public function _publish_changeset_values($changeset_post_id)
{
$publishing_changeset_data = $this->get_changeset_post_data($changeset_post_id);
if (is_wp_error($publishing_changeset_data)) {
return $publishing_changeset_data;
}
$changeset_post = get_post($changeset_post_id);
/*
* Temporarily override the changeset context so that it will be read
* in calls to unsanitized_post_values() and so that it will be available
* on the $wp_customize object passed to hooks during the save logic.
*/
$previous_changeset_post_id = $this->_changeset_post_id;
$this->_changeset_post_id = $changeset_post_id;
$previous_changeset_uuid = $this->_changeset_uuid;
$this->_changeset_uuid = $changeset_post->post_name;
$previous_changeset_data = $this->_changeset_data;
$this->_changeset_data = $publishing_changeset_data;
// Parse changeset data to identify theme mod settings and user IDs associated with settings to be saved.
$setting_user_ids = array();
$theme_mod_settings = array();
$namespace_pattern = '/^(?P<stylesheet>.+?)::(?P<setting_id>.+)$/';
$matches = array();
foreach ($this->_changeset_data as $raw_setting_id => $setting_params) {
$actual_setting_id = null;
$is_theme_mod_setting = isset($setting_params['value']) && isset($setting_params['type']) && 'theme_mod' === $setting_params['type'] && preg_match($namespace_pattern, $raw_setting_id, $matches);
if ($is_theme_mod_setting) {
if (!isset($theme_mod_settings[$matches['stylesheet']])) {
$theme_mod_settings[$matches['stylesheet']] = array();
}
$theme_mod_settings[$matches['stylesheet']][$matches['setting_id']] = $setting_params;
if ($this->get_stylesheet() === $matches['stylesheet']) {
$actual_setting_id = $matches['setting_id'];
}
} else {
$actual_setting_id = $raw_setting_id;
}
// Keep track of the user IDs for settings actually for this theme.
if ($actual_setting_id && isset($setting_params['user_id'])) {
$setting_user_ids[$actual_setting_id] = $setting_params['user_id'];
}
}
$changeset_setting_values = $this->unsanitized_post_values(array('exclude_post_data' => true, 'exclude_changeset' => false));
$changeset_setting_ids = array_keys($changeset_setting_values);
$this->add_dynamic_settings($changeset_setting_ids);
/**
* Fires once the theme has switched in the Customizer, but before settings
* have been saved.
*
* @since 3.4.0
*
* @param WP_Customize_Manager $manager WP_Customize_Manager instance.
*/
do_action('customize_save', $this);
/*
* Ensure that all settings will allow themselves to be saved. Note that
* this is safe because the setting would have checked the capability
* when the setting value was written into the changeset. So this is why
* an additional capability check is not required here.
*/
$original_setting_capabilities = array();
foreach ($changeset_setting_ids as $setting_id) {
$setting = $this->get_setting($setting_id);
if ($setting && !isset($setting_user_ids[$setting_id])) {
$original_setting_capabilities[$setting->id] = $setting->capability;
$setting->capability = 'exist';
}
}
$original_user_id = get_current_user_id();
foreach ($changeset_setting_ids as $setting_id) {
$setting = $this->get_setting($setting_id);
if ($setting) {
/*
* Set the current user to match the user who saved the value into
* the changeset so that any filters that apply during the save
* process will respect the original user's capabilities. This
* will ensure, for example, that KSES won't strip unsafe HTML
* when a scheduled changeset publishes via WP Cron.
*/
if (isset($setting_user_ids[$setting_id])) {
wp_set_current_user($setting_user_ids[$setting_id]);
} else {
wp_set_current_user($original_user_id);
}
$setting->save();
}
}
wp_set_current_user($original_user_id);
// Update the stashed theme mod settings, removing the active theme's stashed settings, if activated.
if (did_action('switch_theme')) {
$other_theme_mod_settings = $theme_mod_settings;
unset($other_theme_mod_settings[$this->get_stylesheet()]);
$this->update_stashed_theme_mod_settings($other_theme_mod_settings);
}
/**
* Fires after Customize settings have been saved.
*
* @since 3.6.0
*
* @param WP_Customize_Manager $manager WP_Customize_Manager instance.
*/
do_action('customize_save_after', $this);
// Restore original capabilities.
foreach ($original_setting_capabilities as $setting_id => $capability) {
$setting = $this->get_setting($setting_id);
if ($setting) {
$setting->capability = $capability;
}
}
// Restore original changeset data.
$this->_changeset_data = $previous_changeset_data;
$this->_changeset_post_id = $previous_changeset_post_id;
$this->_changeset_uuid = $previous_changeset_uuid;
return true;
}