Current Path : /home/theafprt/conviviality360.com/wp-content/themes/customizr/inc/ |
Current File : /home/theafprt/conviviality360.com/wp-content/themes/customizr/inc/czr-front-ccat.php |
<?php /** * Header actions * */ if ( ! class_exists( 'CZR_header_main' ) ) : class CZR_header_main { static $instance; function __construct () { self::$instance =& $this; //Set header hooks //we have to use 'wp' action hook to show header in multisite wp-signup/wp-activate.php which don't fire template_redirect hook //(see https://github.com/presscustomizr/customizr/issues/395) add_action ( 'wp' , array( $this , 'czr_fn_set_header_hooks' ) ); //Set header options add_action ( 'wp' , array( $this , 'czr_fn_set_header_options' ) ); //! tc_user_options_style filter is shared by several classes => must always check the local context inside the callback before appending new css //fired on hook : wp_enqueue_scripts //Set thumbnail specific design based on user options //Set top border style option add_filter( 'tc_user_options_style' , array( $this , 'czr_fn_write_header_inline_css') ); } /*************************** * HEADER HOOKS SETUP ****************************/ /** * Set all header hooks * wp callback * @return void * * @package Customizr * @since Customizr 3.2.6 */ function czr_fn_set_header_hooks() { //The WP favicon (introduced in WP 4.3) will be used in priority add_action ( 'wp_head' , array( $this , 'czr_fn_favicon_display' )); //html > header actions add_action ( '__before_main_wrapper' , 'get_header'); //boolean filter to control the header's rendering if ( ! apply_filters( 'tc_display_header', true ) ) return; add_action ( '__header' , array( $this , 'czr_fn_prepare_logo_title_display' ) , 10 ); add_action ( '__header' , array( $this , 'czr_fn_tagline_display' ) , 20, 1 ); add_action ( '__header' , array( $this , 'czr_fn_navbar_display' ) , 30 ); //New menu view (since 3.2.0) add_filter ( 'tc_navbar_display', array( $this , 'czr_fn_new_menu_view'), 10, 2); //body > header > navbar actions ordered by priority // GY : switch order for RTL sites if (is_rtl()) { add_action ( '__navbar' , array( $this , 'czr_fn_social_in_header' ) , 20, 2 ); add_action ( '__navbar' , array( $this , 'czr_fn_tagline_display' ) , 10, 1 ); } else { add_action ( '__navbar' , array( $this , 'czr_fn_social_in_header' ) , 10, 2 ); add_action ( '__navbar' , array( $this , 'czr_fn_tagline_display' ) , 20, 1 ); } //add a 100% wide container just after the sticky header to reset margin top if ( 1 == esc_attr( czr_fn_opt( 'tc_sticky_header' ) ) || czr_fn_is_customizing() ) add_action( '__after_header' , array( $this, 'czr_fn_reset_margin_top_after_sticky_header'), 0 ); } /** * Callback for wp * Set customizer user options * * @package Customizr * @since Customizr 3.2.0 */ function czr_fn_set_header_options() { //Set some body classes add_filter( 'body_class' , array( $this , 'czr_fn_add_body_classes') ); //Set header classes from options add_filter( 'tc_header_classes' , array( $this , 'czr_fn_set_header_classes') ); //Set logo layout with a customizer option (since 3.2.0) add_filter( 'tc_logo_class' , array( $this , 'czr_fn_set_logo_title_layout') ); } /*************************** * VIEWS ****************************/ /** * Render favicon from options * Since WP 4.3 : let WP do the job if user has set the WP site_icon setting. * * @package Customizr * @since Customizr 3.0 */ function czr_fn_favicon_display() { //is there a WP favicon set ? //if yes then let WP do the job if ( function_exists('has_site_icon') && has_site_icon() ) return; $_fav_option = esc_attr( czr_fn_opt( 'tc_fav_upload') ); if ( ! $_fav_option || is_null($_fav_option) ) return; $_fav_src = ''; //check if option is an attachement id or a path (for backward compatibility) if ( is_numeric($_fav_option) ) { $_attachement_id = $_fav_option; $_attachment_data = apply_filters( 'tc_fav_attachment_img' , wp_get_attachment_image_src( $_fav_option , 'full' ) ); $_fav_src = $_attachment_data[0]; } else { //old treatment $_saved_path = esc_url ( czr_fn_opt( 'tc_fav_upload') ); //rebuild the path : check if the full path is already saved in DB. If not, then rebuild it. $upload_dir = wp_upload_dir(); $_fav_src = ( false !== strpos( $_saved_path , '/wp-content/' ) ) ? $_saved_path : $upload_dir['baseurl'] . $_saved_path; } //makes ssl compliant url $_fav_src = apply_filters( 'tc_fav_src' , is_ssl() ? str_replace('http://', 'https://', $_fav_src) : $_fav_src ); if( null == $_fav_src || !$_fav_src ) return; $type = "image/x-icon"; if ( strpos( $_fav_src, '.png') ) $type = "image/png"; if ( strpos( $_fav_src, '.gif') ) $type = "image/gif"; echo apply_filters( 'tc_favicon_display', sprintf('<link id="czr-favicon" rel="shortcut icon" href="%1$s" type="%2$s">' , $_fav_src, $type ) ); } /** * Prepare the logo / title view * * * @package Customizr * @since Customizr 3.2.3 */ function czr_fn_prepare_logo_title_display() { $logos_type = array( '_sticky_', '_'); $logos_img = array(); $accepted_formats = apply_filters( 'tc_logo_img_formats' , array('jpg', 'jpeg', 'png' ,'gif', 'svg', 'svgz' ) ); $logo_classes = array( 'brand', 'span3'); foreach ( $logos_type as $logo_type ){ // check if we have to print the sticky logo if ( '_sticky_' == $logo_type && ! $this -> czr_fn_use_sticky_logo() ) continue; //check if the logo is a path or is numeric //get src for both cases $_logo_src = ''; $_width = false; $_height = false; $_attachement_id = false; //for the standard logo use the wp custom logo feature if set, otherwise fall back on the customizr custom logo $_logo_option = '_' === $logo_type ? get_theme_mod( 'custom_logo', '' ) : ''; $_logo_option = $_logo_option ? $_logo_option : esc_attr( czr_fn_opt( "tc{$logo_type}logo_upload") ); //check if option is an attachement id or a path (for backward compatibility) if ( is_numeric($_logo_option) ) { $_attachement_id = $_logo_option; $_attachment_data = apply_filters( "tc{$logo_type}logo_attachment_img" , wp_get_attachment_image_src( $_logo_option , 'full' ) ); $_logo_src = $_attachment_data[0]; $_width = ( isset($_attachment_data[1]) && $_attachment_data[1] > 1 ) ? $_attachment_data[1] : $_width; $_height = ( isset($_attachment_data[2]) && $_attachment_data[2] > 1 ) ? $_attachment_data[2] : $_height; } else { //old treatment //rebuild the logo path : check if the full path is already saved in DB. If not, then rebuild it. $upload_dir = wp_upload_dir(); $_saved_path = esc_url ( czr_fn_opt( "tc{$logo_type}logo_upload") ); $_logo_src = ( false !== strpos( $_saved_path , '/wp-content/' ) ) ? $_saved_path : $upload_dir['baseurl'] . $_saved_path; } //hook + makes ssl compliant $_logo_src = apply_filters( "tc{$logo_type}logo_src" , is_ssl() ? str_replace('http://', 'https://', $_logo_src) : $_logo_src ) ; $logo_resize = ( $logo_type == '_' ) ? esc_attr( czr_fn_opt( 'tc_logo_resize') ) : ''; $filetype = czr_fn_check_filetype($_logo_src); if( ! empty($_logo_src) && in_array( $filetype['ext'], $accepted_formats ) ) { $_args = array( 'logo_src' => $_logo_src, 'logo_resize' => $logo_resize, 'logo_attachment_id' => $_attachement_id, 'logo_width' => $_width, 'logo_height' => $_height, 'logo_type' => trim($logo_type,'_') ); $logos_img[] = $this -> czr_fn_logo_img_view($_args); } }//end foreach //render if ( count($logos_img) == 0 ) $this -> czr_fn_title_view($logo_classes); else $this -> czr_fn_logo_view( array ( 'logo_class' => $logo_classes, // normal logo first 'logos_img' => array_reverse($logos_img) ) ); } /** * Title view * * @package Customizr * @since Customizr 3.2.3 */ function czr_fn_title_view( $logo_classes ) { ob_start(); ?> <div class="<?php echo implode( " ", apply_filters( 'tc_logo_class', array_merge($logo_classes , array('pull-left') ) ) ) ?> "> <?php do_action( '__before_logo' ); printf('<%1$s><a class="site-title" href="%2$s">%3$s</a></%1$s>', apply_filters( 'tc_site_title_tag', 'h1' ) , apply_filters( 'tc_logo_link_url', esc_url( home_url( '/' ) ) ) , get_bloginfo( 'name', 'display' ) ); do_action( '__after_logo' ) ?> </div> <!-- brand span3 pull-left --> <?php $html = ob_get_contents(); if ($html) ob_end_clean(); echo apply_filters( 'tc_logo_text_display', $html, $logo_classes); } /** * Logo img view * @return filtered string * * @package Customizr * @since Customizr 3.2.9 */ function czr_fn_logo_img_view( $_args ){ //Extracts $args : logo_src, logo_resize, logo_attachment_id, logo_width, logo_height, logo_type extract($_args); $_html = sprintf( '<img src="%1$s" alt="%2$s" %3$s %4$s %5$s %6$s class="%7$s %8$s"/>', $logo_src, apply_filters( 'tc_logo_alt', __( 'Back Home' , 'customizr' ) ), $logo_width ? sprintf( 'width="%1$s"', $logo_width ) : '', $logo_height ? sprintf( 'height="%1$s"', $logo_height ) : '', ( 1 == $logo_resize) ? sprintf( 'style="max-width:%1$spx;max-height:%2$spx"', apply_filters( 'tc_logo_max_width', 250 ), apply_filters( 'tc_logo_max_height', 100 ) ) : '', implode(' ' , apply_filters('tc_logo_other_attributes' , ( 0 == czr_fn_opt( 'tc_retina_support' ) ) ? array('data-no-retina') : array() ) ), $logo_type, $logo_attachment_id ? sprintf( 'attachment-%1$s', $logo_attachment_id ) : '' ); return apply_filters( 'tc_logo_img_view', $_html, $_args); } /** * Logo view * * @package Customizr * @since Customizr 3.2.3 */ function czr_fn_logo_view( $_args ) { //Exctracts $args : $logo_class, $logos_img (array of <img>) extract($_args); ob_start(); ?> <div class="<?php echo implode( " ", apply_filters( 'tc_logo_class', $logo_class ) ) ?>"> <?php do_action( '__before_logo' ); printf( '<a class="site-logo" href="%1$s" aria-label="%2$s">%3$s</a>', apply_filters( 'tc_logo_link_url', esc_url( home_url( '/' ) ) ) , // keep this filter name for retro-compat, but now it refers to the aria-label attribute. apply_filters( 'tc_logo_link_title', sprintf( '%1$s | %2$s' , get_bloginfo( 'name', 'display' ) , get_bloginfo( 'description', 'display' ) ) ), implode( '', $logos_img ) ); do_action( '__after_logo' ); ?> </div> <!-- brand span3 --> <?php $html = ob_get_contents(); if ($html) ob_end_clean(); echo apply_filters( 'tc_logo_img_display', $html, $_args ); } /** * Displays what's inside the navbar of the website. * Uses the resp parameter for __navbar action. * * @package Customizr * @since Customizr 3.0.10 */ function czr_fn_navbar_display() { $_navbar_classes = implode( " ", apply_filters( 'tc_navbar_wrapper_class', array('navbar-wrapper', 'clearfix', 'span9') ) ); ob_start(); do_action( '__before_navbar' ); ?> <div class="<?php echo $_navbar_classes ?>"> <div class="navbar notresp row-fluid pull-left"> <div class="navbar-inner" role="navigation"> <div class="row-fluid"> <?php do_action( '__navbar' ); //hook of social, tagline, menu, ordered by priorities 10, 20, 30 ?> </div><!-- .row-fluid --> </div><!-- /.navbar-inner --> </div><!-- /.navbar notresp --> <div class="navbar resp"> <div class="navbar-inner" role="navigation"> <?php do_action( '__navbar' , 'resp' ); //hook of social, menu, ordered by priorities 10, 20 ?> </div><!-- /.navbar-inner --> </div><!-- /.navbar resp --> </div><!-- /.navbar-wrapper --> <?php do_action( '__after_navbar' ); $html = ob_get_contents(); if ($html) ob_end_clean(); echo apply_filters( 'tc_navbar_display', $html ); } /** * New menu view. * One menu instead of two * Original function : CZR_header::tc_navbar_display * * @package Customizr * @since Customizr 3.2.0 */ function czr_fn_new_menu_view() { $_navbar_classes = implode( " ", apply_filters( 'tc_navbar_wrapper_class', array('navbar-wrapper', 'clearfix', 'span9') ) ); do_action( '__before_navbar' ); ?> <div class="<?php echo $_navbar_classes ?>"> <div class="navbar resp"> <div class="navbar-inner" role="navigation"> <div class="row-fluid"> <?php do_action( '__navbar' , 'resp' ); //hook of social, menu, ordered by priorities 10, 20 ?> </div><!-- /.row-fluid --> </div><!-- /.navbar-inner --> </div><!-- /.navbar resp --> </div><!-- /.navbar-wrapper --> <?php do_action( '__after_navbar' ); } /** * Displays the social networks block in the header * * * @package Customizr * @since Customizr 3.0.10 */ function czr_fn_social_in_header($resp = null) { //when do we display this block ? //1) if customizing: must be enabled //2) if not customizing : must be enabled and have social networks. $_nothing_to_render = 0 == czr_fn_opt( 'tc_social_in_header' ) || ! ( $_socials = czr_fn__f( '__get_socials' ) ); if ( $_nothing_to_render ) return; //class added if not resp $social_header_block_class = ('resp' == $resp) ? '' : 'span5'; $social_header_block_class = apply_filters( 'tc_social_header_block_class', $social_header_block_class , $resp ); $html = sprintf('<div class="social-block %1$s"><div class="social-links">%2$s</div></div>', $social_header_block_class, $_socials ); echo apply_filters( 'tc_social_in_header', $html, $resp ); } /** * Displays the tagline. This function has two hooks : __header and __navbar * * * @package Customizr * @since Customizr 3.0 */ function czr_fn_tagline_display() { //do not display tagline if the related option is false or no tagline available if ( 0 == czr_fn_opt( 'tc_show_tagline' ) ) return; $_tagline_text = czr_fn_get_tagline_text( $echo = false ); if ( ! $_tagline_text ) return; if ( '__header' == current_filter() ) { //when hooked on __header $html = sprintf('<div class="container outside"><%1$s class="site-description">%2$s</%1$s></div>', apply_filters( 'tc_tagline_tag', 'h2' ), $_tagline_text ); } else { //when hooked on __navbar $html = sprintf('<%1$s class="%2$s inside site-description">%3$s</%1$s>', apply_filters( 'tc_tagline_tag', 'h2' ), apply_filters( 'tc_tagline_class', 'span7' ), $_tagline_text ); } echo apply_filters( 'tc_tagline_display', $html ); }//end of fn /* * hook : __after_header hook * * @package Customizr * @since Customizr 3.2.0 */ function czr_fn_reset_margin_top_after_sticky_header() { echo apply_filters( 'tc_reset_margin_top_after_sticky_header', sprintf('<div id="tc-reset-margin-top" class="container-fluid" style="margin-top:%1$spx"></div>', apply_filters('tc_default_sticky_header_height' , 103 ) ) ); } /*************************** * SETTER / GETTERS / HELPERS ****************************/ /* * Callback of tc_user_options_style hook * @return css string * * @package Customizr * @since Customizr 3.2.6 */ function czr_fn_write_header_inline_css( $_css ) { //TOP BORDER if ( 1 != esc_attr( czr_fn_opt( 'tc_top_border') ) ) { $_css = sprintf("%s\n%s", $_css, "header.tc-header {border-top: none;}\n" ); } //STICKY HEADER if ( czr_fn_is_checked( 'tc_sticky_shrink_title_logo' ) || czr_fn_is_customizing() ) { $_logo_shrink = implode (';' , apply_filters('tc_logo_shrink_css' , array("height:30px!important","width:auto!important") ) ); $_title_font = implode (';' , apply_filters('tc_title_shrink_css' , array("font-size:0.6em","opacity:0.8","line-height:1.2em") ) ); $_css = sprintf("%s\n%s", $_css, ".sticky-enabled .tc-shrink-on .site-logo img { {$_logo_shrink} }\n .sticky-enabled .tc-shrink-on .brand .site-title { {$_title_font} }\n" ); } //STICKY LOGO if ( $this -> czr_fn_use_sticky_logo() ) { $_css = sprintf( "%s\n%s", $_css, ".site-logo img.sticky { display: none; }\n .sticky-enabled .tc-sticky-logo-on .site-logo img { display: none; }\n .sticky-enabled .tc-sticky-logo-on .site-logo img.sticky{ display: inline-block; }\n" ); } //HEADER Z-INDEX if ( 100 != esc_attr( czr_fn_opt( 'tc_sticky_z_index') ) ) { $_custom_z_index = esc_attr( czr_fn_opt( 'tc_sticky_z_index') ); $_css = sprintf("%s\n%s", $_css, ".tc-no-sticky-header .tc-header, .tc-sticky-header .tc-header { z-index:{$_custom_z_index} }\n" ); } return $_css; } /* * Callback of body_class hook * * @package Customizr * @since Customizr 3.2.0 */ function czr_fn_add_body_classes($_classes) { //STICKY HEADER if ( 1 == esc_attr( czr_fn_opt( 'tc_sticky_header' ) ) ) { $_classes = array_merge( $_classes, array('tc-sticky-header', 'sticky-disabled') ); //STICKY TRANSPARENT ON SCROLL if ( 1 == esc_attr( czr_fn_opt( 'tc_sticky_transparent_on_scroll' ) ) ) $_classes = array_merge( $_classes, array('tc-transparent-on-scroll') ); else $_classes = array_merge( $_classes, array('tc-solid-color-on-scroll') ); } else { $_classes = array_merge( $_classes, array('tc-no-sticky-header', 'sticky-disabled' ) ); } //No navbar box if ( 1 != esc_attr( czr_fn_opt( 'tc_display_boxed_navbar') ) ) $_classes = array_merge( $_classes , array('no-navbar' ) ); return $_classes; } /** * Set the header classes * Callback for tc_header_classes filter * * @package Customizr * @since Customizr 3.2.0 */ function czr_fn_set_header_classes( $_classes ) { //backward compatibility (was not handled has an array in previous versions) if ( ! is_array($_classes) ) return $_classes; $_show_tagline = czr_fn_is_checked( 'tc_sticky_show_tagline' ); $_show_title_logo = czr_fn_is_checked( 'tc_sticky_show_title_logo' ); $_use_sticky_logo = $this -> czr_fn_use_sticky_logo(); $_shrink_title_logo = czr_fn_is_checked( 'tc_sticky_shrink_title_logo' ); $_show_menu = czr_fn_is_checked( 'tc_sticky_show_menu' ); $_header_layout = "logo-" . esc_attr( czr_fn_opt( 'tc_header_layout' ) ); $_add_classes = array( $_show_tagline ? 'tc-tagline-on' : 'tc-tagline-off', $_show_title_logo ? 'tc-title-logo-on' : 'tc-title-logo-off', $_use_sticky_logo ? 'tc-sticky-logo-on' : '', $_shrink_title_logo ? 'tc-shrink-on' : 'tc-shrink-off', $_show_menu ? 'tc-menu-on' : 'tc-menu-off', $_header_layout ); return array_merge( $_classes , $_add_classes ); } /** * Returns a boolean wheter we're using or not a specific sticky logo * * @package Customizr * @since Customizr 3.2.9 */ function czr_fn_use_sticky_logo(){ if ( ! esc_attr( czr_fn_opt( "tc_sticky_logo_upload") ) ) return false; if ( ! ( esc_attr( czr_fn_opt( "tc_sticky_header") ) && esc_attr( czr_fn_opt( 'tc_sticky_show_title_logo') ) ) ) return false; return true; } /** * Callback for tc_logo_class * * @package Customizr * @since Customizr 3.2.0 */ function czr_fn_set_logo_title_layout( $_classes ) { //backward compatibility (was not handled has an array in previous versions) if ( ! is_array($_classes) ) return $_classes; $_layout = esc_attr( czr_fn_opt( 'tc_header_layout') ); switch ($_layout) { case 'left': $_classes = array('brand', 'span3' , 'pull-left'); break; case 'right': $_classes = array('brand', 'span3' , 'pull-right'); break; default : $_classes = array('brand', 'span3' , 'pull-left'); break; } return $_classes; } }//end of class endif; ?><?php /** * Menu action * * */ if ( ! class_exists( 'CZR_menu' ) ) : class CZR_menu { static $instance; function __construct () { self::$instance =& $this; //Set menu customizer options (since 3.2.0) add_action( 'wp' , array( $this, 'czr_fn_set_menu_hooks') ); } /*************************************** * WP HOOKS SETTINGS ****************************************/ /* * hook : wp * * @package Customizr * @since Customizr 3.2.0 */ function czr_fn_set_menu_hooks() { if ( (bool) czr_fn_opt('tc_hide_all_menus') ) return; //VARIOUS USER OPTIONS add_filter( 'body_class' , array( $this , 'czr_fn_add_body_classes') ); //Set header css classes based on user options add_filter( 'tc_header_classes' , array( $this , 'czr_fn_set_header_classes') ); add_filter( 'tc_social_header_block_class' , array( $this, 'czr_fn_set_social_header_class') ); //! tc_user_options_style filter is shared by several classes => must always check the local context inside the callback before appending new css //fired on hook : wp_enqueue_scripts //set second menu specific style including @media rules add_filter( 'tc_user_options_style' , array( $this , 'czr_fn_add_second_menu_inline_style') ); //SIDE MENU HOOKS SINCE v3.3+ if ( $this -> czr_fn_is_sidenav_enabled() ){ add_action( 'wp_head' , array( $this , 'czr_fn_set_sidenav_hooks') ); add_filter( 'tc_user_options_style' , array( $this , 'czr_fn_set_sidenav_style') ); } //this adds css classes to the navbar-wrapper : //1) to the main menu if regular (sidenav not enabled) //2) to the secondary menu if enabled if ( ! $this -> czr_fn_is_sidenav_enabled() || czr_fn_is_secondary_menu_enabled() ) { add_filter( 'tc_navbar_wrapper_class' , array( $this, 'czr_fn_set_menu_style_options'), 0 ); } //body > header > navbar action ordered by priority add_action ( '__navbar' , array( $this , 'czr_fn_menu_display' ), 30 ); //adds class add_filter ( 'wp_page_menu' , array( $this , 'czr_fn_add_menuclass' )); } /*************************************** * WP_HEAD HOOKS SETTINGS ****************************************/ /** * Set Various hooks for the sidemenu * hook : wp_head * @return void */ function czr_fn_set_sidenav_hooks() { add_filter( 'body_class' , array( $this, 'czr_fn_sidenav_body_class') ); // disable dropdown on click add_filter( 'tc_menu_open_on_click' , array( $this, 'czr_fn_disable_dropdown_on_click'), 10, 3 ); // add side menu before the page wrapper add_action( '__before_page_wrapper' , array( $this, 'czr_fn_sidenav_display'), 0 ); // add menu button to the sidebar add_action( '__sidenav' , array( $this, 'czr_fn_sidenav_toggle_button_display'), 5 ); // add menu add_action( '__sidenav' , array( $this, 'czr_fn_sidenav_display_menu_customizer'), 10 ); } /*************************************** * VIEWS ****************************************/ /** * Menu Rendering : renders the navbar menus, or just the sidenav toggle button * hook : '__navbar' * * @package Customizr * @since Customizr 3.0 */ function czr_fn_menu_display() { ob_start(); //renders the regular menu + responsive button if ( ! $this -> czr_fn_is_sidenav_enabled() ) { $this -> czr_fn_regular_menu_display( 'main' ); } else { $this -> czr_fn_sidenav_toggle_button_display(); if ( $this -> czr_fn_is_second_menu_enabled() ) $this -> czr_fn_regular_menu_display( 'secondary' ); } $html = ob_get_contents(); ob_end_clean(); echo apply_filters( 'tc_menu_display', $html ); } /** * Menu button View * * @return html string * @package Customizr * @since v3.3+ * */ function czr_fn_menu_button_view( $args ) { //extracts : 'type', 'button_class', 'button_attr' extract( $args ); $_button_label = sprintf( '<span class="menu-label">%s</span>', '__sidenav' == current_filter() ? __('Close', 'customizr') : __('Menu' , 'customizr') ); $_button = sprintf( '<div class="%1$s"><button type="button" class="btn menu-btn" %2$s title="%5$s" aria-label="%5$s">%3$s%3$s%3$s </button>%4$s</div>', implode(' ', apply_filters( "tc_{$type}_button_class", $button_class ) ), apply_filters( "tc_{$type}_menu_button_attr", $button_attr), '<span class="icon-bar"></span>', (bool)esc_attr( czr_fn_opt('tc_display_menu_label') ) ? $_button_label : '', '__sidenav' == current_filter() ? __('Close', 'customizr') : __('Open the menu' , 'customizr') ); return apply_filters( "tc_{$type}_menu_button_view", $_button ); } /** * Menu fallback. Link to the menu editor. * Thanks to tosho (http://wordpress.stackexchange.com/users/73/toscho) * http://wordpress.stackexchange.com/questions/64515/fall-back-for-main-menu * * @package Customizr * @since Customizr 1.0 */ function czr_fn_link_to_menu_editor( $args ) { if ( ! current_user_can( 'manage_options' ) ) return; // see wp-includes/nav-menu-template.php for available arguments extract( $args ); $link = sprintf('%1$s<a href="%2$s">%3$s%4$s%5$s</a>%6$s', $link_before, admin_url( 'nav-menus.php' ), $before, __('Add a menu','customizr'), $after, $link_after ); // We have a list $link = ( FALSE !== stripos( $items_wrap, '<ul' ) || FALSE !== stripos( $items_wrap, '<ol' ) ) ? '<li>' . $link . '</li>' : $link; $output = sprintf( $items_wrap, $menu_id, $menu_class, $link ); $output = ( ! empty ( $container ) ) ? sprintf('<%1$s class="%2$s" id="%3$s">%4$s</%1$s>', $container, $container_class, $container_id, $output ) : $output; if ( $echo ) { echo $output; } return $output; } /*************************************** * REGULAR VIEWS ****************************************/ /** * Prepare params and echo menu views * * @return html string * @since v3.3+ * */ function czr_fn_regular_menu_display( $_location = 'main' ){ $type = 'regular'; $button_where = 'right' != esc_attr( czr_fn_opt( 'tc_header_layout') ) ? 'pull-right' : 'pull-left'; $button_class = array( 'btn-toggle-nav', $button_where ); $button_attr = 'data-toggle="collapse" data-target=".nav-collapse"'; $menu_class = ( ! wp_is_mobile() && 'hover' == esc_attr( czr_fn_opt( 'tc_menu_type' ) ) ) ? array( 'nav tc-hover-menu' ) : array( 'nav' ) ; $menu_wrapper_class = ( ! wp_is_mobile() && 'hover' == esc_attr( czr_fn_opt( 'tc_menu_type' ) ) ) ? array( 'nav-collapse collapse', 'tc-hover-menu-wrapper' ) : array( 'nav-collapse', 'collapse' ); $menu_view = $this -> czr_fn_wp_nav_menu_view( compact( '_location', 'type', 'menu_class', 'menu_wrapper_class' ) ); if ( $menu_view && 'main' == $_location ) $menu_view = $menu_view . $this -> czr_fn_menu_button_view( compact( 'type', 'button_class', 'button_attr') ); echo $menu_view; } /*************************************** * SIDENAV VIEWS ****************************************/ /** * @return html string * @since v3.3+ * * hook: __before_page_wrapper */ function czr_fn_sidenav_display() { ob_start(); $tc_side_nav_class = implode(' ', apply_filters( 'tc_side_nav_class', array( 'tc-sn', 'navbar' ) ) ); $tc_side_nav_inner_class = implode(' ', apply_filters( 'tc_side_nav_inner_class', array( 'tc-sn-inner', 'nav-collapse') ) ); ?> <nav id="tc-sn" class="<?php echo $tc_side_nav_class; ?>"> <div class="<?php echo $tc_side_nav_inner_class; ?>"> <?php do_action( '__sidenav' ); ?> </div><!--.tc-sn-inner --> </nav><!-- //#tc-sn --> <?php $_sidenav = ob_get_contents(); ob_end_clean(); echo apply_filters( 'tc_sidenav_display', $_sidenav ); } /** * @return html string * @since v3.3+ * * hook: __sidenav */ function czr_fn_sidenav_display_menu_customizer(){ //menu setup $type = 'sidenav'; $menu_class = array('nav', 'sn-nav' ); $menu_wrapper_class = array('sn-nav-wrapper'); //sidenav menu is always "main" $_location = 'main'; echo $this -> czr_fn_wp_nav_menu_view( compact( '_location', 'type', 'menu_class', 'menu_wrapper_class') ); } /** * @return html string * @since v3.3+ * * hooks: __sidenav, __navbar */ function czr_fn_sidenav_toggle_button_display() { $type = 'sidenav'; $where = 'right' != esc_attr( czr_fn_opt( 'tc_header_layout') ) ? 'pull-right' : 'pull-left'; $button_class = array( 'btn-toggle-nav', 'sn-toggle', $where ); $button_attr = ''; echo $this -> czr_fn_menu_button_view( compact( 'type', 'button_class', 'button_attr') ); } /*************************************** * COMMON VIEW ****************************************/ /** * WP Nav Menu View * * @return html string * @package Customizr * @since Customizr 3.3+ */ function czr_fn_wp_nav_menu_view( $args ) { extract( $args ); //'_location', 'type', 'menu_class', 'menu_wrapper_class' $menu_args = apply_filters( "tc_{$type}_menu_args", array( 'theme_location' => $_location, 'menu_class' => implode(' ', apply_filters( "tc_{$type}_menu_class", $menu_class ) ), 'fallback_cb' => array( $this, 'czr_fn_page_menu' ), //if no menu is set to the required location, fallsback to tc_page_menu //=> tc_page_menu has it's own class extension of Walker, therefore no need to specify one below 'walker' => ! czr_fn_has_location_menu($_location) ? '' : new CZR_nav_walker($_location), 'echo' => false, ) ); $menu = wp_nav_menu( $menu_args ); if ( $menu ) $menu = sprintf('<div class="%1$s">%2$s</div>', implode(' ', apply_filters( "tc_{$type}_menu_wrapper_class", $menu_wrapper_class ) ), $menu ); return apply_filters("tc_{$type}_menu_view", $menu ); } /*************************************** * GETTERS / SETTERS ****************************************/ /* * Set navbar menu css classes : effects, position... * hook : tc_navbar_wrapper_class hook * * @package Customizr * @since Customizr 3.2.0 */ function czr_fn_set_menu_style_options( $_classes ) { $_classes = ( ! wp_is_mobile() && czr_fn_is_checked( 'tc_menu_submenu_fade_effect' ) ) ? array_merge( $_classes, array( 'tc-submenu-fade' ) ) : $_classes; $_classes = czr_fn_is_checked( 'tc_menu_submenu_item_move_effect' ) ? array_merge( $_classes, array( 'tc-submenu-move' ) ) : $_classes; $_classes = ( ! wp_is_mobile() && 'hover' == esc_attr( czr_fn_opt( 'tc_menu_type' ) ) ) ? array_merge( $_classes, array( 'tc-open-on-hover' ) ) : array_merge( $_classes, array( 'tc-open-on-click' ) ); //Navbar menus positions (not sidenav) //CASE 1 : regular menu (sidenav not enabled), controled by option 'tc_menu_position' //CASE 2 : second menu ( is_secondary_menu_enabled ?), controled by option 'tc_second_menu_position' $_menu_position = ''; if ( ! $this -> czr_fn_is_sidenav_enabled() ) $_menu_position = $_classes[] = esc_attr( czr_fn_opt( 'tc_menu_position') ); if ( czr_fn_is_secondary_menu_enabled() ) $_menu_position = $_classes[] = esc_attr( czr_fn_opt( 'tc_second_menu_position') ); if ( 'pull-menu-center' == $_menu_position ) { //pull-menu-center is possible only when logo-centered if ( 'centered' != esc_attr( czr_fn_opt( 'tc_header_layout' ) ) ) array_pop($_classes); //this value will determine the beahavior when logo-center and menu center and .sticky-enabled //or //be the fall-back when menu position is center but the logo is not centered $_classes[] = is_rtl() ? 'pull-menu-left' : 'pull-menu-right'; } return $_classes; } /* * hook : body_class hook * * @package Customizr * @since Customizr 3.2.0 */ function czr_fn_add_body_classes($_classes) { //menu type class $_menu_type = $this -> czr_fn_is_sidenav_enabled() ? 'tc-side-menu' : 'tc-regular-menu'; array_push( $_classes, $_menu_type ); return $_classes; } /** * Set the header classes * Callback for tc_header_classes filter * * @package Customizr * @since Customizr 3.4+ */ function czr_fn_set_header_classes( $_classes ) { //backward compatibility (was not handled has an array in previous versions) if ( ! is_array($_classes) ) return $_classes; //adds the second menu state if ( czr_fn_is_secondary_menu_enabled() ) array_push( $_classes, 'tc-second-menu-on' ); //adds the resp. behaviour option for secondary menu array_push( $_classes, 'tc-second-menu-' . esc_attr( czr_fn_opt( 'tc_second_menu_resp_setting' ) . '-when-mobile' ) ); return $_classes; } /* * hook : tc_social_header_block_class hook * * @package Customizr * @since Customizr 3.2.0 */ function czr_fn_set_social_header_class($_classes) { return 'span5'; } /** * Adds a specific class to the ul wrapper * hook : 'wp_page_menu' * * @package Customizr * @since Customizr 3.0 */ function czr_fn_add_menuclass( $ulclass) { $html = preg_replace( '/<ul>/' , '<ul class="nav">' , $ulclass, 1); return apply_filters( 'tc_add_menuclass', $html ); } /* * Second menu * This actually "restore" regular menu style (user options in particular) by overriding the max-width: 979px media query */ function czr_fn_add_second_menu_inline_style( $_css ) { if ( ! czr_fn_is_secondary_menu_enabled() ) return $_css; return sprintf("%s\n%s", $_css, "@media (max-width: 979px) { .tc-second-menu-on .nav-collapse { width: inherit; overflow: visible; height: inherit; position:relative; top: inherit; -webkit-box-shadow: none; -moz-box-shadow: none; box-shadow: none; background: inherit; } .logo-centered.tc-second-menu-display-in-header-when-mobile .pull-menu-center .navbar .nav-collapse { width: 100%; text-align: center; } .logo-centered.tc-second-menu-display-in-header-when-mobile .pull-menu-center .navbar .nav-collapse .nav { float: initial; display: inline-block; margin: 0 -12px; text-align: initial; } .tc-sticky-header.sticky-enabled #tc-page-wrap .nav-collapse, #tc-page-wrap .tc-second-menu-hide-when-mobile .nav-collapse.collapse .nav { display:none !important; } .tc-second-menu-on .tc-hover-menu.nav ul.dropdown-menu { display:none; } .tc-second-menu-on .navbar .nav-collapse ul.nav>li li a { padding: 3px 20px; } .tc-second-menu-on .nav-collapse.collapse .nav { display: block; float: left; margin: inherit; } .tc-second-menu-on .nav-collapse .nav>li { float:left; } .tc-second-menu-on .nav-collapse .dropdown-menu { position:absolute; display: none; -webkit-box-shadow: 0 2px 8px rgba(0,0,0,.2); -moz-box-shadow: 0 2px 8px rgba(0,0,0,.2); box-shadow: 0 2px 8px rgba(0,0,0,.2); background-color: #fff; -webkit-border-radius: 6px; -moz-border-radius: 6px; border-radius: 6px; -webkit-background-clip: padding-box; -moz-background-clip: padding; background-clip: padding-box; padding: 5px 0; } .tc-second-menu-on .navbar .nav>li>.dropdown-menu:after, .navbar .nav>li>.dropdown-menu:before{ content: ''; display: inline-block; position: absolute; } .tc-second-menu-on .tc-hover-menu.nav .caret { display:inline-block; } .tc-second-menu-on .tc-hover-menu.nav li:hover>ul { display: block; } .tc-second-menu-on .nav a, .tc-second-menu-on .tc-hover-menu.nav a { border-bottom: none; } .tc-second-menu-on .dropdown-menu>li>a { padding: 3px 20px; } .tc-second-menu-on .tc-submenu-move .dropdown-menu>li>a:focus,.tc-second-menu-on .tc-submenu-move .dropdown-menu>li>a:hover,.tc-second-menu-on .tc-submenu-move .dropdown-submenu:focus>a, .tc-second-menu-on .tc-submenu-move .dropdown-submenu:hover>a { padding-left: 1.63em } .tc-second-menu-on .tc-submenu-fade .nav>li>ul { opacity: 0; top: 75%; visibility: hidden; display: block; -webkit-transition: all .2s ease-in-out; -moz-transition: all .2s ease-in-out; -o-transition: all .2s ease-in-out; -ms-transition: all .2s ease-in-out; transition: all .2s ease-in-out; } .tc-second-menu-on .tc-submenu-fade .nav li.open>ul, .tc-second-menu-on .tc-submenu-fade .tc-hover-menu.nav li:hover>ul { opacity: 1; top: 95%; visibility: visible; } .tc-second-menu-on .tc-submenu-move .dropdown-menu>li>a { -webkit-transition: all ease .241s; -moz-transition: all ease .241s; -o-transition: all ease .241s; transition: all ease .241s; } .tc-second-menu-on .dropdown-submenu>.dropdown-menu { top: 110%; left: 30%; left: 30%\9; top: 0\9; margin-top: -6px; margin-left: -1px; -webkit-border-radius: 6px; -moz-border-radius: 6px; border-radius: 6px; } .tc-second-menu-on .dropdown-submenu>a:after { content: ' '; } }\n .sticky-enabled .tc-second-menu-on .nav-collapse.collapse { clear:none; }\n" ); } /** * Adds a specific style to the first letter of the menu item * hook : tc_user_options_style * * @package Customizr * @since Customizr 3.2.11 */ function czr_fn_set_sidenav_style( $_css ) { $sidenav_width = apply_filters( 'tc_sidenav_width', 330 ); $_sidenav_mobile_css = ' #tc-sn { width: %1$spx;} nav#tc-sn { z-index: 999; } [class*=sn-left].sn-close #tc-sn, [class*=sn-left] #tc-sn{ -webkit-transform: translate3d( -100%%, 0, 0 ); -moz-transform: translate3d( -100%%, 0, 0 ); transform: translate3d(-100%%, 0, 0 ); } [class*=sn-right].sn-close #tc-sn,[class*=sn-right] #tc-sn { -webkit-transform: translate3d( 100%%, 0, 0 ); -moz-transform: translate3d( 100%%, 0, 0 ); transform: translate3d( 100%%, 0, 0 ); } .animating #tc-page-wrap, .sn-open #tc-sn, .tc-sn-visible:not(.sn-close) #tc-sn{ -webkit-transform: translate3d( 0, 0, 0 ); -moz-transform: translate3d( 0, 0, 0 ); transform: translate3d(0,0,0) !important; } '; $_sidenav_desktop_css = ' #tc-sn { width: %1$spx;} .tc-sn-visible[class*=sn-left] #tc-page-wrap { left: %1$spx; } .tc-sn-visible[class*=sn-right] #tc-page-wrap { right: %1$spx; } [class*=sn-right].sn-close #tc-page-wrap, [class*=sn-left].sn-open #tc-page-wrap { -webkit-transform: translate3d( %1$spx, 0, 0 ); -moz-transform: translate3d( %1$spx, 0, 0 ); transform: translate3d( %1$spx, 0, 0 ); } [class*=sn-right].sn-open #tc-page-wrap, [class*=sn-left].sn-close #tc-page-wrap { -webkit-transform: translate3d( -%1$spx, 0, 0 ); -moz-transform: translate3d( -%1$spx, 0, 0 ); transform: translate3d( -%1$spx, 0, 0 ); } /* stick the sticky header to the left/right of the page wrapper */ .tc-sticky-header.tc-sn-visible:not(.animating)[class*=sn-left] .tc-header { left: %1$spx; } .tc-sticky-header.tc-sn-visible:not(.animating)[class*=sn-right] .tc-header { right: %1$spx; } /* ie<9 breaks using :not */ .no-csstransforms3d .tc-sticky-header.tc-sn-visible[class*=sn-left] .tc-header { left: %1$spx; } .no-csstransforms3d .tc-sticky-header.tc-sn-visible[class*=sn-right] .tc-header { right: %1$spx; } '; return sprintf("%s\n%s", $_css, sprintf( apply_filters('tc_sidenav_inline_css', apply_filters( 'tc_sidenav_slide_mobile', wp_is_mobile() ) ? $_sidenav_mobile_css : $_sidenav_desktop_css ), $sidenav_width ) ); } /** * hook : body_class filter * * @since Customizr 3.3+ */ function czr_fn_sidenav_body_class( $_classes ){ $_where = 'right' != esc_attr( czr_fn_opt( 'tc_header_layout') ) ? 'right' : 'left'; array_push( $_classes, apply_filters( 'tc_sidenav_body_class', "sn-$_where" ) ); return $_classes; } /** * This hooks is fired in the Walker_Page extensions, by the start_el() methods. * It only concerns the main menu, when the sidenav is enabled. * @since Customizr 3.4+ * * hook :tc_menu_open_on_click */ function czr_fn_disable_dropdown_on_click( $replace, $search, $_location = null ) { return 'main' == $_location ? $search : $replace ; } /*************************************** * HELPERS ****************************************/ /** * @return bool */ function czr_fn_is_sidenav_enabled() { return apply_filters( 'tc_is_sidenav_enabled', 'aside' == esc_attr( czr_fn_opt( 'tc_menu_style' ) ) ); } /** * @return bool */ function czr_fn_is_second_menu_enabled() { return apply_filters( 'tc_is_second_menu_enabled', (bool)esc_attr( czr_fn_opt( 'tc_display_second_menu' ) ) ); } /** * Display or retrieve list of pages with optional home link. * Modified copy of wp_page_menu() * @return string html menu */ function czr_fn_page_menu( $args = array() ) { $defaults = array('sort_column' => 'menu_order, post_title', 'menu_class' => 'menu', 'echo' => true, 'link_before' => '', 'link_after' => ''); $args = wp_parse_args( $args, $defaults ); $args = apply_filters( 'wp_page_menu_args', $args ); $menu = ''; $list_args = $args; // Show Home in the menu if ( ! empty($args['show_home']) ) { if ( true === $args['show_home'] || '1' === $args['show_home'] || 1 === $args['show_home'] ) $text = __('Home' , 'customizr'); else $text = $args['show_home']; $class = ''; if ( is_front_page() && !is_paged() ) $class = 'class="current_page_item"'; $menu .= '<li ' . $class . '><a href="' . home_url( '/' ) . '">' . $args['link_before'] . $text . $args['link_after'] . '</a></li>'; // If the front page is a page, add it to the exclude list if (get_option('show_on_front') == 'page') { if ( !empty( $list_args['exclude'] ) ) { $list_args['exclude'] .= ','; } else { $list_args['exclude'] = ''; } $list_args['exclude'] .= get_option('page_on_front'); } } $list_args['echo'] = false; $list_args['title_li'] = ''; $menu .= str_replace( array( "\r", "\n", "\t" ), '', $this -> czr_fn_list_pages($list_args) ); // if ( $menu ) // $menu = '<ul>' . $menu . '</ul>'; //$menu = '<div class="' . esc_attr($args['menu_class']) . '">' . $menu . "</div>\n"; if ( $menu ) $menu = '<ul class="' . esc_attr($args['menu_class']) . '">' . $menu . '</ul>'; //$menu = apply_filters( 'wp_page_menu', $menu, $args ); if ( $args['echo'] ) echo $menu; else return $menu; } /** * Retrieve or display list of pages in list (li) format. * Modified copy of wp_list_pages * @return string HTML list of pages. */ function czr_fn_list_pages( $args = '' ) { $defaults = array( 'depth' => 0, 'show_date' => '', 'date_format' => get_option( 'date_format' ), 'child_of' => 0, 'exclude' => '', 'title_li' => __( 'Pages', 'customizr' ), 'echo' => 1, 'authors' => '', 'sort_column' => 'menu_order, post_title', 'link_before' => '', 'link_after' => '', 'walker' => '', ); $r = wp_parse_args( $args, $defaults ); $output = ''; $current_page = 0; // sanitize, mostly to keep spaces out $r['exclude'] = preg_replace( '/[^0-9,]/', '', $r['exclude'] ); // Allow plugins to filter an array of excluded pages (but don't put a nullstring into the array) $exclude_array = ( $r['exclude'] ) ? explode( ',', $r['exclude'] ) : array(); $r['exclude'] = implode( ',', apply_filters( 'wp_list_pages_excludes', $exclude_array ) ); // Query pages. $r['hierarchical'] = 0; $pages = get_pages( $r ); if ( ! empty( $pages ) ) { if ( $r['title_li'] ) { $output .= '<li class="pagenav">' . $r['title_li'] . '<ul>'; } global $wp_query; if ( is_page() || is_attachment() || $wp_query->is_posts_page ) { $current_page = get_queried_object_id(); } elseif ( is_singular() ) { $queried_object = get_queried_object(); if ( is_post_type_hierarchical( $queried_object->post_type ) ) { $current_page = $queried_object->ID; } } $output .= $this -> czr_fn_walk_page_tree( $pages, $r['depth'], $current_page, $r ); if ( $r['title_li'] ) { $output .= '</ul></li>'; } } $html = apply_filters( 'wp_list_pages', $output, $r ); if ( $r['echo'] ) { echo $html; } else { return $html; } } /** * Retrieve HTML list content for page list. * * @uses Walker_Page to create HTML list content. * @since 2.1.0 * @see Walker_Page::walk() for parameters and return description. */ function czr_fn_walk_page_tree($pages, $depth, $current_page, $r) { // if ( empty($r['walker']) ) // $walker = new Walker_Page; // else // $walker = $r['walker']; $walker = new CZR_nav_walker_page; foreach ( (array) $pages as $page ) { if ( $page->post_parent ) $r['pages_with_children'][ $page->post_parent ] = true; } $args = array($pages, $depth, $r, $current_page); return call_user_func_array(array($walker, 'walk'), $args); } }//end of class endif; ?><?php /** * Cleaner walker for wp_nav_menu() * Used for the user created main menus, not for : default menu and widget menus * Walker_Nav_Menu is located in /wp-includes/nav-menu-template.php * Walker is located in wp-includes/class-wp-walker.php */ if ( ! class_exists( 'CZR_nav_walker' ) ) : class CZR_nav_walker extends Walker_Nav_Menu { static $instance; public $tc_location; function __construct($_location) { self::$instance =& $this; $this -> tc_location = $_location; add_filter( 'tc_nav_menu_css_class' , array($this, 'czr_fn_add_bootstrap_classes'), 10, 4 ); } /** * hook : nav_menu_css_class */ function czr_fn_add_bootstrap_classes($classes, $item, $args, $depth ) { //cast $classes into array $classes = (array)$classes; //check if $item is a dropdown ( a parent ) //this is_dropdown property has been added in the the display_element() override method if ( $item -> is_dropdown ) { if ( $depth === 0 && ! in_array( 'dropdown', $classes ) ) { $classes[] = 'dropdown'; } elseif ( $depth > 0 && ! in_array( 'dropdown-submenu', $classes ) ) { $classes[] = 'dropdown-submenu'; } } return $classes; } function start_lvl(&$output, $depth = 0, $args = array()) { $output .= "\n<ul class=\"dropdown-menu\">\n"; } function start_el(&$output, $item, $depth = 0, $args = array(), $id = 0) { $item_html = ''; //ask the parent to do the hard work parent::start_el( $item_html, $item, $depth, $args, $id); //this is_dropdown property has been added in the the display_element() override method if ( $item->is_dropdown ) { //makes top menu not clickable (default bootstrap behaviour) $search = '<a'; $replace = ( ! wp_is_mobile() && 'hover' == esc_attr( czr_fn_opt( 'tc_menu_type' ) ) ) ? '<a' : '<a class="dropdown-toggle" data-toggle="dropdown" data-target="#"'; $replace .= strpos($item_html, 'href=') ? '' : ' href="#"' ; $replace = apply_filters( 'tc_menu_open_on_click', $replace , $search, $this -> tc_location ); $item_html = str_replace( $search , $replace , $item_html); //adds arrows down if ( $depth === 0 ) $item_html = str_replace( '</a>' , ' <strong class="caret"></strong></a>' , $item_html); } elseif (stristr( $item_html, 'li class="divider' )) { $item_html = preg_replace( '/<a[^>]*>.*?<\/a>/iU' , '' , $item_html); } elseif (stristr( $item_html, 'li class="nav-header' )) { $item_html = preg_replace( '/<a[^>]*>(.*)<\/a>/iU' , '$1' , $item_html); } $output .= $item_html; } function display_element( $element, &$children_elements, $max_depth, $depth, $args, &$output) { //we add a property here //will be used in override start_el() and class filter $element->is_dropdown = ! empty( $children_elements[$element->ID]); $element->classes = apply_filters( 'tc_nav_menu_css_class', array_filter( empty( $element->classes) ? array() : (array)$element->classes ), $element, $args, $depth ); //let the parent do the rest of the job ! parent::display_element( $element, $children_elements, $max_depth, $depth, $args, $output); } }//end of class endif; /** * Replace the walker for czr_fn_page_menu() * Used for the specific default page menu only * * Walker_Page is located in wp-includes/post-template.php * Walker is located in wp-includes/class-wp-walker.php * * @package Customizr * @subpackage classes * @since 3.0 * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html */ if ( ! class_exists( 'CZR_nav_walker_page' ) ) : class CZR_nav_walker_page extends Walker_Page { function __construct() { add_filter('page_css_class' , array($this, 'czr_fn_add_bootstrap_classes'), 10, 5 ); } /** * hook : page_css_class */ function czr_fn_add_bootstrap_classes($css_class, $page = null, $depth = 0, $args = array(), $current_page = 0) { if ( ! is_array($css_class) ) return $css_class; if ( ! empty( $args['has_children'] ) ) { if ( 0 === $depth ) { if ( ! in_array( 'dropdown', $css_class ) ) $css_class[] = 'dropdown'; } elseif ( $depth > 0 ) { if ( ! in_array( 'dropdown-submenu', $css_class ) ) $css_class[] = 'dropdown-submenu'; } /* * unify menu items with children whether displaying a standard menu or a page menu * (useful for javascript menu related code) */ if ( ! in_array( 'menu-item-has-children' , $css_class ) ) $css_class[] = 'menu-item-has-children'; } if ( ! in_array( 'menu-item' , $css_class ) ) $css_class[] = 'menu-item'; return $css_class; } function start_lvl(&$output, $depth = 0, $args = array()) { $output .= "\n<ul class=\"dropdown-menu\">\n"; } function start_el(&$output, $page, $depth = 0, $args = array(), $current_page = 0) { $item_html = ''; //since the &$output is passed by reference, it will modify the value on the fly based on the parent method treatment //we just have to make some additional treatments afterwards parent::start_el( $item_html, $page, $depth, $args, $current_page ); if ( ! empty( $args['has_children'] ) ) { //makes top menu not clickable (default bootstrap behaviour) $search = '<a'; $replace = ( ! wp_is_mobile() && 'hover' == esc_attr( czr_fn_opt( 'tc_menu_type' ) ) ) ? '<a' : '<a class="dropdown-toggle" data-toggle="dropdown" data-target="#"'; $replace .= strpos($item_html, 'href=') ? '' : ' href="#"' ; $replace = apply_filters( 'tc_menu_open_on_click', $replace , $search, isset($args['theme_location']) ? $args['theme_location'] : null); $item_html = str_replace( $search , $replace , $item_html); //adds arrows down if ( $depth === 0 ) $item_html = str_replace( '</a>' , ' <strong class="caret"></strong></a>' , $item_html); } elseif (stristr( $item_html, 'li class="divider' )) { $item_html = preg_replace( '/<a[^>]*>.*?<\/a>/iU' , '' , $item_html); } elseif (stristr( $item_html, 'li class="nav-header' )) { $item_html = preg_replace( '/<a[^>]*>(.*)<\/a>/iU' , '$1' , $item_html); } $output .= $item_html; } }//end of class endif; ?><?php /** * 404 content actions * */ if ( ! class_exists( 'CZR_404' ) ) : class CZR_404 { //Access any method or var of the class with classname::$instance -> var or method(): static $instance; function __construct () { self::$instance =& $this; //404 content add_action ( '__loop' , array( $this , 'czr_fn_404_content' )); } /** * The template part for displaying error 404 page content * * @package Customizr * @since Customizr 3.0 */ function czr_fn_404_content() { if ( !is_404() ) return; echo apply_filters( 'tc_404_content', sprintf('<div class="%1$s"><div class="entry-content"><p>%2$s</p> %3$s</div>%4$s</div>', 'tc-content span12', __( 'Sorry, but the requested page is not found. You might try a search below.' , 'customizr' ), get_search_form( $echo = false ), '<hr class="featurette-divider '.current_filter().'">' ) ); } }//end of class endif; ?><?php /** * Attachments content actions * */ if ( ! class_exists( 'CZR_attachment' ) ) : class CZR_attachment { static $instance; function __construct () { self::$instance =& $this; add_action ( '__loop' , array( $this , 'czr_fn_attachment_content' )); } /** * The template part for displaying attachment content * Inspired from Twenty Twelve WP Theme * @package Customizr * @since Customizr 3.0 */ function czr_fn_attachment_content() { //check conditional tags global $post; if ( ! isset($post) || empty($post) || 'attachment' != $post -> post_type || !is_singular() ) return; ob_start(); do_action( '__before_content' ); ?> <nav id="image-navigation" class="navigation"> <span class="previous-image"><?php previous_image_link( false, __( '← Previous' , 'customizr' ) ); ?></span> <span class="next-image"><?php next_image_link( false, __( 'Next →' , 'customizr' ) ); ?></span> </nav><!-- //#image-navigation --> <section class="entry-content"> <div class="entry-attachment"> <div class="attachment"> <?php $attachments = array_values( get_children( array( 'post_parent' => $post->post_parent, 'post_status' => 'inherit' , 'post_type' => 'attachment' , 'post_mime_type' => 'image' , 'order' => 'ASC' , 'orderby' => 'menu_order ID' ) ) ); //did we activate the fancy box in customizer? $tc_fancybox = esc_attr( czr_fn_opt( 'tc_fancybox' ) ); ?> <?php if ( $tc_fancybox == 0 ) : //fancy box not checked! ?> <?php /** * Grab the IDs of all the image attachments in a gallery so we can get the URL of the next adjacent image in a gallery, * or the first image (if we're looking at the last image in a gallery), or, in a gallery of one, just the link to that image file */ foreach ( $attachments as $k => $attachment ) { if ( $attachment->ID == $post->ID ) { break; } } $k++; // If there is more than 1 attachment in a gallery if ( count( $attachments ) > 1 ) { if ( isset( $attachments[ $k ] ) ) { // get the URL of the next image attachment $next_attachment_url = get_attachment_link( $attachments[ $k ]->ID ); } else { // or get the URL of the first image attachment $next_attachment_url = get_attachment_link( $attachments[ 0 ]->ID ); } } else { // or, if there's only 1 image, get the URL of the image $next_attachment_url = wp_get_attachment_url(); } ?> <a href="<?php echo esc_url( $next_attachment_url ); ?>" title="<?php the_title_attribute(); ?>" rel="attachment"><?php $attachment_size = apply_filters( 'tc_customizr_attachment_size' , array( 960, 960 ) ); echo wp_get_attachment_image( $post->ID, $attachment_size ); ?></a> <?php else : // if fancybox option checked ?> <?php //get attachement src $attachment_infos = wp_get_attachment_image_src( $post->ID , 'large' ); $attachment_src = $attachment_infos[0]; ?> <a href="<?php echo $attachment_src; ?>" title="<?php the_title_attribute(); ?>" class="grouped_elements" rel="tc-fancybox-group<?php echo $post -> ID ?>"><?php $attachment_size = apply_filters( 'tc_customizr_attachment_size' , array( 960, 960 ) ); echo wp_get_attachment_image( $post->ID, $attachment_size ); ?></a> <div id="hidden-attachment-list" style="display:none"> <?php foreach ( $attachments as $k => $attachment ) : //get all related galery attachement for lightbox navigation ?> <?php $rel_attachment_infos = wp_get_attachment_image_src( $attachment->ID , 'large' ); $rel_attachment_src = $rel_attachment_infos[0]; ?> <a href="<?php echo $rel_attachment_src ; ?>" title="<?php printf('%1$s', !empty( $attachment->post_excerpt ) ? $attachment->post_excerpt : $attachment->post_title ) ?>" class="grouped_elements" rel="tc-fancybox-group<?php echo $post -> ID ?>"><?php echo $rel_attachment_src ; ?></a> <?php endforeach ?> </div><!-- //#hidden-attachment-list --> <?php endif //end if fancybox option checked ?> <?php if ( ! empty( $post->post_excerpt ) ) : ?> <div class="entry-caption"> <?php the_excerpt(); ?> </div> <?php endif; ?> </div><!-- .attachment --> </div><!-- .entry-attachment --> </section><!-- .entry-content --> <?php do_action( '__after_content' ) ?> <?php $html = ob_get_contents(); if ($html) ob_end_clean(); echo apply_filters( 'tc_attachment_content', $html ); }//end of function }//end of class endif; ?><?php /** * Breadcrumb for Customizr * */ class CZR_breadcrumb { //Access any method or var of the class with classname::$instance -> var or method(): static $instance; private $args; function __construct () { self::$instance =& $this; add_action( '__before_main_container' , array( $this , 'czr_fn_breadcrumb_display' ), 20 ); //since v3.2.0, customizer option add_filter( 'tc_show_breadcrumb_in_context' , array( $this , 'czr_fn_set_breadcrumb_display_in_context' ) ); } function _get_args() { $args = array( 'container' => 'div' , // div, nav, p, etc. 'separator' => '»' , 'before' => false, 'after' => false, 'front_page' => true, 'show_home' => __( 'Home' , 'customizr' ), 'network' => false, 'echo' => false ); /* Set up the default arguments for the breadcrumb. */ $defaults = array( 'container' => 'div' , // div, nav, p, etc. 'separator' => '/' , 'before' => __( 'Browse:' , 'customizr' ), 'after' => false, 'front_page' => true, 'show_home' => __( 'Home' , 'customizr' ), 'network' => false, 'echo' => true ); /* Allow singular post views to have a taxonomy's terms prefixing the trail. */ if ( is_singular() ) { $post = get_queried_object(); $defaults["singular_breadcrumb_taxonomy"] = apply_filters( 'tc_display_taxonomies_in_breadcrumb' , true , $post->post_type ); } /* Parse the arguments and extract them for easy variable naming. */ return apply_filters( 'tc_breadcrumb_trail_args' , wp_parse_args( $args, $defaults) , $args , $defaults ); }//end of function function czr_fn_set_breadcrumb_display_in_context( $_bool ) { if ( czr_fn__f('__is_home') ) return 1 != esc_attr( czr_fn_opt( 'tc_show_breadcrumb_home' ) ) ? false : true; else { if ( is_page() && 1 != esc_attr( czr_fn_opt( 'tc_show_breadcrumb_in_pages' ) ) ) return false; if ( is_single() && 1 != esc_attr( czr_fn_opt( 'tc_show_breadcrumb_in_single_posts' ) ) ) return false; if ( ! is_page() && ! is_single() && 1 != esc_attr( czr_fn_opt( 'tc_show_breadcrumb_in_post_lists' ) ) ) return false; } return $_bool; } /** * * @package Customizr * @since Customizr 1.0 */ function czr_fn_breadcrumb_display() { if ( ! apply_filters( 'tc_show_breadcrumb' , 1 == esc_attr( czr_fn_opt( 'tc_breadcrumb') ) ) ) return; if ( ! apply_filters( 'tc_show_breadcrumb_in_context' , true ) ) return; if ( czr_fn__f('__is_home') && 1 != esc_attr( czr_fn_opt( 'tc_show_breadcrumb_home' ) ) ) return; //set the args properties $this -> args = $this -> _get_args(); /** * Filter the default breadcrumb trails output (like the wp gallery shortcode does). * * If the filtered output isn't empty, it will be used instead of generating * the default breadcrumbs html. * * @since 3.4.38 * * @param string $output The breadcrumbs output. Default empty. * @param array $args The computed attributes of the theme's breadcrumbs */ $breadcrumbs = apply_filters( 'tc_breadcrumbs', '', $this->args ); $breadcrumbs = $breadcrumbs ? $breadcrumbs : $this -> czr_fn_breadcrumb_trail( $this -> args ); echo apply_filters( 'tc_breadcrumb_display' , sprintf('<div class="tc-hot-crumble container" role="navigation"><div class="row"><div class="%1$s">%2$s</div></div></div>', apply_filters( 'tc_breadcrumb_class', 'span12' ), $breadcrumbs ) ); } /** * Breadcrumb Trail - A breadcrumb menu script for WordPress. * * Breadcrumb Trail is a script for showing a breadcrumb trail for any type of page. It tries to * anticipate any type of structure and display the best possible trail that matches your site's * permalink structure. While not perfect, it attempts to fill in the gaps left by many other * breadcrumb scripts. * * * @package BreadcrumbTrail * @version 0.5.3 * @author Justin Tadlock <justin@justintadlock.com> * @copyright Copyright (c) 2008 - 2012, Justin Tadlock * @link http://themehybrid.com/plugins/breadcrumb-trail * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html */ /** * Shows a breadcrumb for all types of pages. This function is formatting the final output of the * breadcrumb trail. The breadcrumb_trail_get_items() function returns the items and this function * formats those items. * * @since 0.1.0 * @access public * @param array $args Mixed arguments for the menu. * @return string Output of the breadcrumb menu. */ function czr_fn_breadcrumb_trail( $args = array() ) { /* Create an empty variable for the breadcrumb. */ $breadcrumb = ''; /* Get the trail items. */ $trail = apply_filters( 'tc_breadcrumb_trail' , $this -> czr_fn_breadcrumb_trail_get_items( $args ) ); /* Connect the breadcrumb trail if there are items in the trail. */ if ( !empty( $trail ) && is_array( $trail ) ) { /* Open the breadcrumb trail containers. */ $breadcrumb = '<' . tag_escape( $args['container'] ) . ' class="breadcrumb-trail breadcrumbs">'; /* If $before was set, wrap it in a container. */ $breadcrumb .= ( !empty( $args['before'] ) ? '<span class="trail-before">' . $args['before'] . '</span> ' : '' ); /* Adds the 'trail-begin' class around first item if there's more than one item. */ if ( 1 < count( $trail ) ) array_unshift( $trail, '<span class="trail-begin">' . array_shift( $trail ) . '</span>' ); /* Adds the 'trail-end' class around last item. */ array_push( $trail, '<span class="trail-end">' . array_pop( $trail ) . '</span>' ); /* Format the separator. */ $separator = ! empty( $args['separator'] ) ? '<span class="sep">' . $args['separator'] . '</span>' : '<span class="sep">/</span>'; /* Join the individual trail items into a single string. */ $breadcrumb .= join( " {$separator} ", $trail ); /* If $after was set, wrap it in a container. */ $breadcrumb .= ( !empty( $args['after'] ) ? ' <span class="trail-after">' . $args['after'] . '</span>' : '' ); /* Close the breadcrumb trail containers. */ $breadcrumb .= '</' . tag_escape( $args['container'] ) . '>'; } /* Allow developers to filter the breadcrumb trail HTML. */ //$breadcrumb = apply_filters( array( $this , 'breadcrumb_trail' ), $breadcrumb, $args ); /* Output the breadcrumb. */ if ( $args['echo'] ) echo $breadcrumb; else return $breadcrumb; } /** * Gets the items for the breadcrumb trail. This is the heart of the script. It checks the current page * being viewed and decided based on the information provided by WordPress what items should be * added to the breadcrumb trail. * * @since 0.4.0 * @todo Build in caching based on the queried object ID. * @access public * @param array $args Mixed arguments for the menu. * @return array List of items to be shown in the trail. */ function czr_fn_breadcrumb_trail_get_items( $args = array() ) { global $wp_rewrite; /* Set up an empty trail array and empty path. */ $trail = array(); $path = ''; $maybe_paged = true; /* tc addon */ $page_for_posts = ( 'posts' != get_option('show_on_front') ) ? get_option('page_for_posts') : false; /* If $show_home is set and we're not on the front page of the site, link to the home page. */ if ( !is_front_page() && $args['show_home'] ) { if ( is_multisite() && true === $args['network'] ) { $trail[] = '<a href="' . network_home_url() . '">' . $args['show_home'] . '</a>'; $trail[] = '<a href="' . esc_url(home_url()) . '" title="' . esc_attr( get_bloginfo( 'name' ) ) . '" rel="home" class="trail-begin">' . get_bloginfo( 'name' ) . '</a>'; } else { $trail[] = '<a href="' . esc_url(home_url()) . '" title="' . esc_attr( get_bloginfo( 'name' ) ) . '" rel="home" class="trail-begin">' . $args['show_home'] . '</a>'; } } /* If bbPress is installed and we're on a bbPress page. */ if ( function_exists( 'is_bbpress' ) && is_bbpress() ) { $trail = array_merge( $trail, $this -> czr_fn_breadcrumb_trail_get_bbpress_items() ); } /* If WooCommerce is installed and we're on a WooCommerce page. */ elseif ( function_exists( 'is_woocommerce' ) && is_woocommerce() ) { $trail = array_merge( $trail, $this -> czr_fn_breadcrumb_trail_get_woocommerce_items() ); $maybe_paged = false; //czr_fn_breadcrumb_trail_get_woocommerce_items already gives us the page } /* If viewing the front page of the site. */ elseif ( is_front_page() ) { if ( !is_paged() && $args['show_home'] && $args['front_page'] ) { if ( is_multisite() && true === $args['network'] ) { $trail[] = '<a href="' . network_home_url() . '">' . $args['show_home'] . '</a>'; $trail[] = get_bloginfo( 'name' ); } else { $trail[] = $args['show_home']; } } elseif ( is_paged() && $args['show_home'] && $args['front_page'] ) { if ( is_multisite() && true === $args['network'] ) { $trail[] = '<a href="' . network_home_url() . '">' . $args['show_home'] . '</a>'; $trail[] = '<a href="' . esc_url(home_url()) . '" title="' . esc_attr( get_bloginfo( 'name' ) ) . '" rel="home" class="trail-begin">' . get_bloginfo( 'name' ) . '</a>'; } else { $trail[] = '<a href="' . esc_url(home_url()) . '" title="' . esc_attr( get_bloginfo( 'name' ) ) . '" rel="home" class="trail-begin">' . $args['show_home'] . '</a>'; } } } /* If viewing the "home"/posts page. */ elseif ( is_home() ) { $home_page = get_page( get_queried_object_id() ); $trail = array_merge( $trail, $this -> czr_fn_breadcrumb_trail_get_parents( $home_page->post_parent, '' ) ); if ( is_paged() ) $trail[] = '<a href="' . get_permalink( $home_page->ID ) . '" title="' . esc_attr( strip_tags( get_the_title( $home_page->ID ) ) ). '">' . get_the_title( $home_page->ID ) . '</a>'; else $trail[] = get_the_title( $home_page->ID ); } /* If viewing a singular post (page, attachment, etc.). */ elseif ( is_singular() ) { /* Get singular post variables needed. */ $post = get_queried_object(); $post_id = absint( get_queried_object_id() ); $post_type = $post->post_type; $parent = absint( $post->post_parent ); /* Get the post type object. */ $post_type_object = get_post_type_object( $post_type ); /* If viewing a singular 'post'. */ if ( 'post' == $post_type ) { /* If $front has been set, add it to the $path. */ $path .= trailingslashit( $wp_rewrite->front ); /* If there's a path, check for parents. */ if ( !empty( $path ) && !$page_for_posts ) $trail = array_merge( $trail, $this -> czr_fn_breadcrumb_trail_get_parents( '' , $path ) ); else if ( $page_for_posts ) $trail = array_merge( $trail, $this -> czr_fn_breadcrumb_trail_get_parents( $page_for_posts , $path ) ); /* Map the permalink structure tags to actual links. */ /*$trail = array_merge( $trail, $this -> czr_fn_breadcrumb_trail_map_rewrite_tags( $post_id, get_option( 'permalink_structure' ), $args ) );*/ } /* If viewing a singular 'attachment'. */ elseif ( 'attachment' == $post_type ) { /* Get the parent post ID. */ $parent_id = $post->post_parent; /* If the attachment has a parent (attached to a post). */ if ( 0 < $parent_id ) { /* Get the parent post type. */ $parent_post_type = get_post_type( $parent_id ); /* If the post type is 'post'. */ if ( 'post' == $parent_post_type ) { /* If $front has been set, add it to the $path. */ $path .= trailingslashit( $wp_rewrite->front ); /* If there's a path, check for parents. */ if ( !empty( $path ) ) $trail = array_merge( $trail, $this -> czr_fn_breadcrumb_trail_get_parents( '' , $path ) ); /* Map the post (parent) permalink structure tags to actual links. */ $trail = array_merge( $trail, $this -> czr_fn_breadcrumb_trail_map_rewrite_tags( $post->post_parent, get_option( 'permalink_structure' ), $args ) ); } /* Custom post types. */ elseif ( 'page' !== $parent_post_type ) { $parent_post_type_object = get_post_type_object( $parent_post_type ); /* If $front has been set, add it to the $path. */ if ( isset($parent_post_type_object->rewrite['with_front']) && $parent_post_type_object->rewrite['with_front'] && $wp_rewrite->front ) $path .= trailingslashit( $wp_rewrite->front ); /* If there's a slug, add it to the $path. */ if ( !empty( $parent_post_type_object->rewrite['slug'] ) ) $path .= $parent_post_type_object->rewrite['slug']; /* If there's a path, check for parents. */ if ( !empty( $path ) ) $trail = array_merge( $trail, $this -> czr_fn_breadcrumb_trail_get_parents( '' , $path ) ); /* If there's an archive page, add it to the trail. */ if ( !empty( $parent_post_type_object->has_archive ) ) { /* Add support for a non-standard label of 'archive_title' (special use case). */ $label = !empty( $parent_post_type_object->labels->archive_title ) ? $parent_post_type_object->labels->archive_title : $parent_post_type_object->labels->name; $trail[] = '<a href="' . get_post_type_archive_link( $parent_post_type ) . '" title="' . esc_attr( $label ) . '">' . $label . '</a>'; } } } } /* If a custom post type, check if there are any pages in its hierarchy based on the slug. */ elseif ( 'page' !== $post_type ) { /* If $front has been set, add it to the $path. */ if ( isset( $post_type_object) && isset($post_type_object->rewrite['with_front']) && $post_type_object->rewrite['with_front'] && $wp_rewrite->front ) $path .= trailingslashit( $wp_rewrite->front ); /* If there's a slug, add it to the $path. */ if ( !empty( $post_type_object->rewrite['slug'] ) ) $path .= $post_type_object->rewrite['slug']; /* If there's a path, check for parents. */ if ( !empty( $path ) ) $trail = array_merge( $trail, $this -> czr_fn_breadcrumb_trail_get_parents( '' , $path ) ); /* If there's an archive page, add it to the trail. */ if ( !empty( $post_type_object->has_archive ) ) { /* Add support for a non-standard label of 'archive_title' (special use case). */ $label = !empty( $post_type_object->labels->archive_title ) ? $post_type_object->labels->archive_title : $post_type_object->labels->name; $trail[] = '<a href="' . get_post_type_archive_link( $post_type ) . '" title="' . esc_attr( $label ) . '">' . $label . '</a>'; } } /* If the post type path returns nothing and there is a parent, get its parents. */ if ( ( empty( $path ) && 0 !== $parent ) || ( 'attachment' == $post_type ) ) $trail = array_merge( $trail, $this -> czr_fn_breadcrumb_trail_get_parents( $parent, '' ) ); /* Or, if the post type is hierarchical and there's a parent, get its parents. */ elseif ( 0 !== $parent && is_post_type_hierarchical( $post_type ) ) $trail = array_merge( $trail, $this -> czr_fn_breadcrumb_trail_get_parents( $parent, '' ) ); /* Display terms for specific post type taxonomy if requested. */ if ( isset($args["singular_breadcrumb_taxonomy"]) && $args["singular_breadcrumb_taxonomy"] ) //If post has parent, then don't add the taxonomy trail part $trail = ( 1 < count($this -> czr_fn_breadcrumb_trail_get_parents($post_id) ) ) ? $trail : $this -> czr_fn_add_first_term_from_hierarchical_taxinomy( $trail , $post_id ); /* End with the post title. */ $post_title = single_post_title( '' , false ); if ( 1 < get_query_var( 'page' ) && !empty( $post_title ) ) $trail[] = '<a href="' . get_permalink( $post_id ) . '" title="' . esc_attr( $post_title ) . '">' . $post_title . '</a>'; elseif ( !empty( $post_title ) ) $trail[] = $post_title; } /* If we're viewing any type of archive. */ elseif ( is_archive() ) { /* If viewing a taxonomy term archive. */ if ( is_tax() || is_category() || is_tag() ) { /* Get some taxonomy and term variables. */ $term = get_queried_object(); $taxonomy = get_taxonomy( $term->taxonomy ); /* Get the path to the term archive. Use this to determine if a page is present with it. */ if ( is_category() ) $path = get_option( 'category_base' ); elseif ( is_tag() ) $path = get_option( 'tag_base' ); else { if ( isset($taxonomy->rewrite['with_front']) && $taxonomy->rewrite['with_front'] && $wp_rewrite->front ) $path = trailingslashit( $wp_rewrite->front ); $path .= $taxonomy->rewrite['slug']; } /* Get parent pages by path if they exist. */ if ( $path && ! $page_for_posts) $trail = array_merge( $trail, $this -> czr_fn_breadcrumb_trail_get_parents( '' , $path ) ); else if ( $page_for_posts && ( is_category() || is_tag() ) ) $trail = array_merge( $trail, $this -> czr_fn_breadcrumb_trail_get_parents( $page_for_posts , $path ) ); /* Add post type archive if its 'has_archive' matches the taxonomy rewrite 'slug'. */ if ( $taxonomy->rewrite['slug'] ) { /* Get public post types that match the rewrite slug. */ $post_types = get_post_types( array( 'public' => true, 'has_archive' => $taxonomy->rewrite['slug'] ), 'objects' ); /** * If any post types are found, loop through them to find one that matches. * The reason for this is because WP doesn't match the 'has_archive' string * exactly when calling get_post_types(). I'm assuming it just matches 'true'. */ if ( !empty( $post_types ) ) { foreach ( $post_types as $post_type_object ) { if ( $taxonomy->rewrite['slug'] === $post_type_object->has_archive ) { /* Add support for a non-standard label of 'archive_title' (special use case). */ $label = !empty( $post_type_object->labels->archive_title ) ? $post_type_object->labels->archive_title : $post_type_object->labels->name; /* Add the post type archive link to the trail. */ $trail[] = '<a href="' . get_post_type_archive_link( $post_type_object->name ) . '" title="' . esc_attr( $label ) . '">' . $label . '</a>'; /* Break out of the loop. */ break; } } } } /* If the taxonomy is hierarchical, list its parent terms. */ if ( is_taxonomy_hierarchical( $term->taxonomy ) && $term->parent ) $trail = array_merge( $trail, $this -> czr_fn_breadcrumb_trail_get_term_parents( $term->parent, $term->taxonomy ) ); /* Add the term name to the trail end. */ if ( is_paged() ) $trail[] = '<a href="' . esc_url( get_term_link( $term, $term->taxonomy ) ) . '" title="' . esc_attr( single_term_title( '' , false ) ) . '">' . single_term_title( '' , false ) . '</a>'; else $trail[] = single_term_title( '' , false ); } /* If viewing a post type archive. */ elseif ( is_post_type_archive() ) { /* Get the post type object. */ $post_type_object = ! is_array(get_query_var( 'post_type' )) ? get_post_type_object( get_query_var( 'post_type' ) ) : array(); /* If $front has been set, add it to the $path. */ if ( isset($post_type_object->rewrite['with_front']) && $post_type_object->rewrite['with_front'] && $wp_rewrite->front ) $path .= trailingslashit( $wp_rewrite->front ); /* If there's a slug, add it to the $path. */ if ( !empty( $post_type_object->rewrite['slug'] ) ) $path .= $post_type_object->rewrite['slug']; /* If there's a path, check for parents. */ if ( !empty( $path ) ) $trail = array_merge( $trail, $this -> czr_fn_breadcrumb_trail_get_parents( '' , $path ) ); /* Add the post type [plural] name to the trail end. */ if ( is_paged() ) $trail[] = '<a href="' . esc_url( get_post_type_archive_link( $post_type_object->name ) ) . '" title="' . esc_attr( post_type_archive_title( '' , false ) ) . '">' . post_type_archive_title( '' , false ) . '</a>'; else $trail[] = post_type_archive_title( '' , false ); } /* If viewing an author archive. */ elseif ( is_author() ) { /* Get the user ID. */ $user_id = get_query_var( 'author' ); /* If $front has been set, add it to $path. */ if ( !empty( $wp_rewrite->front ) ) $path .= trailingslashit( $wp_rewrite->front ); /* If an $author_base exists, add it to $path. */ if ( !empty( $wp_rewrite->author_base ) ) $path .= $wp_rewrite->author_base; /* If there's a path, check for parents. */ if ( !empty( $path ) && !$page_for_posts ) $trail = array_merge( $trail, $this -> czr_fn_breadcrumb_trail_get_parents( '' , $path ) ); else if ( $page_for_posts ) $trail = array_merge( $trail, $this -> czr_fn_breadcrumb_trail_get_parents( $page_for_posts , $path ) ); /* Add the author's display name to the trail end. */ if ( is_paged() ) $trail[] = '<a href="'. esc_url( get_author_posts_url( $user_id ) ) . '" title="' . esc_attr( get_the_author_meta( 'display_name' , $user_id ) ) . '">' . get_the_author_meta( 'display_name' , $user_id ) . '</a>'; else $trail[] = get_the_author_meta( 'display_name' , $user_id ); } /* If viewing a time-based archive. */ elseif ( is_time() ) { /* If there's a path, check for parents. */ if ( !empty( $path ) && !$page_for_posts ) $trail = array_merge( $trail, $this -> czr_fn_breadcrumb_trail_get_parents( '' , $path ) ); else if ( $page_for_posts ) $trail = array_merge( $trail, $this -> czr_fn_breadcrumb_trail_get_parents( $page_for_posts , $path ) ); if ( get_query_var( 'minute' ) && get_query_var( 'hour' ) ) $trail[] = get_the_time( __( 'g:i a' , 'customizr' ) ); elseif ( get_query_var( 'minute' ) ) $trail[] = sprintf( __( 'Minute %1$s' , 'customizr' ), get_the_time( __( 'i' , 'customizr' ) ) ); elseif ( get_query_var( 'hour' ) ) $trail[] = get_the_time( __( 'g a' , 'customizr' ) ); } /* If viewing a date-based archive. */ elseif ( is_date() ) { /* If there's a path, check for parents. */ if ( !empty( $path ) && !$page_for_posts ) $trail = array_merge( $trail, $this -> czr_fn_breadcrumb_trail_get_parents( '' , $path ) ); else if ( $page_for_posts ) $trail = array_merge( $trail, $this -> czr_fn_breadcrumb_trail_get_parents( $page_for_posts , $path ) ); /* If $front has been set, check for parent pages. */ if ( $wp_rewrite->front ) $trail = array_merge( $trail, $this -> czr_fn_breadcrumb_trail_get_parents( '' , $wp_rewrite->front ) ); if ( is_day() ) { $trail[] = '<a href="' . get_year_link( get_the_time( 'Y' ) ) . '" title="' . get_the_time( esc_attr__( 'Y' , 'customizr' ) ) . '">' . get_the_time( __( 'Y' , 'customizr' ) ) . '</a>'; $trail[] = '<a href="' . get_month_link( get_the_time( 'Y' ), get_the_time( 'm' ) ) . '" title="' . get_the_time( esc_attr__( 'F' , 'customizr' ) ) . '">' . get_the_time( __( 'F' , 'customizr' ) ) . '</a>'; if ( is_paged() ) $trail[] = '<a href="' . get_day_link( get_the_time( 'Y' ), get_the_time( 'm' ), get_the_time( 'd' ) ) . '" title="' . get_the_time( esc_attr__( 'd' , 'customizr' ) ) . '">' . get_the_time( __( 'd' , 'customizr' ) ) . '</a>'; else $trail[] = get_the_time( __( 'd' , 'customizr' ) ); } elseif ( get_query_var( 'w' ) ) { $trail[] = '<a href="' . get_year_link( get_the_time( 'Y' ) ) . '" title="' . get_the_time( esc_attr__( 'Y' , 'customizr' ) ) . '">' . get_the_time( __( 'Y' , 'customizr' ) ) . '</a>'; if ( is_paged() ) $trail[] = get_archives_link( add_query_arg( array( 'm' => get_the_time( 'Y' ), 'w' => get_the_time( 'W' ) ), esc_url(home_url()) ), sprintf( __( 'Week %1$s' , 'customizr' ), get_the_time( esc_attr__( 'W' , 'customizr' ) ) ), false ); else $trail[] = sprintf( __( 'Week %1$s' , 'customizr' ), get_the_time( esc_attr__( 'W' , 'customizr' ) ) ); } elseif ( is_month() ) { $trail[] = '<a href="' . get_year_link( get_the_time( 'Y' ) ) . '" title="' . get_the_time( esc_attr__( 'Y' , 'customizr' ) ) . '">' . get_the_time( __( 'Y' , 'customizr' ) ) . '</a>'; if ( is_paged() ) $trail[] = '<a href="' . get_month_link( get_the_time( 'Y' ), get_the_time( 'm' ) ) . '" title="' . get_the_time( esc_attr__( 'F' , 'customizr' ) ) . '">' . get_the_time( __( 'F' , 'customizr' ) ) . '</a>'; else $trail[] = get_the_time( __( 'F' , 'customizr' ) ); } elseif ( is_year() ) { if ( is_paged() ) $trail[] = '<a href="' . get_year_link( get_the_time( 'Y' ) ) . '" title="' . esc_attr( get_the_time( __( 'Y' , 'customizr' ) ) ) . '">' . get_the_time( __( 'Y' , 'customizr' ) ) . '</a>'; else $trail[] = get_the_time( __( 'Y' , 'customizr' ) ); } } } /* If viewing search results. */ elseif ( is_search() ) { if ( is_paged() ) $trail[] = '<a href="' . get_search_link() . '" title="' . sprintf( esc_attr__( 'Search results for "%1$s"' , 'customizr' ), esc_attr( get_search_query() ) ) . '">' . sprintf( __( 'Search results for "%1$s"' , 'customizr' ), esc_attr( get_search_query() ) ) . '</a>'; else $trail[] = sprintf( __( 'Search results for "%1$s"' , 'customizr' ), esc_attr( get_search_query() ) ); } /* If viewing a 404 error page. */ elseif ( is_404() ) { $trail[] = __( '404 Not Found' , 'customizr' ); } /* Check for pagination. */ if ( $maybe_paged ) { if ( is_paged() ) $trail[] = sprintf( __( 'Page %d' , 'customizr' ), absint( get_query_var( 'paged' ) ) ); elseif ( is_singular() && 1 < get_query_var( 'page' ) ) $trail[] = sprintf( __( 'Page %d' , 'customizr' ), absint( get_query_var( 'page' ) ) ); } /* Allow devs to step in and filter the $trail array. */ return apply_filters( 'tc_breadcrumb_trail_items' , $trail, $args ); } /** * Gets the items for the breadcrumb trail if bbPress is installed. * * @since 0.5.0 * @access public * @param array $args Mixed arguments for the menu. * @return array List of items to be shown in the trail. */ function czr_fn_breadcrumb_trail_get_bbpress_items( $args = array() ) { /* Set up a new trail items array. */ $trail = array(); /* Get the forum post type object. */ $post_type_object = get_post_type_object( bbp_get_forum_post_type() ); /* If not viewing the forum root/archive page and a forum archive exists, add it. */ if ( !empty( $post_type_object->has_archive ) && !bbp_is_forum_archive() ) $trail[] = '<a href="' . get_post_type_archive_link( bbp_get_forum_post_type() ) . '">' . bbp_get_forum_archive_title() . '</a>'; /* If viewing the forum root/archive. */ if ( bbp_is_forum_archive() ) { $trail[] = bbp_get_forum_archive_title(); } /* If viewing the topics archive. */ elseif ( bbp_is_topic_archive() ) { $trail[] = bbp_get_topic_archive_title(); } /* If viewing a topic tag archive. */ elseif ( bbp_is_topic_tag() ) { $trail[] = bbp_get_topic_tag_name(); } /* If viewing a topic tag edit page. */ elseif ( bbp_is_topic_tag_edit() ) { $trail[] = '<a href="' . bbp_get_topic_tag_link() . '">' . bbp_get_topic_tag_name() . '</a>'; $trail[] = __( 'Edit' , 'customizr' ); } /* If viewing a "view" page. */ elseif ( bbp_is_single_view() ) { $trail[] = bbp_get_view_title(); } /* If viewing a single topic page. */ elseif ( bbp_is_single_topic() ) { /* Get the queried topic. */ $topic_id = get_queried_object_id(); /* Get the parent items for the topic, which would be its forum (and possibly forum grandparents). */ $trail = array_merge( $trail, $this -> czr_fn_breadcrumb_trail_get_parents( bbp_get_topic_forum_id( $topic_id ) ) ); /* If viewing a split, merge, or edit topic page, show the link back to the topic. Else, display topic title. */ if ( bbp_is_topic_split() || bbp_is_topic_merge() || bbp_is_topic_edit() ) $trail[] = '<a href="' . bbp_get_topic_permalink( $topic_id ) . '">' . bbp_get_topic_title( $topic_id ) . '</a>'; else $trail[] = bbp_get_topic_title( $topic_id ); /* If viewing a topic split page. */ if ( bbp_is_topic_split() ) $trail[] = __( 'Split' , 'customizr' ); /* If viewing a topic merge page. */ elseif ( bbp_is_topic_merge() ) $trail[] = __( 'Merge' , 'customizr' ); /* If viewing a topic edit page. */ elseif ( bbp_is_topic_edit() ) $trail[] = __( 'Edit' , 'customizr' ); } /* If viewing a single reply page. */ elseif ( bbp_is_single_reply() ) { /* Get the queried reply object ID. */ $reply_id = get_queried_object_id(); /* Get the parent items for the reply, which should be its topic. */ $trail = array_merge( $trail, $this -> czr_fn_breadcrumb_trail_get_parents( bbp_get_reply_topic_id( $reply_id ) ) ); /* If viewing a reply edit page, link back to the reply. Else, display the reply title. */ if ( bbp_is_reply_edit() ) { $trail[] = '<a href="' . bbp_get_reply_url( $reply_id ) . '">' . bbp_get_reply_title( $reply_id ) . '</a>'; $trail[] = __( 'Edit' , 'customizr' ); } else { $trail[] = bbp_get_reply_title( $reply_id ); } } /* If viewing a single forum. */ elseif ( bbp_is_single_forum() ) { /* Get the queried forum ID and its parent forum ID. */ $forum_id = get_queried_object_id(); $forum_parent_id = bbp_get_forum_parent_id( $forum_id ); /* If the forum has a parent forum, get its parent(s). */ if ( 0 !== $forum_parent_id) $trail = array_merge( $trail, $this -> czr_fn_breadcrumb_trail_get_parents( $forum_parent_id ) ); /* Add the forum title to the end of the trail. */ $trail[] = bbp_get_forum_title( $forum_id ); } /* If viewing a user page or user edit page. */ elseif ( bbp_is_single_user() || bbp_is_single_user_edit() ) { if ( bbp_is_single_user_edit() ) { $trail[] = '<a href="' . bbp_get_user_profile_url() . '">' . bbp_get_displayed_user_field( 'display_name' ) . '</a>'; $trail[] = __( 'Edit' , 'customizr' ); } else { $trail[] = bbp_get_displayed_user_field( 'display_name' ); } } /* Return the bbPress breadcrumb trail items. */ return apply_filters( 'breadcrumb_trail_get_bbpress_items' , $trail, $args ); } /** * Gets the items for the breadcrumb trail in WooCoomerce contexts * * @since 3.5.0 * @access public * @param array $args Mixed arguments for the menu. * @return array List of items to be shown in the trail. */ function czr_fn_breadcrumb_trail_get_woocommerce_items( $args = array() ) { $trail = array(); if ( ! method_exists( 'WC_Breadcrumb', 'generate' ) ) return $trail; $breadcrumbs = new WC_Breadcrumb(); $wc_trails = $breadcrumbs -> generate(); $wc_trails_length = count( $wc_trails ); if ( ! $wc_trails_length ) return $trail; //Build woocommerce breadcrumb trails //$breadcrumbx -> genenerate() returns a structure like: //array( array( Name, link) , array( Name, link)... array( Name, ) ) $_i = 1; foreach ( $wc_trails as $wc_trail ) { if ( is_array( $wc_trail ) ) { if ( ! empty ( $wc_trail[1] ) && $_i < $wc_trails_length ) $trail[] = '<a href="' . $wc_trail[1] . '" title="'. $wc_trail[0] . '">'. $wc_trail[0] .'</a>'; elseif ( isset( $wc_trail[0] ) ) $trail[] = $wc_trail[0]; } $_i++; } /* Return the WooCommerce breadcrumb trail items. */ return apply_filters( 'breadcrumb_trail_get_woocommerce_tems' , $trail, $args ); } /** * Turns %tag% from permalink structures into usable links for the breadcrumb trail. This feels kind of * hackish for now because we're checking for specific %tag% examples and only doing it for the 'post' * post type. In the future, maybe it'll handle a wider variety of possibilities, especially for custom post * types. * * @since 0.4.0 * @access public * @param int $post_id ID of the post whose parents we want. * @param string $path Path of a potential parent page. * @param array $args Mixed arguments for the menu. * @return array $trail Array of links to the post breadcrumb. */ function czr_fn_breadcrumb_trail_map_rewrite_tags( $post_id = '' , $path = '' , $args = array() ) { /* Set up an empty $trail array. */ $trail = array(); /* Make sure there's a $path and $post_id before continuing. */ if ( empty( $path ) || empty( $post_id ) ) return $trail; /* Get the post based on the post ID. */ $post = get_post( $post_id ); /* If no post is returned, an error is returned, or the post does not have a 'post' post type, return. */ if ( empty( $post ) || is_wp_error( $post ) || 'post' !== $post->post_type ) return $trail; /* Trim '/' from both sides of the $path. */ $path = trim( $path, '/' ); /* Split the $path into an array of strings. */ $matches = explode( '/' , $path ); /* If matches are found for the path. */ if ( is_array( $matches ) ) { /* Loop through each of the matches, adding each to the $trail array. */ foreach ( $matches as $match ) { /* Trim any '/' from the $match. */ $tag = trim( $match, '/' ); /* If using the %year% tag, add a link to the yearly archive. */ if ( '%year%' == $tag ) $trail[] = '<a href="' . get_year_link( get_the_time( 'Y' , $post_id ) ) . '" title="' . get_the_time( esc_attr__( 'Y' , 'customizr' ), $post_id ) . '">' . get_the_time( __( 'Y' , 'customizr' ), $post_id ) . '</a>'; /* If using the %monthnum% tag, add a link to the monthly archive. */ elseif ( '%monthnum%' == $tag ) $trail[] = '<a href="' . get_month_link( get_the_time( 'Y' , $post_id ), get_the_time( 'm' , $post_id ) ) . '" title="' . get_the_time( esc_attr__( 'F Y' , 'customizr' ), $post_id ) . '">' . get_the_time( __( 'F' , 'customizr' ), $post_id ) . '</a>'; /* If using the %day% tag, add a link to the daily archive. */ elseif ( '%day%' == $tag ) $trail[] = '<a href="' . get_day_link( get_the_time( 'Y' , $post_id ), get_the_time( 'm' , $post_id ), get_the_time( 'd' , $post_id ) ) . '" title="' . get_the_time( esc_attr__( 'F j, Y' , 'customizr' ), $post_id ) . '">' . get_the_time( __( 'd' , 'customizr' ), $post_id ) . '</a>'; /* If using the %author% tag, add a link to the post author archive. */ elseif ( '%author%' == $tag ) $trail[] = '<a href="' . get_author_posts_url( $post->post_author ) . '" title="' . esc_attr( get_the_author_meta( 'display_name' , $post->post_author ) ) . '">' . get_the_author_meta( 'display_name' , $post->post_author ) . '</a>'; /* If using the %category% tag, add a link to the first category archive to match permalinks. */ /*elseif ( '%category%' == $tag && isset($args["singular_breadcrumb_taxonomy"]) && $args["singular_breadcrumb_taxonomy"] ) { $trail = $this -> czr_fn_add_first_term_from_hierarchical_taxinomy( $trail , $post_id ); }*/ } } /* Return the $trail array. */ return $trail; } /** * Gets parent pages of any post type or taxonomy by the ID or Path. The goal of this function is to create * a clear path back to home given what would normally be a "ghost" directory. If any page matches the given * path, it'll be added. But, it's also just a way to check for a hierarchy with hierarchical post types. * * @since 0.3.0 * @access public * @param int $post_id ID of the post whose parents we want. * @param string $path Path of a potential parent page. * @return array $trail Array of parent page links. */ function czr_fn_breadcrumb_trail_get_parents( $post_id = '' , $path = '' ) { /* Set up an empty trail array. */ $trail = array(); /* Trim '/' off $path in case we just got a simple '/' instead of a real path. */ $path = trim( $path, '/' ); /* If neither a post ID nor path set, return an empty array. */ if ( empty( $post_id ) && empty( $path ) ) return $trail; /* If the post ID is empty, use the path to get the ID. */ if ( empty( $post_id ) ) { /* Get parent post by the path. */ $parent_page = get_page_by_path( $path ); /* If a parent post is found, set the $post_id variable to it. */ if ( !empty( $parent_page ) ) $post_id = $parent_page->ID; } /* If a post ID and path is set, search for a post by the given path. */ if ( $post_id == 0 && !empty( $path ) ) { /* Separate post names into separate paths by '/'. */ $path = trim( $path, '/' ); preg_match_all( "/\/.*?\z/", $path, $matches ); /* If matches are found for the path. */ if ( isset( $matches ) ) { /* Reverse the array of matches to search for posts in the proper order. */ $matches = array_reverse( $matches ); /* Loop through each of the path matches. */ foreach ( $matches as $match ) { /* If a match is found. */ if ( isset( $match[0] ) ) { /* Get the parent post by the given path. */ $path = str_replace( $match[0], '' , $path ); $parent_page = get_page_by_path( trim( $path, '/' ) ); /* If a parent post is found, set the $post_id and break out of the loop. */ if ( !empty( $parent_page ) && $parent_page->ID > 0 ) { $post_id = $parent_page->ID; break; } } } } } /* While there's a post ID, add the post link to the $parents array. */ while ( $post_id ) { /* Get the post by ID. */ $page = get_page( $post_id ); /* Add the formatted post link to the array of parents. */ $parents[$post_id] = '<a href="' . get_permalink( $post_id ) . '" title="' . esc_attr( strip_tags( get_the_title( $post_id ) ) ) . '">' . get_the_title( $post_id ) . '</a>'; /* Set the parent post's parent to the post ID. */ $post_id = $page->post_parent; } if ( ! isset( $parents ) ) return $trail; /* If we have parent posts, reverse the array to put them in the proper order for the trail. */ //get last parents arrey key = parent post id while( $el = current($parents) ) { $parent_key = key($parents); next($parents); } $first_parent_post = get_post($parent_key); $args = $this -> args; /*if ( isset($args["singular_breadcrumb_taxonomy"]) && $args["singular_breadcrumb_taxonomy"] ) $trail = $this -> czr_fn_add_first_term_from_hierarchical_taxinomy( $trail , $parent_key );*/ foreach (array_reverse($parents) as $key => $value) $trail[] = $value; /* Return the trail of parent posts. */ return $trail; } /** * Searches for term parents of hierarchical taxonomies. This function is similar to the WordPress * function get_category_parents() but handles any type of taxonomy. * * @since 0.3.0 * @access public * @param int $parent_id The ID of the first parent. * @param object|string $taxonomy The taxonomy of the term whose parents we want. * @return array $trail Array of links to parent terms. */ function czr_fn_breadcrumb_trail_get_term_parents( $parent_id = '' , $taxonomy = '' ) { /* Set up some default arrays. */ $trail = array(); $parents = array(); /* If no term parent ID or taxonomy is given, return an empty array. */ if ( empty( $parent_id ) || empty( $taxonomy ) ) return $trail; /* While there is a parent ID, add the parent term link to the $parents array. */ while ( $parent_id ) { /* Get the parent term. */ $parent = get_term( $parent_id, $taxonomy ); /* Add the formatted term link to the array of parent terms. */ $parents[] = '<a href="' . get_term_link( $parent, $taxonomy ) . '" title="' . esc_attr( $parent->name ) . '">' . $parent->name . '</a>'; /* Set the parent term's parent as the parent ID. */ $parent_id = $parent->parent; } /* If we have parent terms, reverse the array to put them in the proper order for the trail. */ if ( !empty( $parents ) ) $trail = array_reverse( $parents ); /* Return the trail of parent terms. */ return $trail; } function czr_fn_add_first_term_from_hierarchical_taxinomy( $trail , $post_id ) { // get post by post id $post = get_post( $post_id ); // get post type by post $post_type = $post->post_type; // get post type taxonomies $taxonomies = get_object_taxonomies( $post_type, 'objects' ); $first_hierarchical_tax = array(); foreach ($taxonomies as $key => $data) { if ( true != $data -> hierarchical && ! empty($first_hierarchical_tax) ) continue; else $first_hierarchical_tax = (true == $data -> hierarchical) ? $data : $first_hierarchical_tax; } //does nothing if no hierarchical tax was found if ( empty($first_hierarchical_tax) ) return $trail; //get the tax terms $terms = isset($first_hierarchical_tax -> name) ? get_the_terms( $post_id ,$first_hierarchical_tax -> name ) : false; //does nothing if no terms was found if ( ! $terms || empty($terms) ) return $trail; //get the first tax term of the list $first_term = array_shift($terms); // If the taxonomy term has a parent, add the hierarchy to the trail. if ( 0 !== $first_term -> parent ) $trail = array_merge( $trail, $this -> czr_fn_breadcrumb_trail_get_term_parents( $first_term -> parent , $first_hierarchical_tax -> name ) ); //Add the taxonomy term archive link to the trail. $trail[] = '<a href="' . get_term_link( $first_term, $first_hierarchical_tax -> name ) . '" title="' . esc_attr( $first_term->name ) . '">' . $first_term->name . '</a>'; return $trail; }//end function }//end of class ?><?php /** * Comments actions * * */ if ( ! class_exists( 'CZR_comments' ) ) : class CZR_comments { static $instance; function __construct () { self::$instance =& $this; //wp hook => wp_query is built add_action ( 'wp' , array( $this , 'czr_fn_comments_set_hooks' ) ); //! tc_user_options_style filter is shared by several classes => must always check the local context inside the callback before appending new css //fired on hook : wp_enqueue_scripts //Set thumbnail specific design based on user options //Set user defined various inline stylings add_filter( 'tc_user_options_style' , array( $this , 'czr_fn_comment_bubble_inline_css' ) ); } /*************************** * HOOK SETUP ****************************/ /** * Set various comment hooks * hook : wp * @package Customizr * @since Customizr 3.3.2 */ function czr_fn_comments_set_hooks() { //Maybe fires the comment's template add_action ( '__after_loop' , array( $this , 'czr_fn_comments' ), 10 ); //Apply a filter on the comment list ( comment list user defined option ) //the filter tc_display_comment_list is fired in the comments.php template add_filter( 'tc_display_comment_list' , array( $this , 'czr_fn_set_comment_list_display' ) ); //Add actions in the comment's template add_action ( '__comment' , array( $this , 'czr_fn_comment_title' ), 10 ); add_action ( '__comment' , array( $this , 'czr_fn_comment_list' ), 20 ); add_action ( '__comment' , array( $this , 'czr_fn_comment_navigation' ), 30 ); add_action ( '__comment' , array( $this , 'czr_fn_comment_close' ), 40 ); add_filter ( 'comment_form_defaults' , array( $this , 'czr_fn_set_comment_title') ); //Add comment bubble add_filter( 'tc_the_title' , array( $this , 'czr_fn_display_comment_bubble' ), 1 ); //Custom Bubble comment since 3.2.6 add_filter( 'tc_bubble_comment' , array( $this , 'czr_fn_custom_bubble_comment'), 10, 2 ); } /*************************** * VIEWS ****************************/ /** * Main commments template * * @package Customizr * @since Customizr 3.0.10 */ function czr_fn_comments() { if ( ! $this -> czr_fn_are_comments_enabled() ) return; do_action('tc_before_comments_template'); comments_template( '' , true ); do_action('tc_after_comments_template'); } /** * Comment title rendering * * * @package Customizr * @since Customizr 3.0 */ function czr_fn_comment_title() { if ( 1 == get_comments_number() ) { $_title = __( 'One thought on', 'customizr' ); } else { $_title = sprintf( '%1$s %2$s', number_format_i18n( get_comments_number(), 'customizr' ) , __( 'thoughts on', 'customizr' ) ); } echo apply_filters( 'tc_comment_title' , sprintf( '<h2 id="tc-comment-title" class="comments-title">%1$s “%2$s”</h2>' , $_title, '<span>' . get_the_title() . '</span>' ) ); } /** * Comment list Rendering * * @package Customizr * @since Customizr 3.0 */ function czr_fn_comment_list() { $_args = apply_filters( 'tc_list_comments_args' , array( 'callback' => array ( $this , 'czr_fn_comment_callback' ) , 'style' => 'ul' ) ); ob_start(); ?> <ul class="commentlist"> <?php wp_list_comments( $_args ); ?> </ul><!-- .commentlist --> <?php $html = ob_get_contents(); if ($html) ob_end_clean(); echo apply_filters( 'tc_comment_list' , $html ); } /** * Template for comments and pingbacks. * * * Used as a callback by wp_list_comments() for displaying the comments. * Inspired from Twenty Twelve 1.0 * @package Customizr * @since Customizr 1.0 */ function czr_fn_comment_callback( $comment, $args, $depth ) { $GLOBALS['comment'] = $comment; //get user defined max comment depth $max_comments_depth = get_option('thread_comments_depth'); $max_comments_depth = isset( $max_comments_depth ) ? $max_comments_depth : 5; ob_start(); switch ( $comment->comment_type ) : case 'pingback' : case 'trackback' : // Display trackbacks differently than normal comments. ?> <li <?php comment_class(); ?> id="comment-<?php comment_ID(); ?>"> <article id="comment-<?php comment_ID(); ?>" class="comment"> <p><?php _e( 'Pingback:' , 'customizr' ); ?> <?php comment_author_link(); ?> <?php if ( ! czr_fn_is_customizing() ) edit_comment_link( __( '(Edit)' , 'customizr' ), '<span class="edit-link btn btn-success btn-mini">' , '</span>' ); ?> </p> </article> <?php break; default : // Proceed with normal comments. global $post; ?> <li <?php comment_class(); ?> id="li-comment-<?php comment_ID(); ?>"> <?php //when do we display the comment content? $tc_show_comment_content = 1 == get_option( 'thread_comments' ) && ($depth < $max_comments_depth) && comments_open(); //gets the comment text => filter parameter! $comment_text = get_comment_text( $comment->comment_ID , $args ); printf('<article id="comment-%9$s" class="comment"><div class="%1$s"><div class="%2$s">%3$s</div><div class="%4$s">%5$s %6$s %7$s %8$s</div></div></article>', apply_filters( 'tc_comment_wrapper_class', 'row-fluid' ), apply_filters( 'tc_comment_avatar_class', 'comment-avatar span2' ), get_avatar( $comment, apply_filters( 'tc_comment_avatar_size', 80 ) ), apply_filters( 'tc_comment_content_class', 'span10' ), $tc_show_comment_content ? sprintf('<div class="%1$s">%2$s</div>', apply_filters( 'tc_comment_reply_btn_class', 'reply btn btn-small' ), get_comment_reply_link( array_merge( $args, array( 'reply_text' => __( 'Reply' , 'customizr' ).' <span>↓</span>', 'depth' => $depth, 'max_depth' => $args['max_depth'] , 'add_below' => apply_filters( 'tc_comment_reply_below' , 'comment' ) ) ) ) ) : '', sprintf('<header class="comment-meta comment-author vcard">%1$s %2$s</header>', sprintf( '<cite class="fn">%1$s %2$s %3$s</cite>' , get_comment_author_link(), // If current post author is also comment author, make it known visually. ( $comment->user_id === $post->post_author ) ? '<span> ' . __( 'Post author' , 'customizr' ) . '</span>' : '' , ! czr_fn_is_customizing() && current_user_can( 'edit_comment', $comment->comment_ID ) ? '<p class="edit-link btn btn-success btn-mini"><a class="comment-edit-link" href="' . get_edit_comment_link( $comment->comment_ID ) . '">' . __( 'Edit' , 'customizr' ) . '</a></p>' : '' ), sprintf( '<a class="comment-date" href="%1$s"><time datetime="%2$s">%3$s</time></a>' , esc_url( get_comment_link( $comment->comment_ID ) ), get_comment_time( 'c' ), /* translators: 1: date, 2: time */ sprintf( __( '%1$s at %2$s' , 'customizr' ), get_comment_date(), get_comment_time() ) ) ), ( '0' == $comment->comment_approved ) ? sprintf('<p class="comment-awaiting-moderation">%1$s</p>', __( 'Your comment is awaiting moderation.' , 'customizr' ) ) : '', sprintf('<section class="comment-content comment">%1$s</section>', apply_filters( 'comment_text', $comment_text, $comment, $args ) ), $comment->comment_ID );//end printf ?> <!-- //#comment-## --> <?php break; endswitch; // end comment_type check $html = ob_get_contents(); if ($html) ob_end_clean(); echo apply_filters( 'tc_comment_callback' , $html, $comment, $args, $depth, $max_comments_depth ); } /** * Comments navigation rendering * * @package Customizr * @since Customizr 3.0 */ function czr_fn_comment_navigation () { if ( get_comment_pages_count() > 1 && get_option( 'page_comments' ) ) : // are there comments to navigate through ob_start(); ?> <nav id="comment-nav-below" class="navigation"> <h3 class="assistive-text section-heading"><?php _e( 'Comment navigation' , 'customizr' ); ?></h3> <ul class="pager"> <?php if(get_previous_comments_link() != null) : ?> <li class="previous"> <span class="nav-previous"><?php previous_comments_link( __( '<span class="meta-nav">←</span> Older Comments' , 'customizr' ) ); ?></span> </li> <?php endif; ?> <?php if(get_next_comments_link() != null) : ?> <li class="next"> <span class="nav-next"><?php next_comments_link( __( 'Newer Comments <span class="meta-nav">→</span>' , 'customizr' ) ); ?></span> </li> <?php endif; ?> </ul> </nav> <?php $html = ob_get_contents(); ob_end_clean(); echo apply_filters( 'tc_comment_navigation' , $html ); endif; // check for comment navigation } /** * Comment close rendering * * @package Customizr * @since Customizr 3.0 */ function czr_fn_comment_close() { /* If there are no comments and comments are closed, let's leave a note. * But we only want the note on posts and pages that had comments in the first place. */ if ( ! comments_open() && get_comments_number() ) : echo apply_filters( 'tc_comment_close' , sprintf('<p class="nocomments">%1$s</p>', __( 'Comments are closed.' , 'customizr' ) ) ); endif; } /*************************** * CALLBACKS ****************************/ /** * Do we display the comment list ? * hook : tc_display_comment_list * @return bool * * @package Customizr * @since Customizr 3.3+ */ function czr_fn_set_comment_list_display() { return (bool) esc_attr( czr_fn_opt( 'tc_show_comment_list' ) ); } /** * Comment title override (comment_form_defaults filter) * * @package Customizr * @since Customizr 3.2.0 */ function czr_fn_set_comment_title($_defaults) { $_defaults['title_reply'] = __( 'Leave a comment' , 'customizr' ); return $_defaults; } /** * Callback for tc_the_title * @return string * * @package Customizr * @since Customizr 3.2.6 */ function czr_fn_display_comment_bubble( $_title = null ) { if ( ! $this -> czr_fn_is_bubble_enabled() ) return $_title; global $post; //checks if comments are opened AND if there are any comments to display return sprintf('%1$s <span class="comments-link"><a href="%2$s%3$s" title="%4$s %5$s" data-disqus-identifier="javascript:this.page.identifier">%6$s</a></span>', $_title, is_singular() ? '' : get_permalink(), apply_filters( 'tc_bubble_comment_anchor', '#tc-comment-title'), sprintf( '%1$s %2$s' , get_comments_number(), __( 'Comment(s) on' , 'customizr' ) ), is_null($_title) ? esc_attr( strip_tags( $post -> post_title ) ) : esc_attr( strip_tags( $_title ) ), 0 != get_comments_number() ? apply_filters( 'tc_bubble_comment' , '' , esc_attr( czr_fn_opt( 'tc_comment_bubble_shape' ) ) ) : '' ); } /** * Callback of tc_bubble_comment * @return string * * @package Customizr * @since Customizr 3.2.6 */ function czr_fn_custom_bubble_comment( $_html , $_opt ) { return sprintf('%4$s<span class="tc-comment-bubble %1$s">%2$s %3$s</span>', 'default' == $_opt ? "default-bubble" : $_opt, get_comments_number(), 'default' == $_opt ? '' : sprintf( _n( 'comment' , 'comments' , get_comments_number(), 'customizr' ), number_format_i18n( get_comments_number(), 'customizr' ) ), $_html ); } /* * Callback of tc_user_options_style hook * @return css string * * @package Customizr * @since Customizr 3.3.2 */ function czr_fn_comment_bubble_inline_css( $_css ) { if ( 0 == czr_fn_opt( 'tc_comment_show_bubble' ) ) return $_css; $_bubble_color_type = esc_attr( czr_fn_opt( 'tc_comment_bubble_color_type' ) ); $_custom_bubble_color = esc_attr( czr_fn_opt( 'tc_comment_bubble_color' ) ); $_bubble_shape = esc_attr( czr_fn_opt( 'tc_comment_bubble_shape' ) ); //apply custom color only if type custom //if color type is skin => bubble color is defined in the skin stylesheet if ( 'skin' != $_bubble_color_type ) { $_border_before_color = 'default' == $_bubble_shape ? $_custom_bubble_color : "{$_custom_bubble_color} rgba(0, 0, 0, 0)"; $_css .= " .comments-link .tc-comment-bubble { color: {$_custom_bubble_color}; border: 2px solid {$_custom_bubble_color}; } .comments-link .tc-comment-bubble:before { border-color: {$_border_before_color}; } "; } if ( 'default' == $_bubble_shape ) return $_css; $_css .= " .comments-link .custom-bubble-one { position: relative; bottom: 28px; right: 10px; padding: 4px; margin: 1em 0 3em; background: none; -webkit-border-radius: 10px; -moz-border-radius: 10px; border-radius: 10px; font-size: 10px; } .comments-link .custom-bubble-one:before { content: ''; position: absolute; bottom: -14px; left: 10px; border-width: 14px 8px 0; border-style: solid; display: block; width: 0; } .comments-link .custom-bubble-one:after { content: ''; position: absolute; bottom: -11px; left: 11px; border-width: 13px 7px 0; border-style: solid; border-color: #FAFAFA rgba(0, 0, 0, 0); display: block; width: 0; }\n"; return $_css; }//end of fn /*************************** * HELPERS ****************************/ /** * 1) if the page / post is password protected OR if is_home OR ! is_singular() => false * 2) if comment_status == 'closed' => false * 3) if user defined comment option in customizer == false => false * * By default, comments are globally disabled in pages and enabled in posts * * @return boolean * * @package Customizr * @since Customizr 3.3+ */ private function czr_fn_are_comments_enabled() { global $post; // 1) By default not displayed on home, for protected posts, and if no comments for page option is checked if ( isset( $post ) ) { $_bool = ( post_password_required() || czr_fn__f( '__is_home' ) || ! is_singular() ) ? false : true; //2) if user has enabled comment for this specific post / page => true $_bool = ( 'closed' != $post -> comment_status ) ? true : $_bool; //3) check global user options for pages and posts if ( is_page() ) { $_bool = 1 == esc_attr( czr_fn_opt( 'tc_page_comments' )) && $_bool; } else { $_bool = 1 == esc_attr( czr_fn_opt( 'tc_post_comments' )) && $_bool; } } else { $_bool = false; } return apply_filters( 'tc_are_comments_enabled', $_bool ); } /** * When are we displaying the comment bubble ? * - Must be in the loop * - Bubble must be enabled by user * - comments are enabled * - there is at least one comment * - the comment list option is enabled * - post type is in the eligible post type list : default = post * - tc_comments_in_title boolean filter is true * * @return boolean * * @package Customizr * @since Customizr 3.3+ */ private function czr_fn_is_bubble_enabled() { $_bool_arr = array( in_the_loop(), (bool) esc_attr( czr_fn_opt( 'tc_comment_show_bubble' ) ), $this -> czr_fn_are_comments_enabled(), get_comments_number() != 0, (bool) esc_attr( czr_fn_opt( 'tc_show_comment_list' ) ), (bool) apply_filters( 'tc_comments_in_title', true ), in_array( get_post_type(), apply_filters('tc_show_comment_bubbles_for_post_types' , array( 'post' , 'page') ) ) ); return (bool) array_product($_bool_arr); } }//end class endif; ?><?php /** * Featured pages actions * */ if ( ! class_exists( 'CZR_featured_pages' ) ) : class CZR_featured_pages { static $instance; function __construct () { self::$instance =& $this; add_action( '__before_main_container' , array( $this , 'czr_fn_fp_block_display'), 10 ); } /****************************** * FP WRAPPER VIEW *******************************/ /** * The template displaying the front page featured page block. * hook : __before_main_container * * @package Customizr * @since Customizr 3.0 */ function czr_fn_fp_block_display() { if ( ! $this -> czr_fn_show_featured_pages() ) return; $tc_show_featured_pages_img = $this -> czr_fn_show_featured_pages_img(); //gets the featured pages array and sets the fp layout $fp_ids = apply_filters( 'tc_featured_pages_ids' , CZR___::$instance -> fp_ids); $fp_nb = count($fp_ids); $fp_per_row = apply_filters( 'tc_fp_per_line', 3 ); //defines the span class $span_array = array( 1 => 12, 2 => 6, 3 => 4, 4 => 3, 5 => 2, 6 => 2, 7 => 2 ); $span_value = 4; $span_value = ( $fp_per_row > 7) ? 1 : $span_value; $span_value = isset( $span_array[$fp_per_row] ) ? $span_array[$fp_per_row] : $span_value; //save $args for filter $args = array($fp_ids, $fp_nb, $fp_per_row, $span_value); //force first attachments as thumb in static front page //see: https://github.com/presscustomizr/customizr/issues/936 add_filter( 'tc_use_attachment_as_thumb', '__return_true', 100 ); add_filter( 'tc_fp_text', 'do_shortcode' ); ?> <?php ob_start(); ?> <div class="container marketing"> <?php do_action ('__before_fp') ; $j = 1; for ($i = 1; $i <= $fp_nb ; $i++ ) { printf('%1$s<div class="span%2$s fp-%3$s">%4$s</div>%5$s', ( 1 == $j ) ? sprintf('<div class="%1$s" role="complementary">', implode(" " , apply_filters( 'tc_fp_widget_area' , array( 'row' , 'widget-area' ) ) ) ) : '', $span_value, $fp_ids[$i - 1], $this -> czr_fn_fp_single_display( $fp_ids[$i - 1] , $tc_show_featured_pages_img ), ( $j == $fp_per_row || $i == $fp_nb ) ? '</div>' : '' ); //set $j back to start value if reach $fp_per_row $j++; $j = ($j == ($fp_per_row + 1)) ? 1 : $j; } do_action ('__after_fp') ; ?> </div><!-- .container --> <?php echo ! czr_fn__f( '__is_home_empty') ? apply_filters( 'tc_after_fp_separator', '<hr class="featurette-divider '.current_filter().'">' ) : ''; ?> <?php $html = ob_get_contents(); if ($html) ob_end_clean(); //remove forcing first attachments as thumb in static front page //see: https://github.com/presscustomizr/customizr/issues/936 remove_filter( 'tc_use_attachment_as_thumb', '__return_true', 100 ); remove_filter( 'tc_fp_text', 'do_shortcode' ); echo apply_filters( 'tc_fp_block_display' , $html, $args ); } /****************************** * SINGLE FP VIEW *******************************/ /** * The template displaying one single featured page * fired in : czr_fn_fp_block_display() * * @package Customizr * @since Customizr 3.0 * @param area are defined in featured-pages templates,show_img is a customizer option * @todo better area definition : dynamic */ function czr_fn_fp_single_display( $fp_single_id,$show_img) { $_skin_color = CZR_utils::$inst -> czr_fn_get_skin_color(); $fp_holder_img = apply_filters ( 'tc_fp_holder_img' , sprintf('<img class="tc-holder-img" data-src="holder.js/270x250/%1$s:%2$s" data-no-retina alt="Holder Thumbnail" style="width:270px;height:250px;"/>', ( '#E4E4E4' != $_skin_color ) ? '#EEE' : '#5A5A5A', $_skin_color ) ); $featured_page_id = 0; //if fps are not set if ( null == czr_fn_opt( 'tc_featured_page_'.$fp_single_id ) || ! czr_fn_opt( 'tc_featured_page_'.$fp_single_id ) ) { //admin link if user logged in $featured_page_link = ''; $customizr_link = ''; if ( ! czr_fn_is_customizing() && is_user_logged_in() && current_user_can('edit_theme_options') ) { $customizr_link = sprintf( '<a href="%1$s" title="%2$s">%3$s</a>', czr_fn_get_customizer_url( array( 'control' => 'tc_featured_text_'.$fp_single_id, 'section' => 'frontpage_sec') ), __( 'Customizer screen' , 'customizr' ), __( 'Edit now.' , 'customizr' ) ); } $featured_page_link = apply_filters( 'tc_fp_link_url', czr_fn_get_customizer_url( array( 'control' => 'tc_featured_page_'.$fp_single_id, 'section' => 'frontpage_sec') ) ); //rendering $featured_page_id = null; $featured_page_title = apply_filters( 'tc_fp_title', __( 'Featured page' , 'customizr' ), $fp_single_id, $featured_page_id); $text = apply_filters( 'tc_fp_text', sprintf( '%1$s %2$s', __( 'Featured page description text : use the page excerpt or set your own custom text in the customizer screen.' , 'customizr' ), $customizr_link ), $fp_single_id, $featured_page_id ); $fp_img = apply_filters ('fp_img_src' , $fp_holder_img, $fp_single_id , $featured_page_id ); } else { $featured_page_id = apply_filters( 'tc_fp_id', esc_attr( czr_fn_opt( 'tc_featured_page_'.$fp_single_id) ), $fp_single_id ); $featured_page_link = apply_filters( 'tc_fp_link_url', get_permalink( $featured_page_id ), $fp_single_id ); $featured_page_title = apply_filters( 'tc_fp_title', get_the_title( $featured_page_id ), $fp_single_id, $featured_page_id ); $edit_enabled = false; //when are we displaying the edit link? //never display when customizing if ( ! czr_fn_is_customizing() ) { $edit_enabled = ( (is_user_logged_in()) && current_user_can('edit_pages') && is_page( $featured_page_id ) ) ? true : $edit_enabled; $edit_enabled = ( (is_user_logged_in()) && current_user_can('edit_post' , $featured_page_id ) && ! is_page( $featured_page_id ) ) ? true : $edit_enabled; } $edit_enabled = apply_filters( 'tc_edit_in_fp_title', $edit_enabled ); $featured_text = apply_filters( 'tc_fp_text', czr_fn_opt( 'tc_featured_text_'.$fp_single_id ), $fp_single_id, $featured_page_id ); $featured_text = apply_filters( 'tc_fp_text_sanitize', strip_tags( html_entity_decode( $featured_text ) ), $fp_single_id, $featured_page_id ); //get the page/post object $page = get_post($featured_page_id); //set page excerpt as default text if no $featured_text $text = ( empty($featured_text) && !post_password_required($featured_page_id) ) ? strip_tags(apply_filters( 'the_content' , $page->post_excerpt )) : $featured_text ; $text = ( empty($text) && !post_password_required($featured_page_id) ) ? strip_tags(apply_filters( 'the_content' , $page->post_content )) : $text ; //limit text to 200 car $default_fp_text_length = apply_filters( 'tc_fp_text_length', 200, $fp_single_id, $featured_page_id ); $text = czr_fn_text_truncate( $text, $default_fp_text_length, $more = '...', $strip_tags = false ); //tags already stripped //set the image : uses thumbnail if any then >> the first attached image then >> a holder script $fp_img_size = apply_filters( 'tc_fp_img_size' , 'tc-thumb', $fp_single_id, $featured_page_id ); //allow user to specify a custom image id $fp_custom_img_id = apply_filters( 'fp_img_id', null , $fp_single_id , $featured_page_id ); $fp_img = $this -> czr_fn_get_fp_img( $fp_img_size, $featured_page_id, $fp_custom_img_id); $fp_img = $fp_img ? $fp_img : $fp_holder_img; $fp_img = apply_filters ('fp_img_src' , $fp_img , $fp_single_id , $featured_page_id ); }//end if //Let's render this ob_start(); ?> <div class="widget-front"> <?php if ( isset( $show_img) && $show_img == 1 ) { //check if image option is checked printf('<div class="thumb-wrapper %1$s">%2$s%3$s</div>', ( $fp_img == $fp_holder_img ) ? 'tc-holder' : '', apply_filters('tc_fp_round_div' , sprintf('<a class="round-div" href="%1$s"></a>', $featured_page_link ) , $fp_single_id, $featured_page_id ), $fp_img ); }//end if image enabled check //title block $tc_fp_title_block = sprintf('<%1$s>%2$s %3$s</%1$s>', apply_filters( 'tc_fp_title_tag' , 'h2', $fp_single_id, $featured_page_id ), $featured_page_title, ( isset($edit_enabled) && $edit_enabled )? sprintf('<span class="edit-link btn btn-inverse btn-mini"><a class="post-edit-link" href="%1$s" title="%2$s" target="_blank">%2$s</a></span>', get_edit_post_link($featured_page_id), __( 'Edit' , 'customizr' ) ) : '' ); echo apply_filters( 'tc_fp_title_block' , $tc_fp_title_block , $featured_page_title , $fp_single_id, $featured_page_id ); //text block $tc_fp_text_block = sprintf('<p class="fp-text-%1$s">%2$s</p>', $fp_single_id, $text ); echo apply_filters( 'tc_fp_text_block' , $tc_fp_text_block , $fp_single_id , $text, $featured_page_id); //button block $tc_fp_button_text = apply_filters( 'tc_fp_button_text' , esc_attr( czr_fn_opt( 'tc_featured_page_button_text') ) , $fp_single_id ); if ( $tc_fp_button_text || czr_fn_is_customizing() ){ $tc_fp_button_class = apply_filters( 'tc_fp_button_class' , 'btn btn-primary fp-button', $fp_single_id ); $tc_fp_button_class = $tc_fp_button_text ? $tc_fp_button_class : $tc_fp_button_class . ' hidden'; $tc_fp_button_block = sprintf('<a class="%1$s" href="%2$s">%3$s</a>', $tc_fp_button_class, $featured_page_link, $tc_fp_button_text ); echo apply_filters( 'tc_fp_button_block' , $tc_fp_button_block , $featured_page_link , $featured_page_title , $fp_single_id, $featured_page_id ); } ?> </div><!-- /.widget-front --> <?php $html = ob_get_contents(); if ($html) ob_end_clean(); return apply_filters( 'tc_fp_single_display' , $html, $fp_single_id, $show_img, $fp_img, $featured_page_link, $featured_page_title, $text, $featured_page_id ); }//end of function /****************************** * HELPERS *******************************/ function czr_fn_get_fp_img( $fp_img_size, $featured_page_id = null , $fp_custom_img_id = null ){ //try to get "tc_thumb" , "tc_thumb_height" , "tc_thumb_width" //czr_fn_get_thumbnail_model( $requested_size = null, $_post_id = null , $_thumb_id = null ) $_fp_img_model = CZR_post_thumbnails::$instance -> czr_fn_get_thumbnail_model( $fp_img_size, $featured_page_id, $fp_custom_img_id ); //finally we define a default holder if no thumbnail found or page is protected if ( isset( $_fp_img_model["tc_thumb"]) && ! empty( $_fp_img_model["tc_thumb"] ) && ! post_password_required( $featured_page_id ) ) $fp_img = $_fp_img_model["tc_thumb"]; else $fp_img = false; return $fp_img; } function czr_fn_show_featured_pages() { //gets display fp option return apply_filters( 'tc_show_fp', czr_fn_is_checked( 'tc_show_featured_pages' ) && czr_fn__f('__is_home') ); } function czr_fn_show_featured_pages_img() { //gets display img option return apply_filters( 'tc_show_featured_pages_img', esc_attr( czr_fn_opt( 'tc_show_featured_pages_img' ) ) ); } }//end of class endif; ?><?php /** * Gallery content filters * */ if ( ! class_exists( 'CZR_gallery' ) ) : class CZR_gallery { static $instance; function __construct () { self::$instance =& $this; add_filter ( 'tc_article_container_class' , array( $this, 'czr_fn_add_gallery_class' ), 20 ); //adds a filter for link markup (allow lightbox) add_filter ( 'wp_get_attachment_link' , array( $this, 'czr_fn_modify_attachment_link') , 20, 6 ); } /** * * Add a class to the article-container to apply Customizr galleries on hover effects * * @package Customizr * @since Customizr 3.3.21 * */ function czr_fn_add_gallery_class( $_classes ){ if ( $this -> czr_fn_is_gallery_enabled() && apply_filters( 'tc_gallery_style', esc_attr( czr_fn_opt( 'tc_gallery_style' ) ) ) ) array_push($_classes, 'tc-gallery-style'); return $_classes; } /** * Add an optional rel="tc-fancybox[]" attribute to all images embedded in a post gallery * Based on the original WP function * @package Customizr * @since Customizr 3.0.5 * */ function czr_fn_modify_attachment_link( $markup, $id, $size, $permalink, $icon, $text ) { if ( ! $this -> czr_fn_is_gallery_enabled() ) return $markup; $tc_gallery_fancybox = apply_filters( 'tc_gallery_fancybox', esc_attr( czr_fn_opt( 'tc_gallery_fancybox' ) ) , $id ); if ( $tc_gallery_fancybox == 1 && $permalink == false ) //add the filter only if link to the attachment file/image { $id = intval( $id ); $_post = get_post( $id ); if ( empty( $_post ) || ( 'attachment' != $_post->post_type ) || ! $url = wp_get_attachment_url( $_post->ID ) ) return __( 'Missing Attachment' , 'customizr'); if ( $permalink ) $url = get_attachment_link( $_post->ID ); $post_title = esc_attr( $_post->post_title ); if ( $text ) $link_text = $text; elseif ( $size && 'none' != $size ) $link_text = wp_get_attachment_image( $id, $size, $icon ); else $link_text = ''; if ( trim( $link_text ) == '' ) $link_text = $_post->post_title; $markup = '<a class="grouped_elements" rel="tc-fancybox-group" href="'.$url.'" title="'.$post_title.'">'.$link_text.'</a>'; } return $markup; } /* * HELPERS */ function czr_fn_is_gallery_enabled(){ return apply_filters('tc_enable_gallery', esc_attr( czr_fn_opt('tc_enable_gallery') ) ); } }//end of class endif; ?><?php /** * Headings actions * */ if ( ! class_exists( 'CZR_headings' ) ) : class CZR_headings { static $instance; function __construct () { self::$instance =& $this; //set actions and filters for posts and page headings add_action( 'template_redirect' , array( $this , 'czr_fn_set_post_page_heading_hooks') ); //set actions and filters for archives headings add_action( 'template_redirect' , array( $this , 'czr_fn_set_archives_heading_hooks') ); //Set headings user options add_action( 'template_redirect' , array( $this , 'czr_fn_set_headings_options') ); } /****************************************** * HOOK SETTINGS *************************** ******************************************/ /** * @return void * set up hooks for archives headings * hook : template_redirect * * @package Customizr * @since Customizr 3.2.6 */ function czr_fn_set_archives_heading_hooks() { //is there anything to render in the current context //by default don't display the Customizr title in feeds if ( apply_filters('tc_display_customizr_headings', ! $this -> czr_fn_archive_title_and_class_callback() || is_feed() ) ) return; //Headings for archives, authors, search, 404 add_action ( '__before_loop' , array( $this , 'czr_fn_render_headings_view' ) ); //Set archive icon with customizer options (since 3.2.0) add_filter ( 'tc_archive_icon' , array( $this , 'czr_fn_set_archive_icon' ) ); add_filter( 'tc_archive_header_class' , array( $this , 'czr_fn_archive_title_and_class_callback'), 10, 2 ); add_filter( 'tc_headings_archive_html' , array( $this , 'czr_fn_archive_title_and_class_callback'), 10, 1 ); global $wp_query; if ( czr_fn__f('__is_home') ) add_filter( 'tc_archive_headings_separator' , '__return_false' ); } /** * @return void * set up hooks for post and page headings * callback of template_redirect * * @package Customizr * @since Customizr 3.2.6 */ function czr_fn_set_post_page_heading_hooks() { //by default don't display the Customizr title of the front page and in feeds if ( apply_filters('tc_display_customizr_headings', ( is_front_page() && 'page' == get_option( 'show_on_front' ) ) ) || is_feed() ) return; //Set single post/page icon with customizer options (since 3.2.0) add_filter ( 'tc_content_title_icon' , array( $this , 'czr_fn_set_post_page_icon' ) ); //Prepare the headings for post, page, attachment add_action ( '__before_content' , array( $this , 'czr_fn_render_headings_view' ) ); //Populate heading with default content add_filter ( 'tc_headings_content_html' , array( $this , 'czr_fn_post_page_title_callback'), 10 ); //Create the Customizr title add_filter( 'tc_the_title' , array( $this , 'czr_fn_content_heading_title' ) , 0 ); //Add edit link add_filter( 'tc_the_title' , array( $this , 'czr_fn_add_edit_link_after_title' ), 2 ); //Set user defined archive titles add_filter( 'tc_category_archive_title' , array( $this , 'czr_fn_set_archive_custom_title' ) ); add_filter( 'tc_tag_archive_title' , array( $this , 'czr_fn_set_archive_custom_title' ) ); add_filter( 'tc_search_results_title' , array( $this , 'czr_fn_set_archive_custom_title' ) ); add_filter( 'tc_author_archive_title' , array( $this , 'czr_fn_set_archive_custom_title' ) ); //SOME DEFAULT OPTIONS //No hr if not singular if ( ! is_singular() ) add_filter( 'tc_content_headings_separator' , '__return_false' ); //No headings for some post formats add_filter( 'tc_headings_content_html' , array( $this, 'czr_fn_post_formats_heading') , 100 ); } /****************************************** * VIEWS *********************************** ******************************************/ /** * Generic heading view : archives, author, search, 404 and the post page heading (if not font page) * This is the place where every heading content blocks are hooked * hook : __before_content AND __before_loop (for post lists) * * @package Customizr * @since Customizr 3.1.0 */ function czr_fn_render_headings_view() { $_heading_type = in_the_loop() ? 'content' : 'archive'; ob_start(); ?> <header class="<?php echo implode( ' ' , apply_filters( "tc_{$_heading_type}_header_class", array('entry-header'), $_return_class = true ) ); ?>"> <?php do_action( "__before_{$_heading_type}_title" ); echo apply_filters( "tc_headings_{$_heading_type}_html", ''); do_action( "__after_{$_heading_type}_title" ); echo apply_filters( "tc_{$_heading_type}_headings_separator", '<hr class="featurette-divider '.current_filter(). '">' ); ?> </header> <?php $html = ob_get_contents(); if ($html) ob_end_clean(); echo apply_filters( 'tc_render_headings_view', $html ); }//end of function /****************************************** * HELPERS / SETTERS / CALLBACKS *********** ******************************************/ /** * @return string or boolean * Returns the heading html content or false * callback of tc_headings_{$_heading_type}_html where $_heading_type = content when in the loop * * @package Customizr * @since Customizr 3.2.9 */ function czr_fn_post_formats_heading( $_html ) { if( in_array( get_post_format(), apply_filters( 'tc_post_formats_with_no_heading', CZR_init::$instance -> post_formats_with_no_heading ) ) ) return; return $_html; } /** * Callback for tc_headings_content_html * @return string * * @package Customizr * @since Customizr 3.2.6 */ function czr_fn_post_page_title_callback() { $_title = apply_filters( 'tc_title_text', get_the_title() ); return sprintf('<%1$s class="entry-title %2$s">%3$s</%1$s>', apply_filters( 'tc_content_title_tag' , is_singular() ? 'h1' : 'h2' ), apply_filters( 'tc_content_title_icon', 'format-icon' ), apply_filters( 'tc_the_title', $_title ) ); } /** * Callback for tc_the_title * @return string * * @package Customizr * @since Customizr 3.2.6 */ function czr_fn_content_heading_title( $_title ) { //Must be in the loop if ( ! in_the_loop() ) return $_title; //gets the post/page title if ( is_singular() || ! apply_filters('tc_display_link_for_post_titles' , true ) ) return is_null($_title) ? apply_filters( 'tc_no_title_post', __( '{no title} Read the post »' , 'customizr' ) ) : $_title; else return sprintf('<a href="%1$s" rel="bookmark">%2$s</a>', get_permalink(), is_null($_title) ? apply_filters( 'tc_no_title_post', __( '{no title} Read the post »' , 'customizr' ) ) : $_title );//end sprintf } /** * Callback for tc_the_title * @return string * * @package Customizr * @since Customizr 3.2.6 */ function czr_fn_add_edit_link_after_title( $_title ) { //Must be in the loop if ( ! in_the_loop() ) return $_title; if ( ! apply_filters( 'tc_edit_in_title', $this -> czr_fn_is_edit_enabled() ) ) return $_title; return sprintf('%1$s %2$s', $_title, $this -> czr_fn_render_edit_link_view( $_echo = false ) ); } /** * Helper Boolean * @return boolean * @package Customizr * @since Customizr 3.3+ */ public function czr_fn_is_edit_enabled() { //never display when customizing if ( czr_fn_is_customizing() ) return false; //when are we displaying the edit link? $edit_enabled = ( (is_user_logged_in()) && is_page() && current_user_can('edit_pages') ) ? true : false; return ( (is_user_logged_in()) && 0 !== get_the_ID() && current_user_can('edit_post' , get_the_ID() ) && ! is_page() ) ? true : $edit_enabled; } /** * Returns the edit link html string * @return string * @package Customizr * @since Customizr 3.3+ */ function czr_fn_render_edit_link_view( $_echo = true ) { $_view = sprintf('<span class="edit-link btn btn-inverse btn-mini"><a class="post-edit-link" href="%1$s" title="%2$s">%2$s</a></span>', get_edit_post_link(), __( 'Edit' , 'customizr' ) ); if ( ! $_echo ) return $_view; echo $_view; } /** * hook tc_content_title_icon * @return boolean * * @package Customizr * @since Customizr 3.2.0 */ function czr_fn_set_post_page_icon( $_bool ) { if ( is_singular() && is_page() ) $_bool = 0 == czr_fn_opt( 'tc_show_page_title_icon' ) ? false : $_bool; if ( is_singular() && is_single() ) $_bool = 0 == czr_fn_opt( 'tc_show_post_title_icon' ) ? false : $_bool; if ( !is_singular() ) $_bool = 0 == czr_fn_opt( 'tc_show_post_list_title_icon' ) ? false : $_bool; //last condition return 0 == czr_fn_opt( 'tc_show_title_icon' ) ? false : $_bool; } /** * hook tc_archive_icon * @return string * * @package Customizr * @since Customizr 3.2.0 */ function czr_fn_set_archive_icon( $_class ) { $_class = 0 == czr_fn_opt( 'tc_show_archive_title_icon' ) ? '' : $_class; //last condition return 0 == czr_fn_opt( 'tc_show_title_icon' ) ? '' : $_class; } /** * Return 1) the archive title html content OR 2) the archive title class OR 3) the boolean * hook : tc_display_customizr_headings * @return boolean * * @package Customizr * @since Customizr 3.2.0 */ function czr_fn_archive_title_and_class_callback( $_title = null, $_return_class = false ) { //declares variables to return $content = false; $_header_class = is_array($_title) ? $_title : array(); //case page for posts but not on front global $wp_query; if ( $wp_query -> is_posts_page && ! is_front_page() ) { //get page for post ID $page_for_post_id = get_option('page_for_posts'); $_header_class = array('entry-header'); if ( $_return_class ) return $_header_class; $content = sprintf('<%1$s class="entry-title %2$s">%3$s</%1$s>', apply_filters( 'tc_content_title_tag' , 'h1' ), apply_filters( 'tc_content_title_icon', 'format-icon' ), get_the_title( $page_for_post_id ) ); $content = apply_filters( 'tc_page_for_post_header_content', $content ); } //404 else if ( is_404() ) { $_header_class = array('entry-header'); if ( $_return_class ) return $_header_class; $content = sprintf('<h1 class="entry-title %1$s">%2$s</h1>', apply_filters( 'tc_archive_icon', '' ), apply_filters( 'tc_404_title' , __( 'Ooops, page not found' , 'customizr' ) ) ); $content = apply_filters( 'tc_404_header_content', $content ); } //search results else if ( is_search() && ! is_singular() ) { $_header_class = array('search-header'); if ( $_return_class ) return $_header_class; $content = sprintf( '<div class="row-fluid"><div class="%1$s"><h1 class="%2$s">%3$s%4$s %5$s </h1></div><div class="%6$s">%7$s</div></div>', apply_filters( 'tc_search_result_header_title_class', 'span8' ), apply_filters( 'tc_archive_icon', 'format-icon' ), have_posts() ? '' : __( 'No' , 'customizr' ).' ' , apply_filters( 'tc_search_results_title' , __( 'Search Results for :' , 'customizr' ) ), '<span>' . get_search_query() . '</span>', apply_filters( 'tc_search_result_header_form_class', 'span4' ), have_posts() ? get_search_form(false) : '' ); $content = apply_filters( 'tc_search_results_header_content', $content ); } // all archives else if ( is_archive() ){ $_header_class = array('archive-header'); if ( $_return_class ) return $_header_class; //author's posts page if ( is_author() ) { //gets the user ID $user_id = get_query_var( 'author' ); $content = sprintf( '<h1 class="%1$s">%2$s %3$s</h1>', apply_filters( 'tc_archive_icon', 'format-icon' ), apply_filters( 'tc_author_archive_title' , '' ), '<span class="vcard">' . get_the_author_meta( 'display_name' , $user_id ) . '</span>' ); if ( apply_filters ( 'tc_show_author_meta' , get_the_author_meta( 'description', $user_id ) ) ) { $content .= sprintf('%1$s<div class="author-info"><div class="%2$s">%3$s</div></div>', apply_filters( 'tc_author_meta_separator', '<hr class="featurette-divider '.current_filter().'">' ), apply_filters( 'tc_author_meta_wrapper_class', 'row-fluid' ), sprintf('<div class="%1$s">%2$s</div><div class="%3$s"><h2>%4$s</h2><div>%5$s</div></div>', apply_filters( 'tc_author_meta_avatar_class', 'comment-avatar author-avatar span2'), get_avatar( get_the_author_meta( 'user_email', $user_id ), apply_filters( 'tc_author_bio_avatar_size' , 100 ) ), apply_filters( 'tc_author_meta_content_class', 'author-description span10' ), sprintf( __( 'About %s' , 'customizr' ), get_the_author() ), get_the_author_meta( 'description' , $user_id ) ) ); } $content = apply_filters( 'tc_author_header_content', $content ); } //category archives else if ( is_category() ) { $content = sprintf( '<h1 class="%1$s">%2$s %3$s</h1>', apply_filters( 'tc_archive_icon', 'format-icon' ), apply_filters( 'tc_category_archive_title' , '' ), '<span>' . single_cat_title( '' , false ) . '</span>' ); if ( apply_filters ( 'tc_show_cat_description' , category_description() ) ) { $content .= sprintf('<div class="archive-meta">%1$s</div>', category_description() ); } $content = apply_filters( 'tc_category_archive_header_content', $content ); } //tag archives else if ( is_tag() ) { $content = sprintf( '<h1 class="%1$s">%2$s %3$s</h1>', apply_filters( 'tc_archive_icon', 'format-icon' ), apply_filters( 'tc_tag_archive_title' , '' ), '<span>' . single_tag_title( '' , false ) . '</span>' ); if ( apply_filters ( 'tc_show_tag_description' , tag_description() ) ) { $content .= sprintf('<div class="archive-meta">%1$s</div>', tag_description() ); } $content = apply_filters( 'tc_tag_archive_header_content', $content ); } //time archives else if ( is_day() || is_month() || is_year() ) { $archive_type = is_day() ? sprintf( __( 'Daily Archives: %s' , 'customizr' ), '<span>' . get_the_date() . '</span>' ) : __( 'Archives' , 'customizr' ); $archive_type = is_month() ? sprintf( __( 'Monthly Archives: %s' , 'customizr' ), '<span>' . get_the_date( _x( 'F Y' , 'monthly archives date format' , 'customizr' ) ) . '</span>' ) : $archive_type; $archive_type = is_year() ? sprintf( __( 'Yearly Archives: %s' , 'customizr' ), '<span>' . get_the_date( _x( 'Y' , 'yearly archives date format' , 'customizr' ) ) . '</span>' ) : $archive_type; $content = sprintf('<h1 class="%1$s">%2$s</h1>', apply_filters( 'tc_archive_icon', 'format-icon' ), $archive_type ); $content = apply_filters( 'tc_time_archive_header_content', $content ); } // all other archivers ( such as custom tax archives ) else if ( apply_filters('tc_show_tax_archive_title', true) ){ $content = sprintf('<h1 class="%1$s">%2$s</h1>', apply_filters( 'tc_archive_icon', 'format-icon' ), /* handle tax icon? */ apply_filters( 'tc_tax_archive_title', get_the_archive_title() ) ); $tax_description = get_the_archive_description(); if ( apply_filters( 'tc_show_tax_description', $tax_description ) ) $content .= sprintf('<div class="archive-meta">%1$s</div>', $tax_description ); $content = apply_filters( 'tc_tax_archive_header_content', $content ); } }// end all archives return $_return_class ? $_header_class : $content; }//end of fn /** * @return void * set up user defined options * callback of template_redirect * * @package Customizr * @since Customizr 3.2.6 */ function czr_fn_set_headings_options() { //by default don't display the Customizr title in feeds if ( apply_filters('tc_display_customizr_headings', is_feed() ) ) return; //Add update status next to the title (@since 3.2.6) add_filter( 'tc_the_title' , array( $this , 'czr_fn_add_update_notice_in_title'), 20); } /** * Callback of the tc_the_title => add an updated status * @return string * User option based * * @package Customizr * @since Customizr 3.2.0 */ function czr_fn_add_update_notice_in_title($html) { //First checks if we are in the loop and we are not displaying a page if ( ! in_the_loop() || is_page() ) return $html; //Is the notice option enabled AND this post type eligible for updated notice ? (default is post) if ( 0 == czr_fn_opt( 'tc_post_metas_update_notice_in_title' ) || ! in_array( get_post_type(), apply_filters('tc_show_update_notice_for_post_types' , array( 'post') ) ) ) return $html; //php version check for DateTime //http://php.net/manual/fr/class.datetime.php if ( version_compare( PHP_VERSION, '5.2.0' ) < 0 ) return $html; //get the user defined interval in days $_interval = esc_attr( czr_fn_opt( 'tc_post_metas_update_notice_interval' ) ); $_interval = ( 0 != $_interval ) ? $_interval : 30; //Check if the last update is less than n days old. (replace n by your own value) $has_recent_update = ( czr_fn_post_has_update( true ) && czr_fn_post_has_update( 'in_days') < $_interval ) ? true : false; if ( ! $has_recent_update ) return $html; //Return the modified title return apply_filters( 'tc_update_notice_in_title', sprintf('%1$s <span class="tc-update-notice label %3$s">%2$s</span>', $html, esc_attr( czr_fn_opt( 'tc_post_metas_update_notice_text' ) ), esc_attr( czr_fn_opt( 'tc_post_metas_update_notice_format' ) ) ) ); } /** * hooks : 'tc_category_archive_title', 'tc_tag_archive_title', 'tc_search_results_title', 'tc_author_archive_title' * @param default title string * @return string of user defined title * @since Customizr 3.3+ */ function czr_fn_set_archive_custom_title( $_title ) { switch ( current_filter() ) { case 'tc_category_archive_title' : return esc_attr( czr_fn_opt( 'tc_cat_title' ) ); break; case 'tc_tag_archive_title' : return esc_attr( czr_fn_opt( 'tc_tag_title' ) ); break; case 'tc_search_results_title' : return esc_attr( czr_fn_opt( 'tc_search_title' ) ); break; case 'tc_author_archive_title' : return esc_attr( czr_fn_opt( 'tc_author_title' ) ); break; } return $_title; } }//end of class endif; ?><?php /** * No results content actions * */ if ( ! class_exists( 'CZR_no_results' ) ) : class CZR_no_results { static $instance; function __construct () { self::$instance =& $this; add_action ( '__loop' , array( $this , 'czr_fn_no_result_content' )); } /** * Rendering the no search results * * @package Customizr * @since Customizr 3.0 */ function czr_fn_no_result_content() { global $wp_query; if ( !is_search() || (is_search() && 0 != $wp_query -> post_count) ) return; echo apply_filters( 'tc_no_result_content', sprintf('<div class="%1$s"><div class="entry-content"><p>%2$s</p> %3$s</div>%4$s</div>', 'tc-content span12', __( 'Sorry, but nothing matched your search criteria. Please try again with some different keywords.', 'customizr' ), get_search_form( $echo = false ), '<hr class="featurette-divider '.current_filter().'">' )//end sprintf );//end filter } }//end of class endif; ?><?php /** * Pages content actions * */ if ( ! class_exists( 'CZR_page' ) ) : class CZR_page { static $instance; function __construct () { self::$instance =& $this; add_action( 'wp' , array( $this , 'czr_fn_set_page_hooks' ) ); //Set single post thumbnail with customizer options (since 3.5+) add_action( 'wp' , array( $this , 'czr_fn_set_single_page_thumbnail_hooks' )); //append inline style to the custom stylesheet //! tc_user_options_style filter is shared by several classes => must always check the local context inside the callback before appending new css //fired on hook : wp_enqueue_scripts //Set thumbnail specific design based on user options add_filter( 'tc_user_options_style' , array( $this , 'czr_fn_write_thumbnail_inline_css') ); } /*************************** * PAGE HOOKS SETUP ****************************/ /** * hook : wp * * @package Customizr * @since Customizr 3.4+ */ function czr_fn_set_page_hooks() { //add page content and footer to the __loop add_action( '__loop' , array( $this , 'czr_fn_page_content' ) ); } /** * hook : wp * * @package Customizr * @since Customizr 3.5+ */ function czr_fn_set_single_page_thumbnail_hooks() { //__before_main_wrapper, 200 //__before_content 0 //__before_content 20 if ( ! $this -> czr_fn_show_single_page_thumbnail() ) return; $_exploded_location = explode('|', esc_attr( czr_fn_opt( 'tc_single_page_thumb_location' )) ); $_hook = apply_filters( 'tc_single_page_thumb_hook', isset($_exploded_location[0]) ? $_exploded_location[0] : '__before_content' ); $_priority = ( isset($_exploded_location[1]) && is_numeric($_exploded_location[1]) ) ? $_exploded_location[1] : 20; //Hook post view add_action( $_hook, array($this , 'czr_fn_single_page_prepare_thumb') , $_priority ); //Set thumb shape with customizer options (since 3.2.0) add_filter( 'tc_post_thumb_wrapper' , array( $this , 'czr_fn_set_thumb_shape'), 10 , 2 ); } /** * The template part for displaying page content * * @package Customizr * @since Customizr 3.0 */ function czr_fn_page_content() { if ( ! $this -> czr_fn_page_display_controller() ) return; ob_start(); do_action( '__before_content' ); ?> <div class="entry-content"> <?php the_content( __( 'Continue reading <span class="meta-nav">→</span>' , 'customizr' ) ); wp_link_pages( array( 'before' => '<div class="btn-toolbar page-links"><div class="btn-group">' . __( 'Pages:' , 'customizr' ), 'after' => '</div></div>', 'link_before' => '<button class="btn btn-small">', 'link_after' => '</button>', 'separator' => '', ) ); ?> </div> <?php do_action( '__after_content' ); $html = ob_get_contents(); if ($html) ob_end_clean(); echo apply_filters( 'tc_page_content', $html ); } /*************************** * SINGLE PAGE THUMBNAIL VIEW ****************************/ /** * Get Single page thumb model + view * Inject it in the view * hook : esc_attr( czr_fn_opt( 'tc_single_page_thumb_location' ) || '__before_content' * @return void * @package Customizr * @since Customizr 3.2.3 */ function czr_fn_single_page_prepare_thumb() { //never display the featured image if a slider is displayed //=> since the post thumbnail is always printed after the slider, we can check if did_action('__after_carousel_inner'). @see class-content-slider.php if ( 0 != did_action('__after_carousel_inner') && '__before_main_wrapper' == current_filter() ) return; $_size_to_request = apply_filters( 'tc_single_page_thumb_size' , $this -> czr_fn_get_current_thumb_size() ); //get the thumbnail data (src, width, height) if any //array( "tc_thumb" , "tc_thumb_height" , "tc_thumb_width" ) $_thumb_model = CZR_post_thumbnails::$instance -> czr_fn_get_thumbnail_model( $_size_to_request ) ; //may be render if ( CZR_post_thumbnails::$instance -> czr_fn_has_thumb() ) { $_thumb_class = implode( " " , apply_filters( 'tc_single_page_thumb_class' , array( 'row-fluid', 'tc-single-page-thumbnail-wrapper', 'tc-singular-thumbnail-wrapper', current_filter() ) ) ); $this -> czr_fn_render_single_page_thumb_view( $_thumb_model , $_thumb_class ); } } /** * @return html string * @package Customizr * @since Customizr 3.2.3 */ private function czr_fn_render_single_page_thumb_view( $_thumb_model , $_thumb_class ) { echo apply_filters( 'tc_render_single_page_thumb_view', sprintf( '<div class="%1$s">%2$s</div>' , $_thumb_class, CZR_post_thumbnails::$instance -> czr_fn_render_thumb_view( $_thumb_model, 'span12', false ) ) ); } /****************************** * SETTERS / HELPERS / CALLBACKS *******************************/ /** * Page view controller * @return boolean * @package Customizr * @since Customizr 3.4+ */ function czr_fn_page_display_controller() { $tc_show_page_content = 'page' == czr_fn__f('__post_type') && is_singular() && ! czr_fn__f( '__is_home_empty'); return apply_filters( 'tc_show_page_content', $tc_show_page_content ); } /** * HELPER * @return boolean * @package Customizr * @since Customizr 3.5+ */ function czr_fn_show_single_page_thumbnail() { return ! czr_fn_is_real_home() && $this -> czr_fn_page_display_controller() && apply_filters( 'tc_show_single_page_thumbnail', 'hide' != esc_attr( czr_fn_opt( 'tc_single_page_thumb_location' ) ) ); } /** * HELPER * @return size string * @package Customizr * @since Customizr 3.5+ */ private function czr_fn_get_current_thumb_size() { $_exploded_location = explode( '|', esc_attr( czr_fn_opt( 'tc_single_page_thumb_location' ) ) ); $_hook = isset( $_exploded_location[0] ) ? $_exploded_location[0] : '__before_content'; return '__before_main_wrapper' == $_hook ? 'slider-full' : 'slider'; } /** * hook : tc_page_thumb_wrapper * @return html string * @package Customizr * @since Customizr 3.5+ */ function czr_fn_set_thumb_shape( $thumb_wrapper, $thumb_img ) { return sprintf('<div class="%3$s"><a class="tc-rectangular-thumb" href="%1$s">%2$s</a></div>', get_permalink( get_the_ID() ), $thumb_img, implode( " ", apply_filters( 'tc_thumb_wrapper_class', array() ) ) ); } /** * hook : tc_user_options_style * @return css string * * @package Customizr * @since Customizr 3.5+ */ function czr_fn_write_thumbnail_inline_css( $_css ) { if ( ! $this -> czr_fn_show_single_page_thumbnail() ) return $_css; $_single_thumb_height = apply_filters('tc_single_page_thumb_height', esc_attr( czr_fn_opt( 'tc_single_page_thumb_height' ) ) ); $_single_thumb_height = (! $_single_thumb_height || ! is_numeric($_single_thumb_height) ) ? 250 : $_single_thumb_height; $_single_thumb_smartphone_height = apply_filters('tc_single_page_thumb_smartphone_height', esc_attr( czr_fn_opt( 'tc_single_page_thumb_smartphone_height' ) ) ); $_single_thumb_smartphone_height = (! $_single_thumb_smartphone_height || ! is_numeric($_single_thumb_smartphone_height) ) ? 200 : $_single_thumb_smartphone_height; $_css = sprintf("%s\n%s", $_css, ".tc-single-page-thumbnail-wrapper .tc-rectangular-thumb { max-height: {$_single_thumb_height}px; height :{$_single_thumb_height}px }\n .tc-center-images .tc-single-page-thumbnail-wrapper .tc-rectangular-thumb img { opacity : 0; -webkit-transition: opacity .5s ease-in-out; -moz-transition: opacity .5s ease-in-out; -ms-transition: opacity .5s ease-in-out; -o-transition: opacity .5s ease-in-out; transition: opacity .5s ease-in-out; }\n" ); //max-height in smartphones: max-width: 480px if ( $_single_thumb_smartphone_height != $_single_thumb_height ) { $_css = sprintf("%s\n@media (max-width: %spx ){\n%s\n}\n", $_css, 480, ".tc-single-page-thumbnail-wrapper .tc-rectangular-thumb { max-height: {$_single_thumb_smartphone_height}px; height :{$_single_thumb_smartphone_height}px }" ); } return $_css; } }//end of class endif; ?><?php /** * Single post content actions * */ if ( ! class_exists( 'CZR_post' ) ) : class CZR_post { static $instance; function __construct () { self::$instance =& $this; add_action( 'wp' , array( $this , 'czr_fn_set_single_post_hooks' )); //Set single post thumbnail with customizer options (since 3.2.0) add_action( 'wp' , array( $this , 'czr_fn_set_single_post_thumbnail_hooks' )); //append inline style to the custom stylesheet //! tc_user_options_style filter is shared by several classes => must always check the local context inside the callback before appending new css //fired on hook : wp_enqueue_scripts //Set thumbnail specific design based on user options add_filter( 'tc_user_options_style' , array( $this , 'czr_fn_write_thumbnail_inline_css') ); } /*************************** * SINGLE POST AND THUMB HOOKS SETUP ****************************/ /** * hook : wp * * @package Customizr * @since Customizr 3.2.0 */ function czr_fn_set_single_post_hooks() { //add post header, content and footer to the __loop add_action( '__loop' , array( $this , 'czr_fn_post_content' )); //posts parts actions add_action( '__after_content' , array( $this , 'czr_fn_post_footer' )); } /** * hook : wp * * @package Customizr * @since Customizr 3.2.0 */ function czr_fn_set_single_post_thumbnail_hooks() { //__before_main_wrapper, 200 //__before_content 0 //__before_content 20 if ( ! $this -> czr_fn_show_single_post_thumbnail() ) return; $_exploded_location = explode('|', esc_attr( czr_fn_opt( 'tc_single_post_thumb_location' )) ); $_hook = apply_filters( 'tc_single_post_thumb_hook', isset($_exploded_location[0]) ? $_exploded_location[0] : '__before_content' ); $_priority = ( isset($_exploded_location[1]) && is_numeric($_exploded_location[1]) ) ? $_exploded_location[1] : 20; //Hook post view add_action( $_hook, array($this , 'czr_fn_single_post_prepare_thumb') , $_priority ); //Set thumb shape with customizer options (since 3.2.0) add_filter( 'tc_post_thumb_wrapper' , array( $this , 'czr_fn_set_thumb_shape'), 10 , 2 ); } /*************************** * SINGLE POST VIEW ****************************/ /** * The default template for displaying single post content * * @package Customizr * @since Customizr 3.0 */ function czr_fn_post_content() { //check conditional tags : we want to show single post or single custom post types if ( ! $this -> czr_fn_single_post_display_controller() ) return; //display an icon for div if there is no title $icon_class = in_array( get_post_format(), array( 'quote' , 'aside' , 'status' , 'link' ) ) ? apply_filters( 'tc_post_format_icon', 'format-icon' ) :'' ; ob_start(); do_action( '__before_content' ); ?> <section class="<?php echo implode( ' ', apply_filters( 'tc_single_post_section_class', array( 'entry-content' ) ) ); ?> <?php echo $icon_class ?>"> <?php the_content( __( 'Continue reading <span class="meta-nav">→</span>' , 'customizr' ) ); ?> <?php wp_link_pages( array( 'before' => '<div class="pagination pagination-centered">' . __( 'Pages:' , 'customizr' ), 'after' => '</div>' ) ); ?> <?php do_action( '__after_single_entry_inner' ); ?> </section><!-- .entry-content --> <?php do_action( '__after_content' ); $html = ob_get_contents(); if ($html) ob_end_clean(); echo apply_filters( 'tc_post_content', $html ); } /** * Single post footer view * * @package Customizr * @since Customizr 3.0 */ function czr_fn_post_footer() { //check conditional tags : we want to show single post or single custom post types if ( ! $this -> czr_fn_single_post_display_controller() || ! apply_filters( 'tc_show_single_post_footer', true ) ) return; //@todo check if some conditions below not redundant? if ( ! is_singular() || ! apply_filters( 'tc_show_author_metas_in_post', true ) || ! esc_attr( czr_fn_opt( 'tc_show_author_info' ) ) ) { return; } $author_id = get_the_author_meta( 'ID' ); $authors_id = apply_filters( 'tc_post_author_id', array( $author_id ) ); $authors_id = is_array( $authors_id ) ? $authors_id : array( $author_id ); //author candidates must have a bio to be displayed $authors_id = array_filter( $authors_id, 'czr_fn_get_author_meta_description_by_id' ); if ( empty( $authors_id ) ) { return; } $html = '<footer class="entry-meta"><hr class="featurette-divider"><div class="author-info-wrapper">'; foreach ( $authors_id as $author_id ) { $author_name = get_the_author_meta( 'display_name', $author_id ); $html .= sprintf('<div class="author-info"><div class="%1$s">%2$s %3$s</div></div>', apply_filters( 'tc_author_meta_wrapper_class', 'row-fluid' ), sprintf('<div class="%1$s">%2$s</div>', apply_filters( 'tc_author_meta_avatar_class', 'comment-avatar author-avatar span2'), get_avatar( get_the_author_meta( 'user_email', $author_id ), apply_filters( 'tc_author_bio_avatar_size' , 100 ) ) ), sprintf('<div class="%1$s"><h3>%2$s</h3><div>%3$s</div><div class="author-link">%4$s</div></div>', apply_filters( 'tc_author_meta_content_class', 'author-description span10' ), sprintf( __( 'About %s' , 'customizr' ), $author_name ), apply_filters( 'the_author_description', get_the_author_meta( 'description', $author_id ) ), sprintf( '<a href="%1$s" rel="author">%2$s</a>', esc_url( get_author_posts_url( $author_id ) ), sprintf( __( 'View all posts by %s <span class="meta-nav">→</span>' , 'customizr' ), $author_name ) ) ) );//end sprintf }//end for $html .= '</div></footer>'; echo apply_filters( 'tc_post_footer', $html ); } /*************************** * SINGLE POST THUMBNAIL VIEW ****************************/ /** * Get Single post thumb model + view * Inject it in the view * hook : esc_attr( czr_fn_opt( 'tc_single_post_thumb_location' ) || '__before_content' * @return void * @package Customizr * @since Customizr 3.2.3 */ function czr_fn_single_post_prepare_thumb() { //never display the featured image if a slider is displayed //=> since the post thumbnail is always printed after the slider, we can check if did_action('__after_carousel_inner'). @see class-content-slider.php if ( 0 != did_action('__after_carousel_inner') && '__before_main_wrapper' == current_filter() ) return; $_size_to_request = apply_filters( 'tc_single_post_thumb_size' , $this -> czr_fn_get_current_thumb_size() ); //get the thumbnail data (src, width, height) if any //array( "tc_thumb" , "tc_thumb_height" , "tc_thumb_width" ) $_thumb_model = CZR_post_thumbnails::$instance -> czr_fn_get_thumbnail_model( $_size_to_request ) ; //may be render if ( CZR_post_thumbnails::$instance -> czr_fn_has_thumb() ) { $_thumb_class = implode( " " , apply_filters( 'tc_single_post_thumb_class' , array( 'row-fluid', 'tc-single-post-thumbnail-wrapper', 'tc-singular-thumbnail-wrapper', current_filter() ) ) ); $this -> czr_fn_render_single_post_thumb_view( $_thumb_model , $_thumb_class ); } } /** * @return html string * @package Customizr * @since Customizr 3.2.3 */ private function czr_fn_render_single_post_thumb_view( $_thumb_model , $_thumb_class ) { echo apply_filters( 'tc_render_single_post_thumb_view', sprintf( '<div class="%1$s">%2$s</div>' , $_thumb_class, CZR_post_thumbnails::$instance -> czr_fn_render_thumb_view( $_thumb_model, 'span12', false ) ) ); } /****************************** * SETTERS / HELPERS / CALLBACKS *******************************/ /** * Single post view controller * @return boolean * @package Customizr * @since Customizr 3.2.0 */ function czr_fn_single_post_display_controller() { //check conditional tags : we want to show single post or single custom post types global $post; $tc_show_single_post_content = isset($post) && 'page' != $post -> post_type && 'attachment' != $post -> post_type && is_singular() && ! czr_fn__f( '__is_home_empty'); return apply_filters( 'tc_show_single_post_content', $tc_show_single_post_content ); } /** * HELPER * @return boolean * @package Customizr * @since Customizr 3.2.11 */ function czr_fn_show_single_post_thumbnail() { return $this -> czr_fn_single_post_display_controller() && apply_filters( 'tc_show_single_post_thumbnail', 'hide' != esc_attr( czr_fn_opt( 'tc_single_post_thumb_location' ) ) ); } /** * HELPER * @return size string * @package Customizr * @since Customizr 3.2.3 */ private function czr_fn_get_current_thumb_size() { $_exploded_location = explode( '|', esc_attr( czr_fn_opt( 'tc_single_post_thumb_location' ) ) ); $_hook = isset( $_exploded_location[0] ) ? $_exploded_location[0] : '__before_content'; return '__before_main_wrapper' == $_hook ? 'slider-full' : 'slider'; } /** * hook : tc_post_thumb_wrapper * @return html string * @package Customizr * @since Customizr 3.2.0 */ function czr_fn_set_thumb_shape( $thumb_wrapper, $thumb_img ) { return sprintf('<div class="%3$s"><a class="tc-rectangular-thumb" href="%1$s">%2$s</a></div>', get_permalink( get_the_ID() ), $thumb_img, implode( " ", apply_filters( 'tc_thumb_wrapper_class', array() ) ) ); } /** * hook : tc_user_options_style * @return css string * * @package Customizr * @since Customizr 3.2.6 */ function czr_fn_write_thumbnail_inline_css( $_css ) { if ( ! $this -> czr_fn_show_single_post_thumbnail() ) return $_css; $_single_thumb_height = apply_filters('tc_single_post_thumb_height', esc_attr( czr_fn_opt( 'tc_single_post_thumb_height' ) ) ); $_single_thumb_height = (! $_single_thumb_height || ! is_numeric($_single_thumb_height) ) ? 250 : $_single_thumb_height; $_single_thumb_smartphone_height = apply_filters('tc_single_post_thumb_smartphone_height', esc_attr( czr_fn_opt( 'tc_single_post_thumb_smartphone_height' ) ) ); $_single_thumb_smartphone_height = (! $_single_thumb_smartphone_height || ! is_numeric($_single_thumb_smartphone_height) ) ? 200 : $_single_thumb_smartphone_height; $_css = sprintf("%s\n%s", $_css, ".tc-single-post-thumbnail-wrapper .tc-rectangular-thumb { max-height: {$_single_thumb_height}px; height :{$_single_thumb_height}px }\n .tc-center-images .tc-single-post-thumbnail-wrapper .tc-rectangular-thumb img { opacity : 0; -webkit-transition: opacity .5s ease-in-out; -moz-transition: opacity .5s ease-in-out; -ms-transition: opacity .5s ease-in-out; -o-transition: opacity .5s ease-in-out; transition: opacity .5s ease-in-out; }\n" ); //max-height in smartphones: max-width: 480px if ( $_single_thumb_smartphone_height != $_single_thumb_height ) { $_css = sprintf("%s\n@media (max-width: %spx ){\n%s\n}\n", $_css, 480, ".tc-single-post-thumbnail-wrapper .tc-rectangular-thumb { max-height: {$_single_thumb_smartphone_height}px; height :{$_single_thumb_smartphone_height}px }" ); } return $_css; } }//end of class endif; ?><?php /** * Posts content actions * */ if ( ! class_exists( 'CZR_post_list' ) ) : class CZR_post_list { static $instance; function __construct () { self::$instance =& $this; //Set new image size can be set here ( => wp hook would be too late) (since 3.2.0) add_action( 'init' , array( $this, 'czr_fn_set_thumb_early_options') ); //Set __loop hooks and customizer options (since 3.2.0) add_action( 'wp_head' , array( $this, 'czr_fn_set_post_list_hooks')); //append inline style to the custom stylesheet //! tc_user_options_style filter is shared by several classes => must always check the local context inside the callback before appending new css //fired on hook : wp_enqueue_scripts //Set thumbnail specific design based on user options add_filter( 'tc_user_options_style' , array( $this , 'czr_fn_write_thumbnail_inline_css') ); } /*************************** * POST LIST HOOKS SETUP ****************************/ /** * hook : init * @return void * * @package Customizr * @since Customizr 3.2.6 */ function czr_fn_set_thumb_early_options() { //Set thumb size depending on the customizer thumbnail position options (since 3.2.0) add_filter ( 'tc_thumb_size_name' , array( $this , 'czr_fn_set_thumb_size') ); } /** * Set __loop hooks and various filters based on customizer options * hook : wp_head * * @package Customizr * @since Customizr 3.2.0 */ function czr_fn_set_post_list_hooks() { if ( ! $this -> czr_fn_post_list_controller() ) return; //displays the article with filtered layout : content + thumbnail add_action ( '__loop' , array( $this , 'czr_fn_prepare_section_view') ); //ARTICLE CONTAINER CSS CLASSES add_filter( 'tc_article_container_class' , array( $this, 'czr_fn_article_container_set_classes' ) ); //based on customizer user options add_filter( 'tc_post_list_layout' , array( $this , 'czr_fn_set_post_list_layout') ); add_filter( 'post_class' , array( $this , 'czr_fn_set_content_class') ); add_filter( 'excerpt_length' , array( $this , 'czr_fn_set_excerpt_length') , 999 ); add_filter( 'post_class' , array( $this , 'czr_fn_add_thumb_shape_name') ); //add current context to the body class add_filter( 'body_class' , array( $this , 'czr_fn_add_post_list_context') ); //Set thumb shape with customizer options (since 3.2.0) add_filter( 'tc_post_thumb_wrapper' , array( $this , 'czr_fn_set_thumb_shape'), 10 , 2 ); add_filter( 'tc_the_content' , array( $this , 'czr_fn_add_support_for_shortcode_special_chars') ); // => filter the thumbnail inline style tc_post_thumb_inline_style and replace width:auto by width:100% // 3 args = $style, $_width, $_height add_filter( 'tc_post_thumb_inline_style' , array( $this , 'czr_fn_change_thumbnail_inline_css_width'), 20, 3 ); } /*************************** * POST LIST MODEL ****************************/ /** * Prepare default posts lists view * hook : __loop * inside loop * @package Customizr * @since Customizr 3.0.10 */ function czr_fn_prepare_section_view() { global $post; if ( ! isset( $post ) || empty( $post ) || ! apply_filters( 'tc_show_post_in_post_list', $this -> czr_fn_post_list_controller() , $post ) ) return; //get the filtered post list layout $_layout = apply_filters( 'tc_post_list_layout', CZR_init::$instance -> post_list_layout ); $_content_model = $this -> czr_fn_get_content_model( $_layout ); $_thumb_model = $this -> czr_fn_show_thumb() ? CZR_post_thumbnails::$instance -> czr_fn_get_thumbnail_model() : array(); $this -> czr_fn_render_section_view( $_layout, $_content_model, $_thumb_model ); } /** * Return the default post list model for the content * inside loop * @return array() "_layout" , "_show_thumb" , "_css_class" * @package Customizr * @since Customizr 3.3.2 */ private function czr_fn_get_content_model($_layout) { $_content = ''; if ( $this -> czr_fn_show_excerpt() ) $_content = apply_filters( 'the_excerpt', get_the_excerpt() ); else $_content = apply_filters( 'tc_the_content', get_the_content() ); //what is determining the layout ? if no thumbnail then full width + filter's conditions $_layout_class = $this -> czr_fn_show_thumb() ? $_layout['content'] : 'span12'; $_layout_class = implode( " " , apply_filters( 'tc_post_list_content_class', array($_layout_class) , $this -> czr_fn_show_thumb() , $_layout ) ); //display an icon for div if there is no title $_icon_class = in_array(get_post_format(), array( 'quote' , 'aside' , 'status' , 'link' )) ? apply_filters( 'tc_post_list_content_icon', 'format-icon' ) :''; return compact( "_layout_class" , "_icon_class" , "_content" ); } /** * @return boolean whether excerpt instead of full content * @package Customizr * @since Customizr 3.3.2 */ private function czr_fn_show_excerpt() { //When do we show the post excerpt? //1) when set in options //2) + other filters conditions return (bool) apply_filters( 'tc_show_excerpt', 'full' != esc_attr( czr_fn_opt( 'tc_post_list_length' ) ) ); } /** * @return boolean * @package Customizr * @since Customizr 3.3.2 */ private function czr_fn_show_thumb() { //when do we display the thumbnail ? //1) there must be a thumbnail //2) the excerpt option is not set to full //3) user settings in customizer //4) filter's conditions return apply_filters( 'tc_show_thumb', array_product( array( $this -> czr_fn_show_excerpt(), CZR_post_thumbnails::$instance -> czr_fn_has_thumb(), czr_fn_is_checked( 'tc_post_list_show_thumb' ) ) ) ); } /*************************** * POST LIST VIEW ****************************/ /** * Render each post list section view * * @package Customizr * @since Customizr 3.0.10 */ private function czr_fn_render_section_view( $_layout, $_content_model, $_thumb_model ) { global $wp_query; echo '<div class="grid__item">'; //Renders the filtered layout for content + thumbnail if ( isset($_layout['alternate']) && $_layout['alternate'] ) { if ( 0 == $wp_query->current_post % 2 ) { $this -> czr_fn_render_content_view( $_content_model ) ; CZR_post_thumbnails::$instance -> czr_fn_render_thumb_view( $_thumb_model , $_layout['thumb'] ); } else { CZR_post_thumbnails::$instance -> czr_fn_render_thumb_view( $_thumb_model , $_layout['thumb'] ); $this -> czr_fn_render_content_view( $_content_model ); } } else if ( isset($_layout['show_thumb_first']) && ! $_layout['show_thumb_first'] ) { $this -> czr_fn_render_content_view( $_content_model ); CZR_post_thumbnails::$instance -> czr_fn_render_thumb_view( $_thumb_model , $_layout['thumb'] ); } else { CZR_post_thumbnails::$instance -> czr_fn_render_thumb_view( $_thumb_model , $_layout['thumb'] ); $this -> czr_fn_render_content_view( $_content_model ); } //renders the hr separator after each article echo apply_filters( 'tc_post_list_separator', '<hr class="featurette-divider '.current_filter().'">' ); echo '</div>'; } /** * Displays the posts list content * * @package Customizr * @since Customizr 3.0 */ private function czr_fn_render_content_view( $_content_model ) { //extract "_layout_class" , "_icon_class" , "_content" extract($_content_model); $_sub_class = 'entry-summary'; if ( in_array( get_post_format(), array( 'image' , 'gallery' ) ) ) { $_sub_class = 'entry-content'; $_content = '<p class="format-icon"></p>'; } elseif ( in_array( get_post_format(), array( 'quote', 'status', 'link', 'aside', 'video' ) ) ) { $_sub_class = sprintf( 'entry-content %s' , $_icon_class ); $_content = sprintf( '%1$s%2$s', apply_filters( 'tc_the_content', get_the_content( __( 'Continue reading <span class="meta-nav">→</span>' , 'customizr' ) ) ), wp_link_pages( array( 'before' => '<div class="pagination pagination-centered">' . __( 'Pages:' , 'customizr' ), 'after' => '</div>', 'echo' => 0 ) ) ); } ob_start(); ?> <section class="tc-content <?php echo $_layout_class; ?>"> <?php do_action( '__before_content' ); printf('<section class="%1$s">%2$s</section>', $_sub_class, $_content ); do_action( '__after_content' ); ?> </section> <?php $_html = ob_get_contents(); if ($_html) ob_end_clean(); echo apply_filters( 'tc_post_list_content', $_html, $_content_model ); } /****************************** * SETTERS / HELPERS / CALLBACKS *******************************/ /** * hook : tc_post_thumb_wrapper * ! 2 cases here : posts lists and single posts * * @package Customizr * @since Customizr 3.2.0 */ function czr_fn_set_thumb_shape( $thumb_wrapper, $thumb_img ) { $_shape = esc_attr( czr_fn_opt( 'tc_post_list_thumb_shape') ); //1) check if shape is rounded, squared on rectangular if ( ! $_shape || false !== strpos($_shape, 'rounded') || false !== strpos($_shape, 'squared') ) return $thumb_wrapper; $_position = esc_attr( czr_fn_opt( 'tc_post_list_thumb_position' ) ); return sprintf('<div class="%3$s"><a class="tc-rectangular-thumb" href="%1$s">%2$s</a></div>', get_permalink( get_the_ID() ), $thumb_img, ( 'top' == $_position || 'bottom' == $_position ) ? '' : implode( " ", apply_filters( 'tc_thumb_wrapper_class', array('') ) ) ); } /** * hook : body_class * @return array of classes * * @package Customizr * @since Customizr 3.3.2 */ function czr_fn_add_post_list_context( $_classes ) { return array_merge( $_classes , array( 'tc-post-list-context' ) ); } /** * @return bool * Controller of the posts list view * * @package Customizr * @since Customizr 3.2.0 */ public function czr_fn_post_list_controller() { global $wp_query; //must be archive or search result. Returns false if home is empty in options. return apply_filters( 'tc_post_list_controller', ! is_singular() && ! is_404() && 0 != $wp_query -> post_count && ! czr_fn__f( '__is_home_empty') ); } /* * hook : tc_article_container_class */ public function czr_fn_article_container_set_classes( $_classes ) { $_classes[] = 'grid-container'; //used by the pro infinite scroll return $_classes; } /** * Callback of filter post_class * @return array() of classes * @package Customizr * @since Customizr 3.2.0 */ function czr_fn_add_thumb_shape_name( $_classes ) { return array_merge( $_classes , array(esc_attr( czr_fn_opt( 'tc_post_list_thumb_shape') ) ) ); } /** * hook : excerpt_length hook * @return string * @package Customizr * @since Customizr 3.2.0 */ function czr_fn_set_excerpt_length( $length ) { $_custom = esc_attr( czr_fn_opt( 'tc_post_list_excerpt_length' ) ); return ( false === $_custom || !is_numeric($_custom) ) ? $length : $_custom; } /** * hook : tc_post_list_layout * @return array() of layout data * @package Customizr * @since Customizr 3.2.0 */ function czr_fn_set_post_list_layout( $_layout ) { $_position = esc_attr( czr_fn_opt( 'tc_post_list_thumb_position' ) ); //since 3.4.16 the alternate layout is not available when the position is top or bottom $_layout['alternate'] = ( 0 == czr_fn_opt( 'tc_post_list_thumb_alternate' ) || in_array( $_position, array( 'top', 'bottom') ) ) ? false : true; $_layout['show_thumb_first'] = ( 'left' == $_position || 'top' == $_position ) ? true : false; $_layout['content'] = ( 'left' == $_position || 'right' == $_position ) ? $_layout['content'] : 'span12'; $_layout['thumb'] = ( 'top' == $_position || 'bottom' == $_position ) ? 'span12' : $_layout['thumb']; return $_layout; } /** * hook : WP filter post_class * @return array() of classes * @package Customizr * @since Customizr 3.2.0 */ function czr_fn_set_content_class( $_classes ) { $_position = esc_attr( czr_fn_opt( 'tc_post_list_thumb_position' ) ); return array_merge( $_classes , array( "thumb-position-{$_position}") ); } /** * hook tc_post_thumb_inline_style (declared in CZR_post_thumbnails) * Replace default widht:auto by width:100% * @param array of args passed by apply_filters_ref_array method * @return string * * @package Customizr * @since Customizr 3.2.6 */ function czr_fn_change_thumbnail_inline_css_width( $_style, $image, $_filtered_thumb_size) { //conditions : //note : handled with javascript if tc_center_img option enabled $_bool = array_product( array( ! esc_attr( czr_fn_opt( 'tc_center_img') ), false != $image, ! empty($image), isset($_filtered_thumb_size['width']), isset($_filtered_thumb_size['height']) ) ); if ( ! $_bool ) return $_style; $_width = $_filtered_thumb_size['width']; $_height = $_filtered_thumb_size['height']; $_shape = esc_attr( czr_fn_opt( 'tc_post_list_thumb_shape') ); $_is_rectangular = ! $_shape || false !== strpos($_shape, 'rounded') || false !== strpos($_shape, 'squared') ? false : true; if ( ! is_single() && ! $_is_rectangular ) return $_style; return sprintf('min-width:%1$spx;min-height:%2$spx;max-width: none;width:100%%;max-height: none;', $_width, $_height ); } /** * hook : tc_user_options_style * @return css string * * @package Customizr * @since Customizr 3.2.6 */ function czr_fn_write_thumbnail_inline_css( $_css ) { if ( ! $this -> czr_fn_post_list_controller() ) return $_css; $_list_thumb_height = esc_attr( czr_fn_opt( 'tc_post_list_thumb_height' ) ); $_list_thumb_height = (! $_list_thumb_height || ! is_numeric($_list_thumb_height) ) ? 250 : $_list_thumb_height; return sprintf("%s\n%s", $_css, ".tc-rectangular-thumb { max-height: {$_list_thumb_height}px; height :{$_list_thumb_height}px }\n" ); } /** * hook : tc_thumb_size_name (declared in CZR_post_thumbnails) * * @package Customizr * @since Customizr 3.2.0 */ function czr_fn_set_thumb_size( $_default_size ) { $_shape = esc_attr( czr_fn_opt( 'tc_post_list_thumb_shape') ); if ( ! $_shape || false !== strpos($_shape, 'rounded') || false !== strpos($_shape, 'squared') ) return $_default_size; $_position = esc_attr( czr_fn_opt( 'tc_post_list_thumb_position' ) ); return ( 'top' == $_position || 'bottom' == $_position ) ? 'tc_rectangular_size' : $_default_size; } /** * hook : tc_the_content * Applies tc_the_content filter to the passed string * * @param string * @return string * * @package Customizr * @since Customizr 3.3+ */ function czr_fn_add_support_for_shortcode_special_chars( $_content ) { return str_replace( ']]>', ']]>', apply_filters( 'the_content', $_content ) ); } }//end of class endif; ?><?php /** * Post lists grid content actions * */ if ( ! class_exists( 'CZR_post_list_grid' ) ) : class CZR_post_list_grid { static $instance; private $expanded_sticky; private $post_id; function __construct () { self::$instance =& $this; $this -> expanded_sticky = null; add_action ( 'pre_get_posts' , array( $this , 'czr_fn_maybe_excl_first_sticky') ); add_action ( 'wp_head' , array( $this , 'czr_fn_set_grid_hooks') ); //Font size filter //Updates the array of font sizes for a given sidebar layout add_filter( 'tc_get_grid_font_sizes' , array( $this , 'czr_fn_set_layout_font_size' ), 10, 4 ); //Layout filter (must filter also the grid cols used in the inline style) add_filter( 'tc_get_grid_cols' , array( $this, 'czr_fn_set_grid_section_cols'), 20 , 2 ); //append inline style to the custom stylesheet //! tc_user_options_style filter is shared by several classes => must always check the local context inside the callback before appending new css //fired on hook : wp_enqueue_scripts add_filter( 'tc_user_options_style' , array( $this , 'czr_fn_grid_write_inline_css'), 100 ); } /*************************************** * HOOKS SETTINGS *********************** ****************************************/ /* * hook : wp */ function czr_fn_set_grid_hooks(){ if ( ! apply_filters( 'tc_set_grid_hooks' , $this -> czr_fn_is_grid_enabled() ) ) return; $this -> post_id = czr_fn_get_id(); do_action( '__post_list_grid' ); //Disable icon titles //add_filter( 'tc_archive_icon' , '__return_false', 50 ); //disable edit link (it's added afterwards) for the expanded post add_filter( 'tc_edit_in_title' , array( $this, 'czr_fn_grid_disable_edit_in_title_expanded' ) ); add_filter( 'tc_content_title_icon' , '__return_false', 50 ); //icon option add_filter( 'tc-grid-thumb-html' , array( $this, 'czr_fn_set_grid_icon_visibility') ); //pre loop hooks add_action( '__before_article_container' , array( $this, 'czr_fn_set_grid_before_loop_hooks'), 5 ); //loop hooks add_action( '__before_loop' , array( $this, 'czr_fn_set_grid_loop_hooks'), 0 ); } /* PRE LOOP HOOKS * hook : __before_article_container * before loop */ function czr_fn_set_grid_before_loop_hooks(){ // LAYOUT add_filter( 'tc_post_list_layout' , array( $this, 'czr_fn_grid_set_content_layout') ); add_filter( 'tc_post_list_selectors' , array( $this, 'czr_fn_grid_set_article_selectors') ); add_action( '__before_article_container' , array( $this, 'czr_fn_grid_prepare_expand_sticky' ) ); // THUMBNAILS remove_filter( 'post_class' , array( CZR_post_list::$instance , 'czr_fn_add_thumb_shape_name')); remove_filter( 'tc_thumb_size_name' , array( CZR_post_thumbnails::$instance, 'czr_fn_set_thumb_size') ); add_filter( 'tc_thumb_size_name' , array( $this, 'czr_fn_set_thumb_size_name') ); add_filter( 'tc_thumb_size' , array( $this, 'czr_fn_set_thumb_size') ); // SINGLE POST CONTENT IN GRID $_content_priorities = apply_filters('tc_grid_post_content_priorities' , array( 'content' => 20, 'link' =>30 )); add_action( '__grid_single_post_content' , array( $this, 'czr_fn_grid_display_figcaption_content') , $_content_priorities['content'] ); add_action( '__grid_single_post_content' , array( $this, 'czr_fn_grid_display_post_link'), $_content_priorities['link'] ); add_action( '__grid_single_post_content' , array( $this, 'czr_fn_grid_display_fade_excerpt'), 100 ); //expanded sticky post : filter the figcaption content to include the post title add_filter( 'tc_grid_display_figcaption_content' , array( $this, 'czr_fn_grid_set_expanded_post_title') ); //ARTICLE CONTAINER CSS CLASSES TO HANDLE EFFECT LIKE SHADOWS add_filter( 'tc_article_container_class' , array( $this, 'czr_fn_grid_container_set_classes' ) ); //COMMENT BUBBLE remove_filter( 'tc_the_title' , array( CZR_comments::$instance, 'czr_fn_display_comment_bubble' ) , 1 ); add_filter( 'tc_grid_get_single_post_html' , array( $this, 'czr_fn_grid_display_comment_bubble' ) ); //POST METAS remove_filter( 'tc_meta_utility_text' , array( CZR_post_metas::$instance , 'czr_fn_add_link_to_post_after_metas'), 20 ); //TITLE LENGTH add_filter( 'tc_title_text' , array( $this, 'czr_fn_grid_set_title_length' ) ); } /** * hook : __before_loop * actions and filters inside loop * @return void */ function czr_fn_set_grid_loop_hooks() { add_action( '__before_article' , array( $this, 'czr_fn_print_row_fluid_section_wrapper' ), 1 ); add_action( '__after_article' , array( $this, 'czr_fn_print_article_sep' ), 0 ); add_action( '__after_article' , array( $this, 'czr_fn_print_row_fluid_section_wrapper' ), 1 ); remove_action( '__loop' , array( CZR_post_list::$instance, 'czr_fn_prepare_section_view') ); add_action( '__loop' , array( $this, 'czr_fn_grid_prepare_single_post') ); if ( CZR_headings::$instance -> czr_fn_is_edit_enabled() && apply_filters( 'tc_grid_render_expanded_edit_link', true ) ) add_filter( 'tc_grid_get_single_post_html' , array( $this, 'czr_fn_grid_render_expanded_edit_link' ), 50 ); } /****************************************** * PREPARE AND RENDER VIEWS **************** ******************************************/ /* * hook : __before_article * Wrap articles in a grid section */ function czr_fn_print_row_fluid_section_wrapper(){ global $wp_query; $current_post = $wp_query -> current_post; $start_post = $this -> expanded_sticky ? 1 : 0; $cols = $this -> czr_fn_get_grid_section_cols(); if ( '__before_article' == current_filter() && ( $start_post == $current_post || 0 == ( $current_post - $start_post ) % $cols ) ) { printf( '<section class="%s">', implode( " ", apply_filters( 'tc_grid_section_class' , array( "row-fluid", "grid-cols-{$cols}" ) ) ) ); } elseif ( '__after_article' == current_filter() && ( $wp_query->post_count == ( $current_post + 1 ) || 0 == ( ( $current_post - $start_post + 1 ) % $cols ) ) ) { printf( '</section><!--end section.row-fluid-->%s', apply_filters( 'tc_grid_separator', '<hr class="featurette-divider post-list-grid">') ); }//end if } /** * hook : __loop * Prepare single post view model * inject it in the single post view * @return the figcation content parts as an array of html strings * inside loop */ function czr_fn_grid_prepare_single_post() { global $post; if ( ! isset($post) || empty($post) || ! apply_filters( 'tc_show_post_in_post_list', $this -> czr_fn_is_grid_context_matching() , $post ) ) return; // get the filtered post list layout $_layout = apply_filters( 'tc_post_list_layout', CZR_init::$instance -> post_list_layout ); // SET HOOKS FOR POST TITLES AND METAS // Default condition : must be a non sticky post if ( apply_filters( 'tc_render_grid_headings_view' , ! $this -> czr_fn_force_current_post_expansion() ) ) { $hook_prefix = '__before'; if ( $_layout['show_thumb_first'] ) $hook_prefix = '__after'; add_action( "{$hook_prefix}_grid_single_post", array( CZR_headings::$instance, 'czr_fn_render_headings_view' ) ); } // THUMBNAIL : cache the post format icon first //add thumbnail html (src, width, height) if any $_thumb_html = ''; if ( $this -> czr_fn_grid_show_thumb() ) { //return an array( $tc_thumb(image object), $tc_thumb_width(string), $tc_thumb_height(string) ) $_thumb_model = CZR_post_thumbnails::$instance -> czr_fn_get_thumbnail_model(); if ( isset($_thumb_model['tc_thumb']) ) $_thumb_html = $_thumb_model['tc_thumb']; } $_thumb_html = apply_filters( 'tc-grid-thumb-html' , $_thumb_html ); // CONTENT : get the figcaption content => post content $post_list_content_class = array( isset( $_layout['content'] ) ? $_layout['content'] : 'span6', czr_fn_is_pro() ? '' : 'mask'//no css mask for the pro grid ); $_post_content_html = $this -> czr_fn_grid_get_single_post_html( implode( ' ', $post_list_content_class ) ); // ADD A WRAPPER CLASS : build single grid post wrapper class $_classes = array('tc-grid-figure'); //may be add class no-thumb if ( ! $this -> czr_fn_grid_show_thumb() ) array_push( $_classes, 'no-thumb' ); else array_push( $_classes, 'has-thumb' ); //if 1 col layout or current post is the expanded => golden ratio should be disabled if ( ( '1' == $this -> czr_fn_get_grid_cols() || $this -> czr_fn_force_current_post_expansion() ) && ! wp_is_mobile() ) array_push( $_classes, 'no-gold-ratio' ); $_classes = implode( ' ' , apply_filters('tc_single_grid_post_wrapper_class', $_classes ) ); //RENDER VIEW $this -> czr_fn_grid_render_single_post( $_classes, $_thumb_html, $_post_content_html ); //return apply_filters( 'tc_prepare_grid_single_post_content' , compact( '_classes', '_thumb_html', '_post_content_html') ); } /** * Single post view in the grid * display single post content + thumbnail * @return html string * */ private function czr_fn_grid_render_single_post( $_classes, $_thumb_html, $_post_content_html ) { ob_start(); echo '<div class="grid__item">'; do_action( '__before_grid_single_post');//<= open <section> and maybe display title + metas echo apply_filters( 'tc_grid_single_post_thumb_content', sprintf('<section class="tc-grid-post"><figure class="%1$s">%2$s %3$s</figure></section>', $_classes, $_thumb_html, $_post_content_html ) ); do_action('__after_grid_single_post');//<= close </section> and maybe display title + metas echo '</div>'; $html = ob_get_contents(); if ($html) ob_end_clean(); echo apply_filters('tc_grid_display', $html); } /** * hook : __grid_single_post_content */ function czr_fn_grid_display_post_link(){ if ( ! apply_filters( 'tc_grid_display_post_link' , true ) ) return; printf( '<a class="tc-grid-bg-link" href="%1$s"></a>', get_permalink( get_the_ID() ) ); } /** * hook : __grid_single_post_content */ function czr_fn_grid_display_fade_excerpt(){ if ( ! apply_filters( 'tc_grid_fade_excerpt' , ! $this -> czr_fn_force_current_post_expansion() ) ) return; printf( '<span class="tc-grid-fade_expt"></span>' ); } /* * hook : __grid_single_post_content */ function czr_fn_grid_display_figcaption_content() { ?> <div class="entry-summary"> <?php echo apply_filters( 'tc_grid_display_figcaption_content', sprintf('<div class="tc-g-cont">%s</div>', get_the_excerpt() ) ); ?> </div> <?php } /** * Separator after each grid article * hook : __after_article (declared in index.php) * print a separator after each article => revealed in responsive mode */ function czr_fn_print_article_sep() { //renders the hr separator after each article echo apply_filters( 'tc_grid_single_post_sep', '<hr class="featurette-divider '.current_filter().'">' ); } /****************************************** * SETTERS / GETTTERS / CALLBACKS ******************************************/ /** * hook : tc_title_text * Limits the length of the post titles in grids to a custom number of characters * @return string */ function czr_fn_grid_set_title_length( $_title ) { $_max = esc_attr( czr_fn_opt( 'tc_grid_num_words') ); $_max = ( empty($_max) || ! $_max ) ? 10 : $_max; $_max = $_max <= 0 ? 1 : $_max; if ( empty($_title) || ! is_string($_title) ) return $_title; if ( count( explode( ' ', $_title ) ) > $_max ) { $_words = array_slice( explode( ' ', $_title ), 0, $_max ); $_title = sprintf( '%s ...', implode( ' ', $_words ) ); } return $_title; } /** * hook : pre_get_posts * exclude the first sticky post */ function czr_fn_maybe_excl_first_sticky( $query ){ if ( $this -> czr_fn_is_grid_enabled() && $this -> czr_fn_is_sticky_expanded( $query ) ) $query->set('post__not_in', array( $this -> expanded_sticky ) ); } /** * hook : tc_post_list_layout * force content + thumb layout : Force the title to be displayed always on bottom * @param current layout array() */ function czr_fn_grid_set_content_layout( $_layout ){ $_layout['show_thumb_first'] = true; $_layout['content'] = 'tc-grid-excerpt'; $_layout['thumb'] = 'span12 tc-grid-post-container'; return $_layout; } /** * Grid columns = fn(current-layout) * Returns the max possible grid column number for a given layout * * @param $_col_nb = string possible values : 1, 2, 3, 4 * @param $_current_layout string of layout class like span4 */ function czr_fn_set_grid_section_cols( $_col_nb, $_current_layout ) { $_map = apply_filters( 'tc_grid_col_layout_map', array( 'span12' => '4',//no sidebars 'span11' => '4', 'span10' => '4', 'span9' => '3',//one sidebar right or left 'span8' => '3', 'span7' => '2', 'span6' => '2',//two sidebars 'span5' => '2', 'span4' => '1', 'span3' => '1', 'span2' => '1', 'span1' => '1', ) ); if ( ! isset($_map[$_current_layout]) ) return $_col_nb; if ( (int) $_map[$_current_layout] >= (int) $_col_nb ) return (string) $_col_nb; return (string) $_map[$_current_layout]; } /** * Apply proper class to articles selectors to control articles width * hook : tc_post_list_selectors */ function czr_fn_grid_set_article_selectors($selectors){ $_class = sprintf( '%1$stc-grid span%2$s', apply_filters( 'tc_grid_add_expanded_class', $this -> czr_fn_force_current_post_expansion() ) ? 'expanded ' : '', is_numeric( $this -> czr_fn_get_grid_section_cols() ) ? 12 / $this -> czr_fn_get_grid_section_cols() : 6 ); return str_replace( 'row-fluid', $_class, $selectors ); } /* * hook : __before_article_container */ function czr_fn_grid_prepare_expand_sticky(){ global $wp_query; if ( ! ( $this -> czr_fn_is_sticky_expanded() && $wp_query -> query_vars[ 'paged' ] == 0 ) ){ $this -> expanded_sticky = null; return; } // prepend the first sticky $first_sticky = get_post( $this -> expanded_sticky ); array_unshift( $wp_query -> posts, $first_sticky ); $wp_query -> post_count = $wp_query -> post_count + 1; } /* * hook : tc_thumb_size_name */ function czr_fn_set_thumb_size_name(){ return ( $this -> czr_fn_get_grid_section_cols() == '1' ) ? 'tc-grid-full' : 'tc-grid'; } /* * hook : tc_thumb_size */ function czr_fn_set_thumb_size(){ $thumb = ( $this -> czr_fn_get_grid_section_cols() == '1' ) ? 'tc_grid_full_size' : 'tc_grid_size'; return CZR___::$instance -> $thumb; } /** * hook : tc_article_container_class * inside loop * add custom classes to the grid .article-container element */ function czr_fn_grid_container_set_classes( $_classes ) { array_push( $_classes, 'tc-post-list-grid' ); if ( esc_attr( czr_fn_opt( 'tc_grid_shadow') ) ) array_push( $_classes, 'tc-grid-shadow' ); if ( esc_attr( czr_fn_opt( 'tc_grid_bottom_border') ) ) array_push( $_classes, 'tc-grid-border' ); return $_classes; } /** * @return the figcation content as a string * @param $post_list_content_class string * inside loop */ private function czr_fn_grid_get_single_post_html( $post_list_content_class ) { global $post; ob_start(); ?> <figcaption class="<?php echo $post_list_content_class ?>"> <?php do_action( '__grid_single_post_content' ) ?> </figcaption> <?php $html = ob_get_contents(); if ($html) ob_end_clean(); return apply_filters( 'tc_grid_get_single_post_html', $html, $post_list_content_class ); } /** * hook : tc_grid_get_single_post_html * @return the comment_bubble as a string * inside loop */ function czr_fn_grid_display_comment_bubble( $_html ) { return CZR_comments::$instance -> czr_fn_display_comment_bubble() . $_html; } /** * hook : __grid_single_post_content * @return html string * hook : tc_grid_display_figcaption_content */ function czr_fn_grid_set_expanded_post_title( $_html ){ if ( ! $this -> czr_fn_force_current_post_expansion() ) return $_html; global $post; $_title = apply_filters( 'tc_grid_expanded_title' , $post->post_title ); $_title = apply_filters( 'tc_the_title' , $_title ); $_title = apply_filters( 'tc_grid_expanded_title_html', sprintf('<h2 class="entry-title">%1$s</h2>', $_title ) ); return $_html . $_title; } /** * @return bool * hook : tc_edit_in_title * @since Customizr 3.4.18 */ function czr_fn_grid_disable_edit_in_title_expanded( $_bool ){ return $this -> czr_fn_force_current_post_expansion() ? false : $_bool; } /** * Append the edit link to the expanded post figcaption * hook : tc_grid_get_single_post_html * @since Customizr 3.4.18 */ function czr_fn_grid_render_expanded_edit_link( $_html ) { if ( $this -> czr_fn_force_current_post_expansion() ) $_html .= CZR_headings::$instance -> czr_fn_render_edit_link_view( $_echo = false ); return $_html; } /** * @return css string * hook : tc_user_options_style * @since Customizr 3.2.18 */ function czr_fn_grid_write_inline_css( $_css ){ if ( ! $this -> czr_fn_is_grid_enabled() ) return $_css; $_col_nb = $this -> czr_fn_get_grid_cols(); //GENERATE THE FIGURE HEIGHT CSS $_current_col_figure_css = $this -> czr_fn_grid_get_figure_css( $_col_nb ); //GENERATE THE MEDIA QUERY CSS FOR FONT-SIZES $_current_col_media_css = $this -> czr_fn_get_grid_font_css( $_col_nb ); $_grid_border_skinned_css = $this -> czr_fn_get_grid_boder_skinned_css(); $_css = sprintf("%s\n%s\n%s\n%s\n", $_css, $_current_col_media_css, $_current_col_figure_css, $_grid_border_skinned_css ); return $_css; } /** * hook : tc-grid-thumb-html * @return modified html string */ function czr_fn_set_grid_icon_visibility( $_html ) { $_icon_enabled = (bool) esc_attr( czr_fn_opt( 'tc_grid_icons') ); if ( czr_fn_is_customizing() ) return sprintf('<div class="tc-grid-icon format-icon" style="display:%1$s"></div>%2$s', $_icon_enabled ? 'inline-block' : 'none', $_html ); if ( $_icon_enabled ) return sprintf('<div class="tc-grid-icon format-icon"></div>%1$s', $_html ); else return $_html; } /****************************** HELPERS FOR INLINE CSS *******************************/ /** * @param (string) $col_layout * @return css media query string * Returns the paragraph and title media queries for a given layout */ private function czr_fn_get_grid_font_css( $_col_nb = '3' ) { $_media_queries = $this -> czr_fn_get_grid_media_queries();//returns the simple array of media queries $_grid_font_sizes = $this -> czr_fn_get_grid_font_sizes( $_col_nb );//return the array of sizes (ordered by @media queries) for a given column layout $_col_rules = array(); $_media_queries_css = ''; //flatten the matrix foreach ($_media_queries as $key => $_med_query_sizes ) { $_size = $_grid_font_sizes[$key];//=> size like 'xxl' $_css_prop = array( 'h' => $this -> czr_fn_grid_build_css_rules( $_size , 'h' ), 'p' => $this -> czr_fn_grid_build_css_rules( $_size , 'p' ) ); $_rules = $this -> czr_fn_grid_assign_css_rules_to_selectors( $_med_query_sizes , $_css_prop, $_col_nb ); $_media_queries_css .= " @media {$_med_query_sizes} {{$_rules}} "; } return $_media_queries_css; } /** * @return simple array of media queries */ private function czr_fn_get_grid_media_queries() { return apply_filters( 'tc_grid_media_queries' , array( '(min-width: 1200px)', '(max-width: 1199px) and (min-width: 980px)', '(max-width: 979px) and (min-width: 768px)', '(max-width: 767px)', '(max-width: 480px)' ) ); } /** * Return the array of sizes (ordered by @media queries) for a given column layout * @param $_col_nb string * @param $_requested_media_size * @return array() * Note : When all sizes are requested (default case), the returned array can be filtered with the current layout param * Size array must have the same length of the media query array */ private function czr_fn_get_grid_font_sizes( $_col_nb = '3', $_requested_media_size = null ) { $_col_media_matrix = apply_filters( 'tc_grid_font_matrix' , array( //=> matrix col nb / media queries // 1200 | 1199-980 | 979-768 | 767 | 480 '1' => array( 'xxxl', 'xxl' , 'xl' , 'xl' , 'l' ), '2' => array( 'xxl' , 'xl' , 'l' , 'xl' , 'l' ), '3' => array( 'xl' , 'l' , 'm' , 'xl' , 'l' ), '4' => array( 'l' , 'm' , 's' , 'xl' , 'l' ) ) ); //if a specific media query is requested, return a string if ( ! is_null($_requested_media_size) ) { $_media_queries = $this -> czr_fn_get_grid_media_queries(); //get the key = position of requested size in the current layout $_key = array_search( $_requested_media_size, $_media_queries); return apply_filters( 'tc_get_layout_single_font_size', isset($_col_media_matrix[$_col_nb][$_key]) ? $_col_media_matrix[$_col_nb][$_key] : 'xl' ); } return apply_filters( 'tc_get_grid_font_sizes', isset($_col_media_matrix[$_col_nb]) ? $_col_media_matrix[$_col_nb] : array( 'xl' , 'l' , 'm', 'l', 'm' ), $_col_nb, $_col_media_matrix, CZR_utils::czr_fn_get_layout( $this -> post_id , 'class' ) ); } /** * hook : 'tc_get_grid_font_sizes' * Updates the array of sizes for a given sidebar layout * @param $_sizes array. ex : array( 'xl' , 'l' , 'm', 'l', 'm' ) * @param $_col_nb string. Ex: '2' * @param $_col_media_matrix : array() matrix 5 x 4 => media queries / Col_nb * @param $_current_layout string. Ex : 'span9' * @return array() */ function czr_fn_set_layout_font_size( $_sizes, $_col_nb, $_col_media_matrix, $_current_layout ) { //max possible font size key in the col_media_queries matrix for a given sidebar layout $_map = apply_filters( 'tc_layout_font_size_map', array( 'span12' => '1',//no sidebars 'span11' => '1', 'span10' => '1', 'span9' => '2',//one sidebar right or left 'span8' => '2', 'span7' => '3', 'span6' => '4',//two sidebars 'span5' => '4', 'span4' => '4', 'span3' => '4', 'span2' => '4', 'span1' => '4', ) ); if ( ! isset($_map[$_current_layout]) ) return $_sizes; if ( (int) $_col_nb >= (int) $_map[$_current_layout] ) return $_sizes; $_new_key = $_map[$_current_layout]; return $_col_media_matrix[$_new_key]; } /** * @return css string * @param size string * @param selector type string * returns ratio of size / body size for a given selector type ( headings or paragraphs ) */ private function czr_fn_get_grid_font_ratios( $_size = 'xl' , $_sel = 'h' ) { $_ratios = apply_filters( 'tc_get_grid_font_ratios' , array( 'xxxl' => array( 'h' => 2.10, 'p' => 1 ), 'xxl' => array( 'h' => 1.86, 'p' => 1 ), 'xl' => array( 'h' => 1.60, 'p' => 0.93 ), 'l' => array( 'h' => 1.30, 'p' => 0.85 ), 'm' => array( 'h' => 1.15, 'p' => 0.80 ), 's' => array( 'h' => 1.0, 'p' => 0.75 ) ) ); if ( isset($_ratios[$_size]) && isset($_ratios[$_size][$_sel]) ) return $_ratios[$_size][$_sel]; return 1; } /** * @return css string * @param $_media_query = string of current media query. * @param $_css_prop = array of css rules for paragraph and titles for a given column layout * @param $_col_nb = current column layout * Assigns css rules to predefined grid selectors for headings and paragraphs * adds the '1' column css if (OR) : * 1) there's a sticky post * 2) user layout is one column */ private function czr_fn_grid_assign_css_rules_to_selectors( $_media_query, $_css_prop, $_col_nb ) { $_css = ''; //Add one column font rules if there's a sticky post if ( $this -> czr_fn_is_sticky_expanded() || '1' == $_col_nb ) { $_size = $this -> czr_fn_get_grid_font_sizes( $_col_nb = '1', $_media_query );//size like xxl $_h_one_col = $this -> czr_fn_grid_build_css_rules( $_size , 'h' ); $_p_one_col = $this -> czr_fn_grid_build_css_rules( $_size , 'p' ); $_css .= " .tc-post-list-grid .grid-cols-1 .entry-title {{$_h_one_col}} .tc-post-list-grid .grid-cols-1 .tc-g-cont {{$_p_one_col}} "; } $_h = $_css_prop['h']; $_p = $_css_prop['p']; $_css .= " .tc-post-list-grid article .entry-title {{$_h}} .tc-post-list-grid .tc-g-cont {{$_p}} "; return $_css; } /** * @return css string * @param column layout (string) * adds the one column css if (OR) : * 1) there's a sticky post * 2) user layout is one column */ private function czr_fn_grid_get_figure_css( $_col_nb = '3' ) { $_height = $this -> czr_fn_get_grid_column_height( $_col_nb ); $_cols_class = sprintf( 'grid-cols-%s' , $_col_nb ); $_css = ''; //Add one column height if there's a sticky post if ( $this -> czr_fn_is_sticky_expanded() && '1' != $_col_nb ) { $_height_col_one = $this -> czr_fn_get_grid_column_height( '1' ); $_css .= ".grid-cols-1 figure { height:{$_height_col_one}px; max-height:{$_height_col_one}px; line-height:{$_height_col_one}px; }"; } $_css .= " .{$_cols_class} figure { height:{$_height}px; max-height:{$_height}px; line-height:{$_height}px; }"; return $_css; } /** * @return string * @param size string * @param selector type string * returns the font-size and line-height css rules */ private function czr_fn_grid_build_css_rules( $_size = 'xl', $_wot = 'h' ) { $_lh_ratio = apply_filters( 'tc_grid_line_height_ratio' , 1.55 ); //line-height / font-size $_ratio = $this -> czr_fn_get_grid_font_ratios( $_size , $_wot ); //body font size $_bs = esc_attr( czr_fn_opt( 'tc_body_font_size') ); $_bs = is_numeric($_bs) && 1 >= $_bs ? $_bs : 15; return sprintf( 'font-size:%spx;line-height:%spx;' , ceil( $_bs * $_ratio ), ceil( $_bs * $_ratio * $_lh_ratio ) ); } /** * @return string * returns the skinned border css rule */ private function czr_fn_get_grid_boder_skinned_css() { //add this reset rule for custom skin users $_reset_old_skinned_border = '.tc-grid-border .tc-grid { border-bottom: none }'; $_skin_main_color = CZR_utils::$instance -> czr_fn_get_skin_color(); return sprintf( "%s\n%s", $_reset_old_skinned_border, '.tc-grid-border .grid__item { border-bottom: 3px solid ' . $_skin_main_color .'}' ); } /****************************** VARIOUS HELPERS *******************************/ /** * @param (string) $col_layout * @return string * */ private function czr_fn_get_grid_column_height( $_cols_nb = '3' ) { $_h = $this -> czr_fn_grid_get_thumb_height(); $_current_layout = CZR_utils::czr_fn_get_layout( $this -> post_id , 'sidebar' ); $_layouts = array('b', 'l', 'r' , 'f');//both, left, right, full (no sidebar) $_key = 3;//default value == full if ( in_array( $_current_layout, $_layouts ) ) //get the key = position of requested size in the current layout $_key = array_search( $_current_layout , $_layouts ); $_grid_col_height_map = apply_filters( 'tc_grid_col_height_map', array( // 'b' 'l' 'r' 'f' '1' => array( 225 , 225, 225, $_h ), '2' => array( 225 , $_h, $_h, $_h ), '3' => array( 225 , 225, 225, 225 ), '4' => array( 165 , 165, 165, 165 ) ) ); //are we ok ? if ( ! isset( $_grid_col_height_map[$_cols_nb] ) ) return $_h; //parse the array to ensure that all values are <= user height foreach ( $_grid_col_height_map as $_c => $_heights ) { $_grid_col_height_map[$_c] = $this -> czr_fn_set_max_col_height ( $_heights ,$_h ); } $_h = isset( $_grid_col_height_map[$_cols_nb][$_key] ) ? $_grid_col_height_map[$_cols_nb][$_key] : $_h; return apply_filters( 'tc_get_grid_column_height' , $_h, $_cols_nb, $_current_layout ); } /** * parse the array to ensure that all values are <= user height * @param (array) grid_col_height_map * @param (num) user defined max height in pixel * @return string * */ private function czr_fn_set_max_col_height( $_heights ,$_h ) { $_return = array(); foreach ($_heights as $_value) { $_return[] = $_value >= $_h ? $_h : $_value; } return $_return; } /** * @return (number) customizer user defined height for the grid thumbnails */ private function czr_fn_grid_get_thumb_height() { $_opt = esc_attr( czr_fn_opt( 'tc_grid_thumb_height') ); return ( is_numeric($_opt) && $_opt > 1 ) ? $_opt : 350; } /* * @return bool * check if we have to expand the first sticky post */ private function czr_fn_is_sticky_expanded( $query = null ){ global $wp_query, $wpdb; $query = ( $query ) ? $query : $wp_query; if ( ! $query->is_main_query() ) { return false; } if ( ! ( ( is_home() && 'posts' == get_option('show_on_front') ) || $wp_query->is_posts_page ) ) return false; $_expand_feat_post_opt = apply_filters( 'tc_grid_expand_featured', esc_attr( czr_fn_opt( 'tc_grid_expand_featured') ) ); if ( $_expand_feat_post_opt ) { if ( ! $this -> expanded_sticky ) { $_sticky_posts = get_option('sticky_posts'); // get last published sticky post if ( is_array($_sticky_posts) && ! empty( $_sticky_posts ) ) { $_where = implode(',', $_sticky_posts ); $this -> expanded_sticky = $wpdb->get_var( " SELECT ID FROM $wpdb->posts WHERE ID IN ( $_where ) ORDER BY post_date DESC LIMIT 1 " ); }else $this -> expanded_sticky = null; } }else { $this -> expanded_sticky = null; } if ( ! $this -> expanded_sticky ) return false; return true; } /* * @return bool * returns if the current post is the expanded one */ private function czr_fn_force_current_post_expansion(){ global $wp_query; return ( $this -> expanded_sticky && 0 == $wp_query -> current_post ); } /* * @return bool */ public function czr_fn_is_grid_enabled() { return apply_filters( 'tc_is_grid_enabled', 'grid' == esc_attr( czr_fn_opt( 'tc_post_list_grid') ) && $this -> czr_fn_is_grid_context_matching() ); } /* retrieves number of cols option, and wrap it into a filter */ private function czr_fn_get_grid_cols() { return apply_filters( 'tc_get_grid_cols', esc_attr( czr_fn_opt( 'tc_grid_columns') ), CZR_utils::czr_fn_get_layout( $this -> post_id , 'class' ) ); } /* returns articles wrapper section columns */ private function czr_fn_get_grid_section_cols() { return apply_filters( 'tc_grid_section_cols', $this -> czr_fn_force_current_post_expansion() ? '1' : $this -> czr_fn_get_grid_cols() ); } /* returns the type of post list we're in if any, an empty string otherwise */ private function czr_fn_get_grid_context() { global $wp_query; if ( ( is_home() && 'posts' == get_option('show_on_front') ) || $wp_query->is_posts_page ) return 'blog'; else if ( is_search() && $wp_query->post_count > 0 ) return 'search'; else if ( is_archive() ) return 'archive'; return ''; } /* performs the match between the option where to use post list grid * and the post list we're in */ private function czr_fn_is_grid_context_matching() { $_type = $this -> czr_fn_get_grid_context(); $_apply_grid_to_post_type = apply_filters( 'tc_grid_in_' . $_type, esc_attr( czr_fn_opt( 'tc_grid_in_' . $_type ) ) ); return apply_filters('tc_grid_do', $_type && $_apply_grid_to_post_type ); } /** * @return boolean */ private function czr_fn_grid_show_thumb() { return CZR_post_thumbnails::$instance -> czr_fn_has_thumb() && czr_fn_is_checked( 'tc_post_list_show_thumb' ); } }//end of class endif; ?><?php /** * Post metas content actions * Since 3.1.20, displays all levels of any hierarchical taxinomies by default and for all types of post (including hierarchical CPT). This feature can be disabled with a the filter : tc_display_taxonomies_in_breadcrumb (set to true by default). In the case of hierarchical post types (like page or hierarchical CPT), the taxonomy trail is only displayed for the higher parent. * */ if ( ! class_exists( 'CZR_post_metas' ) ) : class CZR_post_metas { static $instance; function __construct () { self::$instance =& $this; //Show / hide metas based on customizer user options (@since 3.2.0) add_action( 'template_redirect' , array( $this , 'czr_fn_set_visibility_options' ) , 10 ); //Show / hide metas based on customizer user options (@since 3.2.0) add_action( 'template_redirect' , array( $this , 'czr_fn_set_design_options' ) , 20 ); //Show / hide metas based on customizer user options (@since 3.2.0) add_action( '__after_content_title' , array( $this , 'czr_fn_set_post_metas_hooks' ), 20 ); } /*********************** * VISIBILITY HOOK SETUP ***********************/ /** * Set the post metas visibility based on Customizer options * uses hooks tc_show_post_metas, body_class * hook : template_redirect * * @package Customizr * @since Customizr 3.2.0 */ function czr_fn_set_visibility_options() { //if customizing context, always render. Will be hidden in the DOM with a body class filter is disabled. if ( 0 == czr_fn_opt( 'tc_show_post_metas' ) ) { if ( czr_fn_is_customizing() ) add_filter( 'body_class' , array( $this , 'czr_fn_hide_all_post_metas') ); else{ add_filter( 'tc_show_post_metas' , '__return_false' ); return; } } if ( is_singular() && ! is_page() && ! czr_fn__f('__is_home') ) { if ( czr_fn_is_checked( 'tc_show_post_metas_single_post' ) ) { add_filter( 'tc_show_post_metas' , '__return_true' ); return; } if ( czr_fn_is_customizing() ) { add_filter( 'body_class' , array( $this , 'czr_fn_hide_post_metas') ); add_filter( 'tc_show_post_metas' , '__return_true' ); } else add_filter( 'tc_show_post_metas' , '__return_false' ); return; } if ( ! is_singular() && ! czr_fn__f('__is_home') && ! is_page() ) { if ( czr_fn_is_checked( 'tc_show_post_metas_post_lists' ) ) { add_filter( 'tc_show_post_metas' , '__return_true' ); return; } if ( czr_fn_is_customizing() ) { add_filter( 'body_class' , array( $this , 'czr_fn_hide_post_metas') ); add_filter( 'tc_show_post_metas' , '__return_true' ); } else add_filter( 'tc_show_post_metas' , '__return_false' ); return; } if ( czr_fn__f('__is_home') ) { if ( czr_fn_is_checked( 'tc_show_post_metas_home' ) ) { add_filter( 'tc_show_post_metas' , '__return_true' ); return; } if ( czr_fn_is_customizing() ) { add_filter( 'body_class' , array( $this , 'czr_fn_hide_post_metas') ); add_filter( 'tc_show_post_metas' , '__return_true' ); } else add_filter( 'tc_show_post_metas' , '__return_false' ); } } /** * Default metas visibility controller * tc_show_post_metas gets filtered by czr_fn_set_visibility_options() called early in template_redirect * @return boolean * @package Customizr * @since Customizr 3.2.6 */ private function czr_fn_show_post_metas() { global $post; //when do we display the metas ? //1) default is : not on home page, 404, search page //2) +filter conditions return apply_filters( 'tc_show_post_metas', ! czr_fn__f('__is_home') && ! is_404() && ! 'page' == $post -> post_type && in_array( get_post_type(), apply_filters('tc_show_metas_for_post_types' , array( 'post') ) ) ); } /*********************** * DESIGN HOOK SETUP ***********************/ function czr_fn_set_design_options() { if ( 'buttons' == esc_attr( czr_fn_opt( 'tc_post_metas_design' ) ) ) return; add_filter( 'tc_meta_terms_glue' , array( $this, 'czr_fn_set_term_meta_glue' ) ); add_filter( 'tc_meta_tax_class' , '__return_empty_array' ); add_filter( 'tc_post_tax_metas_html' , array( $this, 'czr_fn_set_tax_metas' ), 10, 2 ); add_filter( 'tc_post_date_metas_html' , array( $this, 'czr_fn_set_date_metas' ), 10, 2 ); add_filter( 'tc_post_author_metas_html' , array( $this, 'czr_fn_set_author_metas' ), 10 , 2 ); add_filter( 'tc_set_metas_content' , array( $this, 'czr_fn_set_metas' ), 10, 2 ); } /***************** * MODELS *****************/ /** * Build the metas models * Render the view based on filters * hook : __after_content_title * @return void * @package Customizr * @since Customizr 3.2.2 */ function czr_fn_set_post_metas_hooks() { if ( ! $this -> czr_fn_show_post_metas() ) return; global $post; $_model = array(); //BUILD MODEL //Two cases : attachment and not attachment if ( 'attachment' == $post -> post_type ) { $_model = $this -> czr_fn_build_attachment_post_metas_model(); } else { $_model = $this -> czr_fn_build_post_post_metas_model(); //Set metas content based on customizer user options (@since 3.2.6) add_filter( 'tc_meta_utility_text' , array( $this , 'czr_fn_set_post_metas_elements'), 10 , 2 ); //filter metas content with default theme settings add_filter( 'tc_meta_utility_text' , array( $this , 'czr_fn_add_link_to_post_after_metas'), 20 ); } //RENDER VIEW $this -> czr_fn_render_metas_view( $_model ); } /** * Post metas model * @return model array * @package Customizr * @since Customizr 3.2.6 */ private function czr_fn_build_post_post_metas_model() { $cat_list = $this -> czr_fn_meta_generate_tax_list( true ); $tag_list = $this -> czr_fn_meta_generate_tax_list( false ); $pub_date = $this -> czr_fn_get_meta_date( 'publication' ); $auth = $this -> czr_fn_get_meta_author(); $upd_date = $this -> czr_fn_get_meta_date( 'update' ); $_args = compact( 'cat_list' ,'tag_list', 'pub_date', 'auth', 'upd_date' ); /* * See: https://github.com/presscustomizr/customizr/issues/875 * use wp_sprintf (wp-includes/formatting.php) to avoid Warning sprintf(): Too few arguments * caused by malformed translation trying to access not passed arguments */ $_html = wp_sprintf( __( 'This entry was posted on %1$s<span class="by-author"> by %2$s</span>.' , 'customizr' ), $pub_date, $auth ); return apply_filters( 'tc_post_metas_model' , compact( "_html" , "_args" ) ); } /** * Attachment metas model * @return model array * @package Customizr * @since Customizr 3.3.2 */ private function czr_fn_build_attachment_post_metas_model() { global $post; $metadata = wp_get_attachment_metadata(); $user_date_format = get_option('date_format'); $_html = sprintf( '%1$s <span class="entry-date"><time class="entry-date updated" datetime="%2$s">%3$s</time></span> %4$s %5$s', '<span class="meta-prep meta-prep-entry-date">'.__('Published' , 'customizr').'</span>', apply_filters('tc_use_the_post_modified_date' , false ) ? esc_attr( get_the_date( $user_date_format ) ) : esc_attr( get_the_modified_date($user_date_format) ), esc_html( get_the_date($user_date_format) ), ( isset($metadata['width']) && isset($metadata['height']) ) ? __('at dimensions' , 'customizr').'<a href="'.esc_url( wp_get_attachment_url() ).'" title="'.__('Link to full-size image' , 'customizr').'"> '.$metadata['width'].' × '.$metadata['height'].'</a>' : '', __('in' , 'customizr').'<a href="'.esc_url( get_permalink( $post->post_parent ) ).'" title="'.__('Return to ' , 'customizr').esc_attr( strip_tags( get_the_title( $post->post_parent ) ) ).'" rel="gallery"> '.get_the_title( $post->post_parent ).'</a>.' ); return apply_filters( 'tc_attachment_metas_model' , compact( "_html" ) ); } /***************** * VIEW *****************/ /** * Customizr metas view * @return html string * @package Customizr * @since Customizr 3.3.2 */ private function czr_fn_render_metas_view( $_model ) { if ( empty($_model) ) return; //extract $_html , $_args extract( $_model ); $_html = isset($_html) ? $_html : ''; $_args = isset($_args) ? $_args : array(); //echoes all filtered metas components echo apply_filters( 'tc_post_metas', sprintf( '<div class="entry-meta">%s</div>', apply_filters( 'tc_meta_utility_text', $_html , $_args ) ) ); } /***************** * SETTERS / GETTERS / HELPERS *****************/ /** * Set meta content based on user options * hook : tc_meta_utility_text * @return html string as a wp filter * @package Customizr * @since Customizr 3.2.6 */ function czr_fn_set_post_metas_elements( $_default , $_args = array() ) { $_show_cats = czr_fn_is_checked( 'tc_show_post_metas_categories' ) && false != $this -> czr_fn_meta_generate_tax_list( true ); $_show_tags = czr_fn_is_checked( 'tc_show_post_metas_tags' ) && false != $this -> czr_fn_meta_generate_tax_list( false ); $_show_pub_date = czr_fn_is_checked( 'tc_show_post_metas_publication_date' ); $_show_upd_date = czr_fn_is_checked( 'tc_show_post_metas_update_date' ) && false !== czr_fn_post_has_update(); $_show_upd_in_days = 'days' == esc_attr( czr_fn_opt( 'tc_post_metas_update_date_format' ) ); $_show_date = $_show_pub_date || $_show_upd_date; $_show_author = czr_fn_is_checked( 'tc_show_post_metas_author' ); //extract cat_list, tag_list, pub_date, auth, upd_date from $args if not empty if ( empty($_args) ) return $_default; extract($_args); //TAGS / CATS $_tax_text = ''; if ( $_show_cats && $_show_tags ) $_tax_text .= __( 'This entry was posted in %1$s and tagged %2$s' , 'customizr' ); if ( $_show_cats && ! $_show_tags ) $_tax_text .= __( 'This entry was posted in %1$s' , 'customizr' ); if ( ! $_show_cats && $_show_tags ) $_tax_text .= __( 'This entry was tagged %2$s' , 'customizr' ); $_tax_text = apply_filters( 'tc_post_tax_metas_html' , sprintf( $_tax_text , $cat_list, $tag_list ), compact( "_show_cats" , "_show_tags" , "cat_list", "tag_list" ) ); //PUBLICATION DATE $_date_text = ''; if ( $_show_pub_date ) { $_date_text = empty($_tax_text) ? __( 'This entry was posted on %1$s' , 'customizr' ) : $_date_text; if ( $_show_cats ) $_date_text .= __( 'on %1$s' , 'customizr' ); if ( ! $_show_cats && $_show_tags ) $_date_text .= __( 'and posted on %1$s' , 'customizr' ); $_date_text = apply_filters( 'tc_post_date_metas_html', sprintf( $_date_text, $pub_date ), $pub_date ); } //AUTHOR $_author_text = ''; if ( $_show_author ) { if ( empty($_tax_text) && empty($_date_text) ) { $_author_text = sprintf( '%s <span class="by-author">%s</span>' , __( 'This entry was posted', 'customizr' ), __('by %1$s' , 'customizr') ); } else { $_author_text = sprintf( '<span class="by-author">%s</span>' , __('by %1$s' , 'customizr') ); } $_author_text = apply_filters( 'tc_post_author_metas_html', sprintf( $_author_text, $auth ), $auth ); } //UPDATE DATE $_update_text = ''; if ( $_show_upd_date ) { if ( $_show_upd_in_days ) { $_update_days = czr_fn_post_has_update(); $_update_text = ( 0 == $_update_days ) ? __( '(updated today)' , 'customizr' ) : sprintf( __( '(updated %s days ago)' , 'customizr' ), $_update_days ); $_update_text = ( 1 == $_update_days ) ? __( '(updated 1 day ago)' , 'customizr' ) : $_update_text; } else { $_update_text = __( '(updated on %1$s)' , 'customizr' ); } $_update_text = apply_filters( 'tc_post_update_metas_html', sprintf( $_update_text , $upd_date ), $upd_date ); } return apply_filters ( 'tc_set_metas_content', sprintf( '%1$s %2$s %3$s %4$s' , $_tax_text , $_date_text, $_author_text, $_update_text ), compact( "_tax_text" , "_date_text", "_author_text", "_update_text" ) ); } /** * Helper * @return string of all the taxonomy terms (including the category list for posts) * @param hierarchical tax boolean => true = categories like, false = tags like * * @package Customizr * @since Customizr 3.0 */ public function czr_fn_meta_generate_tax_list( $hierarchical ) { $post_terms = $this -> czr_fn_get_term_of_tax_type( $hierarchical ); if ( ! $post_terms ) return; $_terms_html_array = array_map( array( $this , 'czr_fn_meta_term_view' ), $post_terms ); return apply_filters( 'tc_meta_generate_tax_list', implode( apply_filters( 'tc_meta_terms_glue' , '' ) , $_terms_html_array ) , $post_terms ); } /** * Helper * @return string of the single term view * @param $term object * * @package Customizr * @since Customizr 3.3.2 */ private function czr_fn_meta_term_view( $term ) { $_classes = array( 'btn' , 'btn-mini' ); $_is_hierarchical = is_taxonomy_hierarchical( $term -> taxonomy ); if ( $_is_hierarchical ) //<= check if hierarchical (category) or not (tag) array_push( $_classes , 'btn-tag' ); $_classes = implode( ' ', apply_filters( 'tc_meta_tax_class', $_classes , $_is_hierarchical, $term ) ); // (Rocco's PR Comment) : following to this https://wordpress.org/support/topic/empty-articles-when-upgrading-to-customizr-version-332 // I found that at least wp 3.6.1 get_term_link($term->term_id, $term->taxonomy) returns a WP_Error // Looking at the codex, looks like we can just use get_term_link($term), when $term is a term object. // Just this change avoids the issue with 3.6.1, but I thought should be better make a check anyway on the return type of that function. $_term_link = is_wp_error( get_term_link( $term ) ) ? '' : get_term_link( $term ); $_to_return = $_term_link ? '<a class="%1$s" href="%2$s" title="%3$s"> %4$s </a>' : '<span class="%1$s"> %4$s </a>'; return apply_filters( 'tc_meta_term_view' , sprintf($_to_return, $_classes, $_term_link, esc_attr( sprintf( __( "View all posts in %s", 'customizr' ), $term -> name ) ), $term -> name ) ); } /** * Helper to return the current post terms of specified taxonomy type : hierarchical or not * * @return boolean (false) or array * @param boolean : hierarchical or not * @package Customizr * @since Customizr 3.1.20 * */ public function czr_fn_get_term_of_tax_type( $hierarchical = true ) { //var declaration $post_type = get_post_type( czr_fn_get_id() ); $tax_list = get_object_taxonomies( $post_type, 'object' ); $_tax_type_list = array(); $_tax_type_terms_list = array(); if ( empty($tax_list) ) return false; //filter the post taxonomies while ( $_tax_object = current($tax_list) ) { // cast $_tax_object stdClass object in an array to access its property 'public' // fix for PHP version < 5.3 (?) $_tax_object = (array) $_tax_object; //Is the object well defined ? if ( ! isset($_tax_object['name']) ) { next($tax_list); continue; } $_tax_name = $_tax_object['name']; //skip the post format taxinomy if ( ! $this -> czr_fn_is_tax_authorized( $_tax_object, $post_type ) ) { next($tax_list); continue; } if ( (bool) $hierarchical === (bool) $_tax_object['hierarchical'] ) $_tax_type_list[$_tax_name] = $_tax_object; next($tax_list); } if ( empty($_tax_type_list) ) return false; //fill the post terms array foreach ($_tax_type_list as $tax_name => $data ) { $_current_tax_terms = get_the_terms( czr_fn_get_id() , $tax_name ); //If current post support this tax but no terms has been assigned yet = continue if ( ! $_current_tax_terms ) continue; while( $term = current($_current_tax_terms) ) { $_tax_type_terms_list[$term -> term_id] = $term; next($_current_tax_terms); } } return empty($_tax_type_terms_list) ? false : apply_filters( "tc_tax_meta_list" , $_tax_type_terms_list , $hierarchical ); } /** * Helper : check if a given tax is allowed in the post metas or not * A tax is authorized if : * 1) not in the exclude list * 2) AND not private * * @return boolean (false) * @param $post_type, $_tax_object * @package Customizr * @since Customizr 3.3+ * */ public function czr_fn_is_tax_authorized( $_tax_object , $post_type ) { $_in_exclude_list = in_array( $_tax_object['name'], apply_filters_ref_array ( 'tc_exclude_taxonomies_from_metas' , array( array('post_format') , $post_type , czr_fn_get_id() ) ) ); $_is_private = false === (bool) $_tax_object['public'] && apply_filters_ref_array( 'tc_exclude_private_taxonomies', array( true, $_tax_object['public'], czr_fn_get_id() ) ); return ! $_in_exclude_list && ! $_is_private; } /** * Helper * Return the date post metas * * @package Customizr * @since Customizr 3.2.6 */ public function czr_fn_get_meta_date( $pub_or_update = 'publication', $_format = '' ) { if ( 'short' == $_format ) $_format = 'j M, Y'; $_format = apply_filters( 'tc_meta_date_format' , $_format ); $_use_post_mod_date = apply_filters( 'tc_use_the_post_modified_date' , 'publication' != $pub_or_update ); $user_date_format = get_option('date_format'); return apply_filters( 'tc_date_meta', sprintf( '<a href="%1$s" title="%2$s" rel="bookmark"><time class="entry-date updated" datetime="%3$s">%4$s</time></a>' , esc_url( get_day_link( get_the_time( 'Y' ), get_the_time( 'm' ), get_the_time( 'd' ) ) ), esc_attr( get_the_time() ), $_use_post_mod_date ? esc_attr( get_the_modified_date($_format) ) : esc_attr( get_the_date( $_format ) ), $_use_post_mod_date ? esc_html( get_the_modified_date( $user_date_format ) ) : esc_html( get_the_date( $user_date_format ) ) ), $_use_post_mod_date, $_format );//end filter } /** * Helper * Return the post author metas * * @package Customizr * @since Customizr 3.2.6 */ private function czr_fn_get_meta_author() { $author_id = get_the_author_meta( 'ID' ); if ( is_single() ) { if ( ! in_the_loop() ) { global $post; $author_id = $post->post_author; } } $author_id_array = apply_filters( 'tc_post_author_id', array( $author_id ) ); $author_id_array = is_array( $author_id_array ) ? $author_id_array : array( $author_id ); $_html = ''; $_i = 1; foreach ( $author_id_array as $author_id ) { $author_name = get_the_author_meta( 'display_name', $author_id ); if ( 1 != $_i && count( $author_id_array ) > $_i - 1 ) { $_html .= ', '; } $_i +=1; $_html .= sprintf( '<span class="author vcard author_name"><a class="url fn n" href="%1$s" title="%2$s" rel="author">%3$s</a></span>' , esc_url( get_author_posts_url( $author_id ) ), esc_attr( sprintf( __( 'View all posts by %s' , 'customizr' ), $author_name ) ), $author_name ); } return apply_filters('tc_author_meta', $_html ); } /** * @return string * Return the filter post metas for specific post formats * hook tc_meta_utility_text * @package Customizr * @since Customizr 3.2.9 */ function czr_fn_add_link_to_post_after_metas( $_metas_html ) { if ( apply_filters( 'tc_show_link_after_post_metas' , true ) && in_array( get_post_format(), apply_filters( 'tc_post_formats_with_no_heading', CZR_init::$instance -> post_formats_with_no_heading ) ) && ! is_singular() ) { return apply_filters('tc_add_link_to_post_after_metas', sprintf('%1$s | <a href="%2$s" title="%3$s">%3$s »</a>', $_metas_html, get_permalink(), __('Open' , 'customizr') ) ); } return $_metas_html; } /** * hook body_class filter * * @package Customizr * @since Customizr 3.2.0 */ function czr_fn_hide_all_post_metas( $_classes ) { return array_merge($_classes , array('hide-all-post-metas') ); } /** * hook body_class filter * * @package Customizr * @since Customizr 3.2.0 */ function czr_fn_hide_post_metas( $_classes ) { return array_merge($_classes , array('hide-post-metas') ); } /** * hook : tc_meta_terms_glue * @return string */ public function czr_fn_set_term_meta_glue() { return ' / '; } /** * hook : tc_post_tax_metas_html * @return string */ function czr_fn_set_tax_metas( $_html , $_tax = array() ) { if ( empty($_tax) ) return $_html; //extract "_show_cats" , "_show_tags" , "cat_list", "tag_list" extract($_tax); $cat_list = ! empty($cat_list) && $_show_cats ? sprintf( ' %s %s' , __('in' , 'customizr') , $cat_list ) : ''; $tag_list = ! empty($tag_list) && $_show_tags ? sprintf( ' %s %s' , __('tagged' , 'customizr') , $tag_list ) : ''; return sprintf( '%s%s' , $cat_list, $tag_list ); } /** * hook : tc_post_date_metas_html * @return string */ function czr_fn_set_date_metas( $_html, $_pubdate = '' ) { if ( empty($_pubdate)) return $_html; return CZR_post_metas::$instance -> czr_fn_get_meta_date( 'publication' , 'short' ); } /** * hook : tc_post_author_metas_html * @return string */ function czr_fn_set_author_metas( $_html , $_auth = '' ) { if ( empty($_auth) ) return $_html; return sprintf( '<span class="by-author"> %s %s</span>' , __('by' , 'customizr'), $_auth ); } /** * hook : tc_set_metas_content * @return string */ function czr_fn_set_metas( $_html, $_parts = array() ) { if ( empty($_parts) ) return $_html; //extract $_tax_text , $_date_text, $_author_text, $_update_text extract($_parts); return sprintf( '%1$s %2$s %3$s %4$s' , $_date_text, $_tax_text , $_author_text, $_update_text ); } }//end of class endif; //the only purpose of this function is to use the_tags() wp function in the theme... function czr_fn_get_the_tags() { return the_tags(); } ?><?php /** * Navigation action * */ if ( ! class_exists( 'CZR_post_navigation' ) ) : class CZR_post_navigation { static $instance; function __construct () { self::$instance =& $this; add_action ( '__after_loop' , array( $this , 'czr_fn_post_nav' ), 20 ); } /*********************** * VISIBILITY SETUP ***********************/ /** * Set the post navigation visibility based on Customizer options * * returns an array which contains, @bool whether or not show the navigation , @array css classes of the navigation, @string the context * @package Customizr * @since Customizr 3.3.22 */ function czr_fn_set_visibility_options(){ $_nav_classes = array('navigation'); $_context = $this -> czr_fn_get_context(); $_post_nav_enabled = $this -> czr_fn_is_post_navigation_enabled(); $_post_nav_context_enabled = $this -> czr_fn_is_post_navigation_context_enabled( $_context ); $_is_customizing = czr_fn_is_customizing() ; if ( $_is_customizing ){ if ( ! $_post_nav_enabled ) array_push( $_nav_classes, 'hide-all-post-navigation' ); if ( ! $_post_nav_context_enabled ) array_push( $_nav_classes, 'hide-post-navigation' ); $_post_nav_enabled = true; }else $_post_nav_enabled = $_post_nav_enabled && $_post_nav_context_enabled; return array( apply_filters( 'tc_show_post_navigation', $_post_nav_enabled ), implode( ' ', apply_filters( 'tc_show_post_navigation_class' , $_nav_classes ) ), $_context ); } /** * The template part for displaying nav links * * @package Customizr * @since Customizr 3.0 */ function czr_fn_post_nav() { list( $post_navigation_bool, $post_nav_class, $_context) = $this -> czr_fn_set_visibility_options(); if( ! $post_navigation_bool ) return; // If in static front page context show the pages navigation. $_context = is_page() ? 'page' : $_context; $prev_arrow = is_rtl() ? '→' : '←' ; $next_arrow = is_rtl() ? '←' : '→' ; $html_id = 'nav-below'; global $wp_query; ob_start(); ?> <?php if ( in_array($_context, array('single', 'page') ) ) : ?> <?php echo apply_filters( 'tc_singular_nav_separator' , '<hr class="featurette-divider '.current_filter().'">'); ?> <nav id="<?php echo $html_id; ?>" class="<?php echo $post_nav_class; ?>"> <h3 class="assistive-text"> <?php echo apply_filters( 'tc_singular_nav_title', __( 'Post navigation' , 'customizr' ) ) ; ?> </h3> <ul class="pager"> <?php if ( get_previous_post() != null ) : ?> <li class="previous"> <span class="nav-previous"> <?php $singular_nav_previous_text = apply_filters( 'tc_singular_nav_previous_text', call_user_func( '_x', $prev_arrow , 'Previous post link' , 'customizr' ) ); $previous_post_link_args = apply_filters( 'tc_previous_single_post_link_args' , array( 'format' => '%link', 'link' => '<span class="meta-nav">' . $singular_nav_previous_text . '</span> %title', 'in_same_term' => false, 'excluded_terms' => '', 'taxonomy' => 'category' ) ); extract( $previous_post_link_args , EXTR_OVERWRITE ); previous_post_link( $format , $link , $in_same_term, $excluded_terms, $taxonomy ); ?> </span> </li> <?php endif; ?> <?php if ( get_next_post() != null ) : ?> <li class="next"> <span class="nav-next"> <?php $singular_nav_next_text = apply_filters( 'tc_singular_nav_next_text', call_user_func( '_x', $next_arrow , 'Next post link' , 'customizr' ) ); $next_post_link_args = apply_filters( 'tc_next_single_post_link_args' , array( 'format' => '%link', 'link' => '%title <span class="meta-nav">' . $singular_nav_next_text . '</span>', 'in_same_term' => false, 'excluded_terms' => '', 'taxonomy' => 'category' ) ); extract( $next_post_link_args , EXTR_OVERWRITE ); next_post_link( $format , $link , $in_same_term, $excluded_terms, $taxonomy ); ?> </span> </li> <?php endif; ?> </ul> </nav><!-- //#<?php echo $html_id; ?> .navigation --> <?php elseif ( $wp_query->max_num_pages > 1 && in_array($_context, array('archive', 'home') ) ) : ?> <nav id="<?php echo $html_id; ?>" class="<?php echo $post_nav_class; ?>"> <h3 class="assistive-text"> <?php echo apply_filters( 'tc_list_nav_title', __( 'Post navigation' , 'customizr' ) ) ; ?> </h3> <ul class="pager"> <?php if(get_next_posts_link() != null) : ?> <li class="previous"> <span class="nav-previous"> <?php $next_posts_link_args = apply_filters( 'tc_next_posts_link_args' , array( 'label' => apply_filters( 'tc_list_nav_next_text', __( '<span class="meta-nav">←</span> Older posts' , 'customizr' ) ), 'max_pages' => 0 ) ); extract( $next_posts_link_args , EXTR_OVERWRITE ); next_posts_link( $label , $max_pages ); ?> </span> </li> <?php endif; ?> <?php if(get_previous_posts_link() != null) : ?> <li class="next"> <span class="nav-next"> <?php $previous_posts_link_args = apply_filters( 'tc_previous_posts_link_args' , array( 'label' => apply_filters( 'tc_list_nav_previous_text', __( 'Newer posts <span class="meta-nav">→</span>' , 'customizr' ) ), 'max_pages' => 0 ) ); extract( $previous_posts_link_args , EXTR_OVERWRITE ); previous_posts_link( $label , $max_pages ); ?> </span> </li> <?php endif; ?> </ul> </nav><!-- //#<?php echo $html_id; ?> .navigation --> <?php endif; ?> <?php $html = ob_get_contents(); if ($html) ob_end_clean(); echo apply_filters( 'tc_post_nav' , $html ); } /****************************** VARIOUS HELPERS *******************************/ /** * * @return string or bool * */ function czr_fn_get_context(){ if ( is_front_page() ) { return 'home'; } if ( is_page() ) { return 'page'; } if ( is_single() && ! is_attachment() ) { return 'single'; // exclude attachments. } if ( !is_404() && ! czr_fn__f( '__is_home_empty') ) { return 'archive'; } return false; } /* * @param (string or bool) the context * @return bool */ function czr_fn_is_post_navigation_context_enabled( $_context ) { return $_context && 1 == esc_attr( czr_fn_opt( "tc_show_post_navigation_{$_context}" ) ); } /* * @return bool */ function czr_fn_is_post_navigation_enabled(){ return 1 == esc_attr( czr_fn_opt( 'tc_show_post_navigation' ) ) ; } }//end of class endif; ?> <?php /** * Posts thumbnails actions * */ if ( ! class_exists( 'CZR_post_thumbnails' ) ) : class CZR_post_thumbnails { static $instance; function __construct () { self::$instance =& $this; //may be filter the thumbnail inline style add_filter( 'tc_post_thumb_inline_style' , array( $this , 'czr_fn_change_thumb_inline_css' ), 10, 3 ); } /********************** * THUMBNAIL MODELS **********************/ /** * Gets the thumbnail or the first images attached to the post if any * inside loop * @return array( $tc_thumb(image object), $tc_thumb_width(string), $tc_thumb_height(string) ) * * @package Customizr * @since Customizr 1.0 */ function czr_fn_get_thumbnail_model( $requested_size = null, $_post_id = null , $_custom_thumb_id = null, $_enable_wp_responsive_imgs = null ) { if ( ! $this -> czr_fn_has_thumb( $_post_id, $_custom_thumb_id ) ) return array(); $tc_thumb_size = is_null($requested_size) ? apply_filters( 'tc_thumb_size_name' , 'tc-thumb' ) : $requested_size; $_post_id = is_null($_post_id) ? get_the_ID() : $_post_id; $_filtered_thumb_size = apply_filters( 'tc_thumb_size' , CZR___::$instance -> tc_thumb_size ); $_model = array(); $_img_attr = array(); $tc_thumb_height = ''; $tc_thumb_width = ''; //when null set it as the image setting for reponsive thumbnails (default) //because this method is also called from the slider of posts which refers to the slider responsive image setting //limit this just for wp version >= 4.4 if ( version_compare( $GLOBALS['wp_version'], '4.4', '>=' ) ) $_enable_wp_responsive_imgs = is_null( $_enable_wp_responsive_imgs ) ? 1 == czr_fn_opt('tc_resp_thumbs_img') : $_enable_wp_responsive_imgs; //try to extract $_thumb_id and $_thumb_type extract( $this -> czr_fn_maybe_set_and_get_thumb_info( $_post_id, $_custom_thumb_id ) ); if ( ! apply_filters( 'tc_has_thumb_info', isset($_thumb_id) && false != $_thumb_id && ! is_null($_thumb_id) ) ) return array(); //Try to get the image $image = wp_get_attachment_image_src( $_thumb_id, $tc_thumb_size); if ( ! apply_filters('tc_has_wp_thumb_image', ! empty( $image[0] ) ) ) return array(); //check also if this array value isset. (=> JetPack photon bug) if ( isset($image[3]) && false == $image[3] && 'tc-thumb' == $tc_thumb_size ) $tc_thumb_size = 'large'; if ( isset($image[3]) && false == $image[3] && 'tc_rectangular_size' == $tc_thumb_size ) $tc_thumb_size = 'slider'; $_img_attr['class'] = sprintf( 'attachment-%1$s tc-thumb-type-%2$s wp-post-image' , $tc_thumb_size , $_thumb_type ); //Add the style value $_style = apply_filters( 'tc_post_thumb_inline_style' , '', $image, $_filtered_thumb_size ); if ( $_style ) $_img_attr['style'] = $_style; $_img_attr = apply_filters( 'tc_post_thumbnail_img_attributes' , $_img_attr ); //we might not want responsive images if ( false === $_enable_wp_responsive_imgs ) { //trick, will produce an empty attr srcset as in wp-includes/media.php the srcset is calculated and added //only when the passed srcset attr is not empty. This will avoid us to: //a) add a filter to get rid of already computed srcset // or //b) use preg_replace to get rid of srcset and sizes attributes from the generated html //Side effect: //we'll see an empty ( or " " depending on the browser ) srcset attribute in the html //to avoid this we filter the attributes getting rid of the srcset if any. //Basically this trick, even if ugly, will avoid the srcset attr computation $_img_attr['srcset'] = " "; add_filter( 'wp_get_attachment_image_attributes', array( $this, 'czr_fn_remove_srcset_attr' ) ); } //get the thumb html if ( is_null($_custom_thumb_id) && has_post_thumbnail( $_post_id ) ) //get_the_post_thumbnail( $post_id, $size, $attr ) $tc_thumb = get_the_post_thumbnail( $_post_id , $tc_thumb_size , $_img_attr); else //wp_get_attachment_image( $attachment_id, $size, $icon, $attr ) $tc_thumb = wp_get_attachment_image( $_thumb_id, $tc_thumb_size, false, $_img_attr ); //get height and width if not empty if ( ! empty($image[1]) && ! empty($image[2]) ) { $tc_thumb_height = $image[2]; $tc_thumb_width = $image[1]; } //used for smart load when enabled $tc_thumb = apply_filters( 'tc_thumb_html', $tc_thumb, $requested_size, $_post_id, $_custom_thumb_id, $_img_attr, $tc_thumb_size ); return apply_filters( 'tc_get_thumbnail_model', isset($tc_thumb) && ! empty($tc_thumb) && false != $tc_thumb ? compact( "tc_thumb" , "tc_thumb_height" , "tc_thumb_width" ) : array(), $_post_id, $_thumb_id, $_enable_wp_responsive_imgs ); } /** * inside loop * @return array( "_thumb_id" , "_thumb_type" ) */ private function czr_fn_maybe_set_and_get_thumb_info( $_post_id = null, $_thumb_id = null ) { $_post_id = is_null($_post_id) ? get_the_ID() : $_post_id; $_meta_thumb = get_post_meta( $_post_id , 'tc-thumb-fld', true ); //get_post_meta( $post_id, $key, $single ); //always refresh the thumb meta if user logged in and current_user_can('upload_files') //When do we refresh ? //1) empty( $_meta_thumb ) //2) is_user_logged_in() && current_user_can('upload_files') $_refresh_bool = empty( $_meta_thumb ) || ! $_meta_thumb; $_refresh_bool = ! isset($_meta_thumb["_thumb_id"]) || ! isset($_meta_thumb["_thumb_type"]); $_refresh_bool = ( is_user_logged_in() && current_user_can('upload_files') ) ? true : $_refresh_bool; //if a custom $_thumb_id is requested => always refresh $_refresh_bool = ! is_null( $_thumb_id ) ? true : $_refresh_bool; if ( ! $_refresh_bool ) return $_meta_thumb; return $this -> czr_fn_set_thumb_info( $_post_id , $_thumb_id, true ); } /************************** * EXPOSED HELPERS / SETTERS **************************/ /* * @return bool */ public function czr_fn_has_thumb( $_post_id = null , $_thumb_id = null ) { $_post_id = is_null($_post_id) ? get_the_ID() : $_post_id; //try to extract (OVERWRITE) $_thumb_id and $_thumb_type extract( $this -> czr_fn_maybe_set_and_get_thumb_info( $_post_id, $_thumb_id ) ); return apply_filters( 'tc_has_thumb', wp_attachment_is_image($_thumb_id) && isset($_thumb_id) && false != $_thumb_id && ! empty($_thumb_id) ); } /** * update the thumb meta and maybe return the info * public because also fired from admin on save_post * @param post_id and (bool) return * @return void or array( "_thumb_id" , "_thumb_type" ) */ public function czr_fn_set_thumb_info( $post_id = null , $_thumb_id = null, $_return = false ) { $post_id = is_null($post_id) ? get_the_ID() : $post_id; $_thumb_type = 'none'; //IF a custom thumb id is requested if ( ! is_null( $_thumb_id ) && false !== $_thumb_id ) { $_thumb_type = false !== $_thumb_id ? 'custom' : $_thumb_type; } //IF no custom thumb id : //1) check if has thumbnail //2) check attachements //3) default thumb else { if ( has_post_thumbnail( $post_id ) ) { $_thumb_id = get_post_thumbnail_id( $post_id ); $_thumb_type = false !== $_thumb_id ? 'thumb' : $_thumb_type; } else { $_thumb_id = $this -> czr_fn_get_id_from_attachment( $post_id ); $_thumb_type = false !== $_thumb_id ? 'attachment' : $_thumb_type; } if ( ! $_thumb_id || empty( $_thumb_id ) ) { $_thumb_id = esc_attr( czr_fn_opt( 'tc_post_list_default_thumb' ) ); $_thumb_type = ( false !== $_thumb_id && ! empty($_thumb_id) ) ? 'default' : $_thumb_type; } } $_thumb_id = ( ! $_thumb_id || empty($_thumb_id) || ! is_numeric($_thumb_id) ) ? false : $_thumb_id; //update_post_meta($post_id, $meta_key, $meta_value, $prev_value); update_post_meta( $post_id , 'tc-thumb-fld', compact( "_thumb_id" , "_thumb_type" ) ); if ( $_return ) return apply_filters( 'tc_set_thumb_info' , compact( "_thumb_id" , "_thumb_type" ), $post_id ); }//end of fn private function czr_fn_get_id_from_attachment( $post_id ) { //define a filtrable boolean to set if attached images can be used as thumbnails //1) must be a non single and non page post context //2) user option should be checked in customizer $_bool = czr_fn_is_checked( 'tc_post_list_use_attachment_as_thumb' ); if ( ! is_admin() ) { $_bool = !CZR_post::$instance -> czr_fn_single_post_display_controller() && $_bool; $_bool = !CZR_page::$instance -> czr_fn_page_display_controller() && $_bool; } if ( ! apply_filters( 'tc_use_attachment_as_thumb' , $_bool ) ) return; //Case if we display a post or a page if ( 'attachment' != get_post_type( $post_id ) ) { //look for the last attached image in a post or page $tc_args = apply_filters('tc_attachment_as_thumb_query_args' , array( 'numberposts' => 1, 'post_type' => 'attachment', 'post_status' => null, 'post_parent' => $post_id, 'post_mime_type' => array( 'image/jpeg' , 'image/gif' , 'image/jpg' , 'image/png' ), 'orderby' => 'post_date', 'order' => 'DESC' ) ); $attachments = get_posts( $tc_args ); } //case were we display an attachment (in search results for example) elseif ( 'attachment' == get_post_type( $post_id ) && wp_attachment_is_image( $post_id ) ) { $attachments = array( get_post( $post_id ) ); } if ( ! isset($attachments) || empty($attachments ) ) return; return isset( $attachments[0] ) && isset( $attachments[0] -> ID ) ? $attachments[0] -> ID : false; }//end of fn /********************** * THUMBNAIL VIEW **********************/ /** * Display or return the thumbnail view * @param : thumbnail model (img, width, height), layout value, echo bool * @package Customizr * @since Customizr 3.0.10 */ function czr_fn_render_thumb_view( $_thumb_model , $layout = 'span3', $_echo = true ) { if ( empty( $_thumb_model ) ) return; //extract "tc_thumb" , "tc_thumb_height" , "tc_thumb_width" extract( $_thumb_model ); $thumb_img = ! isset( $_thumb_model) ? false : $tc_thumb; $thumb_img = apply_filters( 'tc_post_thumb_img', $thumb_img, czr_fn_get_id() ); if ( ! $thumb_img ) return; //handles the case when the image dimensions are too small $thumb_size = apply_filters( 'tc_thumb_size' , CZR___::$instance -> tc_thumb_size, czr_fn_get_id() ); $no_effect_class = ( isset($tc_thumb) && isset($tc_thumb_height) && ( $tc_thumb_height < $thumb_size['height']) ) ? 'no-effect' : ''; $no_effect_class = ( esc_attr( czr_fn_opt( 'tc_center_img') ) || ! isset($tc_thumb) || empty($tc_thumb_height) || empty($tc_thumb_width) ) ? '' : $no_effect_class; //default hover effect $thumb_wrapper = sprintf('<div class="%4$s %1$s"><div class="round-div"></div><a class="round-div %1$s" href="%2$s"></a>%3$s</div>', implode( " ", apply_filters( 'tc_thumbnail_link_class', array( $no_effect_class ) ) ), get_permalink( get_the_ID() ), $thumb_img, implode( " ", apply_filters( 'tc_thumb_wrapper_class', array('thumb-wrapper') ) ) ); $thumb_wrapper = apply_filters_ref_array( 'tc_post_thumb_wrapper', array( $thumb_wrapper, $thumb_img, czr_fn_get_id() ) ); //cache the thumbnail view $html = sprintf('<section class="tc-thumbnail %1$s">%2$s</section>', apply_filters( 'tc_post_thumb_class', $layout ), $thumb_wrapper ); $html = apply_filters_ref_array( 'tc_render_thumb_view', array( $html, $_thumb_model, $layout ) ); if ( ! $_echo ) return $html; echo $html; }//end of function /********************** * HELPER CALLBACK **********************/ /** * hook wp_get_attachment_image_attributes * Get rid of the srcset attribute (responsive images) * @param $attr array of image attributes * @return array of image attributes * * @package Customizr * @since Customizr 3.4.16 */ function czr_fn_remove_srcset_attr( $attr ) { if ( isset( $attr[ 'srcset' ] ) ) { unset( $attr['srcset'] ); //to ensure a "local" removal we have to remove this filter callback, so it won't hurt //responsive images sitewide remove_filter( current_filter(), array( $this, __FUNCTION__ ) ); } return $attr; } /********************** * SETTER CALLBACK **********************/ /** * hook tc_post_thumb_inline_style * Replace default widht:auto by width:100% * => css centering of imgs when the js option is not checked * @param array of args passed by apply_filters_ref_array method * @return string * * @package Customizr * @since Customizr 3.2.6 */ function czr_fn_change_thumb_inline_css( $_style, $image, $_filtered_thumb_size) { //conditions : //note : handled with javascript if tc_center_img option enabled $_bool = array_product( array( ! esc_attr( czr_fn_opt( 'tc_center_img') ), false != $image, ! empty($image), isset($_filtered_thumb_size['width']), isset($_filtered_thumb_size['height']) ) ); if ( ! $_bool ) return $_style; $_width = $_filtered_thumb_size['width']; $_height = $_filtered_thumb_size['height']; $_new_style = ''; //if we have a width and a height and at least on dimension is < to default thumb if ( ! empty($image[1]) && ! empty($image[2]) && ( $image[1] < $_width || $image[2] < $_height ) ) { $_new_style = sprintf('min-width:%1$spx;min-height:%2$spx;max-width: none;width: auto;max-height: none;', $_width, $_height ); } if ( empty($image[1]) || empty($image[2]) ) $_new_style = sprintf('min-width:%1$spx;min-height:%2$spx;max-width: none;width: auto;max-height: none;', $_width, $_height ); return $_new_style; } }//end of class endif; ?><?php /** * Sidebar actions * The default widgets areas are defined as properties of the CZR_utils class in class-fire-utils.php * CZR_utils::$inst -> sidebar_widgets for left and right sidebars * CZR_utils::$inst -> footer_widgets for the footer * The widget area are then fired in class-fire-widgets.php * You can modify those default widgets with 3 filters : tc_default_widgets, tc_footer_widgets, tc_sidebar_widgets */ if ( ! class_exists( 'CZR_sidebar' ) ) : class CZR_sidebar { static $instance; function __construct () { self::$instance =& $this; add_action ( 'wp' , array( $this , 'czr_fn_set_sidebar_hooks' ) ); } /****************************************** * HOOK ******************************************/ /** * Set sidebar hooks * hook : wp * * @since Customizr 3.3+ */ function czr_fn_set_sidebar_hooks() { //displays left sidebar add_action ( '__before_article_container' , array( $this , 'czr_fn_render_sidebar' ) ); add_action ( '__before_left_sidebar' , array( $this , 'czr_fn_social_in_sidebar' ) ); //displays right sidebar add_action ( '__after_article_container' , array( $this , 'czr_fn_render_sidebar' ) ); add_action ( '__before_right_sidebar' , array( $this , 'czr_fn_social_in_sidebar' ) ); //since 3.2.0 show/hide the WP built-in widget icons add_filter ( 'tc_left_sidebar_class' , array( $this , 'czr_fn_set_sidebar_wrapper_widget_class' ) ); add_filter ( 'tc_right_sidebar_class' , array( $this , 'czr_fn_set_sidebar_wrapper_widget_class' ) ); } /****************************************** * VIEW ******************************************/ /** * Displays the sidebar or the front page featured pages area * hook : '__before_article_container' * @param Name of the widgetized area * @package Customizr * @since Customizr 1.0 */ function czr_fn_render_sidebar() { //first check if home and no content option is choosen if ( czr_fn__f( '__is_home_empty') ) return; //gets current screen layout $screen_layout = CZR_utils::czr_fn_get_layout( czr_fn_get_id() , 'sidebar' ); // GY: add relative right and left for LTR/RTL sites $rel_left = is_rtl() ? 'right' : 'left'; $rel_right = is_rtl() ? 'left' : 'right'; //gets position from current hook and checks the context $position = apply_filters( 'tc_sidebar_position', strpos(current_filter(), 'before') ? $rel_left : $rel_right ); if ( 'left' == $position && $screen_layout != 'l' && $screen_layout != 'b' ) return; if ( 'right' == $position && $screen_layout != 'r' && $screen_layout != 'b' ) return; //gets the global layout settings $global_layout = apply_filters( 'tc_global_layout' , CZR_init::$instance -> global_layout ); $sidebar_layout = $global_layout[$screen_layout]; //defines the sidebar wrapper class $class = implode(" ", apply_filters( "tc_{$position}_sidebar_class" , array( $sidebar_layout['sidebar'] , $position , 'tc-sidebar' ) ) ); ob_start(); ?> <div class="<?php echo $class ?>"> <div id="<?php echo $position ?>" class="widget-area" role="complementary"> <?php do_action( "__before_{$position}_sidebar" );##hook of social icons if ( apply_filters( 'tc_has_sidebar_widgets', is_active_sidebar( $position ), $position ) ) { get_sidebar( $position ); } do_action( "__after_{$position}_sidebar" ); ?> </div><!-- //#left or //#right --> </div><!--.tc-sidebar --> <?php $html = ob_get_contents(); if ($html) ob_end_clean(); echo apply_filters( 'tc_sidebar_display', $html, $sidebar_layout, $position ); }//end of function /** * Displays the social networks in sidebars * * @package Customizr * @since Customizr 1.0 */ function czr_fn_social_in_sidebar() { //get option from current hook $option = ( false != strpos(current_filter(), 'left') ) ? 'tc_social_in_left-sidebar' : 'tc_social_in_right-sidebar'; //when do we display this block ? //1) if customizing: must be enabled //2) if not customizing : must be enabled and have social networks. $_nothing_to_render = 0 == czr_fn_opt( $option ); $_nothing_to_render_front = $_nothing_to_render || ! ( $_socials = czr_fn__f( '__get_socials' ) ) ? true : $_nothing_to_render; //only when partial refresh enabled, otherwise we fall back on refresh $_nothing_to_render = czr_fn_is_customizing() && czr_fn_is_partial_refreshed_on() ? $_nothing_to_render : $_nothing_to_render_front; if ( $_nothing_to_render ) return; $_title = esc_attr( czr_fn_opt( 'tc_social_in_sidebar_title') ); $html = sprintf('<aside class="%1$s">%2$s<div class="social-links">%3$s</div></aside>', implode( " " , apply_filters( 'tc_sidebar_block_social_class' , array('social-block', 'widget', 'widget_social') ) ), ! $_title ? '' : apply_filters( 'tc_sidebar_socials_title' , sprintf( '<h3 class="widget-title">%1$s</h3>', $_title ) ), $_socials ); echo apply_filters( 'tc_social_in_sidebar', $html, current_filter() ); } /** * Displays the widget icons if option is enabled in customizer * @uses filter tc_footer_widget_wrapper_class * * @package Customizr * @since Customizr 3.2.0 */ function czr_fn_set_sidebar_wrapper_widget_class($_original_classes) { $_no_icons_classes = array_merge($_original_classes, array('no-widget-icons')); if ( 1 == czr_fn_opt('tc_show_sidebar_widget_icon' ) ) return 0 == czr_fn_opt('tc_show_title_icon' ) ? $_no_icons_classes : $_original_classes; //last condition return $_no_icons_classes; } }//end of class endif; ?><?php /** * Slider Model / Views / Helpers Class * */ if ( ! class_exists( 'CZR_slider' ) ) : class CZR_slider { static $instance; private static $sliders_model; static $rendered_sliders; function __construct () { self::$instance =& $this; add_action( 'tc_set_slider_hooks_done' , array( $this, 'czr_fn_maybe_setup_parallax' ) ); add_action( 'template_redirect' , array( $this, 'czr_fn_set_slider_hooks' ) ); //set user customizer options. @since v3.2.0 add_filter( 'tc_slider_layout_class' , array( $this , 'czr_fn_set_slider_wrapper_class' ) ); //! tc_user_options_style filter is shared by several classes => must always check the local context inside the callback before appending new css //fired on hook : wp_enqueue_scripts //Set thumbnail specific design based on user options //Set user defined height add_filter( 'tc_user_options_style' , array( $this , 'czr_fn_write_slider_inline_css' ) ); //tc_slider_height is fired in CZR_slider::czr_fn_write_slider_inline_css() add_filter( 'tc_slider_height' , array( $this, 'czr_fn_set_demo_slider_height') ); }//end of construct /****************************** * HOOK SETUP *******************************/ /** * callback of template_redirect * Set slider hooks * @return void */ function czr_fn_set_slider_hooks() { //get slides model //extract $slider_name_id, $slides, $layout_class, $img_size extract( $this -> czr_fn_get_slider_model() ); //returns nothing if no slides to display if ( ! isset($slides) || ! $slides ) return; add_action( '__after_header' , array( $this , 'czr_fn_slider_display' ) ); add_action( '__after_carousel_inner' , array( $this , 'czr_fn_slider_control_view' ) ); //adds the center-slides-enabled css class add_filter( 'tc_carousel_inner_classes' , array( $this, 'czr_fn_set_inner_class') ); //adds infos in the caption data of the demo slider add_filter( 'tc_slide_caption_data' , array( $this, 'czr_fn_set_demo_slide_data'), 10, 3 ); //wrap the slide into a link add_filter( 'tc_slide_background' , array( $this, 'czr_fn_link_whole_slide'), 5, 5 ); //display an edit deep link to the Slider section in the Customize or post/page add_action( '__after_carousel_inner' , array( $this, 'czr_fn_render_slider_edit_link_view'), 10, 2 ); //fire event when all the hooks have been set do_action( 'tc_set_slider_hooks_done' ); } /****************************** * MODELS *******************************/ /** * Return a single slide model * Returns and array of slides with data * * @package Customizr * @since Customizr 3.0.15 * */ private function czr_fn_get_single_slide_model( $slider_name_id, $_loop_index , $id , $img_size ) { //check if slider enabled for this attachment and go to next slide if not $slider_checked = esc_attr(get_post_meta( $id, $key = 'slider_check_key' , $single = true )); if ( ! isset( $slider_checked) || $slider_checked != 1 ) return; //title $title = esc_attr(get_post_meta( $id, $key = 'slide_title_key' , $single = true )); $default_title_length = apply_filters( 'tc_slide_title_length', 80 ); $title = czr_fn_text_truncate( $title, $default_title_length, '...' ); //lead text $text = get_post_meta( $id, $key = 'slide_text_key' , $single = true ); $default_text_length = apply_filters( 'tc_slide_text_length', 250 ); $text = czr_fn_text_truncate( $text, $default_text_length, '...' ); //button text $button_text = esc_attr(get_post_meta( $id, $key = 'slide_button_key' , $single = true )); $default_button_length = apply_filters( 'tc_slide_button_length', 80 ); $button_text = czr_fn_text_truncate( $button_text, $default_button_length, '...' ); //link post id $link_id = apply_filters( 'tc_slide_link_id', esc_attr(get_post_meta( $id, $key = 'slide_link_key' , $single = true )), $id, $slider_name_id ); //link $link_url = esc_url( get_post_meta( $id, $key = 'slide_custom_link_key', $single = true ) ); if ( ! $link_url ) $link_url = $link_id ? get_permalink( $link_id ) : $link_url; $link_url = apply_filters( 'tc_slide_link_url', $link_url, $id, $slider_name_id ); //link target $link_target_bool = esc_attr(get_post_meta( $id, $key= 'slide_link_target_key', $single = true )); $link_target = apply_filters( 'tc_slide_link_target', $link_target_bool ? '_blank' : '_self', $id, $slider_name_id ); //link the whole slide? $link_whole_slide = apply_filters( 'tc_slide_link_whole_slide', esc_attr(get_post_meta( $id, $key= 'slide_link_whole_slide_key', $single = true )), $id, $slider_name_id ); //checks if $text_color is set and create an html style attribute $text_color = esc_attr(get_post_meta( $id, $key = 'slide_color_key' , $single = true )); $color_style = ( $text_color != null) ? 'style="color:'.$text_color.'"' : ''; //attachment image $alt = apply_filters( 'tc_slide_background_alt' , trim(strip_tags(get_post_meta( $id, '_wp_attachment_image_alt' , true))) ); $slide_background_attr = array( 'class' => 'slide' , 'alt' => $alt ); //allow responsive images? if ( version_compare( $GLOBALS['wp_version'], '4.4', '>=' ) ) if ( 0 == esc_attr( czr_fn_opt('tc_resp_slider_img') ) ) { $slide_background_attr['srcset'] = " "; //trick, => will produce an empty attr srcset as in wp-includes/media.php the srcset is calculated and added //only when the passed srcset attr is not empty. This will avoid us to: //a) add a filter to get rid of already computed srcset // or //b) use preg_replace to get rid of srcset and sizes attributes from the generated html //Side effect: //we'll see an empty ( or " " depending on the browser ) srcset attribute in the html //to avoid this we filter the attributes getting rid of the srcset if any. //Basically this trick, even if ugly, will avoid the srcset attr computation add_filter( 'wp_get_attachment_image_attributes', array( CZR_post_thumbnails::$instance, 'czr_fn_remove_srcset_attr' ) ); } $slide_background = wp_get_attachment_image( $id, $img_size, false, $slide_background_attr ); if ( czr_fn_is_checked( 'tc_slider_img_smart_load' ) ) { $slide_background = czr_fn_parse_imgs( $slide_background ); //<- to prepare the img smartload } //adds all values to the slide array only if the content exists (=> handle the case when an attachment has been deleted for example). Otherwise go to next slide. if ( !isset($slide_background) || empty($slide_background) ) return; return array( 'title' => $title, 'text' => $text, 'button_text' => $button_text, 'link_id' => $link_id, 'link_url' => $link_url, 'link_target' => $link_target, 'link_whole_slide' => $link_whole_slide, 'active' => ( 0 == $_loop_index ) ? 'active' : '', 'color_style' => $color_style, 'slide_background' => $slide_background ); } /** * Return a single post slide pre model * Returns and array of pre slides with data * * This method will build up the single object model which will be * the base for the actual post slide model * * @package Customizr * @since Customizr 3.4.9 * */ function czr_fn_get_single_post_slide_pre_model( $_post , $img_size, $args ){ $ID = $_post->ID; //attachment image $thumb = CZR_post_thumbnails::$instance -> czr_fn_get_thumbnail_model( $img_size,//$requested_size $ID,//post ID null,//$_custom_thumb_id isset($args['slider_responsive_images']) ? $args['slider_responsive_images'] : null//$_enable_wp_responsive_imgs ); $slide_background = isset($thumb) && isset($thumb['tc_thumb']) ? $thumb['tc_thumb'] : null; // we assign a default thumbnail if needed. if ( ! $slide_background ) { if ( file_exists( TC_BASE_CHILD . 'inc/assets/img/slide-placeholder.png' ) ) { $slide_background = sprintf('<img width="1200" height="500" src="%1$s" class="attachment-slider-full tc-thumb-type-thumb wp-post-image wp-post-image" alt="">', TC_BASE_URL_CHILD . 'inc/assets/img/slide-placeholder.png' ); } else { return false; } } //title $title = ( isset( $args['show_title'] ) && $args['show_title'] ) ? $this -> czr_fn_get_post_slide_title( $_post, $ID) : ''; //lead text $text = ( isset( $args['show_excerpt'] ) && $args['show_excerpt'] ) ? $this -> czr_fn_get_post_slide_excerpt( $_post, $ID) : ''; return compact( 'ID', 'title', 'text', 'slide_background' ); } /** * Return a single post slide model * Returns and array of slides with data * * @package Customizr * @since Customizr 3.4.9 * */ function czr_fn_get_single_post_slide_model( $slider_name_id, $_loop_index , $_post_slide , $common, $img_size ){ extract( $_post_slide ); extract( $common ); //background image $slide_background = apply_filters( 'tc_posts_slide_background', $slide_background, $ID ); if ( czr_fn_is_checked( 'tc_slider_img_smart_load' ) ) { $slide_background = czr_fn_parse_imgs( $slide_background ); //<- to prepare the img smartload } // we don't want to show slides with no image if ( ! $slide_background ) return false; $title = apply_filters('tc_posts_slider_title', $title, $ID ); //lead text $text = apply_filters('tc_posts_slider_text', $text, $ID ); //button $button_text = apply_filters('tc_posts_slider_button_text', $button_text, $ID ); //link $link_id = apply_filters( 'tc_posts_slide_link_id', $ID ); $link_url = apply_filters( 'tc_posts_slide_link_url', $link_id ? get_permalink( $link_id ) : '', $ID ); $link_target = apply_filters( 'tc_posts_slide_link_target', '_self', $ID ); $link_whole_slide = apply_filters( 'tc_posts_slide_link_whole_slide', $link_whole_slide, $ID ); $active = ( 0 == $_loop_index ) ? 'active' : ''; $color_style = apply_filters( 'tc_posts_slide_color_style', '', $ID ); return apply_filters( 'tc_single_post_slide_model', compact( 'title', 'text', 'button_text', 'link_id', 'link_url', 'link_target', 'link_whole_slide', 'active', 'color_style', 'slide_background' ), $ID ); } /** * Helper * Return an array of the slide models from option or default * Returns and array of slides with data * * @package Customizr * @since Customizr 3.0.15 * */ private function czr_fn_get_the_slides( $slider_name_id, $img_size ) { //returns the default slider if requested if ( 'demo' == $slider_name_id ) return apply_filters( 'tc_default_slides', CZR___::$instance -> default_slides ); else if ( 'tc_posts_slider' == $slider_name_id ) { return $this -> czr_fn_get_the_posts_slides( $slider_name_id, $img_size ); } //if not demo or tc_posts_slider, we get slides from options $all_sliders = czr_fn_opt( 'tc_sliders'); $saved_slides = ( isset($all_sliders[$slider_name_id]) ) ? $all_sliders[$slider_name_id] : false; //if the slider not longer exists or exists but is empty, return false if ( ! $this -> czr_fn_slider_exists( $saved_slides) ) return; //inititalize the slides array $slides = array(); //init slide active state index $_loop_index = 0; //GENERATE SLIDES ARRAY foreach ( $saved_slides as $s ) { $slide_object = get_post($s); //next loop if attachment does not exist anymore (has been deleted for example) if ( ! isset( $slide_object) ) continue; $id = $slide_object -> ID; $slide_model = $this -> czr_fn_get_single_slide_model( $slider_name_id, $_loop_index, $id, $img_size); if ( ! $slide_model ) continue; $slides[$id] = $slide_model; $_loop_index++; }//end of slides loop //returns the slides or false if nothing return apply_filters('tc_the_slides', ! empty($slides) ? $slides : false ); } /** * Helper * Return an array of the post slide models * Returns and array of slides with data * * @package Customizr * @since Customizr 3.4.9 * */ /* Steps; * 1) get the pre slides model * 2) get the actual model from the pre_model * * * * The difference between the pre_model and the actual model is because in the * transient we do not store the whole slide model, some info are not needed. * Also the actual model can be filtered, allowing user's filter and to translate it * mostly with qtranslate (polylang will force us, most likely if I don't find any * other suitable solution, to not use the transient). */ private function czr_fn_get_the_posts_slides( $slider_name_id, $img_size ) { $pre_slides = $this -> czr_fn_get_pre_posts_slides( array( 'img_size' => $img_size ) ); //filter the pre_model $pre_slides = apply_filters( 'tc_posts_slider_pre_model', $pre_slides ); //if the slider no longer exists or exists but is empty, return false if ( ! $this -> czr_fn_slider_exists( $pre_slides ) ) return false; //extract pre_slides model extract($pre_slides); //inititalize the slides array $slides = array(); $_loop_index = 0; //GENERATE SLIDES ARRAY foreach ( $posts as $_post_slide ) { $slide_model = $this -> czr_fn_get_single_post_slide_model( $slider_name_id, $_loop_index, $_post_slide, $common, $img_size); if ( ! $slide_model ) continue; $slides[ $_post_slide['ID'] ] = $slide_model; $_loop_index++; }//end of slides loop //returns the slides or false if nothing return apply_filters('tc_the_posts_slides', ! empty($slides) ? $slides : false ); } /** * Helper * Return an as array of 'posts'=> array of the post slide pre models 'common' => common properties * * * - eventually store the transient * * @package Customizr * @since Customizr 3.4.9 * */ private function czr_fn_get_pre_posts_slides( $args ){ $defaults = array( 'img_size' => null, //options 'stickies_only' => esc_attr( czr_fn_opt( 'tc_posts_slider_stickies' ) ), 'show_title' => esc_attr( czr_fn_opt( 'tc_posts_slider_title' ) ), 'show_excerpt' => esc_attr( czr_fn_opt( 'tc_posts_slider_text' ) ), 'button_text' => esc_attr( czr_fn_opt( 'tc_posts_slider_button_text' ) ), 'posts_per_page' => esc_attr( czr_fn_opt( 'tc_posts_slider_number' ) ), //limit 'link_type' => esc_attr( czr_fn_opt( 'tc_posts_slider_link') ), ); $args = apply_filters( 'tc_get_pre_posts_slides_args', wp_parse_args( $args, $defaults ) ); extract( $args ); //retrieve posts from the db $queried_posts = $this -> czr_fn_query_posts_slider( $args ); if ( empty ( $queried_posts ) ) return array(); /*** tc_thumb setup filters ***/ // remove smart load img parsing if any $smart_load_enabled = 1 == esc_attr( czr_fn_opt( 'tc_img_smart_load' ) ); if ( $smart_load_enabled ) remove_filter( 'tc_thumb_html', 'czr_fn_parse_imgs' ); // prevent adding thumb inline style when no center img is added add_filter( 'tc_post_thumb_inline_style', '__return_empty_string', 100 ); //Allow retrieving first attachment as thumb add_filter( 'tc_use_attachment_as_thumb', '__return_true', 100 ); /*** end tc_thumb setup ***/ //allow responsive images? if ( version_compare( $GLOBALS['wp_version'], '4.4', '>=' ) ) $args['slider_responsive_images'] = 0 == czr_fn_opt('tc_resp_slider_img') ? false : true; /* Get the pre_model */ $pre_slides = $pre_slides_posts = array(); foreach ( $queried_posts as $_post ) { $pre_slide_model = $this -> czr_fn_get_single_post_slide_pre_model( $_post , $img_size, $args ); if ( ! $pre_slide_model ) continue; $pre_slides_posts[] = $pre_slide_model; } /* tc_thumb reset filters */ // re-add smart load parsing if removed if ( $smart_load_enabled ) add_filter('tc_thumb_html', 'czr_fn_parse_imgs' ); // remove thumb style reset remove_filter( 'tc_post_thumb_inline_style', '__return_empty_string', 100 ); // remove forced retrieval first attachment as thumb; remove_filter( 'tc_use_attachment_as_thumb', '__return_true', 100 ); /* end tc_thumb reset filters */ if ( ! empty( $pre_slides_posts ) ) { /*** Setup shared properties ***/ /* Shared by all post slides, stored in the "common" field */ // button and link whole slide // has button to be displayed? if ( strstr($link_type, 'cta') ) $button_text = $this -> czr_fn_get_post_slide_button_text( $button_text ); else $button_text = ''; //link the whole slide? $link_whole_slide = strstr( $link_type, 'slide') ? true : false; /*** end Setup shared properties ***/ /* Add common and posts to the actual pre_slides array */ $pre_slides['common'] = compact( 'button_text', 'link_whole_slide'); $pre_slides['posts'] = $pre_slides_posts; } return $pre_slides; } /** * return the slider block model * @return array($slider_name_id, $slides, $layout_class) * * @package Customizr * @since Customizr 3.3+ * */ private function czr_fn_get_slider_model() { //Do we have a slider to display in this context ? if ( ! $this -> czr_fn_is_slider_possible() ) return array(); //gets the actual page id if we are displaying the posts page $queried_id = $this -> czr_fn_get_real_id(); $slider_name_id = $this -> czr_fn_get_current_slider( $queried_id ); if ( ! $this -> czr_fn_is_slider_active( $queried_id) ) return array(); if ( ! empty( self::$sliders_model ) && is_array( self::$sliders_model ) && array_key_exists( $slider_name_id, self::$sliders_model ) ) return self::$sliders_model[ $slider_name_id ]; //gets slider options if any $layout_value = czr_fn__f('__is_home') ? czr_fn_opt( 'tc_slider_width' ) : esc_attr(get_post_meta( $queried_id, $key = 'slider_layout_key' , $single = true )); $layout_value = apply_filters( 'tc_slider_layout', $layout_value, $queried_id ); //declares the layout vars $layout_class = ( 0 == $layout_value ) ? array('container', 'carousel', 'customizr-slide', $slider_name_id ) : array('carousel', 'customizr-slide', $slider_name_id); $img_size = apply_filters( 'tc_slider_img_size' , ( 0 == $layout_value ) ? 'slider' : 'slider-full'); //get slides $slides = $this -> czr_fn_get_the_slides( $slider_name_id , $img_size ); //store the model per slider_name_id self::$sliders_model[ $slider_name_id ] = compact( "slider_name_id", "slides", "layout_class" , "img_size" ); return self::$sliders_model[ $slider_name_id ]; } /** * Helper * Returns the array of eligible posts for the slider of posts * * @package Customizr * @since Customizr 3.4.9 * */ private function czr_fn_query_posts_slider( $args = array() ) { $defaults = array( 'stickies_only' => 0, 'post_status' => 'publish', 'post_type' => 'post', 'orderby' => 'date', 'order' => 'DESC', 'posts_per_page' => 5, 'offset' => 0, 'suppress_filters' => false, // <- for language plugins ); $args = apply_filters( 'tc_query_posts_slider_args', wp_parse_args( $args, $defaults ) ); $_posts = false; if ( is_array($args) && !empty($args) && array_key_exists( 'posts_per_page', $args) && $args['posts_per_page'] > 0 ) { // Do we have to show only sticky posts? if ( array_key_exists( 'stickies_only', $args) && $args['stickies_only'] ) { // Are there sticky posts? $_sticky_posts = get_option('sticky_posts'); if ( ! empty( $_sticky_posts ) ) { $args = array_merge( $args, array( 'post__in' => $_sticky_posts ) ); } else { $args = false; } } if ( !empty($args) ) $_posts = get_posts( $args ); } return apply_filters( 'tc_query_posts_slider', $_posts, $args ); } /****************************** * VIEWS *******************************/ /** * Slider View * Displays the slider based on the context : home, post/page. * hook : __after_header * @package Customizr * @since Customizr 1.0 * */ function czr_fn_slider_display() { //get slides model //extract $slider_name_id, $slides, $layout_class, $img_size extract( $this -> czr_fn_get_slider_model() ); //returns nothing if no slides to display if ( ! isset($slides) || ! $slides ) return; self::$rendered_sliders++ ; //define carousel inner classes and attributes $_inner_classes = implode( ' ' , apply_filters( 'tc_carousel_inner_classes' , array( 'carousel-inner' ) ) ); $_layout_classes = implode( ' ' , apply_filters( 'tc_slider_layout_class' , $layout_class ) ); $_inner_attributes = implode( ' ' , apply_filters( 'tc_carousel_inner_attributes' , array() ) ); ob_start(); ?> <div id="customizr-slider-<?php echo self::$rendered_sliders ?>" class="<?php echo $_layout_classes ?>"> <?php $this -> czr_fn_render_slider_loader_view( $slider_name_id ); ?> <?php do_action( '__before_carousel_inner' , $slides, $slider_name_id ) ?> <div class="<?php echo $_inner_classes?>" <?php echo $_inner_attributes ?>> <?php foreach ($slides as $id => $data) { $_view_model = compact( "id", "data" , "slider_name_id", "img_size" ); $this -> czr_fn_render_single_slide_view( $_view_model ); } ?> </div><!-- /.carousel-inner --> <?php do_action( '__after_carousel_inner' , $slides, $slider_name_id ) ?> </div><!-- /#customizr-slider --> <?php $html = ob_get_contents(); if ($html) ob_end_clean(); echo apply_filters( 'tc_slider_display', $html, $slider_name_id ); } /** * Single slide view * Renders a single slide * @param $_view_model = array( $id, $data , $slider_name_id, $img_size ) * * @package Customizr * @since Customizr 3.3+ * */ function czr_fn_render_single_slide_view( $_view_model ) { //extract $_view_model = array( $id, $data , $slider_name_id, $img_size ) extract( $_view_model ); $slide_classes = implode( ' ', apply_filters( 'tc_single_slide_item_classes', array( 'czr-item', $data['active'], "slide-{$id}" ) ) ); ?> <div class="<?php echo $slide_classes; ?>"> <?php $this -> czr_fn_render_slide_background_view( $_view_model ); $this -> czr_fn_render_slide_caption_view( $_view_model ); $this -> czr_fn_render_slide_edit_link_view( $_view_model ); ?> </div><!-- /.czr-item --> <?php } /** * Slider loader view * This feature is only fired in browser with js enabled => cf the embedded script * @param (string) $slider_name_id * * @package Customizr * @since Customizr 3.3+ * */ function czr_fn_render_slider_loader_view( $slider_name_id ) { if ( ! $this -> czr_fn_is_slider_loader_active( $slider_name_id ) ) return; if ( ! apply_filters( 'tc_slider_loader_gif_only', false ) ) $_pure_css_loader = sprintf( '<div class="tc-css-loader %1$s">%2$s</div>', implode( ' ', apply_filters( 'tc_pure_css_loader_add_classes', array( 'tc-mr-loader') ) ), apply_filters( 'tc_pure_css_loader_inner', '<div></div><div></div><div></div>') ); else $_pure_css_loader = ''; ?> <div id="tc-slider-loader-wrapper-<?php echo self::$rendered_sliders ?>" class="tc-slider-loader-wrapper"> <div class="tc-img-gif-loader"></div> <?php echo $_pure_css_loader; ?> </div> <?php } /** * Slide Background subview * @param $_view_model = array( $id, $data , $slider_name_id, $img_size ) * * @package Customizr * @since Customizr 3.3+ * */ function czr_fn_render_slide_background_view( $_view_model ) { //extract $_view_model = array( $id, $data , $slider_name_id, $img_size ) extract( $_view_model ); ?> <div class="<?php echo apply_filters( 'tc_slide_content_class', sprintf('carousel-image %1$s' , $img_size ) ); ?>"> <?php do_action('__before_all_slides'); do_action_ref_array ("__before_slide_{$id}" , array( $data['slide_background'], $data['link_url'], $id, $slider_name_id, $data ) ); echo apply_filters( 'tc_slide_background', $data['slide_background'], $data['link_url'], $id, $slider_name_id, $data ); do_action_ref_array ("__after_slide_{$id}" , array( $data['slide_background'], $data['link_url'], $id, $slider_name_id, $data ) ); do_action('__after_all_slides'); ?> </div> <!-- .carousel-image --> <?php } /** * * Link whole slide * hook: tc_slide_background * * @package Customizr * @since Customizr 3.3+ * */ function czr_fn_link_whole_slide( $slide_background, $link_url, $id, $slider_name_id, $data ) { if ( isset( $data['link_whole_slide'] ) && $data['link_whole_slide'] && $link_url ) $slide_background = sprintf('<a href="%1$s" class="tc-slide-link" target="%2$s"></a>%3$s', $link_url, $data['link_target'], $slide_background ); return $slide_background; } /** * Slide caption subview * @param $_view_model = array( $id, $data , $slider_name_id, $img_size ) * * @package Customizr * @since Customizr 3.3+ * */ function czr_fn_render_slide_caption_view( $_view_model ) { //extract $_view_model = array( $id, $data , $slider_name_id, $img_size ) extract( $_view_model ); //filters the data before (=> used for demo for example ) $data = apply_filters( 'tc_slide_caption_data', $data, $slider_name_id, $id ); $show_caption = ! ( $data['title'] == null && $data['text'] == null && $data['button_text'] == null ) ; if ( ! apply_filters( 'tc_slide_show_caption', $show_caption , $slider_name_id ) ) return; //apply filters first $data['title'] = isset($data['title']) ? apply_filters( 'tc_slide_title', $data['title'] , $id, $slider_name_id ) : ''; $data['text'] = isset($data['text']) ? esc_html( apply_filters( 'tc_slide_text', $data['text'], $id, $slider_name_id ) ) : ''; $data['color_style'] = apply_filters( 'tc_slide_color', $data['color_style'], $id, $slider_name_id ); $data['button_text'] = isset($data['button_text']) ? apply_filters( 'tc_slide_button_text', $data['button_text'], $id, $slider_name_id ) : ''; //computes the link $button_link = apply_filters( 'tc_slide_button_link', $data['link_url'] ? $data['link_url'] : 'javascript:void(0)', $id, $slider_name_id ); printf('<div class="%1$s">%2$s %3$s %4$s</div>', //class implode( ' ', apply_filters( 'tc_slide_caption_class', array( 'carousel-caption' ), $show_caption, $slider_name_id ) ), //title ( apply_filters( 'tc_slide_show_title', $data['title'] != null, $slider_name_id ) ) ? sprintf('<%1$s class="%2$s" %3$s>%4$s</%1$s>', apply_filters( 'tc_slide_title_tag', 'h1', $slider_name_id ), implode( ' ', apply_filters( 'tc_slide_title_class', array( 'slide-title' ), $data['title'], $slider_name_id ) ), $data['color_style'], $data['title'] ) : '', //lead text ( apply_filters( 'tc_slide_show_text', $data['text'] != null, $slider_name_id ) ) ? sprintf('<p class="%1$s" %2$s>%3$s</p>', implode( ' ', apply_filters( 'tc_slide_text_class', array( 'lead' ), $data['text'], $slider_name_id ) ), $data['color_style'], $data['text'] ) : '', //button call to action ( apply_filters( 'tc_slide_show_button', $data['button_text'] != null, $slider_name_id ) ) ? sprintf('<a class="%1$s" href="%2$s" target="%3$s">%4$s</a>', implode( ' ', apply_filters( 'tc_slide_button_class', array( 'btn', 'btn-large', 'btn-primary' ), $data['button_text'], $slider_name_id ) ), $button_link, $data['link_target'], $data['button_text'] ) : '' ); } /** * Slide edit link subview * @param $_view_model = array( $id, $data , $slider_name_id, $img_size ) * * @package Customizr * @since Customizr 3.3+ * */ function czr_fn_render_slide_edit_link_view( $_view_model ) { //never display when customizing if ( czr_fn_is_customizing() ) return; //extract $_view_model = array( $id, $data , $slider_name_id, $img_size ) extract( $_view_model ); //display edit link for logged in users with edit_post capabilities //upload_files cap isn't a good lower limit 'cause for example and Author can upload_files but actually cannot edit medias he/she hasn't uploaded $show_slide_edit_link = ( is_user_logged_in() && current_user_can( 'edit_post', $id ) ) ? true : false; $show_slide_edit_link = apply_filters('tc_show_slide_edit_link' , $show_slide_edit_link && ! is_null($data['link_id']), $id ); if ( ! $show_slide_edit_link ) return; $_edit_link_suffix = 'tc_posts_slider' == $slider_name_id ? '' : '#slider_sectionid'; //in case of tc_posts_slider the $id is the *post* id, otherwise it's the attachment id $_edit_link = get_edit_post_link($id) . $_edit_link_suffix; printf('<span class="slider edit-link btn btn-inverse"><a class="post-edit-link" href="%1$s" title="%2$s" target="_blank">%2$s</a></span>', $_edit_link, __( 'Edit' , 'customizr' ) ); } /** * Slider Edit deeplink * @param $slides, array of slides * @param $slider_name_id string, the name of the current slider * * hook : __after_carousel_inner * @since v3.4.9 */ function czr_fn_render_slider_edit_link_view( $slides, $slider_name_id ) { //never display when customizing if ( czr_fn_is_customizing() ) return; if ( 'demo' == $slider_name_id ) return; $show_slider_edit_link = false; //We have to show the slider edit link to //a) users who can edit theme options for the slider in home -> deep link in the customizer //b) users who can edit the post/page where the slider is displayed for users who can edit the post/page -> deep link in the post/page slider section if ( czr_fn__f('__is_home') ){ $show_slider_edit_link = ( is_user_logged_in() && current_user_can('edit_theme_options') ) ? true : false; $_edit_link = czr_fn_get_customizer_url( array( 'control' => 'tc_front_slider', 'section' => 'frontpage_sec') ); }else if ( is_singular() ){ // we have a snippet to display sliders in categories, we don't want the slider edit link displayed there global $post; $show_slider_edit_link = ( is_user_logged_in() && ( current_user_can('edit_pages') || current_user_can( 'edit_posts', $post -> ID ) ) ) ? true : false; $_edit_link = get_edit_post_link( $post -> ID ) . '#slider_sectionid'; } $show_slider_edit_link = apply_filters( 'tc_show_slider_edit_link' , $show_slider_edit_link, $slider_name_id ); if ( ! $show_slider_edit_link ) return; // The posts slider shows a different text $_text = sprintf( __( 'Customize or remove %s' , 'customizr' ), ( 'tc_posts_slider' == $slider_name_id ) ?__('the posts slider', 'customizr') : __('this slider', 'customizr' ) ); printf('<span class="slider deep-edit-link edit-link btn btn-inverse"><a class="slider-edit-link" href="%1$s" title="%2$s" target="_blank">%2$s</a></span>', $_edit_link, $_text ); } /* * Slider controls view * @param slides * @hook : __after_carousel_inner * @since v3.2.0 * */ function czr_fn_slider_control_view( $_slides ) { if ( count( $_slides ) <= 1 ) return; if ( ! apply_filters('tc_show_slider_controls' , ! wp_is_mobile() ) ) return; $_html = ''; $_html .= sprintf('<div class="tc-slider-controls %1$s">%2$s</div>', ! is_rtl() ? 'left' : 'right', sprintf('<a class="tc-carousel-control" href="#customizr-slider-%2$s" data-slide="prev">%1$s</a>', apply_filters( 'tc_slide_left_control', '‹' ), self::$rendered_sliders ) ); $_html .= sprintf('<div class="tc-slider-controls %1$s">%2$s</div>', ! is_rtl() ? 'right' : 'left', sprintf('<a class="tc-carousel-control" href="#customizr-slider-%2$s" data-slide="next">%1$s</a>', apply_filters( 'tc_slide_right_control', '›' ), self::$rendered_sliders ) ); echo apply_filters( 'tc_slider_control_view', $_html ); } /****************************** * PARALLAX *******************************/ //hook : wp //introduced in v3.4.23 function czr_fn_maybe_setup_parallax() { if ( 1 != esc_attr( czr_fn_opt( 'tc_slider_parallax') ) ) return; add_filter( 'tc_slider_layout_class' , array( $this, 'czr_fn_add_parallax_wrapper_class' ) ); add_filter( 'tc_carousel_inner_classes' , array( $this, 'czr_fn_add_parallax_item_class' ) ); add_filter( 'tc_carousel_inner_attributes' , array( $this, 'czr_fn_add_parallax_item_data_attributes' ) ); } //hook : tc_carousel_inner_classes function czr_fn_add_parallax_item_class ( $classes ) { array_push($classes, 'czr-parallax-slider' ); return $classes; } //hook : tc_slider_layout_class function czr_fn_add_parallax_wrapper_class( $classes ) { array_push($classes, 'parallax-wrapper' ); return $classes; } function czr_fn_add_parallax_item_data_attributes ( $attributes ) { array_push( $attributes, sprintf( 'data-parallax-ratio="%s"', apply_filters('tc_parallax_speed', 0.55 ) ) ); return $attributes; } /****************************** * HELPERS / SETTERS / CALLBACKS *******************************/ /** * Returns the modified caption data array with a link to the doc * Only displayed for the demo slider and logged in users * hook : tc_slide_caption_data * * @package Customizr * @since Customizr 3.3.+ * */ function czr_fn_set_demo_slide_data( $data, $slider_name_id, $id ) { if ( 'demo' != $slider_name_id || ! is_user_logged_in() ) return $data; switch ( $id ) { case 1 : //$data['title'] = __( 'Discover how to replace or remove this demo slider.', 'customizr' ); $data['link_url'] = esc_url( 'docs.presscustomizr.com/article/175-first-steps-with-the-customizr-wordpress-theme' ); $data['button_text'] = __( 'Discover the Customizr WordPress theme »' , 'customizr'); break; case 2 : $data['title'] = __( 'Discover how to replace or remove this demo slider.', 'customizr' ); $data['link_url'] = esc_url( 'docs.presscustomizr.com/article/102-customizr-theme-options-front-page#front-page-slider' ); $data['button_text'] = __( 'Check the slider doc now »' , 'customizr'); break; }; $data['link_target'] = '_blank'; return $data; } /** * Helper * @return boolean * * @package Customizr * @since Customizr 3.3+ * */ private function czr_fn_is_slider_possible() { //gets the front slider if any $tc_front_slider = esc_attr(czr_fn_opt( 'tc_front_slider' ) ); //when do we display a slider? By default only for home (if a slider is defined), pages and posts (including custom post types) $_show_slider = czr_fn__f('__is_home') ? ! empty( $tc_front_slider ) : ! is_404() && ! is_archive() && ! is_search(); return apply_filters( 'tc_show_slider' , $_show_slider ); } /** * helper * @return boolean * * @package Customizr * @since Customizr 3.4.9 */ function czr_fn_slider_exists( $slider ){ //if the slider not longer exists or exists but is empty, return false return ! ( !isset($slider) || !is_array($slider) || empty($slider) ); } /** * helper * returns the slider name id * @return string * */ private function czr_fn_get_current_slider($queried_id) { //gets the current slider id $_home_slider = czr_fn_opt( 'tc_front_slider' ); $slider_name_id = ( czr_fn__f('__is_home') && $_home_slider ) ? $_home_slider : esc_attr( get_post_meta( $queried_id, $key = 'post_slider_key' , $single = true ) ); return apply_filters( 'tc_slider_name_id', $slider_name_id , $queried_id); } /** * helper * returns the actual page id if we are displaying the posts page * @return number * */ private function czr_fn_get_real_id() { global $wp_query; $queried_id = czr_fn_get_id(); return apply_filters( 'tc_slider_get_real_id', ( ! czr_fn__f('__is_home') && ! empty($queried_id) ) ? $queried_id : get_the_ID() ); } /** * helper * returns the actual page id if we are displaying the posts page * @return boolean * */ private function czr_fn_is_slider_active( $queried_id ) { //is the slider set to on for the queried id? if ( czr_fn__f('__is_home') && czr_fn_opt( 'tc_front_slider' ) ) return apply_filters( 'tc_slider_active_status', true , $queried_id ); $_slider_on = esc_attr( get_post_meta( $queried_id, $key = 'post_slider_check_key' , $single = true ) ); if ( ! empty( $_slider_on ) && $_slider_on ) return apply_filters( 'tc_slider_active_status', true , $queried_id ); return apply_filters( 'tc_slider_active_status', false , $queried_id ); } /** * helper * returns whether or not the slider loading icon must be displayed * @return boolean * */ private function czr_fn_is_slider_loader_active( $slider_name_id ) { //The slider loader must be printed when //a) we have to render the demo slider //b) display slider loading option is enabled (can be filtered) return ( 'demo' == $slider_name_id || apply_filters( 'tc_display_slider_loader', 1 == esc_attr( czr_fn_opt( 'tc_display_slide_loader') ), $slider_name_id ) ); } /** * hook : tc_slider_height, fired in tc_user_options_style * @return number height value * * @package Customizr * @since Customizr 3.3+ */ function czr_fn_set_demo_slider_height( $_h ) { //this custom demo height is applied when : //1) current slider is demo if ( 'demo' != $this -> czr_fn_get_current_slider( $this -> czr_fn_get_real_id() ) ) return $_h; //2) height option has not been changed by user yet //the possible customization context must be taken into account here if ( czr_fn_is_customizing() ) { if ( 500 != esc_attr( czr_fn_opt( 'tc_slider_default_height') ) ) return $_h; } else { if ( false !== (bool) esc_attr( czr_fn_opt( 'tc_slider_default_height', CZR___::$tc_option_group, $use_default = false ) ) ) return $_h; } return apply_filters( 'tc_set_demo_slider_height' , 750 ); } /** * Callback of tc_user_options_style hook * @return css string * * @package Customizr * @since Customizr 3.2.6 */ function czr_fn_write_slider_inline_css( $_css ) { //custom css for the slider loader if ( $this -> czr_fn_is_slider_loader_active( $this -> czr_fn_get_current_slider( $this -> czr_fn_get_real_id() ) ) ) { $_slider_loader_visibility_css = ".tc-slider-loader-wrapper{ display:none }\nhtml.js .tc-slider-loader-wrapper { display: block }"; $_slider_loader_src = apply_filters( 'tc_slider_loader_src' , sprintf( '%1$s%2$s' , TC_BASE_URL , 'assets/front/img/slider-loader.gif') ); //we can load only the gif, or use it as fallback for old browsers (.no-csstransforms3d) if ( ! apply_filters( 'tc_slider_loader_gif_only', false ) ) { $_slider_loader_gif_class = '.no-csstransforms3d'; // The pure css loader color depends on the skin. Why can we do this here without caring of the live preview? // Basically 'cause the loader is something we see when the page "loads" then it disappears so a live change of the skin // will still have no visive impact on it. This will avoid us to rebuild the custom skins. $_current_skin_colors = CZR_utils::$inst -> czr_fn_get_skin_color( 'pair' ); $_pure_css_loader_css = apply_filters( 'tc_slider_loader_css', sprintf( '.tc-slider-loader-wrapper .tc-css-loader > div { border-color:%s; }', //we can use the primary or the secondary skin color 'primary' == apply_filters( 'tc_slider_loader_color', 'primary') ? $_current_skin_colors[0] : $_current_skin_colors[1] )); }else { $_slider_loader_gif_class = ''; $_pure_css_loader_css = ''; } $_slider_loader_gif_css = $_slider_loader_src ? sprintf( '%1$s .tc-slider-loader-wrapper .tc-img-gif-loader { background: url(\'%2$s\') no-repeat center center; }', $_slider_loader_gif_class, $_slider_loader_src ) : ''; $_css = sprintf( "$_css\n%s%s%s", $_slider_loader_visibility_css, $_slider_loader_gif_css, $_pure_css_loader_css ); }//end custom css for the slider loader // 1) Do we have a custom height ? // 2) check if the setting must be applied to all context $_custom_height = apply_filters( 'tc_slider_height' , esc_attr( czr_fn_opt( 'tc_slider_default_height') ) ); $_slider_inline_css = ""; //When shall we append custom slider style to the global custom inline stylesheet? $_bool = 500 != $_custom_height; $_bool = $_bool && ( czr_fn__f('__is_home') || czr_fn_is_checked( 'tc_slider_default_height_apply_all' ) ); if ( ! apply_filters( 'tc_print_slider_inline_css' , $_bool ) ) return $_css; $_resp_shrink_ratios = apply_filters( 'tc_slider_resp_shrink_ratios', array('1200' => 0.77 , '979' => 0.618, '480' => 0.38 , '320' => 0.28 ) ); $_slider_inline_css = " .carousel .czr-item { line-height: {$_custom_height}px; min-height:{$_custom_height}px; max-height:{$_custom_height}px; } .tc-slider-loader-wrapper { line-height: {$_custom_height}px; height:{$_custom_height}px; } .carousel .tc-slider-controls { line-height: {$_custom_height}px; max-height:{$_custom_height}px; }\n"; foreach ( $_resp_shrink_ratios as $_w => $_ratio) { if ( ! is_numeric($_ratio) ) continue; $_item_dyn_height = $_custom_height * $_ratio; $_caption_dyn_height = $_custom_height * ( $_ratio - 0.1 ); $_slider_inline_css .= " @media (max-width: {$_w}px) { .carousel .czr-item { line-height: {$_item_dyn_height}px; max-height:{$_item_dyn_height}px; min-height:{$_item_dyn_height}px; } .czr-item .carousel-caption { max-height: {$_caption_dyn_height}px; overflow: hidden; } .carousel .tc-slider-loader-wrapper { line-height: {$_item_dyn_height}px; height:{$_item_dyn_height}px; } }\n"; }//end foreach return sprintf("%s\n%s", $_css, $_slider_inline_css); } /** * Set slider wrapper class * hook : tc_slider_layout_class filter * * @package Customizr * @since Customizr 3.2.0 * */ function czr_fn_set_slider_wrapper_class($_classes) { if ( ! is_array($_classes) || 500 == esc_attr( czr_fn_opt( 'tc_slider_default_height') ) ) return $_classes; return array_merge( $_classes , array('custom-slider-height') ); } /** * hook : tc_carousel_inner_classes fired in the slider view * @return array of css classes * * @package Customizr * @since Customizr 3.3+ */ function czr_fn_set_inner_class( $_classes ) { if( ! (bool) esc_attr( czr_fn_opt( 'tc_center_slider_img') ) || ! is_array($_classes) ) return $_classes; array_push( $_classes, 'center-slides-enabled' ); return $_classes; } /** * Getter * Returns the trimmed post slide title * * @return string * * @package Customizr * @since Customizr 3.4.9 * */ function czr_fn_get_post_slide_title( $_post, $ID ) { $title_length = apply_filters('tc_post_slide_title_length', 80, $ID ); $more = apply_filters('tc_post_slide_more', '...', $ID ); return $this -> czr_fn_get_post_title( $_post, $title_length, $more ); } /** * Getter * Returns the trimmed post slide excerpt * * @return string * * @package Customizr * @since Customizr 3.4.9 * */ function czr_fn_get_post_slide_excerpt( $_post, $ID ) { $excerpt_length = apply_filters( 'tc_post_slide_text_length', 80, $ID ); $more = apply_filters( 'tc_post_slide_more', '...', $ID ); return $this -> czr_fn_get_post_excerpt( $_post, $excerpt_length, $more ); } /** * Getter * Returns the trimmed posts slider button text * * @return string * * @package Customizr * @since Customizr 3.4.9 * */ function czr_fn_get_post_slide_button_text( $button_text ) { $button_text_length = apply_filters( 'tc_posts_slider_button_text_length', 80 ); $more = apply_filters( 'tc_post_slide_more', '...'); $button_text = apply_filters( 'tc_posts_slider_button_text_pre_trim' , $button_text ); return czr_fn_text_truncate( $button_text, $button_text_length, $more ); } /** * Helper * Returns the trimmed post title * * @return string * * Slightly different and simplified version of get_the_title to avoid conflicts with plugins filtering the_title * and custom trimming. * * @package Customizr * @since Customizr 3.4.9 * */ // move this into CZR_utils? function czr_fn_get_post_title( $_post, $default_title_length, $more ) { $title = $_post->post_title; if ( ! empty( $_post->post_password ) ) { $protected_title_format = apply_filters( 'protected_title_format', __( 'Protected: %s', 'customizr' ), $_post); $title = sprintf( $protected_title_format, $title ); } $title = apply_filters( 'tc_post_title_pre_trim' , $title ); return czr_fn_text_truncate( $title, $default_title_length, $more); } /** * Helper * Returns the trimmed post excerpt * * @return string * * Slightly different and simplified version of wp_trim_excerpt to avoid conflicts with plugins filtering get_excerpt and the_content * and custom trimming. * * @package Customizr * @since Customizr 3.4.9 * */ // move this into CZR_utils? function czr_fn_get_post_excerpt( $_post, $default_text_length, $more ) { if ( ! empty( $_post->post_password) ) return __( 'There is no excerpt because this is a protected post.', 'customizr' ); $excerpt = '' != $_post->post_excerpt ? $_post->post_excerpt : $_post->post_content; $excerpt = apply_filters( 'tc_post_excerpt_pre_sanitize' , $excerpt ); // below some function applied to the_content & the_excerpt filters // we cannot use those filters 'cause some plugins, e.g. qtranslate // filter those as well invalidating our transient $excerpt = strip_shortcodes( $excerpt ); $excerpt = wptexturize( $excerpt ); $excerpt = convert_chars( $excerpt ); $excerpt = wpautop( $excerpt ); $excerpt = shortcode_unautop( $excerpt ); $excerpt = str_replace(']]>', ']]>', $excerpt ); $excerpt = apply_filters( 'tc_post_excerpt_pre_trim' , $excerpt ); return czr_fn_text_truncate( $excerpt, $default_text_length, $more); } } //end of class endif; ?><?php /** * Footer actions * */ if ( ! class_exists( 'CZR_footer_main' ) ) : class CZR_footer_main { static $instance; function __construct () { self::$instance =& $this; //All footer hooks setup add_action( 'wp_head' , array( $this , 'czr_fn_footer_hook_setup') ); // Sticky footer style add_filter( 'tc_user_options_style' , array( $this , 'czr_fn_write_sticky_footer_inline_css' ) ); } /****************************** * HOOK SETUP *******************************/ /** * Footer hooks setup * hook : wp_head * @return void * * @package Customizr * @since Customizr 3.3+ */ function czr_fn_footer_hook_setup() { //add sticky_footer body class add_filter ( 'body_class' , array( $this, 'czr_fn_add_sticky_footer_body_class' ) ); //print the sticky_footer push div add_action ( '__after_main_container' , array( $this, 'czr_fn_sticky_footer_push'), 100 ); //html > footer actions add_action ( '__after_main_wrapper' , 'get_footer'); //boolean filter to control the footer's rendering if ( ! apply_filters( 'tc_display_footer', true ) ) return; //footer actions add_action ( '__footer' , array( $this , 'czr_fn_widgets_footer' ), 10 ); add_action ( '__footer' , array( $this , 'czr_fn_colophon_display' ), 20 ); //colophon actions => some priorities are rtl dependants add_action ( '__colophon' , array( $this , 'czr_fn_colophon_left_block' ), 10 ); add_action ( '__colophon' , array( $this , 'czr_fn_colophon_center_block' ), 20 ); add_action ( '__colophon' , array( $this , 'czr_fn_colophon_right_block' ), 30 ); //since v3.2.0, Show back to top from the Customizer option panel add_action ( '__after_footer' , array( $this , 'czr_fn_render_back_to_top') ); //since v3.2.0, set no widget icons from the Customizer option panel add_filter ( 'tc_footer_widget_wrapper_class' , array( $this , 'czr_fn_set_widget_wrapper_class') ); } /****************************** * VIEWS *******************************/ /** * Displays the footer widgets areas * * * @package Customizr * @since Customizr 3.0.10 */ function czr_fn_widgets_footer() { //checks if there's at least one active widget area in footer.php.php $status = false; $footer_widgets = apply_filters( 'tc_footer_widgets', CZR_init::$instance -> footer_widgets ); foreach ( $footer_widgets as $key => $area ) { $status = is_active_sidebar( $key ) ? true : $status; } //if no active widget area yet, return if ( ! apply_filters( 'tc_has_footer_widgets', $status ) ) { return; } //hack to render white color icons if skin is grey or black $skin_class = ( in_array( czr_fn_opt( 'tc_skin') , array('grey.css' , 'black.css', 'black2.css')) ) ? 'white-icons' : ''; $footer_widgets_wrapper_classes = implode(" ", apply_filters( 'tc_footer_widget_wrapper_class' , array('container' , 'footer-widgets', $skin_class) ) ); ob_start(); ?> <div class="<?php echo $footer_widgets_wrapper_classes; ?>"> <div class="<?php echo implode( ' ' , apply_filters( 'tc_footer_widget_area', array('row' ,'widget-area') ) ) ?>" role="complementary"> <?php do_action("__before_footer_widgets") ?> <?php foreach ( $footer_widgets as $key => $area ) : ?> <div id="<?php echo $key; ?>" class="<?php echo apply_filters( "{$key}_widget_class", "span4" ) ?>"> <?php do_action("__before_{$key}_widgets"); ?> <?php if ( apply_filters( 'tc_has_footer_widgets_zone', is_active_sidebar( $key ), $key ) ) : ?> <?php dynamic_sidebar( $key ); ?> <?php endif; ?> <?php do_action("__after_{$key}_widgets"); ?> </div><!-- .{$key}_widget_class --> <?php endforeach; ?> <?php do_action("__after_footer_widgets") ?> </div><!-- .row.widget-area --> </div><!--.footer-widgets --> <?php $html = ob_get_contents(); if ($html) ob_end_clean(); echo apply_filters( 'tc_widgets_footer', $html , $footer_widgets ); }//end of function /** * Displays the colophon (block below the widgets areas). * * * @package Customizr * @since Customizr 3.0.10 */ function czr_fn_colophon_display() { ?> <?php ob_start() ?> <div class="colophon"> <div class="container"> <div class="<?php echo apply_filters( 'tc_colophon_class', 'row-fluid' ) ?>"> <?php //colophon blocks actions priorities //renders blocks do_action( '__colophon' ); ?> </div><!-- .row-fluid --> </div><!-- .container --> </div><!-- .colophon --> <?php $html = ob_get_contents(); if ($html) ob_end_clean(); echo apply_filters( 'tc_colophon_display', $html ); } /** * Displays the social networks block in the footer * * * @package Customizr * @since Customizr 3.0.10 */ function czr_fn_colophon_left_block() { //when do we display the socials? //1) must be enabled //the whole block will be always displayed for a matter of structure (columns) $_hide_socials = 0 == czr_fn_opt( 'tc_social_in_footer'); echo apply_filters( 'tc_colophon_left_block', sprintf('<div class="%1$s">%2$s</div>', implode( ' ', apply_filters( 'tc_colophon_left_block_class', array( 'span3', 'social-block', is_rtl() ? 'pull-right' : 'pull-left' ) ) ), ( ! $_hide_socials ) ? sprintf('<span class="social-links">%1$s</span>', czr_fn__f( '__get_socials' ) ) : '' ) ); } /** * Footer Credits call back functions * Can be filtered using the $site_credits, $tc_credits parameters * * * @package Customizr * @since Customizr 3.0.6 */ function czr_fn_colophon_center_block() { echo apply_filters( 'tc_credits_display', sprintf('<div class="%1$s">%2$s</div>', apply_filters( 'tc_colophon_center_block_class', 'span6 credits' ), sprintf( '<p>%1$s %2$s %3$s</p>', apply_filters( 'tc_copyright_link', sprintf( '· <span class="tc-copyright-text">© %1$s</span> <a href="%2$s" title="%3$s" rel="bookmark">%3$s</a>', esc_attr( date( 'Y' ) ), esc_url( home_url() ), esc_attr( get_bloginfo() ) ) ), apply_filters( 'tc_wp_powered', sprintf( '· <span class="tc-wp-powered-text">%1$s</span> <a class="icon-wordpress" target="_blank" rel="noopener noreferrer" href="https://wordpress.org" title="%2$s"></a> ·', __('Powered by', 'customizr'), __('Powered by WordPress', 'customizr') ) ), apply_filters( 'tc_credit_link', sprintf( '<span class="tc-credits-text">%1$s </span> ·', sprintf( __('Designed with the %s', 'customizr'), sprintf( '<a class="czr-designer-link" href="%1$s" title="%2$s">%2$s</a>', esc_url( CZR_WEBSITE . 'customizr' ), __('Customizr theme', 'customizr') ) ) ) ) ) ) ); } /** * Displays the back to top fixed text block in the colophon * * * @package Customizr * @since Customizr 3.0.10 */ function czr_fn_colophon_right_block() { //since 3.4.16 BTT button excludes BTT text if ( ! apply_filters('tc_show_text_btt', 0 == czr_fn_opt( 'tc_show_back_to_top' ) ) ) return; echo apply_filters( 'tc_colophon_right_block', sprintf('<div class="%1$s"><p class="%3$s"><a class="back-to-top" href="#">%2$s</a></p></div>', implode( ' ', apply_filters( 'tc_colophon_right_block_class', array( 'span3', 'backtop' ) ) ), __( 'Back to top' , 'customizr' ), is_rtl() ? 'pull-left' : 'pull-right' ) ); } /****************************** * CALLBACKS / SETTERS *******************************/ /** * Set priorities for right and left colophon blocks, depending on the hook and is_rtl bool * hooks : tc_rtl_colophon_priority * @return void * @param priority number, location string * @package Customizr * @since Customizr 3.3+ */ function czr_fn_set_rtl_colophon_priority( $_priority, $_location ) { if ( ! is_rtl() ) return $_priority; //tc_colophon_right_priority OR tc_colophon_left_priority return 'right' == $_location ? 10 : 30; } /* * Callback of tc_user_options_style hook * @return css string * * @package Customizr * @since Customizr 3.3.27 */ function czr_fn_write_sticky_footer_inline_css( $_css ){ if ( ! ( $this -> is_sticky_footer_enabled() || czr_fn_is_customizing() ) ) return $_css; $_css = sprintf("%s\n%s", $_css, "#tc-push-footer { display: none; visibility: hidden; } .tc-sticky-footer #tc-push-footer.sticky-footer-enabled { display: block; } \n" ); return $_css; } /* * Callback of body_class hook * * @package Customizr * @since Customizr 3.3.27 */ function czr_fn_add_sticky_footer_body_class($_classes) { if ( $this -> is_sticky_footer_enabled() ) $_classes = array_merge( $_classes, array( 'tc-sticky-footer') ); return $_classes; } /** * * Print hookable sticky footer push div * * * @package Customizr * @since Customizr 3.3.27 * * @hook __after_main_container * */ function czr_fn_sticky_footer_push() { if ( ! ( $this -> is_sticky_footer_enabled() || czr_fn_is_customizing() ) ) return; echo '<div id="tc-push-footer"></div>'; } /** * Displays the back to top on scroll * Has to be enabled in the customizer * * @package Customizr * @since Customizr 3.2.0 */ function czr_fn_render_back_to_top() { if ( 0 == czr_fn_opt( 'tc_show_back_to_top' ) ) return; printf('<div id="tc-footer-btt-wrapper" class="tc-btt-wrapper %1$s"><i class="btt-arrow"></i></div>', esc_attr( czr_fn_opt( 'tc_back_to_top_position' ) ) ); } /** * Displays the widget icons if option is enabled in customizer * @uses filter tc_footer_widget_wrapper_class * * @package Customizr * @since Customizr 3.2.0 */ function czr_fn_set_widget_wrapper_class( $_original_classes ) { $_no_icons_classes = array_merge($_original_classes, array('no-widget-icons')); if ( 1 == czr_fn_opt( 'tc_show_footer_widget_icon' ) ) return 0 == czr_fn_opt( 'tc_show_title_icon' ) ? $_no_icons_classes : $_original_classes; //last condition return $_no_icons_classes; } /* Helpers */ /* * Sticky footer enabled * * @return bool */ function is_sticky_footer_enabled() { return 1 == czr_fn_opt( 'tc_sticky_footer'); } }//end of class endif; ?>