File "class-wp-customize-nav-menu-setting.php"
Full path: /home/kosmetik/public_html/wp-includes/customize/class-wp-customize-nav-menu-setting.php
File
size: 11.64 B
MIME-type: text/x-php
Charset: utf-8
Download Open Edit Advanced Editor Back
<?php
class WP_Customize_Nav_Menu_Setting extends WP_Customize_Setting
{
const ID_PATTERN = '/^nav_menu\\[(?P<id>-?\\d+)\\]$/';
const TAXONOMY = 'nav_menu';
const TYPE = 'nav_menu';
public $type = self::TYPE;
public $default = array('name' => '', 'description' => '', 'parent' => 0, 'auto_add' => false);
public $transport = 'postMessage';
public $term_id;
public $previous_term_id;
protected $is_updated = false;
public $update_status;
public $update_error;
public function __construct(WP_Customize_Manager $manager, $id, array $args = array())
{
if (empty($manager->nav_menus)) {
throw new Exception('Expected WP_Customize_Manager::$nav_menus to be set.');
}
if (!preg_match(self::ID_PATTERN, $id, $matches)) {
throw new Exception("Illegal widget setting ID: {$id}");
}
$this->term_id = (int) $matches['id'];
parent::__construct($manager, $id, $args);
}
public function value()
{
if ($this->is_previewed && get_current_blog_id() === $this->_previewed_blog_id) {
$undefined = new stdClass();
$post_value = $this->post_value($undefined);
if ($undefined === $post_value) {
$value = $this->_original_value;
} else {
$value = $post_value;
}
} else {
$value = false;
if ($this->term_id > 0) {
$term = wp_get_nav_menu_object($this->term_id);
if ($term) {
$value = wp_array_slice_assoc((array) $term, array_keys($this->default));
$nav_menu_options = (array) get_option('nav_menu_options', array());
$value['auto_add'] = false;
if (isset($nav_menu_options['auto_add']) && is_array($nav_menu_options['auto_add'])) {
$value['auto_add'] = in_array($term->term_id, $nav_menu_options['auto_add'], true);
}
}
}
if (!is_array($value)) {
$value = $this->default;
}
}
return $value;
}
public function preview()
{
if ($this->is_previewed) {
return false;
}
$undefined = new stdClass();
$is_placeholder = $this->term_id < 0;
$is_dirty = $undefined !== $this->post_value($undefined);
if (!$is_placeholder && !$is_dirty) {
return false;
}
$this->is_previewed = true;
$this->_original_value = $this->value();
$this->_previewed_blog_id = get_current_blog_id();
add_filter('wp_get_nav_menus', array($this, 'filter_wp_get_nav_menus'), 10, 2);
add_filter('wp_get_nav_menu_object', array($this, 'filter_wp_get_nav_menu_object'), 10, 2);
add_filter('default_option_nav_menu_options', array($this, 'filter_nav_menu_options'));
add_filter('option_nav_menu_options', array($this, 'filter_nav_menu_options'));
return true;
}
public function filter_wp_get_nav_menus($menus, $args)
{
if (get_current_blog_id() !== $this->_previewed_blog_id) {
return $menus;
}
$setting_value = $this->value();
$is_delete = false === $setting_value;
$index = -1;
foreach ($menus as $i => $menu) {
if ((int) $this->term_id === (int) $menu->term_id || (int) $this->previous_term_id === (int) $menu->term_id) {
$index = $i;
break;
}
}
if ($is_delete) {
if (-1 !== $index) {
array_splice($menus, $index, 1);
}
} else {
$menu_obj = (object) array_merge(array('term_id' => $this->term_id, 'term_taxonomy_id' => $this->term_id, 'slug' => sanitize_title($setting_value['name']), 'count' => 0, 'term_group' => 0, 'taxonomy' => self::TAXONOMY, 'filter' => 'raw'), $setting_value);
array_splice($menus, $index, -1 === $index ? 0 : 1, array($menu_obj));
}
if (!$is_delete && !empty($args['orderby'])) {
$menus = wp_list_sort($menus, array($args['orderby'] => 'ASC'));
}
return $menus;
}
protected $_current_menus_sort_orderby;
protected function _sort_menus_by_orderby($menu1, $menu2)
{
_deprecated_function(__METHOD__, '4.7.0', 'wp_list_sort');
$key = $this->_current_menus_sort_orderby;
return strcmp($menu1->{$key}, $menu2->{$key});
}
public function filter_wp_get_nav_menu_object($menu_obj, $menu_id)
{
$ok = get_current_blog_id() === $this->_previewed_blog_id && is_int($menu_id) && $menu_id === $this->term_id;
if (!$ok) {
return $menu_obj;
}
$setting_value = $this->value();
if (false === $setting_value) {
return false;
}
if (null === $setting_value) {
return $menu_obj;
}
$menu_obj = (object) array_merge(array('term_id' => $this->term_id, 'term_taxonomy_id' => $this->term_id, 'slug' => sanitize_title($setting_value['name']), 'count' => 0, 'term_group' => 0, 'taxonomy' => self::TAXONOMY, 'filter' => 'raw'), $setting_value);
return $menu_obj;
}
public function filter_nav_menu_options($nav_menu_options)
{
if (get_current_blog_id() !== $this->_previewed_blog_id) {
return $nav_menu_options;
}
$menu = $this->value();
$nav_menu_options = $this->filter_nav_menu_options_value($nav_menu_options, $this->term_id, false === $menu ? false : $menu['auto_add']);
return $nav_menu_options;
}
public function sanitize($value)
{
if (false === $value) {
return $value;
}
if (!is_array($value)) {
return null;
}
$default = array('name' => '', 'description' => '', 'parent' => 0, 'auto_add' => false);
$value = array_merge($default, $value);
$value = wp_array_slice_assoc($value, array_keys($default));
$value['name'] = trim(esc_html($value['name']));
$value['description'] = sanitize_text_field($value['description']);
$value['parent'] = max(0, (int) $value['parent']);
$value['auto_add'] = !empty($value['auto_add']);
if ('' === $value['name']) {
$value['name'] = _x('(unnamed)', 'Missing menu name.');
}
return apply_filters("customize_sanitize_{$this->id}", $value, $this);
}
protected $_widget_nav_menu_updates = array();
protected function update($value)
{
if ($this->is_updated) {
return;
}
$this->is_updated = true;
$is_placeholder = $this->term_id < 0;
$is_delete = false === $value;
add_filter('customize_save_response', array($this, 'amend_customize_save_response'));
$auto_add = null;
if ($is_delete) {
if ($is_placeholder) {
$this->update_status = 'deleted';
} else {
$r = wp_delete_nav_menu($this->term_id);
if (is_wp_error($r)) {
$this->update_status = 'error';
$this->update_error = $r;
} else {
$this->update_status = 'deleted';
$auto_add = false;
}
}
} else {
$menu_data = wp_array_slice_assoc($value, array('description', 'parent'));
$menu_data['menu-name'] = $value['name'];
$menu_id = $is_placeholder ? 0 : $this->term_id;
$r = wp_update_nav_menu_object($menu_id, wp_slash($menu_data));
$original_name = $menu_data['menu-name'];
$name_conflict_suffix = 1;
while (is_wp_error($r) && 'menu_exists' === $r->get_error_code()) {
$name_conflict_suffix += 1;
$menu_data['menu-name'] = sprintf(__('%1$s (%2$d)'), $original_name, $name_conflict_suffix);
$r = wp_update_nav_menu_object($menu_id, wp_slash($menu_data));
}
if (is_wp_error($r)) {
$this->update_status = 'error';
$this->update_error = $r;
} else {
if ($is_placeholder) {
$this->previous_term_id = $this->term_id;
$this->term_id = $r;
$this->update_status = 'inserted';
} else {
$this->update_status = 'updated';
}
$auto_add = $value['auto_add'];
}
}
if (null !== $auto_add) {
$nav_menu_options = $this->filter_nav_menu_options_value((array) get_option('nav_menu_options', array()), $this->term_id, $auto_add);
update_option('nav_menu_options', $nav_menu_options);
}
if ('inserted' === $this->update_status) {
foreach ($this->manager->settings() as $setting) {
if (!preg_match('/^nav_menu_locations\\[/', $setting->id)) {
continue;
}
$post_value = $setting->post_value(null);
if (!is_null($post_value) && (int) $post_value === $this->previous_term_id) {
$this->manager->set_post_value($setting->id, $this->term_id);
$setting->save();
}
}
foreach (array_keys($this->manager->unsanitized_post_values()) as $setting_id) {
$nav_menu_widget_setting = $this->manager->get_setting($setting_id);
if (!$nav_menu_widget_setting || !preg_match('/^widget_nav_menu\\[/', $nav_menu_widget_setting->id)) {
continue;
}
$widget_instance = $nav_menu_widget_setting->post_value();
if (empty($widget_instance['nav_menu']) || (int) $widget_instance['nav_menu'] !== $this->previous_term_id) {
continue;
}
$widget_instance['nav_menu'] = $this->term_id;
$updated_widget_instance = $this->manager->widgets->sanitize_widget_js_instance($widget_instance);
$this->manager->set_post_value($nav_menu_widget_setting->id, $updated_widget_instance);
$nav_menu_widget_setting->save();
$this->_widget_nav_menu_updates[$nav_menu_widget_setting->id] = $updated_widget_instance;
}
}
}
protected function filter_nav_menu_options_value($nav_menu_options, $menu_id, $auto_add)
{
$nav_menu_options = (array) $nav_menu_options;
if (!isset($nav_menu_options['auto_add'])) {
$nav_menu_options['auto_add'] = array();
}
$i = array_search($menu_id, $nav_menu_options['auto_add'], true);
if ($auto_add && false === $i) {
array_push($nav_menu_options['auto_add'], $this->term_id);
} elseif (!$auto_add && false !== $i) {
array_splice($nav_menu_options['auto_add'], $i, 1);
}
return $nav_menu_options;
}
public function amend_customize_save_response($data)
{
if (!isset($data['nav_menu_updates'])) {
$data['nav_menu_updates'] = array();
}
if (!isset($data['widget_nav_menu_updates'])) {
$data['widget_nav_menu_updates'] = array();
}
$data['nav_menu_updates'][] = array('term_id' => $this->term_id, 'previous_term_id' => $this->previous_term_id, 'error' => $this->update_error ? $this->update_error->get_error_code() : null, 'status' => $this->update_status, 'saved_value' => 'deleted' === $this->update_status ? null : $this->value());
$data['widget_nav_menu_updates'] = array_merge($data['widget_nav_menu_updates'], $this->_widget_nav_menu_updates);
$this->_widget_nav_menu_updates = array();
return $data;
}
}