run:R W Run
1.25 KB
2026-03-11 16:18:52
R W Run
639 By
2026-03-11 16:18:52
R W Run
2.26 KB
2026-03-11 16:18:52
R W Run
3.13 KB
2026-03-11 16:18:52
R W Run
1.42 KB
2026-03-11 16:18:52
R W Run
5.16 KB
2026-03-11 16:18:52
R W Run
9.22 KB
2026-03-11 16:18:52
R W Run
588 By
2026-03-11 16:18:52
R W Run
7.84 KB
2026-03-11 16:18:52
R W Run
1.74 KB
2026-03-11 16:18:52
R W Run
1.18 KB
2026-03-11 16:18:52
R W Run
9.18 KB
2026-03-11 16:18:52
R W Run
1.1 KB
2026-03-11 16:18:52
R W Run
2.08 KB
2026-03-11 16:18:52
R W Run
7.97 KB
2026-03-11 16:18:52
R W Run
27.22 KB
2026-03-11 16:18:52
R W Run
2.25 KB
2026-03-11 16:18:52
R W Run
2.75 KB
2026-03-11 16:18:52
R W Run
1.1 KB
2026-03-11 16:18:52
R W Run
716 By
2026-03-11 16:18:52
R W Run
18.49 KB
2026-03-11 16:18:52
R W Run
3.23 KB
2026-03-11 16:18:52
R W Run
1.67 KB
2026-03-11 16:18:52
R W Run
1.65 KB
2026-03-11 16:18:52
R W Run
10.32 KB
2026-03-11 16:18:52
R W Run
13.52 KB
2026-03-11 16:18:52
R W Run
1.03 KB
2026-03-11 16:18:52
R W Run
5.04 KB
2026-03-11 16:18:52
R W Run
11.61 KB
2026-03-11 16:18:52
R W Run
3.31 KB
2026-03-11 16:18:52
R W Run
6.79 KB
2026-03-11 16:18:52
R W Run
1.17 KB
2026-03-11 16:18:52
R W Run
686 By
2026-03-11 16:18:52
R W Run
1.68 KB
2026-03-11 16:18:52
R W Run
2.58 KB
2026-03-11 16:18:52
R W Run
error_log
📄class-wp-customize-partial.php
1<?php
2/**
3 * Customize API: WP_Customize_Partial class
4 *
5 * @package WordPress
6 * @subpackage Customize
7 * @since 4.5.0
8 */
9
10/**
11 * Core Customizer class for implementing selective refresh partials.
12 *
13 * Representation of a rendered region in the previewed page that gets
14 * selectively refreshed when an associated setting is changed.
15 * This class is analogous of WP_Customize_Control.
16 *
17 * @since 4.5.0
18 */
19#[AllowDynamicProperties]
20class WP_Customize_Partial {
21
22 /**
23 * Component.
24 *
25 * @since 4.5.0
26 * @var WP_Customize_Selective_Refresh
27 */
28 public $component;
29
30 /**
31 * Unique identifier for the partial.
32 *
33 * If the partial is used to display a single setting, this would generally
34 * be the same as the associated setting's ID.
35 *
36 * @since 4.5.0
37 * @var string
38 */
39 public $id;
40
41 /**
42 * Parsed ID.
43 *
44 * @since 4.5.0
45 * @var array {
46 * @type string $base ID base.
47 * @type array $keys Keys for multidimensional.
48 * }
49 */
50 protected $id_data = array();
51
52 /**
53 * Type of this partial.
54 *
55 * @since 4.5.0
56 * @var string
57 */
58 public $type = 'default';
59
60 /**
61 * The jQuery selector to find the container element for the partial.
62 *
63 * @since 4.5.0
64 * @var string
65 */
66 public $selector;
67
68 /**
69 * IDs for settings tied to the partial.
70 *
71 * @since 4.5.0
72 * @var string[]
73 */
74 public $settings;
75
76 /**
77 * The ID for the setting that this partial is primarily responsible for rendering.
78 *
79 * If not supplied, it will default to the ID of the first setting.
80 *
81 * @since 4.5.0
82 * @var string
83 */
84 public $primary_setting;
85
86 /**
87 * Capability required to edit this partial.
88 *
89 * Normally this is empty and the capability is derived from the capabilities
90 * of the associated `$settings`.
91 *
92 * @since 4.5.0
93 * @var string
94 */
95 public $capability;
96
97 /**
98 * Render callback.
99 *
100 * @since 4.5.0
101 *
102 * @see WP_Customize_Partial::render()
103 * @var callable Callback is called with one argument, the instance of
104 * WP_Customize_Partial. The callback can either echo the
105 * partial or return the partial as a string, or return false if error.
106 */
107 public $render_callback;
108
109 /**
110 * Whether the container element is included in the partial, or if only the contents are rendered.
111 *
112 * @since 4.5.0
113 * @var bool
114 */
115 public $container_inclusive = false;
116
117 /**
118 * Whether to refresh the entire preview in case a partial cannot be refreshed.
119 *
120 * A partial render is considered a failure if the render_callback returns false.
121 *
122 * @since 4.5.0
123 * @var bool
124 */
125 public $fallback_refresh = true;
126
127 /**
128 * Constructor.
129 *
130 * Supplied `$args` override class property defaults.
131 *
132 * If `$args['settings']` is not defined, use the $id as the setting ID.
133 *
134 * @since 4.5.0
135 *
136 * @param WP_Customize_Selective_Refresh $component Customize Partial Refresh plugin instance.
137 * @param string $id Control ID.
138 * @param array $args {
139 * Optional. Array of properties for the new Partials object. Default empty array.
140 *
141 * @type string $type Type of the partial to be created.
142 * @type string $selector The jQuery selector to find the container element for the partial, that is,
143 * a partial's placement.
144 * @type string[] $settings IDs for settings tied to the partial. If undefined, `$id` will be used.
145 * @type string $primary_setting The ID for the setting that this partial is primarily responsible for
146 * rendering. If not supplied, it will default to the ID of the first setting.
147 * @type string $capability Capability required to edit this partial.
148 * Normally this is empty and the capability is derived from the capabilities
149 * of the associated `$settings`.
150 * @type callable $render_callback Render callback.
151 * Callback is called with one argument, the instance of WP_Customize_Partial.
152 * The callback can either echo the partial or return the partial as a string,
153 * or return false if error.
154 * @type bool $container_inclusive Whether the container element is included in the partial, or if only
155 * the contents are rendered.
156 * @type bool $fallback_refresh Whether to refresh the entire preview in case a partial cannot be refreshed.
157 * A partial render is considered a failure if the render_callback returns
158 * false.
159 * }
160 */
161 public function __construct( WP_Customize_Selective_Refresh $component, $id, $args = array() ) {
162 $keys = array_keys( get_object_vars( $this ) );
163 foreach ( $keys as $key ) {
164 if ( isset( $args[ $key ] ) ) {
165 $this->$key = $args[ $key ];
166 }
167 }
168
169 $this->component = $component;
170 $this->id = $id;
171 $this->id_data['keys'] = preg_split( '/\[/', str_replace( ']', '', $this->id ) );
172 $this->id_data['base'] = array_shift( $this->id_data['keys'] );
173
174 if ( empty( $this->render_callback ) ) {
175 $this->render_callback = array( $this, 'render_callback' );
176 }
177
178 // Process settings.
179 if ( ! isset( $this->settings ) ) {
180 $this->settings = array( $id );
181 } elseif ( is_string( $this->settings ) ) {
182 $this->settings = array( $this->settings );
183 }
184
185 if ( empty( $this->primary_setting ) ) {
186 $this->primary_setting = current( $this->settings );
187 }
188 }
189
190 /**
191 * Retrieves parsed ID data for multidimensional setting.
192 *
193 * @since 4.5.0
194 *
195 * @return array {
196 * ID data for multidimensional partial.
197 *
198 * @type string $base ID base.
199 * @type array $keys Keys for multidimensional array.
200 * }
201 */
202 final public function id_data() {
203 return $this->id_data;
204 }
205
206 /**
207 * Renders the template partial involving the associated settings.
208 *
209 * @since 4.5.0
210 *
211 * @param array $container_context Optional. Array of context data associated with the target container (placement).
212 * Default empty array.
213 * @return string|array|false The rendered partial as a string, raw data array (for client-side JS template),
214 * or false if no render applied.
215 */
216 final public function render( $container_context = array() ) {
217 $partial = $this;
218 $rendered = false;
219
220 if ( ! empty( $this->render_callback ) ) {
221 ob_start();
222 $return_render = call_user_func( $this->render_callback, $this, $container_context );
223 $ob_render = ob_get_clean();
224
225 if ( null !== $return_render && '' !== $ob_render ) {
226 _doing_it_wrong( __FUNCTION__, __( 'Partial render must echo the content or return the content string (or array), but not both.' ), '4.5.0' );
227 }
228
229 /*
230 * Note that the string return takes precedence because the $ob_render may just\
231 * include PHP warnings or notices.
232 */
233 $rendered = null !== $return_render ? $return_render : $ob_render;
234 }
235
236 /**
237 * Filters partial rendering.
238 *
239 * @since 4.5.0
240 *
241 * @param string|array|false $rendered The partial value. Default false.
242 * @param WP_Customize_Partial $partial WP_Customize_Setting instance.
243 * @param array $container_context Optional array of context data associated with
244 * the target container.
245 */
246 $rendered = apply_filters( 'customize_partial_render', $rendered, $partial, $container_context );
247
248 /**
249 * Filters partial rendering for a specific partial.
250 *
251 * The dynamic portion of the hook name, `$partial->ID` refers to the partial ID.
252 *
253 * @since 4.5.0
254 *
255 * @param string|array|false $rendered The partial value. Default false.
256 * @param WP_Customize_Partial $partial WP_Customize_Setting instance.
257 * @param array $container_context Optional array of context data associated with
258 * the target container.
259 */
260 $rendered = apply_filters( "customize_partial_render_{$partial->id}", $rendered, $partial, $container_context );
261
262 return $rendered;
263 }
264
265 /**
266 * Default callback used when invoking WP_Customize_Control::render().
267 *
268 * Note that this method may echo the partial *or* return the partial as
269 * a string or array, but not both. Output buffering is performed when this
270 * is called. Subclasses can override this with their specific logic, or they
271 * may provide an 'render_callback' argument to the constructor.
272 *
273 * This method may return an HTML string for straight DOM injection, or it
274 * may return an array for supporting Partial JS subclasses to render by
275 * applying to client-side templating.
276 *
277 * @since 4.5.0
278 *
279 * @param WP_Customize_Partial $partial Partial.
280 * @param array $context Context.
281 * @return string|array|false
282 */
283 public function render_callback( WP_Customize_Partial $partial, $context = array() ) {
284 unset( $partial, $context );
285 return false;
286 }
287
288 /**
289 * Retrieves the data to export to the client via JSON.
290 *
291 * @since 4.5.0
292 *
293 * @return array Array of parameters passed to the JavaScript.
294 */
295 public function json() {
296 $exports = array(
297 'settings' => $this->settings,
298 'primarySetting' => $this->primary_setting,
299 'selector' => $this->selector,
300 'type' => $this->type,
301 'fallbackRefresh' => $this->fallback_refresh,
302 'containerInclusive' => $this->container_inclusive,
303 );
304 return $exports;
305 }
306
307 /**
308 * Checks if the user can refresh this partial.
309 *
310 * Returns false if the user cannot manipulate one of the associated settings,
311 * or if one of the associated settings does not exist.
312 *
313 * @since 4.5.0
314 *
315 * @return bool False if user can't edit one of the related settings,
316 * or if one of the associated settings does not exist.
317 */
318 final public function check_capabilities() {
319 if ( ! empty( $this->capability ) && ! current_user_can( $this->capability ) ) {
320 return false;
321 }
322 foreach ( $this->settings as $setting_id ) {
323 $setting = $this->component->manager->get_setting( $setting_id );
324 if ( ! $setting || ! $setting->check_capabilities() ) {
325 return false;
326 }
327 }
328 return true;
329 }
330}
331