<?php /** * Tmpcoder Customizer Controls */ if ( class_exists( 'WP_Customize_Control' ) ) { /** * WPColorPicker Alpha Color Picker Custom Control */ class Tmpcoder_Alpha_Color_Control extends WP_Customize_Control { /** * The type of control being rendered */ public $type = 'wpcolorpicker-alpha-color'; /** * ColorPicker Attributes */ public $attributes = ""; /** * Color palette defaults */ public $defaultPalette = array( '#000000', '#ffffff', '#dd3333', '#dd9933', '#eeee22', '#81d742', '#1e73be', '#8224e3', ); /** * Constructor */ public function __construct( $manager, $id, $args = array(), $options = array() ) { parent::__construct( $manager, $id, $args ); $this->attributes .= 'data-default-color="' . esc_attr( $this->value() ) . '"'; $this->attributes .= 'data-alpha="true"'; $this->attributes .= 'data-alpha-reset="' . ( isset( $this->input_attrs['resetalpha'] ) ? $this->input_attrs['resetalpha'] : 'true' ) . '"'; $this->attributes .= 'data-alpha-custom-width="0"'; $this->attributes .= 'data-alpha-enabled="true"'; } /** * Enqueue our scripts and styles */ public function enqueue() { wp_enqueue_script( 'wp-color-picker-alpha', TMPCODER_CUSTOMIZER_ASSETS . 'js/wp-color-picker-alpha'.tmpcoder_min_suffix().'.js', array( 'wp-color-picker' ), TMPCODER_THEME_CORE_VERSION, true ); wp_enqueue_script( 'tmpcoder-customize-controls', TMPCODER_CUSTOMIZER_ASSETS . 'js/tmpcoder-customizer'.tmpcoder_min_suffix().'.js', array( 'jquery', 'wp-color-picker-alpha' ), TMPCODER_THEME_CORE_VERSION, true ); wp_enqueue_style( 'tmpcoder-customize-controls', TMPCODER_CUSTOMIZER_ASSETS . 'css/tmpcoder-customizer'.tmpcoder_min_suffix().'.css', array(), TMPCODER_THEME_CORE_VERSION, 'all' ); wp_enqueue_style( 'wp-color-picker' ); } /** * Pass our Palette colours to JavaScript */ public function to_json() { parent::to_json(); $this->json['colorpickerpalette'] = isset( $this->input_attrs['palette'] ) ? $this->input_attrs['palette'] : $this->defaultPalette; } /** * Render the control in the customizer */ public function render_content() { ?> <div class="wpcolorpicker_alpha_color_control"> <?php if( !empty( $this->label ) ) { ?> <span class="customize-control-title"><?php echo esc_html( $this->label ); ?></span> <?php } ?> <?php if( !empty( $this->description ) ) { ?> <span class="customize-control-description"><?php echo esc_html( $this->description ); ?></span> <?php } ?> <input type="text" class="wpcolorpicker-alpha-color-picker color-picker" id="<?php echo esc_attr( $this->id ); ?>" name="<?php echo esc_attr( $this->id ); ?>" value="<?php echo esc_attr( $this->value() ); ?>" <?php echo wp_kses_post($this->attributes); ?> <?php $this->link(); ?> /> </div> <?php } } /** * Slider Customize Control */ class Tmpcoder_Slider_Customize_Control extends WP_Customize_Control { /** * The type of control being rendered */ public $type = 'slider_control'; /** * Enqueue our scripts and styles */ public function enqueue() { wp_enqueue_script( 'tmpcoder-customize-controls', TMPCODER_CUSTOMIZER_ASSETS . 'js/tmpcoder-customizer'.tmpcoder_min_suffix().'.js', array( 'jquery', 'jquery-ui-core' ), TMPCODER_THEME_CORE_VERSION, true ); wp_enqueue_style( 'tmpcoder-customize-controls', TMPCODER_CUSTOMIZER_ASSETS . 'css/tmpcoder-customizer'.tmpcoder_min_suffix().'.css', array(), TMPCODER_THEME_CORE_VERSION, 'all' ); } /** * Render the control in the customizer */ public function render_content() { ?> <div class="slider-custom-control"> <span class="customize-control-title"><?php echo esc_html( $this->label ); ?></span><input type="number" id="<?php echo esc_attr( $this->id ); ?>" name="<?php echo esc_attr( $this->id ); ?>" value="<?php echo esc_attr( $this->value() ); ?>" class="customize-control-slider-value" <?php $this->link(); ?> /> <div class="slider" slider-min-value="<?php echo esc_attr( $this->input_attrs['min'] ); ?>" slider-max-value="<?php echo esc_attr( $this->input_attrs['max'] ); ?>" slider-step-value="<?php echo esc_attr( $this->input_attrs['step'] ); ?>"></div><span class="slider-reset dashicons dashicons-image-rotate" slider-reset-value="<?php echo esc_attr( $this->value() ); ?>"></span> </div> <?php } } /** * Image Radio Button Customize Control */ class Tmpcoder_Image_Radio_Button_Customize_Control extends WP_Customize_Control { /** * The type of control being rendered */ public $type = 'image_radio_button'; /** * Enqueue our scripts and styles */ public function enqueue() { wp_enqueue_style( 'tmpcoder-customize-controls', TMPCODER_CUSTOMIZER_ASSETS . 'css/tmpcoder-customizer'.tmpcoder_min_suffix().'.css', array(), TMPCODER_THEME_CORE_VERSION, 'all' ); } /** * Render the control in the customizer */ public function render_content() { ?> <div class="image_radio_button_control"> <?php if( !empty( $this->label ) ) { ?> <span class="customize-control-title"><?php echo esc_html( $this->label ); ?></span> <?php } ?> <?php if( !empty( $this->description ) ) { ?> <span class="customize-control-description"><?php echo esc_html( $this->description ); ?></span> <?php } ?> <?php foreach ( $this->choices as $key => $value ) { ?> <label class="radio-button-label"> <input type="radio" name="<?php echo esc_attr( $this->id ); ?>" value="<?php echo esc_attr( $key ); ?>" <?php $this->link(); ?> <?php checked( esc_attr( $key ), $this->value() ); ?>/> <img src="<?php echo esc_attr( $value['image'] ); ?>" alt="<?php echo esc_attr( $value['name'] ); ?>" title="<?php echo esc_attr( $value['name'] ); ?>" /> </label> <?php } ?> </div> <?php } } /** * Upsell section */ class Tmpcoder_Upsell_Section extends WP_Customize_Section { /** * The type of control being rendered */ public $type = 'tmpcoder-pro'; /** * The Upsell URL */ public $url = ''; /** * The background color for the control */ public $backgroundcolor = ''; /** * The text color for the control */ public $textcolor = ''; /** * Enqueue our scripts and styles */ public function enqueue() { wp_enqueue_script( 'tmpcoder-customize-controls', TMPCODER_CUSTOMIZER_ASSETS . 'js/tmpcoder-customizer'.tmpcoder_min_suffix().'.js', array( 'jquery' ), TMPCODER_THEME_CORE_VERSION, true ); wp_enqueue_style( 'tmpcoder-customize-controls', TMPCODER_CUSTOMIZER_ASSETS . 'css/tmpcoder-customizer'.tmpcoder_min_suffix().'.css', array(), TMPCODER_THEME_CORE_VERSION, 'all' ); } /** * Render the section, and the controls that have been added to it. */ protected function render() { $bkgrndcolor = !empty( $this->backgroundcolor ) ? esc_attr( $this->backgroundcolor ) : '#fff'; $color = !empty( $this->textcolor ) ? esc_attr( $this->textcolor ) : '#5729d9'; ?> <li id="accordion-section-<?php echo esc_attr( $this->id ); ?>" class="tmpcoder_pro_section accordion-section control-section control-section-<?php echo esc_attr( $this->id ); ?> cannot-expand"> <h3 class="tmpcoder-pro-section-title" <?php echo ' style="color:' . esc_html( $color ) . ';border-left-color:' . esc_html( $bkgrndcolor ) .';border-right-color:' . esc_html( $bkgrndcolor ) .';"'; ?>> <a href="<?php echo esc_url( $this->url); ?>" target="_blank"><?php echo esc_html( $this->title ); ?></a> </h3> </li> <?php } } /** * Divider Control */ class Tmpcoder_Divider_Customize_Control extends WP_Customize_Control { /** * The type of control being rendered */ public $type = 'simple_divider'; /** * Define the available widths for the divider */ private $available_divider_widths = array( "default", "full", "half" ); /** * Define the available types of divider */ private $available_divider_types = array( "solid", "dashed", "dotted", "double" ); /** * Define the width of the divider. Either 'default', 'full', or 'half'. Default = 'default' */ private $dividerwidth = 'default'; /** * Define the type of divider line. Either 'solid', 'dashed' or 'dotted'. Default = 'solid' */ private $dividertype = 'solid'; /** * Define size of the top margin in px. Default = 20 */ private $margintop = 20; /** * Define size of the top margin in px. Default = 20 */ private $marginbottom = 20; /** * Constructor */ public function __construct( $manager, $id, $args = array(), $options = array() ) { parent::__construct( $manager, $id, $args ); // Check the width of the divider if ( isset( $this->input_attrs['width'] ) ) { if ( in_array( strtolower( $this->input_attrs['width'] ), $this->available_divider_widths, true ) ) { $this->dividerwidth = strtolower( $this->input_attrs['width'] ); } } // Check the type of divider if ( isset( $this->input_attrs['type'] ) ) { if ( in_array( strtolower( $this->input_attrs['type'] ), $this->available_divider_types, true ) ) { $this->dividertype = strtolower( $this->input_attrs['type'] ); } } // Check if the top margin is specified and valid. Will accept int and string values. i.e. 42 or '42' if ( isset( $this->input_attrs['margintop'] ) && is_numeric( $this->input_attrs['margintop'] ) ) { $this->margintop = abs( (int)$this->input_attrs['margintop'] ); } // Check if the bottom margin is specified and valid. Will accept int and string values. i.e. 42 or '42' if ( isset( $this->input_attrs['marginbottom'] ) && is_numeric( $this->input_attrs['marginbottom'] ) ) { $this->marginbottom = abs( (int)$this->input_attrs['marginbottom'] ); } } /** * Enqueue our scripts and styles */ public function enqueue() { wp_enqueue_style( 'tmpcoder-customize-controls', TMPCODER_CUSTOMIZER_ASSETS . 'css/tmpcoder-customizer'.tmpcoder_min_suffix().'.css', array(), TMPCODER_THEME_CORE_VERSION, 'all' ); } /** * Render the control in the customizer */ public function render_content() { ?> <div class="simple-divider-custom-control simple-divider-type-<?php echo esc_attr($this->dividertype); ?> simple-divider-width-<?php echo esc_attr($this->dividerwidth); ?>" style="margin-top:<?php echo esc_attr($this->margintop); ?>px;margin-bottom:<?php echo esc_attr($this->marginbottom); ?>px"></div> <?php } } /** * Google Font Select Customize Control */ class Tmpcoder_Google_Font_Select_Customize_Control extends WP_Customize_Control { /** * The type of control being rendered */ public $type = 'google_fonts'; /** * The list of Google Fonts */ private $fontList = false; /** * The saved font values decoded from json */ private $fontValues = array(); /** * The index of the saved font within the list of Google fonts */ private $fontListIndex = 0; /** * The number of fonts to display from the json file. Either positive integer or 'all'. Default = 'all' */ private $fontCount = 'all'; /** * The font list sort order. Either 'alpha' or 'popular'. Default = 'alpha' */ private $fontOrderBy = 'alpha'; /** * Get our list of fonts from the json file */ public function __construct( $manager, $id, $args = array(), $options = array() ) { parent::__construct( $manager, $id, $args ); // Get the font sort order if ( isset( $this->input_attrs['orderby'] ) && strtolower( $this->input_attrs['orderby'] ) === 'popular' ) { $this->fontOrderBy = 'popular'; } // Get the list of Google fonts if ( isset( $this->input_attrs['font_count'] ) ) { if ( 'all' != strtolower( $this->input_attrs['font_count'] ) ) { $this->fontCount = ( abs( (int) $this->input_attrs['font_count'] ) > 0 ? abs( (int) $this->input_attrs['font_count'] ) : 'all' ); } } $this->fontList = $this->tmpcoder_getGoogleFonts( 'all' ); // Decode the default json font value $this->fontValues = json_decode( $this->value() ); // Find the index of our default font within our list of Google fonts $this->fontListIndex = $this->tmpcoder_getFontIndex( $this->fontList, $this->fontValues->font ); } /** * Enqueue our scripts and styles */ public function enqueue() { wp_enqueue_script( 'tmpcoder-select2', TMPCODER_CUSTOMIZER_ASSETS . 'js/select2'.tmpcoder_min_suffix().'.js', array( 'jquery' ), TMPCODER_THEME_CORE_VERSION, true ); wp_enqueue_script( 'tmpcoder-customize-controls', TMPCODER_CUSTOMIZER_ASSETS . 'js/tmpcoder-customizer'.tmpcoder_min_suffix().'.js', array( 'tmpcoder-select2-js' ), TMPCODER_THEME_CORE_VERSION, true ); wp_enqueue_style( 'tmpcoder-customize-controls', TMPCODER_CUSTOMIZER_ASSETS . 'css/tmpcoder-customizer'.tmpcoder_min_suffix().'.css', array(), TMPCODER_THEME_CORE_VERSION, 'all' ); wp_enqueue_style( 'tmpcoder-select2', TMPCODER_CUSTOMIZER_ASSETS . 'css/select2'.tmpcoder_min_suffix().'.css', array(), TMPCODER_THEME_CORE_VERSION, 'all' ); } /** * Export our List of Google Fonts to JavaScript */ public function to_json() { parent::to_json(); $this->json['tmpcoderfontslist'] = $this->fontList; } /** * Render the control in the customizer */ public function render_content() { $fontCounter = 0; $isFontInList = false; $fontListStr = ''; if( !empty($this->fontList) ) { ?> <div class="google_fonts_select_control"> <?php if( !empty( $this->label ) ) { ?> <span class="customize-control-title"><?php echo esc_html( $this->label ); ?></span> <?php } ?> <?php if( !empty( $this->description ) ) { ?> <span class="customize-control-description"><?php echo esc_html( $this->description ); ?></span> <?php } ?> <input type="hidden" id="<?php echo esc_attr( $this->id ); ?>" name="<?php echo esc_attr( $this->id ); ?>" value="<?php echo esc_attr( $this->value() ); ?>" class="customize-control-google-font-selection" <?php $this->link(); ?> /> <div class="google-fonts"> <select class="google-fonts-list" control-name="<?php echo esc_attr( $this->id ); ?>"> <?php foreach( $this->fontList as $key => $value ) { $fontCounter++; $fontListStr .= '<option value="' . esc_html( $value['font'] ) . '" ' . selected( $this->fontValues->font, $value['font'], false ) . '>' . esc_html( $value['font'] ) . '</option>'; if ( $this->fontValues->font === $value['font'] ) { $isFontInList = true; } if ( is_int( $this->fontCount ) && $fontCounter === $this->fontCount ) { break; } } if ( !$isFontInList && $this->fontListIndex ) { // If the default or saved font value isn't in the list of displayed fonts, add it to the top of the list as the default font $fontListStr = '<option value="' . esc_html( $this->fontList[$this->fontListIndex]['font'] ) . '" ' . selected( $this->fontValues->font, $this->fontList[$this->fontListIndex]['font'], false ) . '>' . esc_html( $this->fontList[$this->fontListIndex]['font'] ) . ' (default)</option>' . $fontListStr; } // Display our list of font options echo wp_kses($fontListStr, array( 'option' => array( 'selected' => array(), 'data-*' => array(), ) )); ?> </select> </div> <div class="customize-control-description"><?php esc_html_e( 'Font Weight & Style', 'spexo' ) ?></div> <div class="weight-style"> <select class="google-fonts-regularweight-style customize-control-select2"> <?php $weightLabels = array( "100" => "Thin 100", "200" => "Extra Light 200", "300" => "Light 300", "400" => "Regular 400", "500" => "Medium 500", "600" => "Semi-Bold 600", "700" => "Bold 700", "800" => "Extra Bold 800", "900" => "Black 900" ); $uniqueVariants = array(); foreach( $this->fontList[$this->fontListIndex]['variants'] as $key => $value ) { // Remove the "i" from the variant (if it's the "italic" variant) $cleanedValue = str_replace('i', '', $value); if (!in_array($cleanedValue, $uniqueVariants)) { $uniqueVariants[] = $cleanedValue; $label = isset($weightLabels[$cleanedValue]) ? $weightLabels[$cleanedValue] : $cleanedValue; echo '<option value="' . esc_html( $cleanedValue ) . '" ' . selected( $this->fontValues->regularweight, $cleanedValue, false ) . '>' . esc_html( $label ) . '</option>'; } } ?> </select> </div> <input type="hidden" class="google-fonts-category" value="<?php echo esc_attr($this->fontValues->category); ?>"> </div> <?php } } /** * Find the index of the saved font in our multidimensional array of Google Fonts */ public function tmpcoder_getFontIndex( $haystack, $needle ) { foreach( $haystack as $key => $value ) { if( $value['font'] == $needle ) { return $key; } } return false; } /** * Return the list of Google Fonts from the Google Fonts API. * This method is updated to handle missing properties and use the correct structure. */ public function tmpcoder_getGoogleFonts( $count = 30 ) { $googleFontsUrl = "https://fonts.google.com/metadata/fonts"; $args = array( 'headers' => array( 'User-Agent' => 'Mozilla/5.0', // Required to bypass Google restrictions ) ); $request = wp_remote_get( $googleFontsUrl, $args ); if ( is_wp_error( $request ) ) { return ""; } $body = wp_remote_retrieve_body( $request ); // Remove Google's anti-CSRF prefix: ")]}'" $body = preg_replace('/^\)\]\}\'/', '', $body); $content = json_decode( $body ); if ( !isset( $content->familyMetadataList ) || !is_array( $content->familyMetadataList ) ) { return ""; } $fonts = $content->familyMetadataList; $fontList = []; foreach ( $fonts as $font ) { $fontName = isset( $font->family ) ? $font->family : ''; $variants = isset( $font->variants ) && is_array( $font->variants ) ? $font->variants : []; if ( empty( $variants ) && isset( $font->fonts ) && is_object( $font->fonts ) ) { $variants = array_keys( get_object_vars( $font->fonts ) ); } if ( empty( $variants ) ) { $variants = ['400']; } $category = isset( $font->category ) ? $font->category : 'sans-serif'; $fontList[] = [ 'font' => $fontName, 'regularweight' => '400', 'category' => $category, 'variants' => $variants, 'subsets' => isset( $font->subsets ) ? $font->subsets : [] ]; } return ( $count === 'all' ) ? $fontList : array_slice( $fontList, 0, $count ); } } /** * Dropdown Select2 Customize Control */ class Tmpcoder_Dropdown_Select2_Customize_Control extends WP_Customize_Control { /** * The type of control being rendered */ public $type = 'dropdown_select2'; /** * The type of Select2 Dropwdown to display. Can be either a single select dropdown or a multi-select dropdown. Either false for true. Default = false */ private $multiselect = false; /** * The Placeholder value to display. Select2 requires a Placeholder value to be set when using the clearall option. Default = 'Please select...' */ private $placeholder = 'Please select...'; /** * Constructor */ public function __construct( $manager, $id, $args = array(), $options = array() ) { parent::__construct( $manager, $id, $args ); // Check if this is a multi-select field if ( isset( $this->input_attrs['multiselect'] ) && $this->input_attrs['multiselect'] ) { $this->multiselect = true; } // Check if a placeholder string has been specified if ( isset( $this->input_attrs['placeholder'] ) && $this->input_attrs['placeholder'] ) { $this->placeholder = $this->input_attrs['placeholder']; } } /** * Enqueue scripts and styles */ public function enqueue() { wp_enqueue_script( 'tmpcoder-select2', TMPCODER_CUSTOMIZER_ASSETS . 'js/select2'.tmpcoder_min_suffix().'.js', array( 'jquery' ), TMPCODER_THEME_CORE_VERSION, true ); wp_enqueue_script( 'tmpcoder-customize-controls', TMPCODER_CUSTOMIZER_ASSETS . 'js/tmpcoder-customizer'.tmpcoder_min_suffix().'.js', array( 'tmpcoder-select2-js' ), TMPCODER_THEME_CORE_VERSION, true ); wp_enqueue_style( 'tmpcoder-customize-controls', TMPCODER_CUSTOMIZER_ASSETS . 'css/tmpcoder-customizer'.tmpcoder_min_suffix().'.css', array(), TMPCODER_THEME_CORE_VERSION, 'all' ); wp_enqueue_style( 'tmpcoder-select2', TMPCODER_CUSTOMIZER_ASSETS . 'css/select2'.tmpcoder_min_suffix().'.css', array(), TMPCODER_THEME_CORE_VERSION, 'all' ); } /** * Render the control in the customizer */ public function render_content() { $defaultValue = $this->value(); if ( $this->multiselect ) { $defaultValue = explode( ',', $this->value() ); } ?> <div class="dropdown_select2_control"> <?php if( !empty( $this->label ) ) { ?> <label for="<?php echo esc_attr( $this->id ); ?>" class="customize-control-title"> <?php echo esc_html( $this->label ); ?> </label> <?php } ?> <?php if( !empty( $this->description ) ) { ?> <span class="customize-control-description"><?php echo esc_html( $this->description ); ?></span> <?php } ?> <input type="hidden" id="<?php echo esc_attr( $this->id ); ?>" class="customize-control-dropdown-select2" value="<?php echo esc_attr( $this->value() ); ?>" name="<?php echo esc_attr( $this->id ); ?>" <?php $this->link(); ?> /> <select name="select2-list-<?php echo esc_attr( $this->multiselect ? 'multi[]' : 'single' ); ?>" class="customize-control-select2" data-placeholder="<?php echo esc_attr($this->placeholder); ?>" <?php echo esc_attr( $this->multiselect ? 'multiple="multiple" ' : '' ); ?>> <?php if ( !$this->multiselect ) { // When using Select2 for single selection, the Placeholder needs an empty <option> at the top of the list for it to work (multi-selects dont need this) echo '<option></option>'; } foreach ( $this->choices as $key => $value ) { if ( is_array( $value ) ) { echo '<optgroup label="' . esc_attr( $key ) . '">'; foreach ( $value as $optgroupkey => $optgroupvalue ) { if( $this->multiselect ){ echo '<option value="' . esc_attr( $optgroupkey ) . '" ' . ( in_array( esc_attr( $optgroupkey ), $defaultValue ) ? 'selected="selected"' : '' ) . '>' . esc_attr( $optgroupvalue ) . '</option>'; } else{ echo '<option value="' . esc_attr( $optgroupkey ) . '" ' . selected( esc_attr( $optgroupkey ), $defaultValue, false ) . '>' . esc_attr( $optgroupvalue ) . '</option>'; } } echo '</optgroup>'; } else { if( $this->multiselect ){ echo '<option value="' . esc_attr( $key ) . '" ' . ( in_array( esc_attr( $key ), $defaultValue ) ? 'selected="selected"' : '' ) . '>' . esc_attr( $value ) . '</option>'; } else{ echo '<option value="' . esc_attr( $key ) . '" ' . selected( esc_attr( $key ), $defaultValue, false ) . '>' . esc_attr( $value ) . '</option>'; } } } ?> </select> </div> <?php } } /** * Notice Customize Control */ class Tmpcoder_Notice_Customize_Control extends WP_Customize_Control { /** * The type of control being rendered */ public $type = 'tmpcoder_notice'; /** * Render the control in the customizer */ public function render_content() { $allowed_html = array( 'a' => array( 'href' => array(), 'title' => array(), 'class' => array(), 'target' => array(), ), 'br' => array(), 'em' => array(), 'strong' => array(), 'i' => array( 'class' => array() ), 'span' => array( 'class' => array(), ), 'code' => array(), ); ?> <div class="simple-notice-custom-control"> <?php if( !empty( $this->label ) ) { ?> <span class="customize-control-title"><?php echo esc_html( $this->label ); ?></span> <?php } ?> <?php if( !empty( $this->description ) ) { ?> <span class="customize-control-description"><?php echo wp_kses( $this->description, $allowed_html ); ?></span> <?php } ?> </div> <?php } } /** * Dimensions Customize Control */ class Tmpcoder_Dimensional_Customize_Control extends WP_Customize_Control { public $type = 'dimensional'; public function render_content() { $dimensions = array('top', 'right', 'bottom', 'left'); $saved_values = json_decode($this->value(), true); ?> <label> <span class="customize-control-title"><?php echo esc_html($this->label); ?></span> <div class="dimensional-fields-row"> <?php foreach ($dimensions as $dimension) : ?> <div class="dimensional-field"> <input type="number" placeholder="<?php echo esc_attr ( ucfirst($dimension) ); ?>" class="dimensional-input" data-dimension="<?php echo esc_attr($dimension); ?>" value="<?php echo esc_attr(isset($saved_values[$dimension]) ? $saved_values[$dimension] : ''); ?>" /> <span class="customize-control-description"><?php echo esc_html( ucfirst($dimension) ); ?></span> </div> <?php endforeach; ?> <input type="hidden" class="dimensional-hidden-value" <?php $this->link(); ?> /> </div> </label> <?php } } /** * TinyMCE Customize Control */ class Tmpcoder_TinyMCE_Customize_Control extends WP_Customize_Control { /** * The type of control being rendered */ public $type = 'tinymce_editor'; /** * Enqueue our scripts and styles */ public function enqueue(){ wp_enqueue_script( 'tmpcoder-customize-controls', TMPCODER_CUSTOMIZER_ASSETS . 'js/tmpcoder-customizer'.tmpcoder_min_suffix().'.js', array( 'jquery' ), TMPCODER_THEME_CORE_VERSION, true ); wp_enqueue_style( 'tmpcoder-customize-controls', TMPCODER_CUSTOMIZER_ASSETS . 'css/tmpcoder-customizer'.tmpcoder_min_suffix().'.css', array(), TMPCODER_THEME_CORE_VERSION, 'all' ); wp_enqueue_editor(); } /** * Pass our TinyMCE toolbar string to JavaScript */ public function to_json() { parent::to_json(); $this->json['tmpcodertinymcetoolbar1'] = isset( $this->input_attrs['toolbar1'] ) ? esc_attr( $this->input_attrs['toolbar1'] ) : 'bold italic bullist numlist alignleft aligncenter alignright link'; $this->json['tmpcodertinymcetoolbar2'] = isset( $this->input_attrs['toolbar2'] ) ? esc_attr( $this->input_attrs['toolbar2'] ) : ''; $this->json['tmpcodermediabuttons'] = isset( $this->input_attrs['mediaButtons'] ) && ( $this->input_attrs['mediaButtons'] === true ) ? true : false; } /** * Render the control in the customizer */ public function render_content(){ ?> <div class="tinymce-control"> <span class="customize-control-title"><?php echo esc_html( $this->label ); ?></span> <?php if( !empty( $this->description ) ) { ?> <span class="customize-control-description"><?php echo wp_kses_post( $this->description ); ?></span> <?php } ?> <textarea id="<?php echo esc_attr( $this->id ); ?>" class="customize-control-tinymce-editor" <?php $this->link(); ?>><?php echo esc_html( $this->value() ); ?></textarea> <span class="customize-control-description"> <?php echo wp_kses_post( 'Shortcode List:<br>[COPYRIGHT] = ©<br>[CURRENT_YEAR] = ' . gmdate('Y') . '<br>[SITE_TITLE] = ' . get_bloginfo('name') ); ?></span> </div> <?php } } /** * Only allow values between a certain minimum & maxmium range * * @param number Input to be sanitized * @return number Sanitized input */ if ( ! function_exists( ' tmpcoder_in_range' ) ) { function tmpcoder_in_range( $input, $min, $max ){ if ( $input < $min ) { $input = $min; } if ( $input > $max ) { $input = $max; } return $input; } } /** * Slider sanitization * * @param string Slider value to be sanitized * @return string Sanitized input */ if ( ! function_exists( 'tmpcoder_range_sanitization' ) ) { function tmpcoder_range_sanitization( $input, $setting ) { $attrs = $setting->manager->get_control( $setting->id )->input_attrs; $min = ( isset( $attrs['min'] ) ? $attrs['min'] : $input ); $max = ( isset( $attrs['max'] ) ? $attrs['max'] : $input ); $step = ( isset( $attrs['step'] ) ? $attrs['step'] : 1 ); $number = floor( $input / $attrs['step'] ) * $attrs['step']; return tmpcoder_in_range( $number, $min, $max ); } } /** * Google Font sanitization * * @param string JSON string to be sanitized * @return string Sanitized input */ if ( ! function_exists( 'tmpcoder_google_font_sanitization' ) ) { function tmpcoder_google_font_sanitization( $input ) { $val = json_decode( $input, true ); if( is_array( $val ) ) { foreach ( $val as $key => $value ) { $val[$key] = sanitize_text_field( $value ); } $input = json_encode( $val ); } else { $input = json_encode( sanitize_text_field( $val ) ); } return $input; } } /** * Alpha Color (Hex, RGB & RGBa) sanitization * * @param string Input to be sanitized * @return string Sanitized input */ if ( ! function_exists( 'tmpcoder_hex_rgba_sanitization' ) ) { function tmpcoder_hex_rgba_sanitization( $input, $setting ) { if ( empty( $input ) || is_array( $input ) ) { return $setting->default; } if ( false === strpos( $input, 'rgb' ) ) { // If string doesn't start with 'rgb' then santize as hex color $input = sanitize_hex_color( $input ); } else { if ( false === strpos( $input, 'rgba' ) ) { // Sanitize as RGB color $input = str_replace( ' ', '', $input ); sscanf( $input, 'rgb(%d,%d,%d)', $red, $green, $blue ); $input = 'rgb(' . tmpcoder_in_range( $red, 0, 255 ) . ',' . tmpcoder_in_range( $green, 0, 255 ) . ',' . tmpcoder_in_range( $blue, 0, 255 ) . ')'; } else { // Sanitize as RGBa color $input = str_replace( ' ', '', $input ); sscanf( $input, 'rgba(%d,%d,%d,%f)', $red, $green, $blue, $alpha ); $input = 'rgba(' . tmpcoder_in_range( $red, 0, 255 ) . ',' . tmpcoder_in_range( $green, 0, 255 ) . ',' . tmpcoder_in_range( $blue, 0, 255 ) . ',' . tmpcoder_in_range( $alpha, 0, 1 ) . ')'; } } return $input; } } /** * Text sanitization * * @param string Input to be sanitized (either a string containing a single string or multiple, separated by commas) * @return string Sanitized input */ if ( ! function_exists( 'tmpcoder_text_sanitization' ) ) { function tmpcoder_text_sanitization( $input ) { if ( strpos( $input, ',' ) !== false) { $input = explode( ',', $input ); } if( is_array( $input ) ) { foreach ( $input as $key => $value ) { $input[$key] = sanitize_text_field( $value ); } $input = implode( ',', $input ); } else { $input = sanitize_text_field( $input ); } return $input; } } /** * Dimensions sanitization */ if ( ! function_exists( 'tmpcoder_dimensions_sanitization' ) ) { function tmpcoder_dimensions_sanitization( $input ) { $val = json_decode( $input, true ); if( is_array( $val ) ) { foreach ( $val as $key => $value ) { $val[$key] = sanitize_text_field( $value ); } $input = json_encode( $val ); } else { $input = json_encode( sanitize_text_field( $val ) ); } return $input; } } /** * Boolean sanitization */ if ( ! function_exists( 'tmpcoder_sanitize_boolean' ) ) { function tmpcoder_sanitize_boolean( $value ) { return filter_var( $value, FILTER_VALIDATE_BOOLEAN ); } } }