File "class-wp-customize-selective-refresh.php"
Full path: /home/kosmetik/public_html/wp-includes/customize/class-wp-customize-selective-refresh.php
File
size: 6.37 B
MIME-type: text/x-php
Charset: utf-8
Download Open Edit Advanced Editor Back
<?php
final class WP_Customize_Selective_Refresh
{
const RENDER_QUERY_VAR = 'wp_customize_render_partials';
public $manager;
protected $partials = array();
protected $triggered_errors = array();
protected $current_partial_id;
public function __construct(WP_Customize_Manager $manager)
{
$this->manager = $manager;
require_once ABSPATH . WPINC . '/customize/class-wp-customize-partial.php';
add_action('customize_preview_init', array($this, 'init_preview'));
}
public function partials()
{
return $this->partials;
}
public function add_partial($id, $args = array())
{
if ($id instanceof WP_Customize_Partial) {
$partial = $id;
} else {
$class = 'WP_Customize_Partial';
$args = apply_filters('customize_dynamic_partial_args', $args, $id);
$class = apply_filters('customize_dynamic_partial_class', $class, $id, $args);
$partial = new $class($this, $id, $args);
}
$this->partials[$partial->id] = $partial;
return $partial;
}
public function get_partial($id)
{
if (isset($this->partials[$id])) {
return $this->partials[$id];
} else {
return null;
}
}
public function remove_partial($id)
{
unset($this->partials[$id]);
}
public function init_preview()
{
add_action('template_redirect', array($this, 'handle_render_partials_request'));
add_action('wp_enqueue_scripts', array($this, 'enqueue_preview_scripts'));
}
public function enqueue_preview_scripts()
{
wp_enqueue_script('customize-selective-refresh');
add_action('wp_footer', array($this, 'export_preview_data'), 1000);
}
public function export_preview_data()
{
$partials = array();
foreach ($this->partials() as $partial) {
if ($partial->check_capabilities()) {
$partials[$partial->id] = $partial->json();
}
}
$switched_locale = switch_to_locale(get_user_locale());
$l10n = array('shiftClickToEdit' => __('Shift-click to edit this element.'), 'clickEditMenu' => __('Click to edit this menu.'), 'clickEditWidget' => __('Click to edit this widget.'), 'clickEditTitle' => __('Click to edit the site title.'), 'clickEditMisc' => __('Click to edit this element.'), 'badDocumentWrite' => sprintf(__('%s is forbidden'), 'document.write()'));
if ($switched_locale) {
restore_previous_locale();
}
$exports = array('partials' => $partials, 'renderQueryVar' => self::RENDER_QUERY_VAR, 'l10n' => $l10n);
printf('<script>var _customizePartialRefreshExports = %s;</script>', wp_json_encode($exports));
}
public function add_dynamic_partials($partial_ids)
{
$new_partials = array();
foreach ($partial_ids as $partial_id) {
$partial = $this->get_partial($partial_id);
if ($partial) {
continue;
}
$partial_args = false;
$partial_class = 'WP_Customize_Partial';
$partial_args = apply_filters('customize_dynamic_partial_args', $partial_args, $partial_id);
if (false === $partial_args) {
continue;
}
$partial_class = apply_filters('customize_dynamic_partial_class', $partial_class, $partial_id, $partial_args);
$partial = new $partial_class($this, $partial_id, $partial_args);
$this->add_partial($partial);
$new_partials[] = $partial;
}
return $new_partials;
}
public function is_render_partials_request()
{
return !empty($_POST[self::RENDER_QUERY_VAR]);
}
public function handle_error($errno, $errstr, $errfile = null, $errline = null)
{
$this->triggered_errors[] = array('partial' => $this->current_partial_id, 'error_number' => $errno, 'error_string' => $errstr, 'error_file' => $errfile, 'error_line' => $errline);
return true;
}
public function handle_render_partials_request()
{
if (!$this->is_render_partials_request()) {
return;
}
if (!is_customize_preview()) {
wp_send_json_error('expected_customize_preview', 403);
} elseif (!isset($_POST['partials'])) {
wp_send_json_error('missing_partials', 400);
}
status_header(200);
$partials = json_decode(wp_unslash($_POST['partials']), true);
if (!is_array($partials)) {
wp_send_json_error('malformed_partials');
}
$this->add_dynamic_partials(array_keys($partials));
do_action('customize_render_partials_before', $this, $partials);
set_error_handler(array($this, 'handle_error'), error_reporting());
$contents = array();
foreach ($partials as $partial_id => $container_contexts) {
$this->current_partial_id = $partial_id;
if (!is_array($container_contexts)) {
wp_send_json_error('malformed_container_contexts');
}
$partial = $this->get_partial($partial_id);
if (!$partial || !$partial->check_capabilities()) {
$contents[$partial_id] = null;
continue;
}
$contents[$partial_id] = array();
if (empty($container_contexts)) {
$contents[$partial_id][] = $partial->render(null);
} else {
foreach ($container_contexts as $container_context) {
$contents[$partial_id][] = $partial->render($container_context);
}
}
}
$this->current_partial_id = null;
restore_error_handler();
do_action('customize_render_partials_after', $this, $partials);
$response = array('contents' => $contents);
if (defined('WP_DEBUG_DISPLAY') && WP_DEBUG_DISPLAY) {
$response['errors'] = $this->triggered_errors;
}
$setting_validities = $this->manager->validate_setting_values($this->manager->unsanitized_post_values());
$exported_setting_validities = array_map(array($this->manager, 'prepare_setting_validity_for_js'), $setting_validities);
$response['setting_validities'] = $exported_setting_validities;
$response = apply_filters('customize_render_partials_response', $response, $this, $partials);
wp_send_json_success($response);
}
}