czr_fn_process_singular_thumbnail(); //in singular context handle where to display blocks like: // - author info (single), // - related posts (single), // - comments (page) $this -> czr_fn_process_singular_blocks(); $children = array( array( //registered here also because we access to its properties from other templates //which as of now is only possibile with already registered models 'model_class' => 'content/post-metas/post_metas', 'id' => 'post_metas', ), /********************************************* * SLIDER *********************************************/ /* Need to be registered before rendering because of the custom style*/ array( 'template' => 'modules/slider/slider', 'id' => 'main_slider', 'hook' => '__before_main_wrapper', 'priority' => 10 ), //slider of posts array( 'id' => 'main_posts_slider', 'model_class' => array( 'parent' => 'modules/slider/slider', 'name' => 'modules/slider/slider_of_posts' ), 'template' => 'modules/slider/slider', 'hook' => '__before_main_wrapper', 'priority' => 10 ), /** end slider **/ /********************************************* * Featured Pages *********************************************/ /* contains the featured page item registration */ array( 'id' => 'featured_pages', 'template' => 'modules/featured-pages/featured_pages', 'hook' => '__before_main_container', 'priority' => 10 ), /** end featured pages **/ /********************************************* * Breadcrumbs *********************************************/ /* contains the featured page item registration */ array( 'id' => 'breadcrumb', 'template' => 'modules/common/breadcrumb', 'hook' => '__before_main_container', 'priority' => 20 ), /** end featured pages **/ /* Needs to access the czr_user_options_style */ /********************************************* * GRID (POST LIST) *********************************************/ array( 'id' => 'post_list_grid', 'model_class' => 'modules/grid/grid_wrapper', ), /* END GRID */ ); foreach ( $children as $id => $model ) { CZR() -> collection -> czr_fn_register( $model ); }//foreach } function czr_fn_process_singular_thumbnail() { if ( ! is_singular() ) return; $context = is_single() ? 'post' : 'page'; //do nothing if we don't display regular {context} heading if ( ! czr_fn_is_registered_or_possible( "regular_{$context}_heading" ) ) { return; } //__before_main_wrapper, 200 //__before_regular_{post|page}_heading_title //__after_regular_{post|page}_heading_title $_singular_thumb_option = czr_fn_opt( "tc_single_${context}_thumb_location" ); //nothing to do: if ( ! ( $_singular_thumb_option && 'hide' !== $_singular_thumb_option ) ) { return; } //define old customizr compatibility map: $_compat_location_hook_map = array( //old hook => new_hook '__before_main_wrapper' => '__before_main_wrapper', '__before_content' => '__before_regular_heading_title', '__after_content_title' => '__after_regular_heading_title', ); //process location $_exploded_location = explode('|', $_singular_thumb_option ); $_hook = isset( $_exploded_location[0] ) ? $_exploded_location[0] : '__before_content'; //map the old location hook to the new location hook $_hook = array_key_exists( $_hook, $_compat_location_hook_map ) ? $_compat_location_hook_map[ $_hook ] : '__before_regular_heading_title'; //let's prepare the thumb //register the model and the template for displaying the thumbnail at a specific hook $singular_thumb_model_id = czr_fn_register( array( 'template' => 'content/common/media', 'id' => 'singular_thumbnail', 'hook' => $_hook, 'args' => array( 'media_type' => 'wp_thumb', 'has_permalink' => false, 'has_lightbox' => false, 'element_class' => array('tc-singular-thumbnail-wrapper', $_hook), //slider full when __before_main_wrapper otherwise take the original one 'thumb_size' => '__before_main_wrapper' == $_hook ? 'slider-full' : null ), 'priority' => 15, 'controller' => 'singular_thumbnail' ) ); //control the visibility add_filter( "czr_do_render_view_{$singular_thumb_model_id}", array( $this, 'czr_fn_display_view_singular_thumbnail' ), 100, 2 ); //css //needed only when not __after_regular_heading_title? //if ( '__after_regular_heading_title' != $_hook ) { add_filter( 'czr_user_options_style' , array( $this , 'czr_fn_write_thumbnail_inline_css') ); //} } /* * Singular thumbnail stuff * * TODO : maybe create a specific model * slider and fi before main wrapper xor */ function czr_fn_display_view_singular_thumbnail( $bool, $model ) { if ( !$bool ) return; $_hook = isset( $model->hook ) ? $model->hook : false; if ( !$_hook ) return $bool; $_slider_shown = ( did_action( '__after_carousel_inner' ) ); return '__before_main_wrapper' == $_hook && $_slider_shown ? false : $bool; } function czr_fn_write_thumbnail_inline_css( $_css ) { $context = is_single() ? 'post' : 'page'; $_thumb_smartphone_height = apply_filters( "tc_single_{$context}_thumb_smartphone_height", esc_attr( czr_fn_opt( "tc_single_{$context}_thumb_smartphone_height" ) ) ); $_thumb_smartphone_height = (! $_thumb_smartphone_height || ! is_numeric($_thumb_smartphone_height) ) ? 200 : $_thumb_smartphone_height; $_thumb_height = apply_filters( "tc_single_{$context}_thumb_height", esc_attr( czr_fn_opt( "tc_single_{$context}_thumb_height" ) ) ); $_thumb_height = (! $_thumb_height || ! is_numeric($_thumb_height) ) ? 250 : $_thumb_height; $_css = sprintf("%s\n%s", $_css, ".tc-singular-thumbnail-wrapper .entry-media__wrapper { max-height: {$_thumb_smartphone_height}px; height :{$_thumb_smartphone_height}px }\n" ); if ( $_thumb_smartphone_height != $_thumb_height ) { $css_mq_breakpoints = CZR_init::$instance->css_mq_breakpoints; $_css = sprintf("%s\n@media (min-width: %spx ){\n%s\n}\n", $_css, $css_mq_breakpoints[ 'sm' ], //sm breakpoint up: 576px ".tc-singular-thumbnail-wrapper .entry-media__wrapper { max-height: {$_thumb_height}px; height :{$_thumb_height}px }" ); } return $_css; } /** * In singular context handle where to display blocks like: * - author info (single), * - related posts (single), * - comments (singular) * * @return void */ private function czr_fn_process_singular_blocks() { $_option_name_model_configuration = array( //option name => model 'tc_single_author_block_location' => array( 'template' => 'content/singular/authors/author_info', 'priority' => 10, 'controller' => 'single_author_info' ), 'tc_single_related_posts_block_location' => array( 'template' => 'modules/related-posts/related_posts', 'priority' => 20 ), 'tc_singular_comments_block_location' => array( 'template' => 'content/singular/comments/comments', 'priority' => 30 ), ); $_option_location_hook = array( //option value => hook 'below_post_content' => '__after_loop', 'below_main_content' => '__after_content' ); //register our models using the model configuration array linked to each option foreach ( $_option_name_model_configuration as $_option_name => $model_configuration ) { //retrieve the location option $_location_info = esc_attr( czr_fn_opt( $_option_name ) ); //let's register our model specifying at which action hook its template must be printed if ( $_location_info && array_key_exists( $_location_info, $_option_location_hook ) ) { $model_configuration[ 'hook' ] = $_option_location_hook [ $_location_info ]; //when displayed below the main content (__after_content) blocks need additional classes if ( 'below_main_content' == $_location_info ) { $model_configuration[ 'args' ] = array( 'element_class' => 'col-12 order-md-last' ); } czr_fn_register( $model_configuration ); } } } }