* @copyright Copyright (c) 2013, Nicolas GUILLAUME
* @link http://themesandco.com/customizr
* @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
*/
if ( ! class_exists( 'TC_utils' ) ) :
class TC_utils {
//Access any method or var of the class with classname::$instance -> var or method():
static $instance;
public $default_options;
public $options;//not used in customizer context only
public $is_customizing;
function __construct () {
self::$instance =& $this;
//get all options
add_filter ( '__options' , array( $this , 'tc_get_theme_options' ), 10, 1);
//get single option
add_filter ( '__get_option' , array( $this , 'tc_get_option' ), 10, 2 );
//some useful filters
add_filter ( '__ID' , array( $this , 'tc_get_the_ID' ));
add_filter ( '__screen_layout' , array( $this , 'tc_get_current_screen_layout' ) , 10 , 2 );
add_filter ( '__is_home' , array( $this , 'tc_is_home' ) );
add_filter ( '__is_home_empty' , array( $this , 'tc_is_home_empty' ) );
add_filter ( '__post_type' , array( $this , 'tc_get_post_type' ) );
add_filter ( '__is_no_results' , array( $this , 'tc_is_no_results') );
add_filter ( '__article_selectors' , array( $this , 'tc_article_selectors' ));
//social networks
add_filter ( '__get_socials' , array( $this , 'tc_get_social_networks' ) );
//WP filters
add_filter ( 'the_content' , array( $this , 'tc_fancybox_content_filter' ));
add_filter ( 'wp_title' , array( $this , 'tc_wp_title' ), 10, 2 );
//default options
$this -> is_customizing = $this -> tc_is_customizing();
$this -> default_options = $this -> tc_get_default_options();
}
/**
* Returns a boolean on the customizer's state
*
* @package Customizr
* @since Customizr 3.1.11
*/
function tc_is_customizing() {
//checks if is customizing : two contexts, admin and front (preview frame)
global $pagenow;
$is_customizing = false;
if ( is_admin() && isset( $pagenow ) && 'customize.php' == $pagenow ) {
$is_customizing = true;
} else if ( ! is_admin() && isset($_REQUEST['wp_customize']) ) {
$is_customizing = true;
}
return $is_customizing;
}
/**
* Returns the default options array
*
* @package Customizr
* @since Customizr 3.1.11
*/
function tc_get_default_options() {
$def_options = get_option( "tc_theme_defaults");
//Always update the default option when (OR) :
// 1) they are not defined
// 2) customzing => takes into account if user has set a filter or added a new customizer setting
// 3) theme version not defined
// 4) versions are different
if ( ! $def_options || $this -> is_customizing || ! isset($def_options['ver']) || 0 != version_compare( $def_options['ver'] , CUSTOMIZR_VER ) ) {
$def_options = $this -> tc_generate_default_options( $this -> tc_customizer_map( $get_default_option = 'true' ) , 'tc_theme_options' );
//Adds the version
$def_options['ver'] = CUSTOMIZR_VER;
update_option( "tc_theme_defaults" , $def_options );
}
return apply_filters( 'tc_default_options', $def_options );
}
/**
* Generates the default options array from a customizer map + add slider option
*
* @package Customizr
* @since Customizr 3.0.3
*/
function tc_generate_default_options( $map, $option_group = null ) {
//do we have to look in a specific group of option (plugin?)
$option_group = is_null($option_group) ? 'tc_theme_options' : $option_group;
//initialize the default array with the sliders options
$defaults = array();
foreach ($map['add_setting_control'] as $key => $options) {
//check it is a customizr option
if( false !== strpos( $key , $option_group ) ) {
//isolate the option name between brackets [ ]
$option_name = '';
$option = preg_match_all( '/\[(.*?)\]/' , $key , $match );
if ( isset( $match[1][0] ) )
{
$option_name = $match[1][0];
}
//write default option in array
if(isset($options['default'])) {
$defaults[$option_name] = $options['default'];
}
else {
$defaults[$option_name] = null;
}
}//end if
}//end foreach
return $defaults;
}
/**
* Get the saved options in Customizer Screen, merge them with the default theme options array and return the updated global options array
* @package Customizr
* @since Customizr 1.0
*
*/
function tc_get_theme_options ( $option_group = null ) {
//do we have to look in a specific group of option (plugin?)
$option_group = is_null($option_group) ? 'tc_theme_options' : $option_group;
$saved = (array) get_option( $option_group );
$defaults = $this -> default_options;
$__options = wp_parse_args( $saved, $defaults );
//$__options = array_intersect_key( $__options, $defaults );
return $__options;
}
/**
* Returns an option from the options array of the theme.
*
* @package Customizr
* @since Customizr 1.0
*/
function tc_get_option( $option_name , $option_group = null ) {
//do we have to look in a specific group of option (plugin?)
$option_group = is_null($option_group) ? 'tc_theme_options' : $option_group;
$saved = (array) get_option( $option_group );
$defaults = $this -> default_options;
$__options = wp_parse_args( $saved, $defaults );
//$options = array_intersect_key( $saved , $defaults);
$returned_option = isset($__options[$option_name]) ? $__options[$option_name] : false;
return apply_filters( 'tc_get_option' , $returned_option , $option_name , $option_group );
}
/**
* Returns the "real" queried post ID or if !isset, get_the_ID()
* Checks some contextual booleans
*
* @package Customizr
* @since Customizr 1.0
*/
function tc_get_the_ID() {
$queried_object = get_queried_object();
$tc_id = get_post() ? get_the_ID() : null;
$tc_id = ( isset ($queried_object -> ID) ) ? $queried_object -> ID : $tc_id;
return ( is_404() || is_search() || is_archive() ) ? null : $tc_id;
}
/**
* This function returns the layout (sidebar(s), or full width) to apply to a context
*
* @package Customizr
* @since Customizr 1.0
*/
function tc_get_current_screen_layout ( $post_id , $sidebar_or_class) {
$__options = tc__f ( '__options' );
global $post;
//Article wrapper class definition
$global_layout = apply_filters( 'tc_global_layout' , TC_init::$instance -> global_layout );
/* DEFAULT LAYOUTS */
//get the global default layout
$tc_sidebar_global_layout = $__options['tc_sidebar_global_layout'];
//get the post default layout
$tc_sidebar_post_layout = $__options['tc_sidebar_post_layout'];
//get the page default layout
$tc_sidebar_page_layout = $__options['tc_sidebar_page_layout'];
//what is the default layout we want to apply? By default we apply the global default layout
$tc_sidebar_default_layout = $tc_sidebar_global_layout;
if ( is_single() )
$tc_sidebar_default_layout = $tc_sidebar_post_layout;
if ( is_page() )
$tc_sidebar_default_layout = $tc_sidebar_page_layout;
//builds the default layout option array including layout and article class
$class_tab = $global_layout[$tc_sidebar_default_layout];
$class_tab = $class_tab['content'];
$tc_screen_layout = array(
'sidebar' => $tc_sidebar_default_layout,
'class' => $class_tab
);
//checks if the 'force default layout' option is checked and return the default layout before any specific layout
$force_layout = $__options['tc_sidebar_force_layout'];
if( $force_layout == 1) {
$class_tab = $global_layout[$tc_sidebar_global_layout];
$class_tab = $class_tab['content'];
$tc_screen_layout = array(
'sidebar' => $tc_sidebar_global_layout,
'class' => $class_tab
);
return $tc_screen_layout[$sidebar_or_class];
}
//The following lines set the post specific layout if any, and if not keeps the default layout previously defined
$tc_specific_post_layout = false;
global $wp_query;
//if we are displaying an attachement, we use the parent post/page layout
if ( $post && 'attachment' == $post -> post_type ) {
$tc_specific_post_layout = esc_attr(get_post_meta( $post->post_parent , $key = 'layout_key' , $single = true ));
}
//for a singular post or page OR for the posts page
elseif ( is_singular() || $wp_query -> is_posts_page ) {
$tc_specific_post_layout = esc_attr(get_post_meta( $post_id, $key = 'layout_key' , $single = true ));
}
//checks if we display home page, either posts or static page and apply the customizer option
if( (is_home() && 'posts' == get_option( 'show_on_front' ) ) || is_front_page()) {
$tc_specific_post_layout = $__options['tc_front_layout'];
}
if( $tc_specific_post_layout ) {
$class_tab = $global_layout[$tc_specific_post_layout];
$class_tab = $class_tab['content'];
$tc_screen_layout = array(
'sidebar' => $tc_specific_post_layout,
'class' => $class_tab
);
}
return apply_filters( 'tc_screen_layout' , $tc_screen_layout[$sidebar_or_class], $post_id , $sidebar_or_class );
}
/**
* Add an optional rel="tc-fancybox[]" attribute to all images embedded in a post.
*
* @package Customizr
* @since Customizr 2.0.7
*/
function tc_fancybox_content_filter( $content) {
$tc_fancybox = esc_attr( tc__f( '__get_option' , 'tc_fancybox' ) );
if ( 1 == $tc_fancybox )
{
global $post;
if ( !isset($post) )
return;
$pattern ="//i";
$replacement = '';
$content = preg_replace( $pattern, $replacement, $content);
}
return apply_filters( 'tc_fancybox_content_filter', $content );
}
/**
* Title element formating
*
* @since Customizr 2.1.6
*
*/
function tc_wp_title( $title, $sep ) {
global $paged, $page;
if ( is_feed() )
return $title;
// Add the site name.
$title .= get_bloginfo( 'name' );
// Add the site description for the home/front page.
$site_description = get_bloginfo( 'description' , 'display' );
if ( $site_description && tc__f('__is_home') )
$title = "$title $sep $site_description";
// Add a page number if necessary.
if ( $paged >= 2 || $page >= 2 )
$title = "$title $sep " . sprintf( __( 'Page %s' , 'customizr' ), max( $paged, $page ) );
return $title;
}
/**
* Check if we are displaying posts lists or front page
*
* @since Customizr 3.0.6
*
*/
function tc_is_home() {
//get info whether the front page is a list of last posts or a page
return ( (is_home() && ( 'posts' == get_option( 'show_on_front' ) || 'nothing' == get_option( 'show_on_front' ) ) ) || is_front_page() ) ? true : false;
}
/**
* Check if we show posts or page content on home page
*
* @since Customizr 3.0.6
*
*/
function tc_is_home_empty() {
//check if the users has choosen the "no posts or page" option for home page
return ( (is_home() || is_front_page() ) && 'nothing' == get_option( 'show_on_front' ) ) ? true : false;
}
/**
* Return object post type
*
* @since Customizr 3.0.10
*
*/
function tc_get_post_type() {
global $post;
if ( !isset($post) )
return;
return $post -> post_type;
}
/**
* Returns the classes for the post div.
*
* @param string|array $class One or more classes to add to the class list.
* @param int $post_id An optional post ID.
* @package Customizr
* @since 3.0.10
*/
function tc_get_post_class( $class = '', $post_id = null ) {
// Separates classes with a single space, collates classes for post DIV
return 'class="' . join( ' ', get_post_class( $class, $post_id ) ) . '"';
}
/**
* Boolean : check if we are in the no search results case
*
* @package Customizr
* @since 3.0.10
*/
function tc_is_no_results() {
global $wp_query;
return ( is_search() && 0 == $wp_query -> post_count ) ? true : false;
}
/**
* Displays the selectors of the article depending on the context
*
* @package Customizr
* @since 3.1.0
*/
function tc_article_selectors() {
//gets global vars
global $post;
global $wp_query;
//declares selector var
$selectors = '';
// SINGLE POST
$single_post_selector_bool = isset($post) && 'page' != $post -> post_type && 'attachment' != $post -> post_type && is_singular();
$selectors = $single_post_selector_bool ? apply_filters( 'tc_single_post_selectors' ,'id="post-'.get_the_ID().'" '.$this -> tc_get_post_class('row-fluid') ) : $selectors;
// POST LIST
$post_list_selector_bool = ( isset($post) && !is_singular() && !is_404() && !tc__f( '__is_home_empty') ) || ( is_search() && 0 != $wp_query -> post_count );
$selectors = $post_list_selector_bool ? apply_filters( 'tc_post_list_selectors' , 'id="post-'.get_the_ID().'" '.$this -> tc_get_post_class('row-fluid') ) : $selectors;
// PAGE
$page_selector_bool = isset($post) && 'page' == tc__f('__post_type') && is_singular() && !tc__f( '__is_home_empty');
$selectors = $page_selector_bool ? apply_filters( 'tc_page_selectors' , 'id="page-'.get_the_ID().'" '.$this -> tc_get_post_class('row-fluid') ) : $selectors;
// ATTACHMENT
//checks if attachement is image and add a selector
$format_image = wp_attachment_is_image() ? 'format-image' : '';
$selectors = ( isset($post) && 'attachment' == $post -> post_type && is_singular() ) ? apply_filters( 'tc_attachment_selectors' , 'id="post-'.get_the_ID().'" '.$this -> tc_get_post_class(array('row-fluid', $format_image) ) ) : $selectors;
// NO SEARCH RESULTS
$selectors = ( is_search() && 0 == $wp_query -> post_count ) ? apply_filters( 'tc_no_results_selectors' , 'id="post-0" class="post error404 no-results not-found row-fluid"' ) : $selectors;
// 404
$selectors = is_404() ? apply_filters( 'tc_404_selectors' , 'id="post-0" class="post error404 no-results not-found row-fluid"' ) : $selectors;
echo apply_filters( 'tc_article_selectors', $selectors );
}//end of function
/**
* Gets the social networks list defined in customizer options
*
* @package Customizr
* @since Customizr 3.0.10
*/
function tc_get_social_networks() {
$__options = tc__f( '__options' );
//gets the social network array
$socials = apply_filters( 'tc_default_socials' , TC_init::$instance -> socials );
//declares some vars
$html = '';
foreach ( $socials as $key => $data ) {
if ( $__options[$key] != '' ) {
//gets height and width from image, we check if getimagesize can be used first with the error control operator
$width = $height = '';
if ( isset($data['custom_icon_url']) && @getimagesize($data['custom_icon_url']) ) { list( $width, $height ) = getimagesize($data['custom_icon_url']); }
//there is one exception : rss feed has no target _blank and special icon title
$html .= sprintf('%6$s',
apply_filters( 'tc_social_link_class',
sprintf('social-icon icon-%1$s' ,
( $key == 'tc_rss' ) ? 'feed' : str_replace('tc_', '', $key)
)
),
esc_url( $__options[$key]),
isset($data['link_title']) ? call_user_func( '__' , $data['link_title'] , 'customizr' ) : '' ,
( $key == 'tc_rss' ) ? '' : apply_filters( 'tc_socials_target', 'target=_blank', $key ),
apply_filters( 'tc_additional_social_attributes', '' , $key),
( isset($data['custom_icon_url']) && !empty($data['custom_icon_url']) ) ? sprintf('
',
$data['custom_icon_url'],
$width,
$height,
isset($data['link_title']) ? call_user_func( '__' , $data['link_title'] , 'customizr' ) : ''
) : ''
);
}
}
return $html;
}
/**
* Generates the featured pages options
*
* @package Customizr
* @since Customizr 3.0.15
*
*/
function tc_generates_featured_pages() {
$default = array(
'dropdown' => array(
'one' => __( 'Home featured page one' , 'customizr' ),
'two' => __( 'Home featured page two' , 'customizr' ),
'three' => __( 'Home featured page three' , 'customizr' )
),
'text' => array(
'one' => __( 'Featured text one (200 car. max)' , 'customizr' ),
'two' => __( 'Featured text two (200 car. max)' , 'customizr' ),
'three' => __( 'Featured text three (200 car. max)' , 'customizr' )
)
);
//declares some loop's vars and the settings array
$priority = 70;
$incr = 0;
$fp_setting_control = array();
//gets the featured pages id from init
$fp_ids = apply_filters( 'tc_featured_pages_ids' , TC_init::$instance -> fp_ids);
//dropdown field generator
foreach ( $fp_ids as $id ) {
$priority = $priority + $incr;
$fp_setting_control['tc_theme_options[tc_featured_page_'. $id.']'] = array(
'label' => isset($default['dropdown'][$id]) ? $default['dropdown'][$id] : sprintf( __('Custom featured page %1$s' , 'customizr' ) , $id ),
'section' => 'tc_frontpage_settings' ,
'type' => 'dropdown-pages' ,
'priority' => $priority
);
$incr += 10;
}
//text field generator
$incr = 10;
foreach ( $fp_ids as $id ) {
$priority = $priority + $incr;
$fp_setting_control['tc_theme_options[tc_featured_text_' . $id . ']'] = array(
'sanitize_callback' => array( $this , 'tc_sanitize_textarea' ),
'transport' => 'postMessage',
'control' => 'TC_controls' ,
'label' => isset($default['text'][$id]) ? $default['text'][$id] : sprintf( __('Featured text %1$s (200 car. max)' , 'customizr' ) , $id ),
'section' => 'tc_frontpage_settings' ,
'type' => 'textarea' ,
'notice' => __( 'You need to select a page first. Leave this field empty if you want to use the page excerpt.' , 'customizr' ),
'priority' => $priority,
);
$incr += 10;
}
return $fp_setting_control;
}
function tc_generates_socials() {
//gets the social network array
$socials = apply_filters( 'tc_default_socials' , TC_init::$instance -> socials );
//declares some loop's vars and the settings array
$priority = 50;//start priority
$incr = 0;
$socials_setting_control = array();
foreach ( $socials as $key => $data ) {
$priority += $incr;
$socials_setting_control['tc_theme_options[' . $key . ']'] = array(
'default' => ( isset($data['default']) && !is_null($data['default']) ) ? $data['default'] : null ,
'sanitize_callback' => array( $this , 'tc_sanitize_url' ),
'control' => 'TC_controls' ,
'label' => ( isset($data['option_label']) ) ? call_user_func( '__' , $data['option_label'] , 'customizr' ) : $key,
'section' => 'tc_social_settings' ,
'type' => 'url',
'priority' => $priority
);
$incr += 5;
}
return $socials_setting_control;
}
function tc_get_skins($path) {
//checks if path exists
if ( !file_exists($path) )
return;
//gets the skins from init
$default_skin_list = TC_init::$instance -> skins;
//declares the skin list array
$skin_list = array();
//gets the skins : filters the files with a css extension and generates and array[] : $key = filename.css => $value = filename
$files = scandir($path) ;
foreach ( $files as $file) {
//skips the minified
if ( false !== strpos($file, '.min.') )
continue;
if ( $file[0] != '.' && !is_dir($path.$file) ) {
if ( substr( $file, -4) == '.css' ) {
$skin_list[$file] = isset($default_skin_list[$file]) ? call_user_func( '__' , $default_skin_list[$file] , 'customizr' ) : substr_replace( $file , '' , -4 , 4);
}
}
}//endforeach
return $skin_list;
}//end of function
/**
* Returns the layout choices array
*
* @package Customizr
* @since Customizr 3.1.0
*/
function tc_layout_choices() {
$global_layout = apply_filters( 'tc_global_layout' , TC_init::$instance -> global_layout );
$layout_choices = array();
foreach ($global_layout as $key => $value) {
$layout_choices[$key] = ( $value['customizer'] ) ? call_user_func( '__' , $value['customizer'] , 'customizr' ) : null ;
}
return $layout_choices;
}
/**
* Retrieves slider names and generate the select list
* @package Customizr
* @since Customizr 3.0.1
*/
function tc_slider_choices() {
$__options = get_option('tc_theme_options');
$slider_names = isset($__options['tc_sliders']) ? $__options['tc_sliders'] : array();
$slider_choices = array(
0 => __( '— No slider —' , 'customizr' ),
'demo' => __( '— Demo Slider —' , 'customizr' )
);
if ( $slider_names ) {
foreach( $slider_names as $tc_name => $slides) {
$slider_choices[$tc_name] = $tc_name;
}
}
return $slider_choices;
}
/**
* Returns the list of available skins from child (if exists) and parent theme
*
* @package Customizr
* @since Customizr 3.0.11
* @updated Customizr 3.0.15
*/
function tc_skin_choices() {
$parent_skins = $this -> tc_get_skins(TC_BASE .'inc/assets/css');
$child_skins = ( TC___::$instance -> tc_is_child() && file_exists(TC_BASE_CHILD .'inc/assets/css') ) ? $this -> tc_get_skins(TC_BASE_CHILD .'inc/assets/css') : array();
$skin_list = array_merge( $parent_skins , $child_skins );
return apply_filters( 'tc_skin_list', $skin_list );
}
/**
* Defines sections, settings and function of customizer and return and array
* Also used to get the default options array, in this case $get_default = true and we DISABLE the __get_option (=>infinite loop)
*
* @package Customizr
* @since Customizr 3.0
*/
function tc_customizer_map( $get_default = null ) {
//customizer option array
$remove_section = array(
'remove_section' => array(
'background_image' ,
'static_front_page' ,
'colors'
)
);//end of remove_sections array
$remove_section = apply_filters( 'tc_remove_section_map', $remove_section );
$add_section = array(
'add_section' => array(
'tc_skins_settings' => array(
'title' => __( 'Skin' , 'customizr' ),
'priority' => 10,
'description' => __( 'Select a skin for Customizr' , 'customizr' )
),
'tc_logo_settings' => array(
'title' => __( 'Logo & Favicon' , 'customizr' ),
'priority' => 20,
'description' => __( 'Set up logo and favicon options' , 'customizr' ),
),
'tc_frontpage_settings' => array(
'title' => __( 'Front Page' , 'customizr' ),
'priority' => 30,
'description' => __( 'Set up front page options' , 'customizr' )
),
'tc_layout_settings' => array(
'title' => __( 'Pages & Posts Layout' , 'customizr' ),
'priority' => 150,
'description' => __( 'Set up layout options' , 'customizr' )
),
'tc_page_comments' => array(
'title' => __( 'Comments' , 'customizr' ),
'priority' => 160,
'description' => __( 'Set up comments options' , 'customizr' ),
),
'tc_social_settings' => array(
'title' => __( 'Social links' , 'customizr' ),
'priority' => 170,
'description' => __( 'Set up your social links' , 'customizr' ),
),
'tc_image_settings' => array(
'title' => __( 'Images' , 'customizr' ),
'priority' => 180,
'description' => __( 'Various images settings' , 'customizr' ),
),
'tc_links_settings' => array(
'title' => __( 'Links' , 'customizr' ),
'priority' => 190,
'description' => __( 'Various links settings' , 'customizr' ),
),
'tc_custom_css' => array(
'title' => __( 'Custom CSS' , 'customizr' ),
'priority' => 200,
'description' => __( 'Add your own CSS' , 'customizr' ),
),
'tc_responsive' => array(
'title' => __( 'Responsive settings' , 'customizr' ),
'priority' => 210,
'description' => __( 'Various settings for responsive display' , 'customizr' ),
)
)
);//end of add_sections array
$add_section = apply_filters( 'tc_add_section_map', $add_section );
//specifies the transport for some options
$get_setting = array(
'get_setting' => array(
'blogname' ,
'blogdescription'
)
);//end of get_setting array
$get_setting = apply_filters( 'tc_get_setting_map', $get_setting );
/*-----------------------------------------------------------------------------------------------------
NAVIGATION SECTION
------------------------------------------------------------------------------------------------------*/
$navigation_option_map = array(
'menu_button' => array(
'setting_type' => null,
'control' => 'TC_controls' ,
'section' => 'nav' ,
'type' => 'button' ,
'link' => 'nav-menus.php' ,
'buttontext' => __( 'Manage menus' , 'customizr' ),
),
//The hover menu type has been introduced in v3.1.0.
//For users already using the theme (no theme's option set), the default choice is click, for new users, it is hover.
'tc_theme_options[tc_menu_type]' => array(
'default' => ( false == get_option('tc_theme_options') ) ? 'hover' : 'click' ,
'label' => __( 'Select a submenu expansion option' , 'customizr' ),
'section' => 'nav' ,
'type' => 'select' ,
'choices' => array(
'click' => __( 'Expand submenus on click' , 'customizr'),
'hover' => __( 'Expand submenus on hover' , 'customizr' ),
),
),
); //end of navigation options
$navigation_option_map = apply_filters( 'tc_navigation_option_map', $navigation_option_map , $get_default );
/*-----------------------------------------------------------------------------------------------------
SKIN SECTION
------------------------------------------------------------------------------------------------------*/
$skin_option_map = array(
//skin select
'tc_theme_options[tc_skin]' => array(
'default' => 'blue.css' ,
'label' => __( 'Choose a predefined skin' , 'customizr' ),
'section' => 'tc_skins_settings' ,
'type' => 'select' ,
'choices' => $this -> tc_skin_choices()
),
'tc_theme_options[tc_minified_skin]' => array(
'default' => 1,
'control' => 'TC_controls' ,
'label' => __( "Performance : use the minified CSS stylesheet", 'customizr' ),
'section' => 'tc_skins_settings' ,
'type' => 'checkbox' ,
'notice' => __( 'Using the minified version of the skin stylesheet will speed up your webpage load time.' , 'customizr' ),
),
//enable/disable top border
'tc_theme_options[tc_top_border]' => array(
'default' => 1,//top border on by default
'label' => __( 'Display top border' , 'customizr' ),
'control' => 'TC_controls' ,
'section' => 'tc_skins_settings' ,
'type' => 'checkbox' ,
'notice' => __( 'Uncheck this option to remove the colored top border.' , 'customizr' ),
)
);//end of skin options
apply_filters( 'tc_skin_option_map', $skin_option_map, $get_default );
/*-----------------------------------------------------------------------------------------------------
LOGO & FAVICON SECTION
------------------------------------------------------------------------------------------------------*/
$logo_favicon_option_map = array(
//logo upload
'tc_theme_options[tc_logo_upload]' => array(
'control' => 'WP_Customize_Upload_Control' ,
'label' => __( 'Logo Upload (supported formats : .jpg, .png, .gif, svg, svgz)' , 'customizr' ),
'section' => 'tc_logo_settings' ,
'sanitize_callback' => array( $this , 'tc_sanitize_uploads' ),
),
//force logo resize 250 * 85
'tc_theme_options[tc_logo_resize]' => array(
'default' => 1,
'label' => __( 'Force logo dimensions to max-width:250px and max-height:100px' , 'customizr' ),
'control' => 'TC_controls' ,
'section' => 'tc_logo_settings' ,
'type' => 'checkbox' ,
),
//hr
'hr_logo' => array(
'control' => 'TC_controls' ,
'section' => 'tc_logo_settings' ,
'type' => 'hr' ,
),
//favicon
'tc_theme_options[tc_fav_upload]' => array(
'control' => 'WP_Customize_Upload_Control' ,
'label' => __( 'Favicon Upload (supported formats : .ico, .png, .gif)' , 'customizr' ),
'section' => 'tc_logo_settings' ,
'sanitize_callback' => array( $this , 'tc_sanitize_uploads' ),
)
);
$logo_favicon_option_map = apply_filters( 'tc_logo_favicon_option_map', $logo_favicon_option_map , $get_default );
/*-----------------------------------------------------------------------------------------------------
FRONT PAGE SETTINGS
------------------------------------------------------------------------------------------------------*/
$front_page_option_map = array(
//title
'homecontent_title' => array(
'setting_type' => null,
'control' => 'TC_controls' ,
'title' => __( 'Choose content and layout' , 'customizr' ),
'section' => 'tc_frontpage_settings' ,
'type' => 'title' ,
'priority' => 0,
),
//show on front
'show_on_front' => array(
'label' => __( 'Front page displays' , 'customizr' ),
'section' => 'tc_frontpage_settings' ,
'type' => 'select' ,
'priority' => 1,
'choices' => array(
'nothing' => __( 'Don\'t show any posts or page' , 'customizr'),
'posts' => __( 'Your latest posts' , 'customizr'),
'page' => __( 'A static page' , 'customizr' ),
),
),
//page on front
'page_on_front' => array(
'label' => __( 'Front page' , 'customizr' ),
'section' => 'tc_frontpage_settings' ,
'type' => 'dropdown-pages' ,
'priority' => 1,
),
//page for posts
'page_for_posts' => array(
'label' => __( 'Posts page' , 'customizr' ),
'section' => 'tc_frontpage_settings' ,
'type' => 'dropdown-pages' ,
'priority' => 1,
),
//layout
'tc_theme_options[tc_front_layout]' => array(
'default' => 'f' ,//Default layout for home page is full width
'label' => __( 'Set up the front page layout' , 'customizr' ),
'section' => 'tc_frontpage_settings' ,
'type' => 'select' ,
'choices' => $this -> tc_layout_choices(),
'priority' => 2,
),
//select slider
'tc_theme_options[tc_front_slider]' => array(
'default' => 'demo' ,
'control' => 'TC_controls' ,
'title' => __( 'Slider options' , 'customizr' ),
'label' => __( 'Select front page slider' , 'customizr' ),
'section' => 'tc_frontpage_settings' ,
'type' => 'select' ,
//!important
'choices' => ($get_default == true) ? null : $this -> tc_slider_choices(),
'priority' => 20
),
//select slider
'tc_theme_options[tc_slider_width]' => array(
'default' => 1,
'control' => 'TC_controls' ,
'label' => __( 'Full width slider' , 'customizr' ),
'section' => 'tc_frontpage_settings' ,
'type' => 'checkbox' ,
'priority' => 30,
),
//Delay between each slides
'tc_theme_options[tc_slider_delay]' => array(
'default' => 5000,
'sanitize_callback' => array( $this , 'tc_sanitize_number' ),
'control' => 'TC_controls' ,
'label' => __( 'Delay between each slides' , 'customizr' ),
'section' => 'tc_frontpage_settings' ,
'type' => 'number' ,
'step' => 500,
'min' => 1000,
'notice' => __( 'in ms : 1000ms = 1s' , 'customizr' ),
'priority' => 50,
),
//Front page widget area
'tc_theme_options[tc_show_featured_pages]' => array(
'default' => 1,
'control' => 'TC_controls' ,
'title' => __( 'Featured pages options' , 'customizr' ),
'label' => __( 'Display home featured pages area' , 'customizr' ),
'section' => 'tc_frontpage_settings' ,
'type' => 'select' ,
'choices' => array(
1 => __( 'Enable' , 'customizr' ),
0 => __( 'Disable' , 'customizr' ),
),
'priority' => 55,
),
//display featured page images
'tc_theme_options[tc_show_featured_pages_img]' => array(
'default' => 1,
'control' => 'TC_controls' ,
'label' => __( 'Show images' , 'customizr' ),
'section' => 'tc_frontpage_settings' ,
'type' => 'checkbox' ,
'notice' => __( 'The images are set with the "featured image" of each pages (in the page edit screen). Uncheck the option above to disable the featured page images.' , 'customizr' ),
'priority' => 60,
),
//display featured page images
'tc_theme_options[tc_featured_page_button_text]' => array(
'default' => __( 'Read more »' , 'customizr' ),
'transport' => 'postMessage',
'label' => __( 'Button text' , 'customizr' ),
'section' => 'tc_frontpage_settings' ,
'type' => 'text' ,
'priority' => 65,
)
);//end of front_page_options
$front_page_option_map = array_merge( $front_page_option_map , $this -> tc_generates_featured_pages() );
$front_page_option_map = apply_filters( 'tc_front_page_option_map', $front_page_option_map , $get_default );
/*-----------------------------------------------------------------------------------------------------
SITE LAYOUT
------------------------------------------------------------------------------------------------------*/
$layout_option_map = array(
//Breadcrumb
'tc_theme_options[tc_breadcrumb]' => array(
'default' => 1,//Breadcrumb is checked by default
'label' => __( 'Display Breadcrumb' , 'customizr' ),
'control' => 'TC_controls' ,
'section' => 'tc_layout_settings' ,
'type' => 'checkbox' ,
'priority' => 1,
),
//Global sidebar layout
'tc_theme_options[tc_sidebar_global_layout]' => array(
'default' => 'l' ,//Default sidebar layout is on the left
'label' => __( 'Choose the global default layout' , 'customizr' ),
'section' => 'tc_layout_settings' ,
'type' => 'select' ,
'choices' => $this -> tc_layout_choices(),
'priority' => 2,
),
//force default layout on every posts
'tc_theme_options[tc_sidebar_force_layout]' => array(
'default' => 0,
'control' => 'TC_controls' ,
'label' => __( 'Force default layout everywhere' , 'customizr' ),
'section' => 'tc_layout_settings' ,
'type' => 'checkbox' ,
'notice' => __( 'This option will override the specific layouts on all posts/pages, including the front page.' , 'customizr' ),
'priority' => 3,
),
//Post sidebar layout
'tc_theme_options[tc_sidebar_post_layout]' => array(
'default' => 'l' ,//Default sidebar layout is on the left
'label' => __( 'Choose the posts default layout' , 'customizr' ),
'section' => 'tc_layout_settings' ,
'type' => 'select' ,
'choices' => $this -> tc_layout_choices(),
'priority' => 4,
),
//Post per page
'posts_per_page' => array(
'default' => get_option( 'posts_per_page' ),
'sanitize_callback' => array( $this , 'tc_sanitize_number' ),
'control' => 'TC_controls' ,
'label' => __( 'Maximum number of posts per page' , 'customizr' ),
'section' => 'tc_layout_settings' ,
'type' => 'number' ,
'step' => 1,
'min' => 1,
//'priority' => 8,
),
//Post list length
'tc_theme_options[tc_post_list_length]' => array(
'default' => 'excerpt',
'label' => __( 'Select the length of posts in lists (home, search, archives, ...)' , 'customizr' ),
'section' => 'tc_layout_settings' ,
'type' => 'select' ,
'choices' => array(
'excerpt' => __( 'Display the excerpt' , 'customizr' ),
'full' => __( 'Display the full content' , 'customizr' )
)
//'priority' => 6,
),
//Page sidebar layout
'tc_theme_options[tc_sidebar_page_layout]' => array(
'default' => 'l' ,//Default sidebar layout is on the left
'label' => __( 'Choose the pages default layout' , 'customizr' ),
'section' => 'tc_layout_settings' ,
'type' => 'select' ,
'choices' => $this -> tc_layout_choices(),
//'priority' => 6,
),
);//end of layout_options
$layout_option_map = apply_filters( 'tc_layout_option_map', $layout_option_map , $get_default);
/*-----------------------------------------------------------------------------------------------------
COMMENTS SETTINGS
------------------------------------------------------------------------------------------------------*/
$comment_option_map = array(
'tc_theme_options[tc_page_comments]' => array(
'default' => 0,
'control' => 'TC_controls' ,
'label' => __( 'Enable comments on pages' , 'customizr' ),
'section' => 'tc_page_comments' ,
'type' => 'checkbox' ,
'notice' => __( 'This option will enable comments on pages. You can disable comments for a single page in the quick edit mode of the page list screen.' , 'customizr' ),
)
);
$comment_option_map = apply_filters( 'tc_comment_option_map', $comment_option_map , $get_default );
/*-----------------------------------------------------------------------------------------------------
SOCIAL POSITIONS AND NETWORKS
------------------------------------------------------------------------------------------------------*/
$social_layout_map = array(
//Position checkboxes
'tc_theme_options[tc_social_in_header]' => array(
'default' => 1,
'label' => __( 'Social links in header' , 'customizr' ),
'control' => 'TC_controls' ,
'section' => 'tc_social_settings' ,
'type' => 'checkbox' ,
'priority' => 10
),
'tc_theme_options[tc_social_in_left-sidebar]' => array(
'default' => 0,
'label' => __( 'Social links in left sidebar' , 'customizr' ),
'control' => 'TC_controls' ,
'section' => 'tc_social_settings' ,
'type' => 'checkbox' ,
'priority' => 20
),
'tc_theme_options[tc_social_in_right-sidebar]' => array(
'default' => 0,
'label' => __( 'Social links in right sidebar' , 'customizr' ),
'control' => 'TC_controls' ,
'section' => 'tc_social_settings' ,
'type' => 'checkbox' ,
'priority' => 30
),
'tc_theme_options[tc_social_in_footer]' => array(
'default' => 1,
'label' => __( 'Social links in footer' , 'customizr' ),
'control' => 'TC_controls' ,
'section' => 'tc_social_settings' ,
'type' => 'checkbox' ,
'priority' => 40
)
);//end of social layout map
$social_option_map = array_merge( $social_layout_map , $this -> tc_generates_socials() );
$social_option_map = apply_filters( 'tc_social_option_map', $social_option_map, $get_default );
/*-----------------------------------------------------------------------------------------------------
IMAGE SETTINGS
------------------------------------------------------------------------------------------------------*/
$images_option_map = array(
'tc_theme_options[tc_fancybox]' => array(
'default' => 1,
'control' => 'TC_controls' ,
'label' => __( 'Enable/disable lightbox effect on images' , 'customizr' ),
'section' => 'tc_image_settings' ,
'type' => 'checkbox' ,
'notice' => __( 'If enabled, this option activate a popin window whith a zoom effect when an image is clicked. This will not apply to image gallery.' , 'customizr' ),
),
'tc_theme_options[tc_fancybox_autoscale]' => array(
'default' => 1,
'control' => 'TC_controls' ,
'label' => __( 'Autoscale images on zoom' , 'customizr' ),
'section' => 'tc_image_settings' ,
'type' => 'checkbox' ,
'notice' => __( 'If enabled, this option will force images to fit the screen on lightbox zoom.' , 'customizr' ),
),
'tc_theme_options[tc_retina_support]' => array(
'default' => 1,
'control' => 'TC_controls' ,
'label' => __( 'Enable/disable retina support' , 'customizr' ),
'section' => 'tc_image_settings' ,
'type' => 'checkbox' ,
'notice' => __( 'If enabled, your website will include support for high resolution devices.' , 'customizr' ),
)
);//end of images options
$images_option_map = apply_filters( 'tc_images_option_map', $images_option_map , $get_default );
/*-----------------------------------------------------------------------------------------------------
LINKS SETTINGS
------------------------------------------------------------------------------------------------------*/
$links_option_map = array(
'tc_theme_options[tc_link_scroll]' => array(
'default' => 0,
'control' => 'TC_controls' ,
'label' => __( 'Enable/disable smooth scroll on click' , 'customizr' ),
'section' => 'tc_links_settings' ,
'type' => 'checkbox' ,
'notice' => __( 'If enabled, this option activates a smooth page scroll when clicking on a link to an anchor of the same page.' , 'customizr' ),
)
);//end of links options
$links_option_map = apply_filters( 'tc_links_option_map', $links_option_map , $get_default );
/*-----------------------------------------------------------------------------------------------------
RESPONSIVE SETTINGS
------------------------------------------------------------------------------------------------------*/
$responsive_option_map = array(
'tc_theme_options[tc_block_reorder]' => array(
'default' => 1,
'control' => 'TC_controls' ,
'label' => __( 'Enable/disable blocks reordering on small devices' , 'customizr' ),
'section' => 'tc_responsive' ,
'type' => 'checkbox' ,
'notice' => __( 'On responsive mode, for smartphone viewport, the sidebars are moved after the main content block.' , 'customizr' ),
),
'tc_theme_options[tc_center_slides]' => array(
'default' => 1,
'control' => 'TC_controls' ,
'label' => __( "Enable/disable slider's slides centering on any devices" , "customizr" ),
'section' => 'tc_responsive' ,
'type' => 'checkbox' ,
'notice' => __( 'This option centers your slider (carousel) pictures vertically and horizontally on any devices when displayed in full width mode' , 'customizr' ),
)
);//end of links options
$responsive_option_map = apply_filters( 'tc_responsive_option_map', $responsive_option_map , $get_default );
/*-----------------------------------------------------------------------------------------------------
CUSTOM CSS
------------------------------------------------------------------------------------------------------*/
$custom_css_option_map = array(
'tc_theme_options[tc_custom_css]' => array(
'sanitize_callback' => array( $this , 'tc_sanitize_textarea' ),
'control' => 'TC_controls' ,
'label' => __( 'Add your custom css here and design live! (for advanced users)' , 'customizr' ),
'section' => 'tc_custom_css' ,
'type' => 'textarea' ,
'notice' => __( 'Always use this field to add your custom css instead of editing directly the style.css file : it will not be deleted during theme updates. You can also paste your custom css in the style.css file of a child theme.' , 'customizr' )
)
);//end of custom_css_options
$custom_css_option_map = apply_filters( 'tc_custom_css_option_map', $custom_css_option_map , $get_default );
$add_setting_control = array(
'add_setting_control' => array_merge(
$navigation_option_map,
$skin_option_map,
$logo_favicon_option_map,
$front_page_option_map,
$layout_option_map,
$comment_option_map,
$social_option_map,
$images_option_map,
$links_option_map,
$responsive_option_map,
$custom_css_option_map,
apply_filters( 'tc_custom_setting_control', array() )
)
);
$add_setting_control = apply_filters( 'tc_add_setting_control_map', $add_setting_control );
//merges all customizer arrays
$customizer_map = array_merge( $remove_section , $add_section , $get_setting , $add_setting_control );
return apply_filters( 'tc_customizer_map', $customizer_map );
}//end of tc_customizer_map function
/**
* adds sanitization callback funtion : textarea
* @package Customizr
* @since Customizr 1.1.4
*/
function tc_sanitize_textarea( $value) {
$value = esc_html( $value);
return $value;
}
/**
* adds sanitization callback funtion : number
* @package Customizr
* @since Customizr 1.1.4
*/
function tc_sanitize_number( $value) {
$value = esc_attr( $value); // clean input
$value = (int) $value; // Force the value into integer type.
return ( 0 < $value ) ? $value : null;
}
/**
* adds sanitization callback funtion : url
* @package Customizr
* @since Customizr 1.1.4
*/
function tc_sanitize_url( $value) {
$value = esc_url( $value);
return $value;
}
/**
* adds sanitization callback funtion : colors
* @package Customizr
* @since Customizr 1.1.4
*/
function tc_sanitize_hex_color( $color ) {
if ( $unhashed = sanitize_hex_color_no_hash( $color ) )
return '#' . $unhashed;
return $color;
}
/**
* Change upload's path to relative instead of absolute
* @package Customizr
* @since Customizr 3.1.11
*/
function tc_sanitize_uploads( $url ) {
$upload_dir = wp_upload_dir();
return str_replace($upload_dir['baseurl'], '', $url);
}
}//end of class
endif;