CARVIEW |
Select Language
HTTP/2 200
server: nginx
date: Sat, 11 Oct 2025 15:28:57 GMT
content-type: text/html;charset=utf-8
vary: Accept-Encoding
cache-control: must-revalidate
alt-svc: h3=":443"; ma=86400
x-nc: MISS
content-encoding: gzip
class-wp-customize-control.php in trunk/src/wp-includes
– WordPress Trac
source:
trunk/src/wp-includes/class-wp-customize-control.php
source:
trunk/src/wp-includes/class-wp-customize-control.php
Last change on this file was 60715, checked in by joedolson, 5 weeks ago | |
---|---|
Customizer: Accessible errors when adding new pages.
When setting the home page settings or dynamically adding new pages in the menu manager, the error messages didn't meet accessibility standards.
Add a screen reader announcement, a visible notification, and standardize the error styles.
Props dilipbheda, dlh, celloexpressions, joedolson, jeremiahbratton, shailu25. |
|
|
|
File size: 25.5 KB |
Line | |
---|---|
1 | <?php |
2 | /** |
3 | * WordPress Customize Control classes |
4 | * |
5 | * @package WordPress |
6 | * @subpackage Customize |
7 | * @since 3.4.0 |
8 | */ |
9 | |
10 | // Don't load directly. |
11 | if ( ! defined( 'ABSPATH' ) ) { |
12 | die( '-1' ); |
13 | } |
14 | |
15 | /** |
16 | * Customize Control class. |
17 | * |
18 | * @since 3.4.0 |
19 | */ |
20 | #[AllowDynamicProperties] |
21 | class WP_Customize_Control { |
22 | |
23 | /** |
24 | * Incremented with each new class instantiation, then stored in $instance_number. |
25 | * |
26 | * Used when sorting two instances whose priorities are equal. |
27 | * |
28 | * @since 4.1.0 |
29 | * @var int |
30 | */ |
31 | protected static $instance_count = 0; |
32 | |
33 | /** |
34 | * Order in which this instance was created in relation to other instances. |
35 | * |
36 | * @since 4.1.0 |
37 | * @var int |
38 | */ |
39 | public $instance_number; |
40 | |
41 | /** |
42 | * Customizer manager. |
43 | * |
44 | * @since 3.4.0 |
45 | * @var WP_Customize_Manager |
46 | */ |
47 | public $manager; |
48 | |
49 | /** |
50 | * Control ID. |
51 | * |
52 | * @since 3.4.0 |
53 | * @var string |
54 | */ |
55 | public $id; |
56 | |
57 | /** |
58 | * All settings tied to the control. |
59 | * |
60 | * @since 3.4.0 |
61 | * @var array |
62 | */ |
63 | public $settings; |
64 | |
65 | /** |
66 | * The primary setting for the control (if there is one). |
67 | * |
68 | * @since 3.4.0 |
69 | * @var string|WP_Customize_Setting|null |
70 | */ |
71 | public $setting = 'default'; |
72 | |
73 | /** |
74 | * Capability required to use this control. |
75 | * |
76 | * Normally this is empty and the capability is derived from the capabilities |
77 | * of the associated `$settings`. |
78 | * |
79 | * @since 4.5.0 |
80 | * @var string |
81 | */ |
82 | public $capability; |
83 | |
84 | /** |
85 | * Order priority to load the control in Customizer. |
86 | * |
87 | * @since 3.4.0 |
88 | * @var int |
89 | */ |
90 | public $priority = 10; |
91 | |
92 | /** |
93 | * Section the control belongs to. |
94 | * |
95 | * @since 3.4.0 |
96 | * @var string |
97 | */ |
98 | public $section = ''; |
99 | |
100 | /** |
101 | * Label for the control. |
102 | * |
103 | * @since 3.4.0 |
104 | * @var string |
105 | */ |
106 | public $label = ''; |
107 | |
108 | /** |
109 | * Description for the control. |
110 | * |
111 | * @since 4.0.0 |
112 | * @var string |
113 | */ |
114 | public $description = ''; |
115 | |
116 | /** |
117 | * List of choices for 'radio' or 'select' type controls, where values are the keys, and labels are the values. |
118 | * |
119 | * @since 3.4.0 |
120 | * @var array |
121 | */ |
122 | public $choices = array(); |
123 | |
124 | /** |
125 | * List of custom input attributes for control output, where attribute names are the keys and values are the values. |
126 | * |
127 | * Not used for 'checkbox', 'radio', 'select', or 'dropdown-pages' control types. |
128 | * |
129 | * @since 4.0.0 |
130 | * @var array |
131 | */ |
132 | public $input_attrs = array(); |
133 | |
134 | /** |
135 | * Show UI for adding new content, currently only used for the dropdown-pages control. |
136 | * |
137 | * @since 4.7.0 |
138 | * @var bool |
139 | */ |
140 | public $allow_addition = false; |
141 | |
142 | /** |
143 | * @deprecated It is better to just call the json() method |
144 | * @since 3.4.0 |
145 | * @var array |
146 | */ |
147 | public $json = array(); |
148 | |
149 | /** |
150 | * Control's Type. |
151 | * |
152 | * @since 3.4.0 |
153 | * @var string |
154 | */ |
155 | public $type = 'text'; |
156 | |
157 | /** |
158 | * Callback. |
159 | * |
160 | * @since 4.0.0 |
161 | * |
162 | * @see WP_Customize_Control::active() |
163 | * |
164 | * @var callable Callback is called with one argument, the instance of |
165 | * WP_Customize_Control, and returns bool to indicate whether |
166 | * the control is active (such as it relates to the URL |
167 | * currently being previewed). |
168 | */ |
169 | public $active_callback = ''; |
170 | |
171 | /** |
172 | * Constructor. |
173 | * |
174 | * Supplied `$args` override class property defaults. |
175 | * |
176 | * If `$args['settings']` is not defined, use the `$id` as the setting ID. |
177 | * |
178 | * @since 3.4.0 |
179 | * |
180 | * @param WP_Customize_Manager $manager Customizer bootstrap instance. |
181 | * @param string $id Control ID. |
182 | * @param array $args { |
183 | * Optional. Array of properties for the new Control object. Default empty array. |
184 | * |
185 | * @type int $instance_number Order in which this instance was created in relation |
186 | * to other instances. |
187 | * @type WP_Customize_Manager $manager Customizer bootstrap instance. |
188 | * @type string $id Control ID. |
189 | * @type array $settings All settings tied to the control. If undefined, `$id` will |
190 | * be used. |
191 | * @type string $setting The primary setting for the control (if there is one). |
192 | * Default 'default'. |
193 | * @type string $capability Capability required to use this control. Normally this is empty |
194 | * and the capability is derived from `$settings`. |
195 | * @type int $priority Order priority to load the control. Default 10. |
196 | * @type string $section Section the control belongs to. Default empty. |
197 | * @type string $label Label for the control. Default empty. |
198 | * @type string $description Description for the control. Default empty. |
199 | * @type array $choices List of choices for 'radio' or 'select' type controls, where |
200 | * values are the keys, and labels are the values. |
201 | * Default empty array. |
202 | * @type array $input_attrs List of custom input attributes for control output, where |
203 | * attribute names are the keys and values are the values. Not |
204 | * used for 'checkbox', 'radio', 'select', or 'dropdown-pages' |
205 | * control types. Default empty array. |
206 | * @type bool $allow_addition Show UI for adding new content, currently only used for the |
207 | * dropdown-pages control. Default false. |
208 | * @type array $json Deprecated. Use WP_Customize_Control::json() instead. |
209 | * @type string $type Control type. Core controls include 'text', 'checkbox', |
210 | * 'textarea', 'radio', 'select', and 'dropdown-pages'. Additional |
211 | * input types such as 'email', 'url', 'number', 'hidden', and |
212 | * 'date' are supported implicitly. Default 'text'. |
213 | * @type callable $active_callback Active callback. |
214 | * } |
215 | */ |
216 | public function __construct( $manager, $id, $args = array() ) { |
217 | $keys = array_keys( get_object_vars( $this ) ); |
218 | foreach ( $keys as $key ) { |
219 | if ( isset( $args[ $key ] ) ) { |
220 | $this->$key = $args[ $key ]; |
221 | } |
222 | } |
223 | |
224 | $this->manager = $manager; |
225 | $this->id = $id; |
226 | if ( empty( $this->active_callback ) ) { |
227 | $this->active_callback = array( $this, 'active_callback' ); |
228 | } |
229 | self::$instance_count += 1; |
230 | $this->instance_number = self::$instance_count; |
231 | |
232 | // Process settings. |
233 | if ( ! isset( $this->settings ) ) { |
234 | $this->settings = $id; |
235 | } |
236 | |
237 | $settings = array(); |
238 | if ( is_array( $this->settings ) ) { |
239 | foreach ( $this->settings as $key => $setting ) { |
240 | $settings[ $key ] = $this->manager->get_setting( $setting ); |
241 | } |
242 | } elseif ( is_string( $this->settings ) ) { |
243 | $this->setting = $this->manager->get_setting( $this->settings ); |
244 | $settings['default'] = $this->setting; |
245 | } |
246 | $this->settings = $settings; |
247 | } |
248 | |
249 | /** |
250 | * Enqueues control related scripts/styles. |
251 | * |
252 | * @since 3.4.0 |
253 | */ |
254 | public function enqueue() {} |
255 | |
256 | /** |
257 | * Checks whether control is active to current Customizer preview. |
258 | * |
259 | * @since 4.0.0 |
260 | * |
261 | * @return bool Whether the control is active to the current preview. |
262 | */ |
263 | final public function active() { |
264 | $control = $this; |
265 | $active = call_user_func( $this->active_callback, $this ); |
266 | |
267 | /** |
268 | * Filters response of WP_Customize_Control::active(). |
269 | * |
270 | * @since 4.0.0 |
271 | * |
272 | * @param bool $active Whether the Customizer control is active. |
273 | * @param WP_Customize_Control $control WP_Customize_Control instance. |
274 | */ |
275 | $active = apply_filters( 'customize_control_active', $active, $control ); |
276 | |
277 | return $active; |
278 | } |
279 | |
280 | /** |
281 | * Default callback used when invoking WP_Customize_Control::active(). |
282 | * |
283 | * Subclasses can override this with their specific logic, or they may |
284 | * provide an 'active_callback' argument to the constructor. |
285 | * |
286 | * @since 4.0.0 |
287 | * |
288 | * @return true Always true. |
289 | */ |
290 | public function active_callback() { |
291 | return true; |
292 | } |
293 | |
294 | /** |
295 | * Fetches a setting's value. |
296 | * Grabs the main setting by default. |
297 | * |
298 | * @since 3.4.0 |
299 | * |
300 | * @param string $setting_key |
301 | * @return mixed The requested setting's value, if the setting exists. |
302 | */ |
303 | final public function value( $setting_key = 'default' ) { |
304 | if ( isset( $this->settings[ $setting_key ] ) ) { |
305 | return $this->settings[ $setting_key ]->value(); |
306 | } |
307 | } |
308 | |
309 | /** |
310 | * Refreshes the parameters passed to the JavaScript via JSON. |
311 | * |
312 | * @since 3.4.0 |
313 | */ |
314 | public function to_json() { |
315 | $this->json['settings'] = array(); |
316 | foreach ( $this->settings as $key => $setting ) { |
317 | $this->json['settings'][ $key ] = $setting->id; |
318 | } |
319 | |
320 | $this->json['type'] = $this->type; |
321 | $this->json['priority'] = $this->priority; |
322 | $this->json['active'] = $this->active(); |
323 | $this->json['section'] = $this->section; |
324 | $this->json['content'] = $this->get_content(); |
325 | $this->json['label'] = $this->label; |
326 | $this->json['description'] = $this->description; |
327 | $this->json['instanceNumber'] = $this->instance_number; |
328 | |
329 | if ( 'dropdown-pages' === $this->type ) { |
330 | $this->json['allow_addition'] = $this->allow_addition; |
331 | } |
332 | } |
333 | |
334 | /** |
335 | * Gets the data to export to the client via JSON. |
336 | * |
337 | * @since 4.1.0 |
338 | * |
339 | * @return array Array of parameters passed to the JavaScript. |
340 | */ |
341 | public function json() { |
342 | $this->to_json(); |
343 | return $this->json; |
344 | } |
345 | |
346 | /** |
347 | * Checks if the user can use this control. |
348 | * |
349 | * Returns false if the user cannot manipulate one of the associated settings, |
350 | * or if one of the associated settings does not exist. Also returns false if |
351 | * the associated section does not exist or if its capability check returns |
352 | * false. |
353 | * |
354 | * @since 3.4.0 |
355 | * |
356 | * @return bool False if theme doesn't support the control or user doesn't have the required permissions, otherwise true. |
357 | */ |
358 | final public function check_capabilities() { |
359 | if ( ! empty( $this->capability ) && ! current_user_can( $this->capability ) ) { |
360 | return false; |
361 | } |
362 | |
363 | foreach ( $this->settings as $setting ) { |
364 | if ( ! $setting || ! $setting->check_capabilities() ) { |
365 | return false; |
366 | } |
367 | } |
368 | |
369 | $section = $this->manager->get_section( $this->section ); |
370 | if ( isset( $section ) && ! $section->check_capabilities() ) { |
371 | return false; |
372 | } |
373 | |
374 | return true; |
375 | } |
376 | |
377 | /** |
378 | * Gets the control's content for insertion into the Customizer pane. |
379 | * |
380 | * @since 4.1.0 |
381 | * |
382 | * @return string Contents of the control. |
383 | */ |
384 | final public function get_content() { |
385 | ob_start(); |
386 | $this->maybe_render(); |
387 | return trim( ob_get_clean() ); |
388 | } |
389 | |
390 | /** |
391 | * Checks capabilities and render the control. |
392 | * |
393 | * @since 3.4.0 |
394 | * @uses WP_Customize_Control::render() |
395 | */ |
396 | final public function maybe_render() { |
397 | if ( ! $this->check_capabilities() ) { |
398 | return; |
399 | } |
400 | |
401 | /** |
402 | * Fires just before the current Customizer control is rendered. |
403 | * |
404 | * @since 3.4.0 |
405 | * |
406 | * @param WP_Customize_Control $control WP_Customize_Control instance. |
407 | */ |
408 | do_action( 'customize_render_control', $this ); |
409 | |
410 | /** |
411 | * Fires just before a specific Customizer control is rendered. |
412 | * |
413 | * The dynamic portion of the hook name, `$this->id`, refers to |
414 | * the control ID. |
415 | * |
416 | * @since 3.4.0 |
417 | * |
418 | * @param WP_Customize_Control $control WP_Customize_Control instance. |
419 | */ |
420 | do_action( "customize_render_control_{$this->id}", $this ); |
421 | |
422 | $this->render(); |
423 | } |
424 | |
425 | /** |
426 | * Renders the control wrapper and calls $this->render_content() for the internals. |
427 | * |
428 | * @since 3.4.0 |
429 | */ |
430 | protected function render() { |
431 | $id = 'customize-control-' . str_replace( array( '[', ']' ), array( '-', '' ), $this->id ); |
432 | $class = 'customize-control customize-control-' . $this->type; |
433 | |
434 | printf( '<li id="%s" class="%s">', esc_attr( $id ), esc_attr( $class ) ); |
435 | $this->render_content(); |
436 | echo '</li>'; |
437 | } |
438 | |
439 | /** |
440 | * Gets the data link attribute for a setting. |
441 | * |
442 | * @since 3.4.0 |
443 | * @since 4.9.0 Return a `data-customize-setting-key-link` attribute if a setting is not registered for the supplied setting key. |
444 | * |
445 | * @param string $setting_key |
446 | * @return string Data link parameter, a `data-customize-setting-link` attribute if the `$setting_key` refers |
447 | * to a pre-registered setting, and a `data-customize-setting-key-link` attribute if the setting |
448 | * is not yet registered. |
449 | */ |
450 | public function get_link( $setting_key = 'default' ) { |
451 | if ( isset( $this->settings[ $setting_key ] ) && $this->settings[ $setting_key ] instanceof WP_Customize_Setting ) { |
452 | return 'data-customize-setting-link="' . esc_attr( $this->settings[ $setting_key ]->id ) . '"'; |
453 | } else { |
454 | return 'data-customize-setting-key-link="' . esc_attr( $setting_key ) . '"'; |
455 | } |
456 | } |
457 | |
458 | /** |
459 | * Renders the data link attribute for the control's input element. |
460 | * |
461 | * @since 3.4.0 |
462 | * @uses WP_Customize_Control::get_link() |
463 | * |
464 | * @param string $setting_key Default 'default'. |
465 | */ |
466 | public function link( $setting_key = 'default' ) { |
467 | echo $this->get_link( $setting_key ); |
468 | } |
469 | |
470 | /** |
471 | * Renders the custom attributes for the control's input element. |
472 | * |
473 | * @since 4.0.0 |
474 | */ |
475 | public function input_attrs() { |
476 | foreach ( $this->input_attrs as $attr => $value ) { |
477 | echo $attr . '="' . esc_attr( $value ) . '" '; |
478 | } |
479 | } |
480 | |
481 | /** |
482 | * Renders the control's content. |
483 | * |
484 | * Allows the content to be overridden without having to rewrite the wrapper in `$this::render()`. |
485 | * |
486 | * Supports basic input types `text`, `checkbox`, `textarea`, `radio`, `select` and `dropdown-pages`. |
487 | * Additional input types such as `email`, `url`, `number`, `hidden` and `date` are supported implicitly. |
488 | * |
489 | * Control content can alternately be rendered in JS. See WP_Customize_Control::print_template(). |
490 | * |
491 | * @since 3.4.0 |
492 | */ |
493 | protected function render_content() { |
494 | $input_id = '_customize-input-' . $this->id; |
495 | $description_id = '_customize-description-' . $this->id; |
496 | $describedby_attr = ( ! empty( $this->description ) ) ? ' aria-describedby="' . esc_attr( $description_id ) . '" ' : ''; |
497 | switch ( $this->type ) { |
498 | case 'checkbox': |
499 | ?> |
500 | <span class="customize-inside-control-row"> |
501 | <input |
502 | id="<?php echo esc_attr( $input_id ); ?>" |
503 | <?php echo $describedby_attr; ?> |
504 | type="checkbox" |
505 | value="<?php echo esc_attr( $this->value() ); ?>" |
506 | <?php $this->link(); ?> |
507 | <?php checked( $this->value() ); ?> |
508 | /> |
509 | <label for="<?php echo esc_attr( $input_id ); ?>"><?php echo esc_html( $this->label ); ?></label> |
510 | <?php if ( ! empty( $this->description ) ) : ?> |
511 | <span id="<?php echo esc_attr( $description_id ); ?>" class="description customize-control-description"><?php echo $this->description; ?></span> |
512 | <?php endif; ?> |
513 | </span> |
514 | <?php |
515 | break; |
516 | case 'radio': |
517 | if ( empty( $this->choices ) ) { |
518 | return; |
519 | } |
520 | |
521 | $name = '_customize-radio-' . $this->id; |
522 | ?> |
523 | <?php if ( ! empty( $this->label ) ) : ?> |
524 | <span class="customize-control-title"><?php echo esc_html( $this->label ); ?></span> |
525 | <?php endif; ?> |
526 | <?php if ( ! empty( $this->description ) ) : ?> |
527 | <span id="<?php echo esc_attr( $description_id ); ?>" class="description customize-control-description"><?php echo $this->description; ?></span> |
528 | <?php endif; ?> |
529 | |
530 | <?php foreach ( $this->choices as $value => $label ) : ?> |
531 | <span class="customize-inside-control-row"> |
532 | <input |
533 | id="<?php echo esc_attr( $input_id . '-radio-' . $value ); ?>" |
534 | type="radio" |
535 | <?php echo $describedby_attr; ?> |
536 | value="<?php echo esc_attr( $value ); ?>" |
537 | name="<?php echo esc_attr( $name ); ?>" |
538 | <?php $this->link(); ?> |
539 | <?php checked( $this->value(), $value ); ?> |
540 | /> |
541 | <label for="<?php echo esc_attr( $input_id . '-radio-' . $value ); ?>"><?php echo esc_html( $label ); ?></label> |
542 | </span> |
543 | <?php endforeach; ?> |
544 | <?php |
545 | break; |
546 | case 'select': |
547 | if ( empty( $this->choices ) ) { |
548 | return; |
549 | } |
550 | |
551 | ?> |
552 | <?php if ( ! empty( $this->label ) ) : ?> |
553 | <label for="<?php echo esc_attr( $input_id ); ?>" class="customize-control-title"><?php echo esc_html( $this->label ); ?></label> |
554 | <?php endif; ?> |
555 | <?php if ( ! empty( $this->description ) ) : ?> |
556 | <span id="<?php echo esc_attr( $description_id ); ?>" class="description customize-control-description"><?php echo $this->description; ?></span> |
557 | <?php endif; ?> |
558 | |
559 | <select id="<?php echo esc_attr( $input_id ); ?>" <?php echo $describedby_attr; ?> <?php $this->link(); ?>> |
560 | <?php |
561 | foreach ( $this->choices as $value => $label ) { |
562 | echo '<option value="' . esc_attr( $value ) . '"' . selected( $this->value(), $value, false ) . '>' . esc_html( $label ) . '</option>'; |
563 | } |
564 | ?> |
565 | </select> |
566 | <?php |
567 | break; |
568 | case 'textarea': |
569 | if ( ! array_key_exists( 'rows', $this->input_attrs ) ) { |
570 | $this->input_attrs['rows'] = 5; |
571 | } |
572 | ?> |
573 | <?php if ( ! empty( $this->label ) ) : ?> |
574 | <label for="<?php echo esc_attr( $input_id ); ?>" class="customize-control-title"><?php echo esc_html( $this->label ); ?></label> |
575 | <?php endif; ?> |
576 | <?php if ( ! empty( $this->description ) ) : ?> |
577 | <span id="<?php echo esc_attr( $description_id ); ?>" class="description customize-control-description"><?php echo $this->description; ?></span> |
578 | <?php endif; ?> |
579 | <textarea |
580 | id="<?php echo esc_attr( $input_id ); ?>" |
581 | <?php echo $describedby_attr; ?> |
582 | <?php $this->input_attrs(); ?> |
583 | <?php $this->link(); ?> |
584 | ><?php echo esc_textarea( $this->value() ); ?></textarea> |
585 | <?php |
586 | break; |
587 | case 'dropdown-pages': |
588 | ?> |
589 | <?php if ( ! empty( $this->label ) ) : ?> |
590 | <label for="<?php echo esc_attr( $input_id ); ?>" class="customize-control-title"><?php echo esc_html( $this->label ); ?></label> |
591 | <?php endif; ?> |
592 | <?php if ( ! empty( $this->description ) ) : ?> |
593 | <span id="<?php echo esc_attr( $description_id ); ?>" class="description customize-control-description"><?php echo $this->description; ?></span> |
594 | <?php endif; ?> |
595 | |
596 | <?php |
597 | $dropdown_name = '_customize-dropdown-pages-' . $this->id; |
598 | $show_option_none = __( '— Select —' ); |
599 | $option_none_value = '0'; |
600 | $dropdown = wp_dropdown_pages( |
601 | array( |
602 | 'name' => $dropdown_name, |
603 | 'echo' => 0, |
604 | 'show_option_none' => $show_option_none, |
605 | 'option_none_value' => $option_none_value, |
606 | 'selected' => $this->value(), |
607 | ) |
608 | ); |
609 | if ( empty( $dropdown ) ) { |
610 | $dropdown = sprintf( '<select id="%1$s" name="%1$s">', esc_attr( $dropdown_name ) ); |
611 | $dropdown .= sprintf( '<option value="%1$s">%2$s</option>', esc_attr( $option_none_value ), esc_html( $show_option_none ) ); |
612 | $dropdown .= '</select>'; |
613 | } |
614 | |
615 | // Hackily add in the data link parameter. |
616 | $dropdown = str_replace( '<select', '<select ' . $this->get_link() . ' id="' . esc_attr( $input_id ) . '" ' . $describedby_attr, $dropdown ); |
617 | |
618 | /* |
619 | * Even more hackily add auto-draft page stubs. |
620 | * @todo Eventually this should be removed in favor of the pages being injected into the underlying get_pages() call. |
621 | * See <https://github.com/xwp/wp-customize-posts/pull/250>. |
622 | */ |
623 | $nav_menus_created_posts_setting = $this->manager->get_setting( 'nav_menus_created_posts' ); |
624 | if ( $nav_menus_created_posts_setting && current_user_can( 'publish_pages' ) ) { |
625 | $auto_draft_page_options = ''; |
626 | foreach ( $nav_menus_created_posts_setting->value() as $auto_draft_page_id ) { |
627 | $post = get_post( $auto_draft_page_id ); |
628 | if ( $post && 'page' === $post->post_type ) { |
629 | $auto_draft_page_options .= sprintf( '<option value="%1$s">%2$s</option>', esc_attr( $post->ID ), esc_html( $post->post_title ) ); |
630 | } |
631 | } |
632 | if ( $auto_draft_page_options ) { |
633 | $dropdown = str_replace( '</select>', $auto_draft_page_options . '</select>', $dropdown ); |
634 | } |
635 | } |
636 | |
637 | echo $dropdown; |
638 | ?> |
639 | <?php if ( $this->allow_addition && current_user_can( 'publish_pages' ) && current_user_can( 'edit_theme_options' ) ) : // Currently tied to menus functionality. ?> |
640 | <button type="button" class="button-link add-new-toggle"> |
641 | <?php |
642 | /* translators: %s: Add Page label. */ |
643 | printf( __( '+ %s' ), get_post_type_object( 'page' )->labels->add_new_item ); |
644 | ?> |
645 | </button> |
646 | <div class="new-content-item-wrapper"> |
647 | <label for="create-input-<?php echo esc_attr( $this->id ); ?>"><?php _e( 'New page title' ); ?></label> |
648 | <div class="new-content-item"> |
649 | <input type="text" id="create-input-<?php echo esc_attr( $this->id ); ?>" class="create-item-input form-required"> |
650 | <button type="button" class="button add-content"><?php _e( 'Add' ); ?></button> |
651 | </div> |
652 | <span id="create-input-<?php echo esc_attr( $this->id ); ?>-error" class="create-item-error error-message" style="display: none;"><?php _e( 'Please enter a page title' ); ?></span> |
653 | |
654 | </div> |
655 | <?php endif; ?> |
656 | <?php |
657 | break; |
658 | default: |
659 | ?> |
660 | <?php if ( ! empty( $this->label ) ) : ?> |
661 | <label for="<?php echo esc_attr( $input_id ); ?>" class="customize-control-title"><?php echo esc_html( $this->label ); ?></label> |
662 | <?php endif; ?> |
663 | <?php if ( ! empty( $this->description ) ) : ?> |
664 | <span id="<?php echo esc_attr( $description_id ); ?>" class="description customize-control-description"><?php echo $this->description; ?></span> |
665 | <?php endif; ?> |
666 | <input |
667 | id="<?php echo esc_attr( $input_id ); ?>" |
668 | type="<?php echo esc_attr( $this->type ); ?>" |
669 | <?php echo $describedby_attr; ?> |
670 | <?php $this->input_attrs(); ?> |
671 | <?php if ( ! isset( $this->input_attrs['value'] ) ) : ?> |
672 | value="<?php echo esc_attr( $this->value() ); ?>" |
673 | <?php endif; ?> |
674 | <?php $this->link(); ?> |
675 | /> |
676 | <?php |
677 | break; |
678 | } |
679 | } |
680 | |
681 | /** |
682 | * Renders the control's JS template. |
683 | * |
684 | * This function is only run for control types that have been registered with |
685 | * WP_Customize_Manager::register_control_type(). |
686 | * |
687 | * In the future, this will also print the template for the control's container |
688 | * element and be override-able. |
689 | * |
690 | * @since 4.1.0 |
691 | */ |
692 | final public function print_template() { |
693 | ?> |
694 | <script type="text/html" id="tmpl-customize-control-<?php echo esc_attr( $this->type ); ?>-content"> |
695 | <?php $this->content_template(); ?> |
696 | </script> |
697 | <?php |
698 | } |
699 | |
700 | /** |
701 | * An Underscore (JS) template for this control's content (but not its container). |
702 | * |
703 | * Class variables for this control class are available in the `data` JS object; |
704 | * export custom variables by overriding WP_Customize_Control::to_json(). |
705 | * |
706 | * @see WP_Customize_Control::print_template() |
707 | * |
708 | * @since 4.1.0 |
709 | */ |
710 | protected function content_template() {} |
711 | } |
712 | |
713 | /** |
714 | * WP_Customize_Color_Control class. |
715 | */ |
716 | require_once ABSPATH . WPINC . '/customize/class-wp-customize-color-control.php'; |
717 | |
718 | /** |
719 | * WP_Customize_Media_Control class. |
720 | */ |
721 | require_once ABSPATH . WPINC . '/customize/class-wp-customize-media-control.php'; |
722 | |
723 | /** |
724 | * WP_Customize_Upload_Control class. |
725 | */ |
726 | require_once ABSPATH . WPINC . '/customize/class-wp-customize-upload-control.php'; |
727 | |
728 | /** |
729 | * WP_Customize_Image_Control class. |
730 | */ |
731 | require_once ABSPATH . WPINC . '/customize/class-wp-customize-image-control.php'; |
732 | |
733 | /** |
734 | * WP_Customize_Background_Image_Control class. |
735 | */ |
736 | require_once ABSPATH . WPINC . '/customize/class-wp-customize-background-image-control.php'; |
737 | |
738 | /** |
739 | * WP_Customize_Background_Position_Control class. |
740 | */ |
741 | require_once ABSPATH . WPINC . '/customize/class-wp-customize-background-position-control.php'; |
742 | |
743 | /** |
744 | * WP_Customize_Cropped_Image_Control class. |
745 | */ |
746 | require_once ABSPATH . WPINC . '/customize/class-wp-customize-cropped-image-control.php'; |
747 | |
748 | /** |
749 | * WP_Customize_Site_Icon_Control class. |
750 | */ |
751 | require_once ABSPATH . WPINC . '/customize/class-wp-customize-site-icon-control.php'; |
752 | |
753 | /** |
754 | * WP_Customize_Header_Image_Control class. |
755 | */ |
756 | require_once ABSPATH . WPINC . '/customize/class-wp-customize-header-image-control.php'; |
757 | |
758 | /** |
759 | * WP_Customize_Theme_Control class. |
760 | */ |
761 | require_once ABSPATH . WPINC . '/customize/class-wp-customize-theme-control.php'; |
762 | |
763 | /** |
764 | * WP_Widget_Area_Customize_Control class. |
765 | */ |
766 | require_once ABSPATH . WPINC . '/customize/class-wp-widget-area-customize-control.php'; |
767 | |
768 | /** |
769 | * WP_Widget_Form_Customize_Control class. |
770 | */ |
771 | require_once ABSPATH . WPINC . '/customize/class-wp-widget-form-customize-control.php'; |
772 | |
773 | /** |
774 | * WP_Customize_Nav_Menu_Control class. |
775 | */ |
776 | require_once ABSPATH . WPINC . '/customize/class-wp-customize-nav-menu-control.php'; |
777 | |
778 | /** |
779 | * WP_Customize_Nav_Menu_Item_Control class. |
780 | */ |
781 | require_once ABSPATH . WPINC . '/customize/class-wp-customize-nav-menu-item-control.php'; |
782 | |
783 | /** |
784 | * WP_Customize_Nav_Menu_Location_Control class. |
785 | */ |
786 | require_once ABSPATH . WPINC . '/customize/class-wp-customize-nav-menu-location-control.php'; |
787 | |
788 | /** |
789 | * WP_Customize_Nav_Menu_Name_Control class. |
790 | * |
791 | * As this file is deprecated, it will trigger a deprecation notice if instantiated. In a subsequent |
792 | * release, the require_once here will be removed and _deprecated_file() will be called if file is |
793 | * required at all. |
794 | * |
795 | * @deprecated 4.9.0 This file is no longer used due to new menu creation UX. |
796 | */ |
797 | require_once ABSPATH . WPINC . '/customize/class-wp-customize-nav-menu-name-control.php'; |
798 | |
799 | /** |
800 | * WP_Customize_Nav_Menu_Locations_Control class. |
801 | */ |
802 | require_once ABSPATH . WPINC . '/customize/class-wp-customize-nav-menu-locations-control.php'; |
803 | |
804 | /** |
805 | * WP_Customize_Nav_Menu_Auto_Add_Control class. |
806 | */ |
807 | require_once ABSPATH . WPINC . '/customize/class-wp-customize-nav-menu-auto-add-control.php'; |
808 | |
809 | /** |
810 | * WP_Customize_Date_Time_Control class. |
811 | */ |
812 | require_once ABSPATH . WPINC . '/customize/class-wp-customize-date-time-control.php'; |
813 | |
814 | /** |
815 | * WP_Sidebar_Block_Editor_Control class. |
816 | */ |
817 | require_once ABSPATH . WPINC . '/customize/class-wp-sidebar-block-editor-control.php'; |
Note: See TracBrowser
for help on using the repository browser.