diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-17 07:56:49 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-17 07:56:49 +0000 |
commit | a415c29efee45520ae252d2aa28f1083a521cd7b (patch) | |
tree | f4ade4b6668ecc0765de7e1424f7c1427ad433ff /wp-includes/customize/class-wp-customize-partial.php | |
parent | Initial commit. (diff) | |
download | wordpress-a415c29efee45520ae252d2aa28f1083a521cd7b.tar.xz wordpress-a415c29efee45520ae252d2aa28f1083a521cd7b.zip |
Adding upstream version 6.4.3+dfsg1.upstream/6.4.3+dfsg1
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'wp-includes/customize/class-wp-customize-partial.php')
-rw-r--r-- | wp-includes/customize/class-wp-customize-partial.php | 330 |
1 files changed, 330 insertions, 0 deletions
diff --git a/wp-includes/customize/class-wp-customize-partial.php b/wp-includes/customize/class-wp-customize-partial.php new file mode 100644 index 0000000..06502be --- /dev/null +++ b/wp-includes/customize/class-wp-customize-partial.php @@ -0,0 +1,330 @@ +<?php +/** + * Customize API: WP_Customize_Partial class + * + * @package WordPress + * @subpackage Customize + * @since 4.5.0 + */ + +/** + * Core Customizer class for implementing selective refresh partials. + * + * Representation of a rendered region in the previewed page that gets + * selectively refreshed when an associated setting is changed. + * This class is analogous of WP_Customize_Control. + * + * @since 4.5.0 + */ +#[AllowDynamicProperties] +class WP_Customize_Partial { + + /** + * Component. + * + * @since 4.5.0 + * @var WP_Customize_Selective_Refresh + */ + public $component; + + /** + * Unique identifier for the partial. + * + * If the partial is used to display a single setting, this would generally + * be the same as the associated setting's ID. + * + * @since 4.5.0 + * @var string + */ + public $id; + + /** + * Parsed ID. + * + * @since 4.5.0 + * @var array { + * @type string $base ID base. + * @type array $keys Keys for multidimensional. + * } + */ + protected $id_data = array(); + + /** + * Type of this partial. + * + * @since 4.5.0 + * @var string + */ + public $type = 'default'; + + /** + * The jQuery selector to find the container element for the partial. + * + * @since 4.5.0 + * @var string + */ + public $selector; + + /** + * IDs for settings tied to the partial. + * + * @since 4.5.0 + * @var string[] + */ + public $settings; + + /** + * The ID for the setting that this partial is primarily responsible for rendering. + * + * If not supplied, it will default to the ID of the first setting. + * + * @since 4.5.0 + * @var string + */ + public $primary_setting; + + /** + * Capability required to edit this partial. + * + * Normally this is empty and the capability is derived from the capabilities + * of the associated `$settings`. + * + * @since 4.5.0 + * @var string + */ + public $capability; + + /** + * Render callback. + * + * @since 4.5.0 + * + * @see WP_Customize_Partial::render() + * @var callable Callback is called with one argument, the instance of + * WP_Customize_Partial. The callback can either echo the + * partial or return the partial as a string, or return false if error. + */ + public $render_callback; + + /** + * Whether the container element is included in the partial, or if only the contents are rendered. + * + * @since 4.5.0 + * @var bool + */ + public $container_inclusive = false; + + /** + * Whether to refresh the entire preview in case a partial cannot be refreshed. + * + * A partial render is considered a failure if the render_callback returns false. + * + * @since 4.5.0 + * @var bool + */ + public $fallback_refresh = true; + + /** + * Constructor. + * + * Supplied `$args` override class property defaults. + * + * If `$args['settings']` is not defined, use the $id as the setting ID. + * + * @since 4.5.0 + * + * @param WP_Customize_Selective_Refresh $component Customize Partial Refresh plugin instance. + * @param string $id Control ID. + * @param array $args { + * Optional. Array of properties for the new Partials object. Default empty array. + * + * @type string $type Type of the partial to be created. + * @type string $selector The jQuery selector to find the container element for the partial, that is, + * a partial's placement. + * @type string[] $settings IDs for settings tied to the partial. If undefined, `$id` will be used. + * @type string $primary_setting The ID for the setting that this partial is primarily responsible for + * rendering. If not supplied, it will default to the ID of the first setting. + * @type string $capability Capability required to edit this partial. + * Normally this is empty and the capability is derived from the capabilities + * of the associated `$settings`. + * @type callable $render_callback Render callback. + * Callback is called with one argument, the instance of WP_Customize_Partial. + * The callback can either echo the partial or return the partial as a string, + * or return false if error. + * @type bool $container_inclusive Whether the container element is included in the partial, or if only + * the contents are rendered. + * @type bool $fallback_refresh Whether to refresh the entire preview in case a partial cannot be refreshed. + * A partial render is considered a failure if the render_callback returns + * false. + * } + */ + public function __construct( WP_Customize_Selective_Refresh $component, $id, $args = array() ) { + $keys = array_keys( get_object_vars( $this ) ); + foreach ( $keys as $key ) { + if ( isset( $args[ $key ] ) ) { + $this->$key = $args[ $key ]; + } + } + + $this->component = $component; + $this->id = $id; + $this->id_data['keys'] = preg_split( '/\[/', str_replace( ']', '', $this->id ) ); + $this->id_data['base'] = array_shift( $this->id_data['keys'] ); + + if ( empty( $this->render_callback ) ) { + $this->render_callback = array( $this, 'render_callback' ); + } + + // Process settings. + if ( ! isset( $this->settings ) ) { + $this->settings = array( $id ); + } elseif ( is_string( $this->settings ) ) { + $this->settings = array( $this->settings ); + } + + if ( empty( $this->primary_setting ) ) { + $this->primary_setting = current( $this->settings ); + } + } + + /** + * Retrieves parsed ID data for multidimensional setting. + * + * @since 4.5.0 + * + * @return array { + * ID data for multidimensional partial. + * + * @type string $base ID base. + * @type array $keys Keys for multidimensional array. + * } + */ + final public function id_data() { + return $this->id_data; + } + + /** + * Renders the template partial involving the associated settings. + * + * @since 4.5.0 + * + * @param array $container_context Optional. Array of context data associated with the target container (placement). + * Default empty array. + * @return string|array|false The rendered partial as a string, raw data array (for client-side JS template), + * or false if no render applied. + */ + final public function render( $container_context = array() ) { + $partial = $this; + $rendered = false; + + if ( ! empty( $this->render_callback ) ) { + ob_start(); + $return_render = call_user_func( $this->render_callback, $this, $container_context ); + $ob_render = ob_get_clean(); + + if ( null !== $return_render && '' !== $ob_render ) { + _doing_it_wrong( __FUNCTION__, __( 'Partial render must echo the content or return the content string (or array), but not both.' ), '4.5.0' ); + } + + /* + * Note that the string return takes precedence because the $ob_render may just\ + * include PHP warnings or notices. + */ + $rendered = null !== $return_render ? $return_render : $ob_render; + } + + /** + * Filters partial rendering. + * + * @since 4.5.0 + * + * @param string|array|false $rendered The partial value. Default false. + * @param WP_Customize_Partial $partial WP_Customize_Setting instance. + * @param array $container_context Optional array of context data associated with + * the target container. + */ + $rendered = apply_filters( 'customize_partial_render', $rendered, $partial, $container_context ); + + /** + * Filters partial rendering for a specific partial. + * + * The dynamic portion of the hook name, `$partial->ID` refers to the partial ID. + * + * @since 4.5.0 + * + * @param string|array|false $rendered The partial value. Default false. + * @param WP_Customize_Partial $partial WP_Customize_Setting instance. + * @param array $container_context Optional array of context data associated with + * the target container. + */ + $rendered = apply_filters( "customize_partial_render_{$partial->id}", $rendered, $partial, $container_context ); + + return $rendered; + } + + /** + * Default callback used when invoking WP_Customize_Control::render(). + * + * Note that this method may echo the partial *or* return the partial as + * a string or array, but not both. Output buffering is performed when this + * is called. Subclasses can override this with their specific logic, or they + * may provide an 'render_callback' argument to the constructor. + * + * This method may return an HTML string for straight DOM injection, or it + * may return an array for supporting Partial JS subclasses to render by + * applying to client-side templating. + * + * @since 4.5.0 + * + * @param WP_Customize_Partial $partial Partial. + * @param array $context Context. + * @return string|array|false + */ + public function render_callback( WP_Customize_Partial $partial, $context = array() ) { + unset( $partial, $context ); + return false; + } + + /** + * Retrieves the data to export to the client via JSON. + * + * @since 4.5.0 + * + * @return array Array of parameters passed to the JavaScript. + */ + public function json() { + $exports = array( + 'settings' => $this->settings, + 'primarySetting' => $this->primary_setting, + 'selector' => $this->selector, + 'type' => $this->type, + 'fallbackRefresh' => $this->fallback_refresh, + 'containerInclusive' => $this->container_inclusive, + ); + return $exports; + } + + /** + * Checks if the user can refresh this partial. + * + * Returns false if the user cannot manipulate one of the associated settings, + * or if one of the associated settings does not exist. + * + * @since 4.5.0 + * + * @return bool False if user can't edit one of the related settings, + * or if one of the associated settings does not exist. + */ + final public function check_capabilities() { + if ( ! empty( $this->capability ) && ! current_user_can( $this->capability ) ) { + return false; + } + foreach ( $this->settings as $setting_id ) { + $setting = $this->component->manager->get_setting( $setting_id ); + if ( ! $setting || ! $setting->check_capabilities() ) { + return false; + } + } + return true; + } +} |