$control[ 'class' ],
'sanitize' => isset( $control[ 'sanitize' ] ) ? $control[ 'sanitize' ] : false,
'register_control_type' => isset( $control[ 'register_control_type' ] ) ? $control[ 'register_control_type' ] : true
);
}
}
/**
* Add custom sections to its array
*
* @static
* @access public
* @since 1.0.0
* @return object
*
* @package BizSmart WordPress Theme
*/
public static function add_custom_section( $section ){
if( !is_array( $section ) ){
$err = esc_html__( 'Invalid argument passed for Custom Section. Must be an array with "type" & "class" key.', 'bizsmart' );
self::add_error( $err );
return;
}
$flag = true;
if( !isset( $section[ 'type' ] ) ){
$err = esc_html__( 'Custom Section must contain "type" key ( type of section ).', 'bizsmart' );
self::add_error( $err );
$flag = false;
}
if( !isset( $section[ 'class' ] ) ){
$err = esc_html__( 'Custom Section must contain "class" key ( name of section class ).', 'bizsmart' );
self::add_error( $err );
$flag = false;
}
if( $flag ){
self::$custom_sections[ $section[ 'type' ] ] = array(
'class' => $section[ 'class' ]
);
}
}
/**
* The Setter function
*
* @static
* @access public
* @since 1.0.0
* @return object
*
* @package BizSmart WordPress Theme
*/
public static function set( $args ){
do_action( self::fn_prefix( 'customizer_before_set' ), self::get_instance() );
self::validate_argument( $args );
if( count( self::$errors ) > 0 ){
return;
}
$panel_id = false;
if( isset( $args[ 'panel' ] ) ){
$panel = $args[ 'panel' ];
# adds prefix to the panel id
if( is_array( $panel ) ){
if( isset( $panel[ 'prefix' ] ) && $panel[ 'prefix' ] === false ){
$panel_id = $panel[ 'id' ];
}else{
$panel_id = self::with_prefix( $panel[ 'id' ] );
}
}else{
$panel_id = self::with_prefix( $panel );
}
if( is_array( $panel ) && !array_key_exists( $panel_id, self::$panels ) ){
self::$panels[ $panel_id ] = self::get_panel_arg( $panel );
}
}
# adds prefix to the section id
$prefix_on_section = true;
if( isset( $args[ 'section' ][ 'prefix' ] ) ){
$prefix_on_section = $args[ 'section' ][ 'prefix' ];
}
if( $prefix_on_section ){
$section_id = self::with_prefix( $args[ 'section' ][ 'id' ] );
}else{
$section_id = $args[ 'section' ][ 'id' ];
}
if( !in_array( $section_id, self::$default_sections ) ){
self::$sections[ $section_id ] = self::get_section_arg( $panel_id, $args[ 'section' ] );
}
if( isset( $args[ 'fields' ] ) ){
foreach( $args[ 'fields' ] as $field ){
if( isset( $field[ 'id' ] ) ){
$field_id = self::with_prefix( $field[ 'id' ] );
# Store it for future
# This variable might be useful for custom controls
self::$fields[ $field[ 'type' ] ][] = $field;
if( array_key_exists( $field_id, self::$settings ) ){
/* translators: %s: name of field id that user feed */
$msg = sprintf( esc_html__( 'Field with ID: %s already exists.', 'bizsmart' ), $field[ 'id' ] );
self::add_error( $msg );
}
if( isset( $field[ 'default' ] ) ){
self::$defaults[ $field_id ] = $field[ 'default' ];
}
$field[ 'id' ] = $field_id;
self::$settings[ $field_id ] = self::get_setting_arg( $field );
self::$controls[ $field_id ] = self::get_control_arg( $args[ 'section' ], $field, $prefix_on_section );
if( 'color' == $field[ 'type' ] ){
self::$color_picker = true;
}
if( isset( $field[ 'partial' ] ) ){
self::$partials[ $field_id ] = self::get_partial_arg( $field[ 'partial' ] );
}
}
}
}
do_action( self::fn_prefix( 'customizer_after_set' ), self::get_instance() );
}
/**
* Checks wheather the arguments are eligible for customizer
*
* Adds error if invalid arguments
* @static
* @access private
* @param arrau
* @since 1.0.0
* @return void
*
* @package BizSmart WordPress Theme
*/
private static function validate_argument( $args ){
if( !is_array( $args ) ){
$msg = esc_html__( 'You must pass array as an argument in set method.', 'bizsmart' );
self::add_error( $msg, 2 );
return;
}
if( !isset( $args[ 'section' ] ) ){
$msg = esc_html__( 'No section found.', 'bizsmart' );
self::add_error( $msg, 2 );
return;
}
if( !is_array( $args[ 'section' ] ) ){
$msg = sprintf(
'%s %s. %s',
esc_html__( 'Invalid argument', 'bizsmart' ),
esc_html__( 'section', 'bizsmart' ),
esc_html__( 'Must be a an array with atleast an id, title...', 'bizsmart' )
);
self::add_error( $msg, 2 );
}elseif( !isset( $args[ 'section' ][ 'id' ] ) ){
$msg = esc_html__( 'Section id is missing.', 'bizsmart' );
self::add_error( $msg, 2 );
}
if( isset( $args[ 'fields' ] ) && !is_array( $args[ 'fields' ] ) ){
$msg = sprintf(
'%s %s. %s',
esc_html__( 'Invalid argument', 'bizsmart' ),
esc_html__( 'fields', 'bizsmart' ),
esc_html__( 'Must be a an array', 'bizsmart' )
);
self::add_error( $msg );
}
}
/**
* Adds Errors in a static variable
*
* @static
* @access private
* @param string
* @since 1.0.0
* @return void
*
* @package BizSmart WordPress Theme
*/
public static function add_error( $msg, $n = 1 ){
$trace = debug_backtrace();
$msg = sprintf( '%s
%s
', $msg, $trace[ $n ][ 'file' ] . ' ' . $trace[ $n ][ 'line' ] );
self::$errors[] =$msg;
}
/**
* Adds values in the buffer
*
* @static
* @access public
* @param string
* @since 1.0.0
* @return void
*
* @package BizSmart WordPress Theme
*/
public static function add_buffer( $key, $val ){
self::$buffer[ $key ] = $val;
}
/**
* Retrieve value from buffer
*
* @static
* @access public
* @param string
* @since 1.0.0
* @return void
*
* @package BizSmart WordPress Theme
*/
public static function get_buffer( $key, $default = false ){
return isset( self::$buffer[ $key ] ) ? self::$buffer[ $key ] : $default;
}
/**
* Print errors in dashboard
*
* @static
* @access public
* @since 1.0.0
* @param boolean
* @return void
*
* @package BizSmart WordPress Theme
*/
public static function errors( $get = false ){
if( count( self::$errors ) > 0 ){
if( $get )
ob_start();
?>
$value ): ?>
%s %s',
esc_html__( 'BizSmart Customizer:', 'bizsmart' ),
esc_html( $value )
);
?>
default );
}
/**
* Sanitization function for blank.
*
* @access public
* @since 1.0.0
* @return number
*
* @package BizSmart WordPress Theme
*/
public static function sanitize_number_blank( $val ){
return is_numeric( $val ) ? $val : '';
}
/**
* Sanitization function for checkbox.
*
* @access public
* @since 1.0.0
* @return boolean
*
* @package BizSmart WordPress Theme
*/
public static function sanitize_checkbox( $checked ) {
return ( ( isset( $checked ) && true === $checked ) ? true : false );
}
/**
* Sanitization function for select.
*
* @access public
* @since 1.0.0
* @return string
*
* @package BizSmart WordPress Theme
*/
public static function sanitize_choice( $input, $setting ){
# Ensure input is a slug.
$input = sanitize_key( $input );
# Get list of choices from the control associated with the setting.
$choices = $setting->manager->get_control( $setting->id )->choices;
# If the input is a valid key, return it; otherwise, return the default.
return ( array_key_exists( $input, $choices ) ? $input : $setting->default );
}
/**
* Sanitization function for hex color.
*
* @access public
* @since 1.0.0
* @return string
*
* @package BizSmart WordPress Theme
*/
public static function sanitize_hex_color( $input, $setting ){ # Ensure input is a slug.
$input = sanitize_hex_color( $input );
# If $input is a valid hex value, return it; otherwise, return the default.
$return = !is_null( $input ) ? $input : $setting->default;
return $return;
}
/**
* Sanitization function for rgba.
*
* @access public
* @param string $color
* @since 1.0.0
* @return string
*
* @package BizSmart WordPress Theme
*/
public static function sanitize_rgba( $color ) {
if ( '' === $color ){
return '';
}
# If string does not start with 'rgba', then treat as hex
# sanitize the hex color and finally convert hex to rgba
if ( false === strpos( $color, 'rgba' ) ) {
return sanitize_hex_color( $color );
}
# By now we know the string is formatted as an rgba color so we need to further sanitize it.
$color = str_replace( ' ', '', $color );
sscanf( $color, 'rgba(%d,%d,%d,%f)', $red, $green, $blue, $alpha );
return 'rgba('.$red.','.$green.','.$blue.','.$alpha.')';
}
/**
* Retrives value by id
*
* @access public
* @param string $id
* @return string | false
* @since 1.0.0
*
* @package BizSmart WordPress Theme
*/
public static function get( $id ){
$defaults = self::get_defaults();
if( isset( $defaults[ $id ] ) ){
$default = $defaults[ $id ];
}else{
$default = false;
}
$v = get_theme_mod( $id, $default );;
return apply_filters( self::fn_prefix( 'customizer_get' ), $v, $id, self::$instance );
}
/**
* Returns Sanitization function
*
* @since 1.0.0
* @access private
* @param string $type
* @return string
*
* @package BizSmart WordPress Theme
*/
private static function get_sanitize_callback( $type ){
$fn = '';
switch ( $type ) {
case 'text':
$fn = 'sanitize_text_field';
break;
case 'url':
$fn = 'esc_url_raw';
break;
case 'email':
$fn = 'sanitize_email';
break;
case 'number':
$fn = array( __CLASS__ , 'sanitize_number' );
break;
case 'checkbox':
$fn = array( __CLASS__ , 'sanitize_checkbox' );
break;
case 'select':
case 'radio':
$fn = array( __CLASS__ , 'sanitize_choice' );
break;
case 'textarea':
$fn = 'esc_textarea';
break;
case 'color':
$fn = array( __CLASS__ , 'sanitize_hex_color' );
break;
case 'dropdown-pages':
$fn = 'absint';
break;
default:
if( array_key_exists( $type, self::$custom_controls ) ){
$sanitize_callback = self::$custom_controls[ $type ][ 'sanitize' ];
if( $sanitize_callback ){
$fn = $sanitize_callback;
}
}
break;
}
return apply_filters( self::fn_prefix( 'customizer_sanitizer' ), $fn, $type );
}
/**
* Returns args for panels
*
* @since 1.0.0
* @access private
* @param array $panel
* @return array
*
* @package BizSmart WordPress Theme
*/
private static function get_panel_arg( $panel ){
$args = array(
'title' => empty( $panel[ 'title' ] ) ?
esc_html__( 'No Title Specified.', 'bizsmart' ) :
$panel['title'],
);
if( isset( $panel[ 'description' ] ) ){
$args[ 'description' ] = $panel[ 'description' ];
}
if( isset( $panel[ 'priority' ] ) ){
$args[ 'priority' ] = $panel[ 'priority' ];
}
if( isset( $panel[ 'active_callback' ] ) ) {
$args[ 'active_callback' ] = $panel[ 'active_callback' ];
}
if( isset( $panel[ 'theme_supports' ] ) ) {
$args[ 'theme_supports' ] = $panel[ 'theme_supports' ];
}
if( isset( $panel[ 'capability' ] ) ) {
$args[ 'capability' ] = $panel[ 'capability' ];
}
return apply_filters( self::fn_prefix( 'customizer_get_panel_arg' ), $args, $panel );
}
/**
* Returns args for settings
*
* @since 1.0.0
* @access public
* @param array $field
* @return array
*
* @package BizSmart WordPress Theme
*/
public static function get_setting_arg( $field ){
$args = array();
if( isset( self::$defaults[ $field[ 'id' ] ] ) )
$args[ 'default' ] = self::$defaults[ $field[ 'id' ] ];
else
$args[ 'default' ] = '';
if( isset( $field[ 'setting_type' ] ) || !empty( $field[ 'setting_type' ] ) ){
$args[ 'type' ] = $field[ 'setting_type' ];
}
if( isset( $field[ 'capability' ] ) && !empty( $field[ 'capability' ] ) ){
$args[ 'capability' ] = $field[ 'capability' ];
}
if( isset( $field[ 'theme_supports' ] ) && !empty( $field[ 'theme_supports' ] ) ){
$args[ 'theme_supports' ] = $field[ 'theme_supports' ];
}
if( isset($field['partial']) && isset( $field['partial']['selector'] ) ){
$args[ 'transport' ] = 'postMessage' ;
}elseif( isset( $field[ 'transport' ] ) || !empty( $field[ 'transport' ] ) ) {
$args[ 'transport' ] = $field[ 'transport' ];
}
if( isset( $field[ 'sanitize_callback' ] ) && !empty( $field[ 'sanitize_callback' ] ) ){
$args[ 'sanitize_callback' ] = $field[ 'sanitize_callback' ];
}else{
$args[ 'sanitize_callback' ] = self::get_sanitize_callback( $field[ 'type' ] );
}
if( isset( $field[ 'sanitize_js_callback' ] ) && !empty( $field[ 'sanitize_js_callback' ] ) ){
$args[ 'sanitize_js_callback' ] = $field[ 'sanitize_js_callback' ];
}
return apply_filters( self::fn_prefix( 'customizer_get_setting_arg' ), $args, $field );
}
/**
* Returns args for control
*
* @since 1.0.0
* @access private
* @param array $panel
* @param array $field
* @return array
*
* @package BizSmart WordPress Theme
*/
private static function get_control_arg( $section, $field, $prefix_on_section = true ){
$args = array();
if( isset( $field[ 'type' ] ) && !empty( $field[ 'type' ] ) ){
$args[ 'type' ] = $field[ 'type' ];
}
if( isset( $field[ 'label' ] ) && !empty( $field[ 'label' ] ) ){
$args[ 'label' ] = $field[ 'label' ];
}
if( isset( $field[ 'description' ] ) && !empty( $field[ 'description' ] ) ){
$args[ 'description' ] = $field[ 'description' ];
}
if( is_array( $section ) && isset( $section[ 'id' ] ) ){
$args[ 'section' ] = $prefix_on_section ? self::with_prefix( $section[ 'id' ] ) : $section[ 'id' ];
}
if( isset( $field[ 'priority' ] ) && !empty( $field[ 'priority' ] ) ){
$args[ 'priority' ] = $field[ 'priority' ];
}
if( isset( $field[ 'active_callback' ] ) ) {
$acb = $field[ 'active_callback' ];
if( is_array( $acb ) ){
$args[ 'active_callback' ] = $acb;
}else{
$args[ 'active_callback' ] = self::fn_prefix( $acb );
}
}
if( isset( $field[ 'settings' ] ) && !empty( $field[ 'settings' ] ) ){
$args[ 'settings' ] = $field[ 'settings' ];
}
if( isset( $field[ 'choices' ] ) && is_array( $field[ 'choices' ] ) ){
$args[ 'choices' ] = $field[ 'choices' ];
}
if( isset( $field[ 'height' ] ) && !empty( $field[ 'height' ] ) ){
$args[ 'height' ] = $field[ 'height' ];
}
if( isset( $field[ 'width' ] ) && !empty( $field[ 'width' ] ) ){
$args[ 'width' ] = $field[ 'width' ];
}
if( isset( $field[ 'input_attrs' ] ) && !empty( $field[ 'input_attrs' ] ) ){
$args[ 'input_attrs' ] = $field[ 'input_attrs' ];
}
return apply_filters( self::fn_prefix( 'customizer_get_control_arg' ), $args, $section, $field );
}
/**
* Returns args for partials
*
* @since 1.0.0
* @access private
* @param array $partial
* @return array
*
* @package BizSmart WordPress Theme
*/
private static function get_partial_arg( $partial ){
$args = array();
if( isset( $partial[ 'type' ] ) && !empty( $partial[ 'type' ] ) ){
$args[ 'type' ] = $partial[ 'type' ];
}
if( isset( $partial[ 'selector' ] ) && !empty( $partial[ 'selector' ] ) ){
$args[ 'selector' ] = $partial[ 'selector' ];
}
if( isset( $partial[ 'settings' ] ) && !empty( $partial[ 'settings' ] ) ){
$args[ 'settings' ] = $partial[ 'settings' ];
}
if( isset( $partial[ 'primary_setting' ] ) && !empty( $partial[ 'primary_setting' ] ) ){
$args[ 'primary_setting' ] = $partial[ 'primary_setting' ];
}
if( isset( $partial[ 'capability' ] ) && !empty( $partial[ 'capability' ] ) ){
$args[ 'capability' ] = $partial[ 'capability' ];
}
if( isset( $partial[ 'render_callback' ] ) && !empty( $partial[ 'render_callback' ] ) ){
$args[ 'render_callback' ] = $partial[ 'render_callback' ];
}else{
$args[ 'render_callback' ] = array( self::$instance, 'render_partial' );
}
if( isset( $partial[ 'container_inclusive' ] ) && !empty( $partial[ 'container_inclusive' ] ) ){
$args[ 'container_inclusive' ] = $partial[ 'container_inclusive' ];
}
if( isset( $partial[ 'fallback_refresh' ] ) && !empty( $partial[ 'fallback_refresh' ] ) ){
$args[ 'fallback_refresh' ] = $partial[ 'fallback_refresh' ];
}
return apply_filters( self::fn_prefix( 'customizer_get_partial_arg' ), $args, $partial );
}
/**
* adds Customizer's sections.
*
* @since 1.0.0
* @access private
* @link https://codex.wordpress.org/Class_Reference/WP_Customize_Manager/add_section
* @return void
*
* @package BizSmart WordPress Theme
*/
private static function get_section_arg( $panel_id = false, $section ){
$args = array(
'title' => empty( $section[ 'title' ] ) ? esc_html__( 'No Title Specified.', 'bizsmart' ) : $section[ 'title' ],
);
if( isset( $section[ 'priority' ] ) ){
$args[ 'priority' ] = $section[ 'priority' ];
}
if( isset( $section[ 'section' ] ) ){
$args[ 'section' ] = $section[ 'section' ];
}
if( isset( $section[ 'description' ] ) ){
$args[ 'description' ] = $section[ 'description' ];
}
if( isset( $section[ 'active_callback' ] ) ){
$args[ 'active_callback' ] = $section[ 'active_callback' ];
}
if( isset( $section[ 'type' ] ) ){
$args[ 'type' ] = $section[ 'type' ];
}
if( $panel_id ){
$args[ 'panel' ] = $panel_id;
}
return apply_filters( self::fn_prefix( 'customizer_get_section_arg' ), $args, $panel_id, $section );
}
/**
* Equeue necessary scripts or styles for customizer
*
* @since 1.0.0
* @access public
* @return void
*
* @package BizSmart WordPress Theme
*/
public static function scripts(){
if( self::$color_picker ){
wp_enqueue_style( 'wp-color-picker' );
wp_enqueue_script( 'wp-color-picker');
}
}
/**
* Register panels, sections, controls and settings
*
* @since 1.0.0
* @param object ( $wp_customize )
* @access public
* @return void
*/
public static function register( $wp_customize ){
do_action( self::fn_prefix( 'customize_register_start' ), self::get_instance(), $wp_customize );
if( count( self::$errors ) > 0 ){
if( is_customize_preview() ){
wp_die( self::errors( true ) );
}
return;
}
add_action( 'admin_enqueue_scripts', array( self::get_instance(), 'scripts' ) );
foreach( self::$custom_controls as $type => $args ){
if( $args[ 'register_control_type' ] === true ){
$wp_customize->register_control_type( $args[ 'class' ] );
}
}
foreach( self::$panels as $id => $args ){
$wp_customize->add_panel( $id, $args );
}
foreach( self::$sections as $id => $args ){
if( isset( $args['type'] ) && isset( self::$custom_sections[ $args['type'] ] ) ){
$class = self::$custom_sections[ $args['type'] ][ 'class' ];
$type = $args[ 'type' ];
unset( $args[ 'type' ] );
$wp_customize->add_section( new $class( $wp_customize, $id, $args ) );
}else{
$wp_customize->add_section( $id, $args );
}
}
foreach( self::$settings as $id => $args ){
$wp_customize->add_setting(
$id , array_merge( $args, array( 'sanitize_callback', $args[ 'sanitize_callback' ] ) )
);
if( isset( self::$controls[ $id ] ) ){
$control = self::$controls[ $id ];
self::add_control( $wp_customize, $id, $control );
}
}
foreach( self::$partials as $id => $args ){
$wp_customize->selective_refresh->add_partial( $id, $args );
}
do_action( self::fn_prefix( 'customize_register_end' ), self::get_instance(), $wp_customize );
}
public static function add_control( $wp_customize, $id, $control ){
switch( $control[ 'type' ] ){
case 'color':
unset( $control[ 'type' ] );
$wp_customize->add_control( new WP_Customize_Color_Control(
$wp_customize,
$id,
$control
) );
break;
case 'file':
unset( $control[ 'type' ] );
$wp_customize->add_control( new WP_Customize_Upload_Control(
$wp_customize,
$id,
$control
) );
break;
case 'image':
$wp_customize->add_control( new WP_Customize_Image_Control(
$wp_customize,
$id,
$control
) );
break;
default:
if( array_key_exists( $control[ 'type' ], self::$custom_controls ) ){
$class = self::$custom_controls[ $control[ 'type' ] ][ 'class' ];
unset( $control[ 'type' ] );
$wp_customize->add_control( new $class( $wp_customize, $id, $control ) );
}else{
$wp_customize->add_control( $id, $control );
}
break;
}
}
/**
* Callback function of selective refresh.
*
* @since 1.0.0
* @param object ( $object )
* @access public
* @return string
*
* @package BizSmart WordPress Theme
*/
public static function render_partial( $object ){
echo esc_html( self::get( $object->id ) );
}
}
}
add_action( 'customize_register', array( BizSmart_Customizer::get_instance(), 'register' ) );
if( !function_exists( 'bizsmart_get' ) ):
/**
* Retrieve customizer option
*
* @param string ( $id )
* @return string
* @since 1.0.0
*
* @package BizSmart WordPress Theme
*/
function bizsmart_get( $id ){
$id = BizSmart_Helper::with_prefix( $id );
return BizSmart_Customizer::get( $id );
}
endif;