| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792 | <?php/** * WordPress Customize Control classes * * @package WordPress * @subpackage Customize * @since 3.4.0 *//** * Customize Control class. * * @since 3.4.0 */class WP_Customize_Control {	/**	 * Incremented with each new class instantiation, then stored in $instance_number.	 *	 * Used when sorting two instances whose priorities are equal.	 *	 * @since 4.1.0	 * @var int	 */	protected static $instance_count = 0;	/**	 * Order in which this instance was created in relation to other instances.	 *	 * @since 4.1.0	 * @var int	 */	public $instance_number;	/**	 * Customizer manager.	 *	 * @since 3.4.0	 * @var WP_Customize_Manager	 */	public $manager;	/**	 * Control ID.	 *	 * @since 3.4.0	 * @var string	 */	public $id;	/**	 * All settings tied to the control.	 *	 * @since 3.4.0	 * @var array	 */	public $settings;	/**	 * The primary setting for the control (if there is one).	 *	 * @since 3.4.0	 * @var string	 */	public $setting = 'default';	/**	 * Capability required to use this control.	 *	 * Normally this is empty and the capability is derived from the capabilities	 * of the associated `$settings`.	 *	 * @since 4.5.0	 * @var string	 */	public $capability;	/**	 * Order priority to load the control in Customizer.	 *	 * @since 3.4.0	 * @var int	 */	public $priority = 10;	/**	 * Section the control belongs to.	 *	 * @since 3.4.0	 * @var string	 */	public $section = '';	/**	 * Label for the control.	 *	 * @since 3.4.0	 * @var string	 */	public $label = '';	/**	 * Description for the control.	 *	 * @since 4.0.0	 * @var string	 */	public $description = '';	/**	 * List of choices for 'radio' or 'select' type controls, where values are the keys, and labels are the values.	 *	 * @since 3.4.0	 * @var array	 */	public $choices = array();	/**	 * List of custom input attributes for control output, where attribute names are the keys and values are the values.	 *	 * Not used for 'checkbox', 'radio', 'select', 'textarea', or 'dropdown-pages' control types.	 *	 * @since 4.0.0	 * @var array	 */	public $input_attrs = array();	/**	 * Show UI for adding new content, currently only used for the dropdown-pages control.	 *	 * @since 4.7.0	 * @var bool	 */	public $allow_addition = false;	/**	 * @deprecated It is better to just call the json() method	 * @since 3.4.0	 * @var array	 */	public $json = array();	/**	 * Control's Type.	 *	 * @since 3.4.0	 * @var string	 */	public $type = 'text';	/**	 * Callback.	 *	 * @since 4.0.0	 *	 * @see WP_Customize_Control::active()	 *	 * @var callable Callback is called with one argument, the instance of	 *               WP_Customize_Control, and returns bool to indicate whether	 *               the control is active (such as it relates to the URL	 *               currently being previewed).	 */	public $active_callback = '';	/**	 * Constructor.	 *	 * Supplied `$args` override class property defaults.	 *	 * If `$args['settings']` is not defined, use the $id as the setting ID.	 *	 * @since 3.4.0	 *	 * @param WP_Customize_Manager $manager Customizer bootstrap instance.	 * @param string               $id      Control ID.	 * @param array                $args    {	 *     Optional. Arguments to override class property defaults.	 *	 *     @type int                  $instance_number Order in which this instance was created in relation	 *                                                 to other instances.	 *     @type WP_Customize_Manager $manager         Customizer bootstrap instance.	 *     @type string               $id              Control ID.	 *     @type array                $settings        All settings tied to the control. If undefined, `$id` will	 *                                                 be used.	 *     @type string               $setting         The primary setting for the control (if there is one).	 *                                                 Default 'default'.	 *     @type int                  $priority        Order priority to load the control. Default 10.	 *     @type string               $section         Section the control belongs to. Default empty.	 *     @type string               $label           Label for the control. Default empty.	 *     @type string               $description     Description for the control. Default empty.	 *     @type array                $choices         List of choices for 'radio' or 'select' type controls, where	 *                                                 values are the keys, and labels are the values.	 *                                                 Default empty array.	 *     @type array                $input_attrs     List of custom input attributes for control output, where	 *                                                 attribute names are the keys and values are the values. Not	 *                                                 used for 'checkbox', 'radio', 'select', 'textarea', or	 *                                                 'dropdown-pages' control types. Default empty array.	 *     @type array                $json            Deprecated. Use WP_Customize_Control::json() instead.	 *     @type string               $type            Control type. Core controls include 'text', 'checkbox',	 *                                                 'textarea', 'radio', 'select', and 'dropdown-pages'. Additional	 *                                                 input types such as 'email', 'url', 'number', 'hidden', and	 *                                                 'date' are supported implicitly. Default 'text'.	 * }	 */	public function __construct( $manager, $id, $args = array() ) {		$keys = array_keys( get_object_vars( $this ) );		foreach ( $keys as $key ) {			if ( isset( $args[ $key ] ) ) {				$this->$key = $args[ $key ];			}		}		$this->manager = $manager;		$this->id      = $id;		if ( empty( $this->active_callback ) ) {			$this->active_callback = array( $this, 'active_callback' );		}		self::$instance_count += 1;		$this->instance_number = self::$instance_count;		// Process settings.		if ( ! isset( $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 );			}		} elseif ( is_string( $this->settings ) ) {			$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() {}	/**	 * Check whether control is active to current Customizer preview.	 *	 * @since 4.0.0	 *	 * @return bool Whether the control is active to the current preview.	 */	final public function active() {		$control = $this;		$active  = call_user_func( $this->active_callback, $this );		/**		 * Filters response of WP_Customize_Control::active().		 *		 * @since 4.0.0		 *		 * @param bool                 $active  Whether the Customizer control is active.		 * @param WP_Customize_Control $control WP_Customize_Control instance.		 */		$active = apply_filters( 'customize_control_active', $active, $control );		return $active;	}	/**	 * Default callback used when invoking WP_Customize_Control::active().	 *	 * Subclasses can override this with their specific logic, or they may	 * provide an 'active_callback' argument to the constructor.	 *	 * @since 4.0.0	 *	 * @return true Always true.	 */	public function active_callback() {		return true;	}	/**	 * 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.	 */	final public 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;		$this->json['priority']       = $this->priority;		$this->json['active']         = $this->active();		$this->json['section']        = $this->section;		$this->json['content']        = $this->get_content();		$this->json['label']          = $this->label;		$this->json['description']    = $this->description;		$this->json['instanceNumber'] = $this->instance_number;		if ( 'dropdown-pages' === $this->type ) {			$this->json['allow_addition'] = $this->allow_addition;		}	}	/**	 * Get the data to export to the client via JSON.	 *	 * @since 4.1.0	 *	 * @return array Array of parameters passed to the JavaScript.	 */	public function json() {		$this->to_json();		return $this->json;	}	/**	 * Checks if the user can use this control.	 *	 * Returns false if the user cannot manipulate one of the associated settings,	 * or if one of the associated settings does not exist. Also returns false if	 * the associated section does not exist or if its capability check returns	 * false.	 *	 * @since 3.4.0	 *	 * @return bool False if theme doesn't support the control or user doesn't have the required permissions, otherwise true.	 */	final public function check_capabilities() {		if ( ! empty( $this->capability ) && ! current_user_can( $this->capability ) ) {			return false;		}		foreach ( $this->settings as $setting ) {			if ( ! $setting || ! $setting->check_capabilities() ) {				return false;			}		}		$section = $this->manager->get_section( $this->section );		if ( isset( $section ) && ! $section->check_capabilities() ) {			return false;		}		return true;	}	/**	 * Get the control's content for insertion into the Customizer pane.	 *	 * @since 4.1.0	 *	 * @return string Contents of the control.	 */	final public function get_content() {		ob_start();		$this->maybe_render();		return trim( ob_get_clean() );	}	/**	 * Check capabilities and render the control.	 *	 * @since 3.4.0	 * @uses WP_Customize_Control::render()	 */	final public 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( array( '[', ']' ), array( '-', '' ), $this->id );		$class = 'customize-control customize-control-' . $this->type;		printf( '<li id="%s" class="%s">', esc_attr( $id ), esc_attr( $class ) );		$this->render_content();		echo '</li>';	}	/**	 * Get the data link attribute for a setting.	 *	 * @since 3.4.0	 * @since 4.9.0 Return a `data-customize-setting-key-link` attribute if a setting is not registered for the supplied setting key.	 *	 * @param string $setting_key	 * @return string Data link parameter, a `data-customize-setting-link` attribute if the `$setting_key` refers to a pre-registered setting,	 *                and a `data-customize-setting-key-link` attribute if the setting is not yet registered.	 */	public function get_link( $setting_key = 'default' ) {		if ( isset( $this->settings[ $setting_key ] ) && $this->settings[ $setting_key ] instanceof WP_Customize_Setting ) {			return 'data-customize-setting-link="' . esc_attr( $this->settings[ $setting_key ]->id ) . '"';		} else {			return 'data-customize-setting-key-link="' . esc_attr( $setting_key ) . '"';		}	}	/**	 * 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 custom attributes for the control's input element.	 *	 * @since 4.0.0	 */	public function input_attrs() {		foreach ( $this->input_attrs as $attr => $value ) {			echo $attr . '="' . esc_attr( $value ) . '" ';		}	}	/**	 * Render the control's content.	 *	 * Allows the content to be overridden without having to rewrite the wrapper in `$this::render()`.	 *	 * Supports basic input types `text`, `checkbox`, `textarea`, `radio`, `select` and `dropdown-pages`.	 * Additional input types such as `email`, `url`, `number`, `hidden` and `date` are supported implicitly.	 *	 * Control content can alternately be rendered in JS. See WP_Customize_Control::print_template().	 *	 * @since 3.4.0	 */	protected function render_content() {		$input_id         = '_customize-input-' . $this->id;		$description_id   = '_customize-description-' . $this->id;		$describedby_attr = ( ! empty( $this->description ) ) ? ' aria-describedby="' . esc_attr( $description_id ) . '" ' : '';		switch ( $this->type ) {			case 'checkbox':				?>				<span class="customize-inside-control-row">					<input						id="<?php echo esc_attr( $input_id ); ?>"						<?php echo $describedby_attr; ?>						type="checkbox"						value="<?php echo esc_attr( $this->value() ); ?>"						<?php $this->link(); ?>						<?php checked( $this->value() ); ?>					/>					<label for="<?php echo esc_attr( $input_id ); ?>"><?php echo esc_html( $this->label ); ?></label>					<?php if ( ! empty( $this->description ) ) : ?>						<span id="<?php echo esc_attr( $description_id ); ?>" class="description customize-control-description"><?php echo $this->description; ?></span>					<?php endif; ?>				</span>				<?php				break;			case 'radio':				if ( empty( $this->choices ) ) {					return;				}				$name = '_customize-radio-' . $this->id;				?>				<?php if ( ! empty( $this->label ) ) : ?>					<span class="customize-control-title"><?php echo esc_html( $this->label ); ?></span>				<?php endif; ?>				<?php if ( ! empty( $this->description ) ) : ?>					<span id="<?php echo esc_attr( $description_id ); ?>" class="description customize-control-description"><?php echo $this->description; ?></span>				<?php endif; ?>				<?php foreach ( $this->choices as $value => $label ) : ?>					<span class="customize-inside-control-row">						<input							id="<?php echo esc_attr( $input_id . '-radio-' . $value ); ?>"							type="radio"							<?php echo $describedby_attr; ?>							value="<?php echo esc_attr( $value ); ?>"							name="<?php echo esc_attr( $name ); ?>"							<?php $this->link(); ?>							<?php checked( $this->value(), $value ); ?>							/>						<label for="<?php echo esc_attr( $input_id . '-radio-' . $value ); ?>"><?php echo esc_html( $label ); ?></label>					</span>				<?php endforeach; ?>				<?php				break;			case 'select':				if ( empty( $this->choices ) ) {					return;				}				?>				<?php if ( ! empty( $this->label ) ) : ?>					<label for="<?php echo esc_attr( $input_id ); ?>" class="customize-control-title"><?php echo esc_html( $this->label ); ?></label>				<?php endif; ?>				<?php if ( ! empty( $this->description ) ) : ?>					<span id="<?php echo esc_attr( $description_id ); ?>" class="description customize-control-description"><?php echo $this->description; ?></span>				<?php endif; ?>				<select id="<?php echo esc_attr( $input_id ); ?>" <?php echo $describedby_attr; ?> <?php $this->link(); ?>>					<?php					foreach ( $this->choices as $value => $label ) {						echo '<option value="' . esc_attr( $value ) . '"' . selected( $this->value(), $value, false ) . '>' . $label . '</option>';					}					?>				</select>				<?php				break;			case 'textarea':				?>				<?php if ( ! empty( $this->label ) ) : ?>					<label for="<?php echo esc_attr( $input_id ); ?>" class="customize-control-title"><?php echo esc_html( $this->label ); ?></label>				<?php endif; ?>				<?php if ( ! empty( $this->description ) ) : ?>					<span id="<?php echo esc_attr( $description_id ); ?>" class="description customize-control-description"><?php echo $this->description; ?></span>				<?php endif; ?>				<textarea					id="<?php echo esc_attr( $input_id ); ?>"					rows="5"					<?php echo $describedby_attr; ?>					<?php $this->input_attrs(); ?>					<?php $this->link(); ?>				><?php echo esc_textarea( $this->value() ); ?></textarea>				<?php				break;			case 'dropdown-pages':				?>				<?php if ( ! empty( $this->label ) ) : ?>					<label for="<?php echo esc_attr( $input_id ); ?>" class="customize-control-title"><?php echo esc_html( $this->label ); ?></label>				<?php endif; ?>				<?php if ( ! empty( $this->description ) ) : ?>					<span id="<?php echo esc_attr( $description_id ); ?>" class="description customize-control-description"><?php echo $this->description; ?></span>				<?php endif; ?>				<?php				$dropdown_name     = '_customize-dropdown-pages-' . $this->id;				$show_option_none  = __( '— Select —' );				$option_none_value = '0';				$dropdown          = wp_dropdown_pages(					array(						'name'              => $dropdown_name,						'echo'              => 0,						'show_option_none'  => $show_option_none,						'option_none_value' => $option_none_value,						'selected'          => $this->value(),					)				);				if ( empty( $dropdown ) ) {					$dropdown  = sprintf( '<select id="%1$s" name="%1$s">', esc_attr( $dropdown_name ) );					$dropdown .= sprintf( '<option value="%1$s">%2$s</option>', esc_attr( $option_none_value ), esc_html( $show_option_none ) );					$dropdown .= '</select>';				}				// Hackily add in the data link parameter.				$dropdown = str_replace( '<select', '<select ' . $this->get_link() . ' id="' . esc_attr( $input_id ) . '" ' . $describedby_attr, $dropdown );				// Even more hacikly add auto-draft page stubs.				// @todo Eventually this should be removed in favor of the pages being injected into the underlying get_pages() call. See <https://github.com/xwp/wp-customize-posts/pull/250>.				$nav_menus_created_posts_setting = $this->manager->get_setting( 'nav_menus_created_posts' );				if ( $nav_menus_created_posts_setting && current_user_can( 'publish_pages' ) ) {					$auto_draft_page_options = '';					foreach ( $nav_menus_created_posts_setting->value() as $auto_draft_page_id ) {						$post = get_post( $auto_draft_page_id );						if ( $post && 'page' === $post->post_type ) {							$auto_draft_page_options .= sprintf( '<option value="%1$s">%2$s</option>', esc_attr( $post->ID ), esc_html( $post->post_title ) );						}					}					if ( $auto_draft_page_options ) {						$dropdown = str_replace( '</select>', $auto_draft_page_options . '</select>', $dropdown );					}				}				echo $dropdown;				?>				<?php if ( $this->allow_addition && current_user_can( 'publish_pages' ) && current_user_can( 'edit_theme_options' ) ) : // Currently tied to menus functionality. ?>					<button type="button" class="button-link add-new-toggle">						<?php						/* translators: %s: Add New Page label. */						printf( __( '+ %s' ), get_post_type_object( 'page' )->labels->add_new_item );						?>					</button>					<div class="new-content-item">						<label for="create-input-<?php echo $this->id; ?>"><span class="screen-reader-text"><?php _e( 'New page title' ); ?></span></label>						<input type="text" id="create-input-<?php echo $this->id; ?>" class="create-item-input" placeholder="<?php esc_attr_e( 'New page title…' ); ?>">						<button type="button" class="button add-content"><?php _e( 'Add' ); ?></button>					</div>				<?php endif; ?>				<?php				break;			default:				?>				<?php if ( ! empty( $this->label ) ) : ?>					<label for="<?php echo esc_attr( $input_id ); ?>" class="customize-control-title"><?php echo esc_html( $this->label ); ?></label>				<?php endif; ?>				<?php if ( ! empty( $this->description ) ) : ?>					<span id="<?php echo esc_attr( $description_id ); ?>" class="description customize-control-description"><?php echo $this->description; ?></span>				<?php endif; ?>				<input					id="<?php echo esc_attr( $input_id ); ?>"					type="<?php echo esc_attr( $this->type ); ?>"					<?php echo $describedby_attr; ?>					<?php $this->input_attrs(); ?>					<?php if ( ! isset( $this->input_attrs['value'] ) ) : ?>						value="<?php echo esc_attr( $this->value() ); ?>"					<?php endif; ?>					<?php $this->link(); ?>					/>				<?php				break;		}	}	/**	 * Render the control's JS template.	 *	 * This function is only run for control types that have been registered with	 * WP_Customize_Manager::register_control_type().	 *	 * In the future, this will also print the template for the control's container	 * element and be override-able.	 *	 * @since 4.1.0	 */	final public function print_template() {		?>		<script type="text/html" id="tmpl-customize-control-<?php echo $this->type; ?>-content">			<?php $this->content_template(); ?>		</script>		<?php	}	/**	 * An Underscore (JS) template for this control's content (but not its container).	 *	 * Class variables for this control class are available in the `data` JS object;	 * export custom variables by overriding WP_Customize_Control::to_json().	 *	 * @see WP_Customize_Control::print_template()	 *	 * @since 4.1.0	 */	protected function content_template() {}}/** * WP_Customize_Color_Control class. */require_once( ABSPATH . WPINC . '/customize/class-wp-customize-color-control.php' );/** * WP_Customize_Media_Control class. */require_once( ABSPATH . WPINC . '/customize/class-wp-customize-media-control.php' );/** * WP_Customize_Upload_Control class. */require_once( ABSPATH . WPINC . '/customize/class-wp-customize-upload-control.php' );/** * WP_Customize_Image_Control class. */require_once( ABSPATH . WPINC . '/customize/class-wp-customize-image-control.php' );/** * WP_Customize_Background_Image_Control class. */require_once( ABSPATH . WPINC . '/customize/class-wp-customize-background-image-control.php' );/** * WP_Customize_Background_Position_Control class. */require_once( ABSPATH . WPINC . '/customize/class-wp-customize-background-position-control.php' );/** * WP_Customize_Cropped_Image_Control class. */require_once( ABSPATH . WPINC . '/customize/class-wp-customize-cropped-image-control.php' );/** * WP_Customize_Site_Icon_Control class. */require_once( ABSPATH . WPINC . '/customize/class-wp-customize-site-icon-control.php' );/** * WP_Customize_Header_Image_Control class. */require_once( ABSPATH . WPINC . '/customize/class-wp-customize-header-image-control.php' );/** * WP_Customize_Theme_Control class. */require_once( ABSPATH . WPINC . '/customize/class-wp-customize-theme-control.php' );/** * WP_Widget_Area_Customize_Control class. */require_once( ABSPATH . WPINC . '/customize/class-wp-widget-area-customize-control.php' );/** * WP_Widget_Form_Customize_Control class. */require_once( ABSPATH . WPINC . '/customize/class-wp-widget-form-customize-control.php' );/** * WP_Customize_Nav_Menu_Control class. */require_once( ABSPATH . WPINC . '/customize/class-wp-customize-nav-menu-control.php' );/** * WP_Customize_Nav_Menu_Item_Control class. */require_once( ABSPATH . WPINC . '/customize/class-wp-customize-nav-menu-item-control.php' );/** * WP_Customize_Nav_Menu_Location_Control class. */require_once( ABSPATH . WPINC . '/customize/class-wp-customize-nav-menu-location-control.php' );/** * WP_Customize_Nav_Menu_Name_Control class. * * As this file is deprecated, it will trigger a deprecation notice if instantiated. In a subsequent * release, the require_once() here will be removed and _deprecated_file() will be called if file is * required at all. * * @deprecated 4.9.0 This file is no longer used due to new menu creation UX. */require_once( ABSPATH . WPINC . '/customize/class-wp-customize-nav-menu-name-control.php' );/** * WP_Customize_Nav_Menu_Locations_Control class. */require_once( ABSPATH . WPINC . '/customize/class-wp-customize-nav-menu-locations-control.php' );/** * WP_Customize_Nav_Menu_Auto_Add_Control class. */require_once( ABSPATH . WPINC . '/customize/class-wp-customize-nav-menu-auto-add-control.php' );/** * WP_Customize_Date_Time_Control class. */require_once( ABSPATH . WPINC . '/customize/class-wp-customize-date-time-control.php' );
 |