wp/wp-includes/class-wp-customize-section.php
changeset 5 5e2f62d02dcd
parent 0 d970ebf37754
child 7 cf61fcea0001
equal deleted inserted replaced
4:346c88efed21 5:5e2f62d02dcd
     1 <?php
     1 <?php
     2 /**
     2 /**
     3  * Customize Section Class.
     3  * WordPress Customize Section classes
     4  *
     4  *
     5  * @package WordPress
     5  * @package WordPress
     6  * @subpackage Customize
     6  * @subpackage Customize
     7  * @since 3.4.0
     7  * @since 3.4.0
     8  */
     8  */
       
     9 
       
    10 /**
       
    11  * Customize Section class.
       
    12  *
       
    13  * A UI container for controls, managed by the WP_Customize_Manager class.
       
    14  *
       
    15  * @since 3.4.0
       
    16  *
       
    17  * @see WP_Customize_Manager
       
    18  */
     9 class WP_Customize_Section {
    19 class WP_Customize_Section {
       
    20 
       
    21 	/**
       
    22 	 * Incremented with each new class instantiation, then stored in $instance_number.
       
    23 	 *
       
    24 	 * Used when sorting two instances whose priorities are equal.
       
    25 	 *
       
    26 	 * @since 4.1.0
       
    27 	 * @access protected
       
    28 	 * @var int
       
    29 	 */
       
    30 	protected static $instance_count = 0;
       
    31 
       
    32 	/**
       
    33 	 * Order in which this instance was created in relation to other instances.
       
    34 	 *
       
    35 	 * @since 4.1.0
       
    36 	 * @access public
       
    37 	 * @var int
       
    38 	 */
       
    39 	public $instance_number;
       
    40 
       
    41 	/**
       
    42 	 * WP_Customize_Manager instance.
       
    43 	 *
       
    44 	 * @since 3.4.0
       
    45 	 * @access public
       
    46 	 * @var WP_Customize_Manager
       
    47 	 */
    10 	public $manager;
    48 	public $manager;
       
    49 
       
    50 	/**
       
    51 	 * Unique identifier.
       
    52 	 *
       
    53 	 * @since 3.4.0
       
    54 	 * @access public
       
    55 	 * @var string
       
    56 	 */
    11 	public $id;
    57 	public $id;
    12 	public $priority       = 10;
    58 
    13 	public $capability     = 'edit_theme_options';
    59 	/**
       
    60 	 * Priority of the section which informs load order of sections.
       
    61 	 *
       
    62 	 * @since 3.4.0
       
    63 	 * @access public
       
    64 	 * @var integer
       
    65 	 */
       
    66 	public $priority = 160;
       
    67 
       
    68 	/**
       
    69 	 * Panel in which to show the section, making it a sub-section.
       
    70 	 *
       
    71 	 * @since 4.0.0
       
    72 	 * @access public
       
    73 	 * @var string
       
    74 	 */
       
    75 	public $panel = '';
       
    76 
       
    77 	/**
       
    78 	 * Capability required for the section.
       
    79 	 *
       
    80 	 * @since 3.4.0
       
    81 	 * @access public
       
    82 	 * @var string
       
    83 	 */
       
    84 	public $capability = 'edit_theme_options';
       
    85 
       
    86 	/**
       
    87 	 * Theme feature support for the section.
       
    88 	 *
       
    89 	 * @since 3.4.0
       
    90 	 * @access public
       
    91 	 * @var string|array
       
    92 	 */
    14 	public $theme_supports = '';
    93 	public $theme_supports = '';
    15 	public $title          = '';
    94 
    16 	public $description    = '';
    95 	/**
       
    96 	 * Title of the section to show in UI.
       
    97 	 *
       
    98 	 * @since 3.4.0
       
    99 	 * @access public
       
   100 	 * @var string
       
   101 	 */
       
   102 	public $title = '';
       
   103 
       
   104 	/**
       
   105 	 * Description to show in the UI.
       
   106 	 *
       
   107 	 * @since 3.4.0
       
   108 	 * @access public
       
   109 	 * @var string
       
   110 	 */
       
   111 	public $description = '';
       
   112 
       
   113 	/**
       
   114 	 * Customizer controls for this section.
       
   115 	 *
       
   116 	 * @since 3.4.0
       
   117 	 * @access public
       
   118 	 * @var array
       
   119 	 */
    17 	public $controls;
   120 	public $controls;
    18 
   121 
    19 	/**
   122 	/**
       
   123 	 * Type of this section.
       
   124 	 *
       
   125 	 * @since 4.1.0
       
   126 	 * @access public
       
   127 	 * @var string
       
   128 	 */
       
   129 	public $type = 'default';
       
   130 
       
   131 	/**
       
   132 	 * Active callback.
       
   133 	 *
       
   134 	 * @since 4.1.0
       
   135 	 * @access public
       
   136 	 *
       
   137 	 * @see WP_Customize_Section::active()
       
   138 	 *
       
   139 	 * @var callable Callback is called with one argument, the instance of
       
   140 	 *               {@see WP_Customize_Section}, and returns bool to indicate
       
   141 	 *               whether the section is active (such as it relates to the URL
       
   142 	 *               currently being previewed).
       
   143 	 */
       
   144 	public $active_callback = '';
       
   145 
       
   146 	/**
    20 	 * Constructor.
   147 	 * Constructor.
    21 	 *
   148 	 *
    22 	 * @since 3.4.0
   149 	 * Any supplied $args override class property defaults.
    23 	 *
   150 	 *
    24 	 * @param WP_Customize_Manager $manager
   151 	 * @since 3.4.0
    25 	 * @param string $id An specific ID of the section.
   152 	 *
    26 	 * @param array $args Section arguments.
   153 	 * @param WP_Customize_Manager $manager Customizer bootstrap instance.
    27 	 */
   154 	 * @param string               $id      An specific ID of the section.
    28 	function __construct( $manager, $id, $args = array() ) {
   155 	 * @param array                $args    Section arguments.
    29 		$keys = array_keys( get_class_vars( __CLASS__ ) );
   156 	 */
       
   157 	public function __construct( $manager, $id, $args = array() ) {
       
   158 		$keys = array_keys( get_object_vars( $this ) );
    30 		foreach ( $keys as $key ) {
   159 		foreach ( $keys as $key ) {
    31 			if ( isset( $args[ $key ] ) )
   160 			if ( isset( $args[ $key ] ) ) {
    32 				$this->$key = $args[ $key ];
   161 				$this->$key = $args[ $key ];
       
   162 			}
    33 		}
   163 		}
    34 
   164 
    35 		$this->manager = $manager;
   165 		$this->manager = $manager;
    36 		$this->id = $id;
   166 		$this->id = $id;
       
   167 		if ( empty( $this->active_callback ) ) {
       
   168 			$this->active_callback = array( $this, 'active_callback' );
       
   169 		}
       
   170 		self::$instance_count += 1;
       
   171 		$this->instance_number = self::$instance_count;
    37 
   172 
    38 		$this->controls = array(); // Users cannot customize the $controls array.
   173 		$this->controls = array(); // Users cannot customize the $controls array.
    39 
   174 	}
    40 		return $this;
   175 
    41 	}
   176 	/**
    42 
   177 	 * Check whether section is active to current Customizer preview.
    43 	/**
   178 	 *
    44 	 * Check if the theme supports the section and check user capabilities.
   179 	 * @since 4.1.0
       
   180 	 * @access public
       
   181 	 *
       
   182 	 * @return bool Whether the section is active to the current preview.
       
   183 	 */
       
   184 	final public function active() {
       
   185 		$section = $this;
       
   186 		$active = call_user_func( $this->active_callback, $this );
       
   187 
       
   188 		/**
       
   189 		 * Filter response of {@see WP_Customize_Section::active()}.
       
   190 		 *
       
   191 		 * @since 4.1.0
       
   192 		 *
       
   193 		 * @param bool                 $active  Whether the Customizer section is active.
       
   194 		 * @param WP_Customize_Section $section {@see WP_Customize_Section} instance.
       
   195 		 */
       
   196 		$active = apply_filters( 'customize_section_active', $active, $section );
       
   197 
       
   198 		return $active;
       
   199 	}
       
   200 
       
   201 	/**
       
   202 	 * Default callback used when invoking {@see WP_Customize_Section::active()}.
       
   203 	 *
       
   204 	 * Subclasses can override this with their specific logic, or they may provide
       
   205 	 * an 'active_callback' argument to the constructor.
       
   206 	 *
       
   207 	 * @since 4.1.0
       
   208 	 * @access public
       
   209 	 *
       
   210 	 * @return bool Always true.
       
   211 	 */
       
   212 	public function active_callback() {
       
   213 		return true;
       
   214 	}
       
   215 
       
   216 	/**
       
   217 	 * Gather the parameters passed to client JavaScript via JSON.
       
   218 	 *
       
   219 	 * @since 4.1.0
       
   220 	 *
       
   221 	 * @return array The array to be exported to the client as JSON.
       
   222 	 */
       
   223 	public function json() {
       
   224 		$array = wp_array_slice_assoc( (array) $this, array( 'title', 'description', 'priority', 'panel', 'type' ) );
       
   225 		$array['content'] = $this->get_content();
       
   226 		$array['active'] = $this->active();
       
   227 		$array['instanceNumber'] = $this->instance_number;
       
   228 		return $array;
       
   229 	}
       
   230 
       
   231 	/**
       
   232 	 * Checks required user capabilities and whether the theme has the
       
   233 	 * feature support required by the section.
    45 	 *
   234 	 *
    46 	 * @since 3.4.0
   235 	 * @since 3.4.0
    47 	 *
   236 	 *
    48 	 * @return bool False if theme doesn't support the section or user doesn't have the capability.
   237 	 * @return bool False if theme doesn't support the section or user doesn't have the capability.
    49 	 */
   238 	 */
    50 	public final function check_capabilities() {
   239 	final public function check_capabilities() {
    51 		if ( $this->capability && ! call_user_func_array( 'current_user_can', (array) $this->capability ) )
   240 		if ( $this->capability && ! call_user_func_array( 'current_user_can', (array) $this->capability ) ) {
    52 			return false;
   241 			return false;
    53 
   242 		}
    54 		if ( $this->theme_supports && ! call_user_func_array( 'current_theme_supports', (array) $this->theme_supports ) )
   243 
       
   244 		if ( $this->theme_supports && ! call_user_func_array( 'current_theme_supports', (array) $this->theme_supports ) ) {
    55 			return false;
   245 			return false;
       
   246 		}
    56 
   247 
    57 		return true;
   248 		return true;
    58 	}
   249 	}
    59 
   250 
    60 	/**
   251 	/**
       
   252 	 * Get the section's content template for insertion into the Customizer pane.
       
   253 	 *
       
   254 	 * @since 4.1.0
       
   255 	 *
       
   256 	 * @return string Contents of the section.
       
   257 	 */
       
   258 	final public function get_content() {
       
   259 		ob_start();
       
   260 		$this->maybe_render();
       
   261 		$template = trim( ob_get_contents() );
       
   262 		ob_end_clean();
       
   263 		return $template;
       
   264 	}
       
   265 
       
   266 	/**
    61 	 * Check capabilities and render the section.
   267 	 * Check capabilities and render the section.
    62 	 *
   268 	 *
    63 	 * @since 3.4.0
   269 	 * @since 3.4.0
    64 	 */
   270 	 */
    65 	public final function maybe_render() {
   271 	final public function maybe_render() {
    66 		if ( ! $this->check_capabilities() )
   272 		if ( ! $this->check_capabilities() ) {
    67 			return;
   273 			return;
    68 
   274 		}
       
   275 
       
   276 		/**
       
   277 		 * Fires before rendering a Customizer section.
       
   278 		 *
       
   279 		 * @since 3.4.0
       
   280 		 *
       
   281 		 * @param WP_Customize_Section $this WP_Customize_Section instance.
       
   282 		 */
    69 		do_action( 'customize_render_section', $this );
   283 		do_action( 'customize_render_section', $this );
    70 		do_action( 'customize_render_section_' . $this->id );
   284 		/**
       
   285 		 * Fires before rendering a specific Customizer section.
       
   286 		 *
       
   287 		 * The dynamic portion of the hook name, `$this->id`, refers to the ID
       
   288 		 * of the specific Customizer section to be rendered.
       
   289 		 *
       
   290 		 * @since 3.4.0
       
   291 		 */
       
   292 		do_action( "customize_render_section_{$this->id}" );
    71 
   293 
    72 		$this->render();
   294 		$this->render();
    73 	}
   295 	}
    74 
   296 
    75 	/**
   297 	/**
    76 	 * Render the section.
   298 	 * Render the section, and the controls that have been added to it.
    77 	 *
   299 	 *
    78 	 * @since 3.4.0
   300 	 * @since 3.4.0
    79 	 */
   301 	 */
    80 	protected function render() {
   302 	protected function render() {
       
   303 		$classes = 'accordion-section control-section control-section-' . $this->type;
    81 		?>
   304 		?>
    82 		<li id="accordion-section-<?php echo esc_attr( $this->id ); ?>" class="control-section accordion-section">
   305 		<li id="accordion-section-<?php echo esc_attr( $this->id ); ?>" class="<?php echo esc_attr( $classes ); ?>">
    83 			<h3 class="accordion-section-title" tabindex="0"><?php echo esc_html( $this->title ); ?></h3>
   306 			<h3 class="accordion-section-title" tabindex="0">
       
   307 				<?php echo esc_html( $this->title ); ?>
       
   308 				<span class="screen-reader-text"><?php _e( 'Press return or enter to expand' ); ?></span>
       
   309 			</h3>
    84 			<ul class="accordion-section-content">
   310 			<ul class="accordion-section-content">
    85 				<?php if ( ! empty( $this->description ) ) : ?>
   311 				<?php if ( ! empty( $this->description ) ) : ?>
    86 				<li><p class="description"><?php echo $this->description; ?></p></li>
   312 					<li class="customize-section-description-container">
       
   313 						<p class="description customize-section-description"><?php echo $this->description; ?></p>
       
   314 					</li>
    87 				<?php endif; ?>
   315 				<?php endif; ?>
    88 				<?php
       
    89 				foreach ( $this->controls as $control )
       
    90 					$control->maybe_render();
       
    91 				?>
       
    92 			</ul>
   316 			</ul>
    93 		</li>
   317 		</li>
    94 		<?php
   318 		<?php
    95 	}
   319 	}
    96 }
   320 }
       
   321 
       
   322 /**
       
   323  * Customize Themes Section class.
       
   324  *
       
   325  * A UI container for theme controls, which behaves like a backwards Panel.
       
   326  *
       
   327  * @since 4.2.0
       
   328  *
       
   329  * @see WP_Customize_Section
       
   330  */
       
   331 class WP_Customize_Themes_Section extends WP_Customize_Section {
       
   332 
       
   333 	/**
       
   334 	 * Customize section type.
       
   335 	 *
       
   336 	 * @since 4.2.0
       
   337 	 * @access public
       
   338 	 * @var string
       
   339 	 */
       
   340 	public $type = 'themes';
       
   341 
       
   342 	/**
       
   343 	 * Render the themes section, which behaves like a panel.
       
   344 	 *
       
   345 	 * @since 4.2.0
       
   346 	 * @access protected
       
   347 	 */
       
   348 	protected function render() {
       
   349 		$classes = 'accordion-section control-section control-section-' . $this->type;
       
   350 		?>
       
   351 		<li id="accordion-section-<?php echo esc_attr( $this->id ); ?>" class="<?php echo esc_attr( $classes ); ?>">
       
   352 			<h3 class="accordion-section-title">
       
   353 				<?php
       
   354 				if ( $this->manager->is_theme_active() ) {
       
   355 					/* translators: %s: theme name */
       
   356 					printf( __( '<span>Active theme</span> %s' ), $this->title );
       
   357 				} else {
       
   358 					/* translators: %s: theme name */
       
   359 					printf( __( '<span>Previewing theme</span> %s' ), $this->title );
       
   360 				}
       
   361 				?>
       
   362 
       
   363 				<button type="button" class="button change-theme"><?php _ex( 'Change', 'theme' ); ?></button>
       
   364 			</h3>
       
   365 			<div class="customize-themes-panel control-panel-content themes-php">
       
   366 				<h2>
       
   367 					<?php _e( 'Themes' ); ?>
       
   368 					<span class="title-count theme-count"><?php echo count( $this->controls ) + 1 /* Active theme */; ?></span>
       
   369 				</h2>
       
   370 
       
   371 				<h3 class="accordion-section-title customize-section-title">
       
   372 					<?php
       
   373 					if ( $this->manager->is_theme_active() ) {
       
   374 						/* translators: %s: theme name */
       
   375 						printf( __( '<span>Active theme</span> %s' ), $this->title );
       
   376 					} else {
       
   377 						/* translators: %s: theme name */
       
   378 						printf( __( '<span>Previewing theme</span> %s' ), $this->title );
       
   379 					}
       
   380 					?>
       
   381 					<button type="button" class="button customize-theme"><?php _e( 'Customize' ); ?></button>
       
   382 				</h3>
       
   383 
       
   384 				<div class="theme-overlay" tabindex="0" role="dialog" aria-label="<?php esc_attr_e( 'Theme Details' ); ?>"></div>
       
   385 
       
   386 				<div id="customize-container"></div>
       
   387 				<?php if ( count( $this->controls ) > 4 ) : ?>
       
   388 					<p><label for="themes-filter">
       
   389 						<span class="screen-reader-text"><?php _e( 'Search installed themes...' ); ?></span>
       
   390 						<input type="text" id="themes-filter" placeholder="<?php esc_attr_e( 'Search installed themes...' ); ?>" />
       
   391 					</label></p>
       
   392 				<?php endif; ?>
       
   393 				<div class="theme-browser rendered">
       
   394 					<ul class="themes accordion-section-content">
       
   395 					</ul>
       
   396 				</div>
       
   397 			</div>
       
   398 		</li>
       
   399 <?php }
       
   400 }
       
   401 
       
   402 /**
       
   403  * Customizer section representing widget area (sidebar).
       
   404  *
       
   405  * @since 4.1.0
       
   406  *
       
   407  * @see WP_Customize_Section
       
   408  */
       
   409 class WP_Customize_Sidebar_Section extends WP_Customize_Section {
       
   410 
       
   411 	/**
       
   412 	 * Type of this section.
       
   413 	 *
       
   414 	 * @since 4.1.0
       
   415 	 * @access public
       
   416 	 * @var string
       
   417 	 */
       
   418 	public $type = 'sidebar';
       
   419 
       
   420 	/**
       
   421 	 * Unique identifier.
       
   422 	 *
       
   423 	 * @since 4.1.0
       
   424 	 * @access public
       
   425 	 * @var string
       
   426 	 */
       
   427 	public $sidebar_id;
       
   428 
       
   429 	/**
       
   430 	 * Gather the parameters passed to client JavaScript via JSON.
       
   431 	 *
       
   432 	 * @since 4.1.0
       
   433 	 *
       
   434 	 * @return array The array to be exported to the client as JSON.
       
   435 	 */
       
   436 	public function json() {
       
   437 		$json = parent::json();
       
   438 		$json['sidebarId'] = $this->sidebar_id;
       
   439 		return $json;
       
   440 	}
       
   441 
       
   442 	/**
       
   443 	 * Whether the current sidebar is rendered on the page.
       
   444 	 *
       
   445 	 * @since 4.1.0
       
   446 	 * @access public
       
   447 	 *
       
   448 	 * @return bool Whether sidebar is rendered.
       
   449 	 */
       
   450 	public function active_callback() {
       
   451 		return $this->manager->widgets->is_sidebar_rendered( $this->sidebar_id );
       
   452 	}
       
   453 }