$key = $args[ $key ]; } $this->manager = $manager; $this->id = $id; // Process settings. if ( empty( $this->settings ) ) $this->settings = $id; $settings = array(); if ( is_array( $this->settings ) ) { foreach ( $this->settings as $key => $setting ) { $settings[ $key ] = $this->manager->get_setting( $setting ); } } else { $this->setting = $this->manager->get_setting( $this->settings ); $settings['default'] = $this->setting; } $this->settings = $settings; } /** * Enqueue control related scripts/styles. * * @since 3.4.0 */ public function enqueue() {} /** * Fetch a setting's value. * Grabs the main setting by default. * * @since 3.4.0 * * @param string $setting_key * @return mixed The requested setting's value, if the setting exists. */ public final function value( $setting_key = 'default' ) { if ( isset( $this->settings[ $setting_key ] ) ) return $this->settings[ $setting_key ]->value(); } /** * Refresh the parameters passed to the JavaScript via JSON. * * @since 3.4.0 */ public function to_json() { $this->json['settings'] = array(); foreach ( $this->settings as $key => $setting ) { $this->json['settings'][ $key ] = $setting->id; } $this->json['type'] = $this->type; } /** * Check if the theme supports the control and check user capabilities. * * @since 3.4.0 * * @return bool False if theme doesn't support the control or user doesn't have the required permissions, otherwise true. */ public final function check_capabilities() { foreach ( $this->settings as $setting ) { if ( ! $setting->check_capabilities() ) return false; } $section = $this->manager->get_section( $this->section ); if ( isset( $section ) && ! $section->check_capabilities() ) return false; return true; } /** * Check capabilities and render the control. * * @since 3.4.0 * @uses WP_Customize_Control::render() */ public final function maybe_render() { if ( ! $this->check_capabilities() ) return; /** * Fires just before the current Customizer control is rendered. * * @since 3.4.0 * * @param WP_Customize_Control $this WP_Customize_Control instance. */ do_action( 'customize_render_control', $this ); /** * Fires just before a specific Customizer control is rendered. * * The dynamic portion of the hook name, $this->id, refers to * the control ID. * * @since 3.4.0 * * @param WP_Customize_Control $this WP_Customize_Control instance. */ do_action( 'customize_render_control_' . $this->id, $this ); $this->render(); } /** * Renders the control wrapper and calls $this->render_content() for the internals. * * @since 3.4.0 */ protected function render() { $id = 'customize-control-' . str_replace( '[', '-', str_replace( ']', '', $this->id ) ); $class = 'customize-control customize-control-' . $this->type; ?>
  • render_content(); ?>
  • settings[ $setting_key ] ) ) return ''; return 'data-customize-setting-link="' . esc_attr( $this->settings[ $setting_key ]->id ) . '"'; } /** * Render the data link attribute for the control's input element. * * @since 3.4.0 * @uses WP_Customize_Control::get_link() * * @param string $setting_key */ public function link( $setting_key = 'default' ) { echo $this->get_link( $setting_key ); } /** * Render the control's content. * * Allows the content to be overriden without having to rewrite the wrapper in $this->render(). * * Supports basic input types `text`, `checkbox`, `radio`, `select` and `dropdown-pages`. * * @since 3.4.0 */ protected function render_content() { switch( $this->type ) { case 'text': ?> choices ) ) return; $name = '_customize-radio-' . $this->id; ?> label ); ?> choices as $value => $label ) : ?> choices ) ) return; ?> '_customize-dropdown-pages-' . $this->id, 'echo' => 0, 'show_option_none' => __( '— Select —' ), 'option_none_value' => '0', 'selected' => $this->value(), ) ); // Hackily add in the data link parameter. $dropdown = str_replace( 'get_link(), $dropdown ); printf( '', $this->label, $dropdown ); break; } } } /** * Customize Color Control Class * * @package WordPress * @subpackage Customize * @since 3.4.0 */ class WP_Customize_Color_Control extends WP_Customize_Control { /** * @access public * @var string */ public $type = 'color'; /** * @access public * @var array */ public $statuses; /** * Constructor. * * @since 3.4.0 * @uses WP_Customize_Control::__construct() * * @param WP_Customize_Manager $manager * @param string $id * @param array $args */ public function __construct( $manager, $id, $args = array() ) { $this->statuses = array( '' => __('Default') ); parent::__construct( $manager, $id, $args ); } /** * Enqueue scripts/styles for the color picker. * * @since 3.4.0 */ public function enqueue() { wp_enqueue_script( 'wp-color-picker' ); wp_enqueue_style( 'wp-color-picker' ); } /** * Refresh the parameters passed to the JavaScript via JSON. * * @since 3.4.0 * @uses WP_Customize_Control::to_json() */ public function to_json() { parent::to_json(); $this->json['statuses'] = $this->statuses; } /** * Render the control's content. * * @since 3.4.0 */ public function render_content() { $this_default = $this->setting->default; $default_attr = ''; if ( $this_default ) { if ( false === strpos( $this_default, '#' ) ) $this_default = '#' . $this_default; $default_attr = ' data-default-color="' . esc_attr( $this_default ) . '"'; } // The input's value gets set by JS. Don't fill it. ?> json['removed'] = $this->removed; if ( $this->context ) $this->json['context'] = $this->context; if ( $this->extensions ) $this->json['extensions'] = implode( ',', $this->extensions ); } /** * Render the control's content. * * @since 3.4.0 */ public function render_content() { ?> statuses = array( '' => __('No Image') ); parent::__construct( $manager, $id, $args ); $this->add_tab( 'upload-new', __('Upload New'), array( $this, 'tab_upload_new' ) ); $this->add_tab( 'uploaded', __('Uploaded'), array( $this, 'tab_uploaded' ) ); // Early priority to occur before $this->manager->prepare_controls(); add_action( 'customize_controls_init', array( $this, 'prepare_control' ), 5 ); } /** * Prepares the control. * * If no tabs exist, removes the control from the manager. * * @since 3.4.2 */ public function prepare_control() { if ( ! $this->tabs ) $this->manager->remove_control( $this->id ); } /** * Refresh the parameters passed to the JavaScript via JSON. * * @since 3.4.0 * @uses WP_Customize_Upload_Control::to_json() */ public function to_json() { parent::to_json(); $this->json['statuses'] = $this->statuses; } /** * Render the control's content. * * @since 3.4.0 */ public function render_content() { $src = $this->value(); if ( isset( $this->get_url ) ) $src = call_user_func( $this->get_url, $src ); ?>
    label ); ?>
      tabs as $id => $tab ): ?>
    tabs as $id => $tab ): ?>
    tabs[ $id ] = array( 'label' => $label, 'callback' => $callback, ); } /** * Remove a tab from the control. * * @since 3.4.0 * * @param string $id */ public function remove_tab( $id ) { unset( $this->tabs[ $id ] ); } /** * @since 3.4.0 */ public function tab_upload_new() { if ( ! _device_can_upload() ) { echo '

    ' . sprintf( __('The web browser on your device cannot be used to upload files. You may be able to use the native app for your device instead.'), 'https://wordpress.org/mobile/' ) . '

    '; } else { ?>
    select a file.'); ?>
    __( 'Background Image' ), 'section' => 'background_image', 'context' => 'custom-background', 'get_url' => 'get_background_image', ) ); if ( $this->setting->default ) $this->add_tab( 'default', __('Default'), array( $this, 'tab_default_background' ) ); } /** * @since 3.4.0 */ public function tab_uploaded() { $backgrounds = get_posts( array( 'post_type' => 'attachment', 'meta_key' => '_wp_attachment_is_custom_background', 'meta_value' => $this->manager->get_stylesheet(), 'orderby' => 'none', 'nopaging' => true, ) ); ?>
    print_tab_image( esc_url_raw( $background->guid ) ); } /** * @since 3.4.0 * @uses WP_Customize_Image_Control::print_tab_image() */ public function tab_default_background() { $this->print_tab_image( $this->setting->default ); } } final class WP_Customize_Header_Image_Control extends WP_Customize_Image_Control { public $type = 'header'; public function __construct( $manager ) { parent::__construct( $manager, 'header_image', array( 'label' => __( 'Header Image' ), 'settings' => array( 'default' => 'header_image', 'data' => 'header_image_data', ), 'section' => 'header_image', 'context' => 'custom-header', 'removed' => 'remove-header', 'get_url' => 'get_header_image', ) ); } public function to_json() { parent::to_json(); } public function enqueue() { wp_enqueue_media(); wp_enqueue_script( 'customize-views' ); $this->prepare_control(); wp_localize_script( 'customize-views', '_wpCustomizeHeader', array( 'data' => array( 'width' => absint( get_theme_support( 'custom-header', 'width' ) ), 'height' => absint( get_theme_support( 'custom-header', 'height' ) ), 'flex-width' => absint( get_theme_support( 'custom-header', 'flex-width' ) ), 'flex-height' => absint( get_theme_support( 'custom-header', 'flex-height' ) ), 'currentImgSrc' => $this->get_current_image_src(), ), 'nonces' => array( 'add' => wp_create_nonce( 'header-add' ), 'remove' => wp_create_nonce( 'header-remove' ), ), 'l10n' => array( /* translators: header images uploaded by user */ 'uploaded' => __( 'uploaded' ), /* translators: header images suggested by the current theme */ 'default' => __( 'suggested' ) ), 'uploads' => $this->uploaded_headers, 'defaults' => $this->default_headers ) ); parent::enqueue(); } public function get_default_header_images() { global $custom_image_header; // Get *the* default image if there is one $default = get_theme_support( 'custom-header', 'default-image' ); if ( ! $default ) { // If not, return $custom_image_header->default_headers; // easy peasy. } $default = sprintf( $default, get_template_directory_uri(), get_stylesheet_directory_uri() ); $header_images = array(); $already_has_default = false; // Get the whole set of default images $default_header_images = $custom_image_header->default_headers; foreach ( $default_header_images as $k => $h ) { if ( $h['url'] == $default ) { $already_has_default = true; break; } } // If *the one true image* isn't included in the default set, add it in // first position if ( ! $already_has_default ) { $header_images['default'] = array( 'url' => $default, 'thumbnail_url' => $default, 'description' => 'Default' ); } // The rest of the set comes after $header_images = array_merge( $header_images, $default_header_images ); return $header_images; } public function get_uploaded_header_images() { $key = '_wp_attachment_custom_header_last_used_' . get_stylesheet(); $header_images = array(); $headers_not_dated = get_posts( array( 'post_type' => 'attachment', 'meta_key' => '_wp_attachment_is_custom_header', 'meta_value' => get_option('stylesheet'), 'orderby' => 'none', 'nopaging' => true, 'meta_query' => array( array( 'key' => '_wp_attachment_is_custom_header', 'value' => get_option( 'stylesheet' ), 'compare' => 'LIKE' ), array( 'key' => $key, 'value' => 'this string must not be empty', 'compare' => 'NOT EXISTS' ), ) ) ); $headers_dated = get_posts( array( 'post_type' => 'attachment', 'meta_key' => $key, 'orderby' => 'meta_value_num', 'order' => 'DESC', 'nopaging' => true, 'meta_query' => array( array( 'key' => '_wp_attachment_is_custom_header', 'value' => get_option( 'stylesheet' ), 'compare' => 'LIKE' ), ), ) ); $limit = apply_filters( 'custom_header_uploaded_limit', 15 ); $headers = array_merge( $headers_dated, $headers_not_dated ); $headers = array_slice( $headers, 0, $limit ); foreach ( (array) $headers as $header ) { $url = esc_url_raw( $header->guid ); $header_data = wp_get_attachment_metadata( $header->ID ); $timestamp = get_post_meta( $header->ID, '_wp_attachment_custom_header_last_used_' . get_stylesheet(), true ); $h = array( 'attachment_id' => $header->ID, 'url' => $url, 'thumbnail_url' => $url, 'timestamp' => $timestamp ? $timestamp : 0, ); if ( isset( $header_data['width'] ) ) { $h['width'] = $header_data['width']; } if ( isset( $header_data['height'] ) ) { $h['height'] = $header_data['height']; } $header_images[] = $h; } return $header_images; } public function prepare_control() { global $custom_image_header; if ( empty( $custom_image_header ) ) { return; } // Process default headers and uploaded headers. $custom_image_header->process_default_headers(); $this->default_headers = $this->get_default_header_images(); $this->uploaded_headers = $this->get_uploaded_header_images(); } function print_header_image_template() { ?> value(); if ( isset( $this->get_url ) ) { $src = call_user_func( $this->get_url, $src ); return $src; } return null; } public function render_content() { $this->print_header_image_template(); $visibility = $this->get_current_image_src() ? '' : ' style="display:none" '; $width = absint( get_theme_support( 'custom-header', 'width' ) ); $height = absint( get_theme_support( 'custom-header', 'height' ) ); ?>

    %s, your theme recommends a header size of %dx%d pixels.' ), _x( 'Add new', 'header image' ), $width, $height ); } else { if ( $width ) { printf( __( 'While you can crop images to your liking after clicking %s, your theme recommends a header width of %d pixels.' ), _x( 'Add new', 'header image' ), $width ); } if ( $height ) { printf( __( 'While you can crop images to your liking after clicking %s, your theme recommends a header height of %d pixels.' ), _x( 'Add new', 'header image' ), $height ); } } ?>

    json[ $key ] = $this->$key; } } public function render_content() { ?> json[ $key ] = $this->$key; } } public function render_content() { global $wp_registered_widgets; require_once ABSPATH . '/wp-admin/includes/widgets.php'; $widget = $wp_registered_widgets[ $this->widget_id ]; if ( ! isset( $widget['params'][0] ) ) { $widget['params'][0] = array(); } $args = array( 'widget_id' => $widget['id'], 'widget_name' => $widget['name'], ); $args = wp_list_widget_controls_dynamic_sidebar( array( 0 => $args, 1 => $widget['params'][0] ) ); echo WP_Customize_Widgets::get_widget_control( $args ); } }