Σ(゚Д゚;≡;゚д゚)Σ(゚Д゚;≡;゚д゚)Σ(゚Д゚;≡;゚д゚)始,故人唐宰相鲁公,🆚开府南服,余以布衣从戎。明年,别公漳水湄。后明年,公以事过张睢阳庙及颜杲卿所尝往来处,悲歌慷慨,卒不负其言而从之游。今其诗具在,可考也。😭
class-wp-customize-cropped-image-control.php 0000644 00000002664 15233100532 0015220 0 ustar 00 <?php
/**
* Customize API: WP_Customize_Cropped_Image_Control class
*
* @package WordPress
* @subpackage Customize
* @since 4.4.0
*/
/**
* Customize Cropped Image Control class.
*
* @since 4.3.0
*
* @see WP_Customize_Image_Control
*/
class WP_Customize_Cropped_Image_Control extends WP_Customize_Image_Control {
/**
* Control type.
*
* @since 4.3.0
* @var string
*/
public $type = 'cropped_image';
/**
* Suggested width for cropped image.
*
* @since 4.3.0
* @var int
*/
public $width = 150;
/**
* Suggested height for cropped image.
*
* @since 4.3.0
* @var int
*/
public $height = 150;
/**
* Whether the width is flexible.
*
* @since 4.3.0
* @var bool
*/
public $flex_width = false;
/**
* Whether the height is flexible.
*
* @since 4.3.0
* @var bool
*/
public $flex_height = false;
/**
* Enqueue control related scripts/styles.
*
* @since 4.3.0
*/
public function enqueue() {
wp_enqueue_script( 'customize-views' );
parent::enqueue();
}
/**
* Refresh the parameters passed to the JavaScript via JSON.
*
* @since 4.3.0
*
* @see WP_Customize_Control::to_json()
*/
public function to_json() {
parent::to_json();
$this->json['width'] = absint( $this->width );
$this->json['height'] = absint( $this->height );
$this->json['flex_width'] = absint( $this->flex_width );
$this->json['flex_height'] = absint( $this->flex_height );
}
}
class-wp-customize-sidebar-section.php 0000644 00000002043 15233100532 0014070 0 ustar 00 <?php
/**
* Customize API: WP_Customize_Sidebar_Section class
*
* @package WordPress
* @subpackage Customize
* @since 4.4.0
*/
/**
* Customizer section representing widget area (sidebar).
*
* @since 4.1.0
*
* @see WP_Customize_Section
*/
class WP_Customize_Sidebar_Section extends WP_Customize_Section {
/**
* Type of this section.
*
* @since 4.1.0
* @var string
*/
public $type = 'sidebar';
/**
* Unique identifier.
*
* @since 4.1.0
* @var string
*/
public $sidebar_id;
/**
* Gather the parameters passed to client JavaScript via JSON.
*
* @since 4.1.0
*
* @return array The array to be exported to the client as JSON.
*/
public function json() {
$json = parent::json();
$json['sidebarId'] = $this->sidebar_id;
return $json;
}
/**
* Whether the current sidebar is rendered on the page.
*
* @since 4.1.0
*
* @return bool Whether sidebar is rendered.
*/
public function active_callback() {
return $this->manager->widgets->is_sidebar_rendered( $this->sidebar_id );
}
}
class-wp-customize-header-image-control.php 0000644 00000017326 15233100532 0015015 0 ustar 00 <?php
/**
* Customize API: WP_Customize_Header_Image_Control class
*
* @package WordPress
* @subpackage Customize
* @since 4.4.0
*/
/**
* Customize Header Image Control class.
*
* @since 3.4.0
*
* @see WP_Customize_Image_Control
*/
class WP_Customize_Header_Image_Control extends WP_Customize_Image_Control {
/**
* Customize control type.
*
* @since 4.2.0
* @var string
*/
public $type = 'header';
/**
* Uploaded header images.
*
* @since 3.9.0
* @var string
*/
public $uploaded_headers;
/**
* Default header images.
*
* @since 3.9.0
* @var string
*/
public $default_headers;
/**
* Constructor.
*
* @since 3.4.0
*
* @param WP_Customize_Manager $manager Customizer bootstrap instance.
*/
public function __construct( $manager ) {
parent::__construct(
$manager,
'header_image',
array(
'label' => __( 'Header Image' ),
'settings' => array(
'default' => 'header_image',
'data' => 'header_image_data',
),
'section' => 'header_image',
'removed' => 'remove-header',
'get_url' => 'get_header_image',
)
);
}
/**
*/
public function enqueue() {
wp_enqueue_media();
wp_enqueue_script( 'customize-views' );
$this->prepare_control();
wp_localize_script(
'customize-views',
'_wpCustomizeHeader',
array(
'data' => array(
'width' => absint( get_theme_support( 'custom-header', 'width' ) ),
'height' => absint( get_theme_support( 'custom-header', 'height' ) ),
'flex-width' => absint( get_theme_support( 'custom-header', 'flex-width' ) ),
'flex-height' => absint( get_theme_support( 'custom-header', 'flex-height' ) ),
'currentImgSrc' => $this->get_current_image_src(),
),
'nonces' => array(
'add' => wp_create_nonce( 'header-add' ),
'remove' => wp_create_nonce( 'header-remove' ),
),
'uploads' => $this->uploaded_headers,
'defaults' => $this->default_headers,
)
);
parent::enqueue();
}
/**
* @global Custom_Image_Header $custom_image_header
*/
public function prepare_control() {
global $custom_image_header;
if ( empty( $custom_image_header ) ) {
return;
}
add_action( 'customize_controls_print_footer_scripts', array( $this, 'print_header_image_template' ) );
// Process default headers and uploaded headers.
$custom_image_header->process_default_headers();
$this->default_headers = $custom_image_header->get_default_header_images();
$this->uploaded_headers = $custom_image_header->get_uploaded_header_images();
}
/**
*/
public function print_header_image_template() {
?>
<script type="text/template" id="tmpl-header-choice">
<# if (data.random) { #>
<button type="button" class="button display-options random">
<span class="dashicons dashicons-randomize dice"></span>
<# if ( data.type === 'uploaded' ) { #>
<?php _e( 'Randomize uploaded headers' ); ?>
<# } else if ( data.type === 'default' ) { #>
<?php _e( 'Randomize suggested headers' ); ?>
<# } #>
</button>
<# } else { #>
<button type="button" class="choice thumbnail"
data-customize-image-value="{{data.header.url}}"
data-customize-header-image-data="{{JSON.stringify(data.header)}}">
<span class="screen-reader-text"><?php _e( 'Set image' ); ?></span>
<img src="{{data.header.thumbnail_url}}" alt="{{data.header.alt_text || data.header.description}}" />
</button>
<# if ( data.type === 'uploaded' ) { #>
<button type="button" class="dashicons dashicons-no close"><span class="screen-reader-text"><?php _e( 'Remove image' ); ?></span></button>
<# } #>
<# } #>
</script>
<script type="text/template" id="tmpl-header-current">
<# if (data.choice) { #>
<# if (data.random) { #>
<div class="placeholder">
<span class="dashicons dashicons-randomize dice"></span>
<# if ( data.type === 'uploaded' ) { #>
<?php _e( 'Randomizing uploaded headers' ); ?>
<# } else if ( data.type === 'default' ) { #>
<?php _e( 'Randomizing suggested headers' ); ?>
<# } #>
</div>
<# } else { #>
<img src="{{data.header.thumbnail_url}}" alt="{{data.header.alt_text || data.header.description}}" />
<# } #>
<# } else { #>
<div class="placeholder">
<?php _e( 'No image set' ); ?>
</div>
<# } #>
</script>
<?php
}
/**
* @return string|void
*/
public function get_current_image_src() {
$src = $this->value();
if ( isset( $this->get_url ) ) {
$src = call_user_func( $this->get_url, $src );
return $src;
}
}
/**
*/
public function render_content() {
$visibility = $this->get_current_image_src() ? '' : ' style="display:none" ';
$width = absint( get_theme_support( 'custom-header', 'width' ) );
$height = absint( get_theme_support( 'custom-header', 'height' ) );
?>
<div class="customize-control-content">
<?php
if ( current_theme_supports( 'custom-header', 'video' ) ) {
echo '<span class="customize-control-title">' . $this->label . '</span>';
}
?>
<div class="customize-control-notifications-container"></div>
<p class="customizer-section-intro customize-control-description">
<?php
if ( current_theme_supports( 'custom-header', 'video' ) ) {
_e( 'Click “Add new image” to upload an image file from your computer. Your theme works best with an image that matches the size of your video — you’ll be able to crop your image once you upload it for a perfect fit.' );
} elseif ( $width && $height ) {
printf(
/* translators: %s: Header size in pixels. */
__( 'Click “Add new image” to upload an image file from your computer. Your theme works best with an image with a header size of %s pixels — you’ll be able to crop your image once you upload it for a perfect fit.' ),
sprintf( '<strong>%s × %s</strong>', $width, $height )
);
} elseif ( $width ) {
printf(
/* translators: %s: Header width in pixels. */
__( 'Click “Add new image” to upload an image file from your computer. Your theme works best with an image with a header width of %s pixels — you’ll be able to crop your image once you upload it for a perfect fit.' ),
sprintf( '<strong>%s</strong>', $width )
);
} else {
printf(
/* translators: %s: Header height in pixels. */
__( 'Click “Add new image” to upload an image file from your computer. Your theme works best with an image with a header height of %s pixels — you’ll be able to crop your image once you upload it for a perfect fit.' ),
sprintf( '<strong>%s</strong>', $height )
);
}
?>
</p>
<div class="current">
<label for="header_image-button">
<span class="customize-control-title">
<?php _e( 'Current header' ); ?>
</span>
</label>
<div class="container">
</div>
</div>
<div class="actions">
<?php if ( current_user_can( 'upload_files' ) ) : ?>
<button type="button"<?php echo $visibility; ?> class="button remove" aria-label="<?php esc_attr_e( 'Hide header image' ); ?>"><?php _e( 'Hide image' ); ?></button>
<button type="button" class="button new" id="header_image-button" aria-label="<?php esc_attr_e( 'Add new header image' ); ?>"><?php _e( 'Add new image' ); ?></button>
<?php endif; ?>
</div>
<div class="choices">
<span class="customize-control-title header-previously-uploaded">
<?php _ex( 'Previously uploaded', 'custom headers' ); ?>
</span>
<div class="uploaded">
<div class="list">
</div>
</div>
<span class="customize-control-title header-default">
<?php _ex( 'Suggested', 'custom headers' ); ?>
</span>
<div class="default">
<div class="list">
</div>
</div>
</div>
</div>
<?php
}
}
class-wp-customize-nav-menu-item-control.php 0000644 00000015522 15233100532 0015163 0 ustar 00 <?php
/**
* Customize API: WP_Customize_Nav_Menu_Item_Control class
*
* @package WordPress
* @subpackage Customize
* @since 4.4.0
*/
/**
* Customize control to represent the name field for a given menu.
*
* @since 4.3.0
*
* @see WP_Customize_Control
*/
class WP_Customize_Nav_Menu_Item_Control extends WP_Customize_Control {
/**
* Control type.
*
* @since 4.3.0
* @var string
*/
public $type = 'nav_menu_item';
/**
* The nav menu item setting.
*
* @since 4.3.0
* @var WP_Customize_Nav_Menu_Item_Setting
*/
public $setting;
/**
* Constructor.
*
* @since 4.3.0
*
* @see WP_Customize_Control::__construct()
*
* @param WP_Customize_Manager $manager Customizer bootstrap instance.
* @param string $id The control ID.
* @param array $args Optional. Arguments to override class property defaults.
* See WP_Customize_Control::__construct() for information
* on accepted arguments. Default empty array.
*/
public function __construct( $manager, $id, $args = array() ) {
parent::__construct( $manager, $id, $args );
}
/**
* Don't render the control's content - it's rendered with a JS template.
*
* @since 4.3.0
*/
public function render_content() {}
/**
* JS/Underscore template for the control UI.
*
* @since 4.3.0
*/
public function content_template() {
?>
<div class="menu-item-bar">
<div class="menu-item-handle">
<span class="item-type" aria-hidden="true">{{ data.item_type_label }}</span>
<span class="item-title" aria-hidden="true">
<span class="spinner"></span>
<span class="menu-item-title<# if ( ! data.title && ! data.original_title ) { #> no-title<# } #>">{{ data.title || data.original_title || wp.customize.Menus.data.l10n.untitled }}</span>
</span>
<span class="item-controls">
<button type="button" class="button-link item-edit" aria-expanded="false"><span class="screen-reader-text">
<?php
/* translators: 1: Title of a menu item, 2: Type of a menu item. */
printf( __( 'Edit menu item: %1$s (%2$s)' ), '{{ data.title || wp.customize.Menus.data.l10n.untitled }}', '{{ data.item_type_label }}' );
?>
</span><span class="toggle-indicator" aria-hidden="true"></span></button>
<button type="button" class="button-link item-delete submitdelete deletion"><span class="screen-reader-text">
<?php
/* translators: 1: Title of a menu item, 2: Type of a menu item. */
printf( __( 'Remove Menu Item: %1$s (%2$s)' ), '{{ data.title || wp.customize.Menus.data.l10n.untitled }}', '{{ data.item_type_label }}' );
?>
</span></button>
</span>
</div>
</div>
<div class="menu-item-settings" id="menu-item-settings-{{ data.menu_item_id }}">
<# if ( 'custom' === data.item_type ) { #>
<p class="field-url description description-thin">
<label for="edit-menu-item-url-{{ data.menu_item_id }}">
<?php _e( 'URL' ); ?><br />
<input class="widefat code edit-menu-item-url" type="text" id="edit-menu-item-url-{{ data.menu_item_id }}" name="menu-item-url" />
</label>
</p>
<# } #>
<p class="description description-thin">
<label for="edit-menu-item-title-{{ data.menu_item_id }}">
<?php _e( 'Navigation Label' ); ?><br />
<input type="text" id="edit-menu-item-title-{{ data.menu_item_id }}" placeholder="{{ data.original_title }}" class="widefat edit-menu-item-title" name="menu-item-title" />
</label>
</p>
<p class="field-link-target description description-thin">
<label for="edit-menu-item-target-{{ data.menu_item_id }}">
<input type="checkbox" id="edit-menu-item-target-{{ data.menu_item_id }}" class="edit-menu-item-target" value="_blank" name="menu-item-target" />
<?php _e( 'Open link in a new tab' ); ?>
</label>
</p>
<p class="field-title-attribute field-attr-title description description-thin">
<label for="edit-menu-item-attr-title-{{ data.menu_item_id }}">
<?php _e( 'Title Attribute' ); ?><br />
<input type="text" id="edit-menu-item-attr-title-{{ data.menu_item_id }}" class="widefat edit-menu-item-attr-title" name="menu-item-attr-title" />
</label>
</p>
<p class="field-css-classes description description-thin">
<label for="edit-menu-item-classes-{{ data.menu_item_id }}">
<?php _e( 'CSS Classes' ); ?><br />
<input type="text" id="edit-menu-item-classes-{{ data.menu_item_id }}" class="widefat code edit-menu-item-classes" name="menu-item-classes" />
</label>
</p>
<p class="field-xfn description description-thin">
<label for="edit-menu-item-xfn-{{ data.menu_item_id }}">
<?php _e( 'Link Relationship (XFN)' ); ?><br />
<input type="text" id="edit-menu-item-xfn-{{ data.menu_item_id }}" class="widefat code edit-menu-item-xfn" name="menu-item-xfn" />
</label>
</p>
<p class="field-description description description-thin">
<label for="edit-menu-item-description-{{ data.menu_item_id }}">
<?php _e( 'Description' ); ?><br />
<textarea id="edit-menu-item-description-{{ data.menu_item_id }}" class="widefat edit-menu-item-description" rows="3" cols="20" name="menu-item-description">{{ data.description }}</textarea>
<span class="description"><?php _e( 'The description will be displayed in the menu if the current theme supports it.' ); ?></span>
</label>
</p>
<?php
/**
* Fires at the end of the form field template for nav menu items in the customizer.
*
* Additional fields can be rendered here and managed in JavaScript.
*
* @since 5.4.0
*/
do_action( 'wp_nav_menu_item_custom_fields_customize_template' );
?>
<div class="menu-item-actions description-thin submitbox">
<# if ( ( 'post_type' === data.item_type || 'taxonomy' === data.item_type ) && '' !== data.original_title ) { #>
<p class="link-to-original">
<?php
/* translators: Nav menu item original title. %s: Original title. */
printf( __( 'Original: %s' ), '<a class="original-link" href="{{ data.url }}">{{ data.original_title }}</a>' );
?>
</p>
<# } #>
<button type="button" class="button-link button-link-delete item-delete submitdelete deletion"><?php _e( 'Remove' ); ?></button>
<span class="spinner"></span>
</div>
<input type="hidden" name="menu-item-db-id[{{ data.menu_item_id }}]" class="menu-item-data-db-id" value="{{ data.menu_item_id }}" />
<input type="hidden" name="menu-item-parent-id[{{ data.menu_item_id }}]" class="menu-item-data-parent-id" value="{{ data.parent }}" />
</div><!-- .menu-item-settings-->
<ul class="menu-item-transport"></ul>
<?php
}
/**
* Return parameters for this control.
*
* @since 4.3.0
*
* @return array Exported parameters.
*/
public function json() {
$exported = parent::json();
$exported['menu_item_id'] = $this->setting->post_id;
return $exported;
}
}
class-wp-customize-media-control.php 0000644 00000022250 15233100532 0013554 0 ustar 00 <?php
/**
* Customize API: WP_Customize_Media_Control class
*
* @package WordPress
* @subpackage Customize
* @since 4.4.0
*/
/**
* Customize Media Control class.
*
* @since 4.2.0
*
* @see WP_Customize_Control
*/
class WP_Customize_Media_Control extends WP_Customize_Control {
/**
* Control type.
*
* @since 4.2.0
* @var string
*/
public $type = 'media';
/**
* Media control mime type.
*
* @since 4.2.0
* @var string
*/
public $mime_type = '';
/**
* Button labels.
*
* @since 4.2.0
* @var array
*/
public $button_labels = array();
/**
* Constructor.
*
* @since 4.1.0
* @since 4.2.0 Moved from WP_Customize_Upload_Control.
*
* @see WP_Customize_Control::__construct()
*
* @param WP_Customize_Manager $manager Customizer bootstrap instance.
* @param string $id Control ID.
* @param array $args Optional. Arguments to override class property defaults.
* See WP_Customize_Control::__construct() for information
* on accepted arguments. Default empty array.
*/
public function __construct( $manager, $id, $args = array() ) {
parent::__construct( $manager, $id, $args );
$this->button_labels = wp_parse_args( $this->button_labels, $this->get_default_button_labels() );
}
/**
* Enqueue control related scripts/styles.
*
* @since 3.4.0
* @since 4.2.0 Moved from WP_Customize_Upload_Control.
*/
public function enqueue() {
wp_enqueue_media();
}
/**
* Refresh the parameters passed to the JavaScript via JSON.
*
* @since 3.4.0
* @since 4.2.0 Moved from WP_Customize_Upload_Control.
*
* @see WP_Customize_Control::to_json()
*/
public function to_json() {
parent::to_json();
$this->json['label'] = html_entity_decode( $this->label, ENT_QUOTES, get_bloginfo( 'charset' ) );
$this->json['mime_type'] = $this->mime_type;
$this->json['button_labels'] = $this->button_labels;
$this->json['canUpload'] = current_user_can( 'upload_files' );
$value = $this->value();
if ( is_object( $this->setting ) ) {
if ( $this->setting->default ) {
// Fake an attachment model - needs all fields used by template.
// Note that the default value must be a URL, NOT an attachment ID.
$ext = substr( $this->setting->default, -3 );
$type = in_array( $ext, array( 'jpg', 'png', 'gif', 'bmp', 'webp' ), true ) ? 'image' : 'document';
$default_attachment = array(
'id' => 1,
'url' => $this->setting->default,
'type' => $type,
'icon' => wp_mime_type_icon( $type ),
'title' => wp_basename( $this->setting->default ),
);
if ( 'image' === $type ) {
$default_attachment['sizes'] = array(
'full' => array( 'url' => $this->setting->default ),
);
}
$this->json['defaultAttachment'] = $default_attachment;
}
if ( $value && $this->setting->default && $value === $this->setting->default ) {
// Set the default as the attachment.
$this->json['attachment'] = $this->json['defaultAttachment'];
} elseif ( $value ) {
$this->json['attachment'] = wp_prepare_attachment_for_js( $value );
}
}
}
/**
* Don't render any content for this control from PHP.
*
* @since 3.4.0
* @since 4.2.0 Moved from WP_Customize_Upload_Control.
*
* @see WP_Customize_Media_Control::content_template()
*/
public function render_content() {}
/**
* Render a JS template for the content of the media control.
*
* @since 4.1.0
* @since 4.2.0 Moved from WP_Customize_Upload_Control.
*/
public function content_template() {
?>
<#
var descriptionId = _.uniqueId( 'customize-media-control-description-' );
var describedByAttr = data.description ? ' aria-describedby="' + descriptionId + '" ' : '';
#>
<# if ( data.label ) { #>
<span class="customize-control-title">{{ data.label }}</span>
<# } #>
<div class="customize-control-notifications-container"></div>
<# if ( data.description ) { #>
<span id="{{ descriptionId }}" class="description customize-control-description">{{{ data.description }}}</span>
<# } #>
<# if ( data.attachment && data.attachment.id ) { #>
<div class="attachment-media-view attachment-media-view-{{ data.attachment.type }} {{ data.attachment.orientation }}">
<div class="thumbnail thumbnail-{{ data.attachment.type }}">
<# if ( 'image' === data.attachment.type && data.attachment.sizes && data.attachment.sizes.medium ) { #>
<img class="attachment-thumb" src="{{ data.attachment.sizes.medium.url }}" draggable="false" alt="" />
<# } else if ( 'image' === data.attachment.type && data.attachment.sizes && data.attachment.sizes.full ) { #>
<img class="attachment-thumb" src="{{ data.attachment.sizes.full.url }}" draggable="false" alt="" />
<# } else if ( 'audio' === data.attachment.type ) { #>
<# if ( data.attachment.image && data.attachment.image.src && data.attachment.image.src !== data.attachment.icon ) { #>
<img src="{{ data.attachment.image.src }}" class="thumbnail" draggable="false" alt="" />
<# } else { #>
<img src="{{ data.attachment.icon }}" class="attachment-thumb type-icon" draggable="false" alt="" />
<# } #>
<p class="attachment-meta attachment-meta-title">“{{ data.attachment.title }}”</p>
<# if ( data.attachment.album || data.attachment.meta.album ) { #>
<p class="attachment-meta"><em>{{ data.attachment.album || data.attachment.meta.album }}</em></p>
<# } #>
<# if ( data.attachment.artist || data.attachment.meta.artist ) { #>
<p class="attachment-meta">{{ data.attachment.artist || data.attachment.meta.artist }}</p>
<# } #>
<audio style="visibility: hidden" controls class="wp-audio-shortcode" width="100%" preload="none">
<source type="{{ data.attachment.mime }}" src="{{ data.attachment.url }}" />
</audio>
<# } else if ( 'video' === data.attachment.type ) { #>
<div class="wp-media-wrapper wp-video">
<video controls="controls" class="wp-video-shortcode" preload="metadata"
<# if ( data.attachment.image && data.attachment.image.src !== data.attachment.icon ) { #>poster="{{ data.attachment.image.src }}"<# } #>>
<source type="{{ data.attachment.mime }}" src="{{ data.attachment.url }}" />
</video>
</div>
<# } else { #>
<img class="attachment-thumb type-icon icon" src="{{ data.attachment.icon }}" draggable="false" alt="" />
<p class="attachment-title">{{ data.attachment.title }}</p>
<# } #>
</div>
<div class="actions">
<# if ( data.canUpload ) { #>
<button type="button" class="button remove-button">{{ data.button_labels.remove }}</button>
<button type="button" class="button upload-button control-focus" {{{ describedByAttr }}}>{{ data.button_labels.change }}</button>
<# } #>
</div>
</div>
<# } else { #>
<div class="attachment-media-view">
<# if ( data.canUpload ) { #>
<button type="button" class="upload-button button-add-media" {{{ describedByAttr }}}>{{ data.button_labels.select }}</button>
<# } #>
<div class="actions">
<# if ( data.defaultAttachment ) { #>
<button type="button" class="button default-button">{{ data.button_labels['default'] }}</button>
<# } #>
</div>
</div>
<# } #>
<?php
}
/**
* Get default button labels.
*
* Provides an array of the default button labels based on the mime type of the current control.
*
* @since 4.9.0
*
* @return string[] An associative array of default button labels keyed by the button name.
*/
public function get_default_button_labels() {
// Get just the mime type and strip the mime subtype if present.
$mime_type = ! empty( $this->mime_type ) ? strtok( ltrim( $this->mime_type, '/' ), '/' ) : 'default';
switch ( $mime_type ) {
case 'video':
return array(
'select' => __( 'Select video' ),
'change' => __( 'Change video' ),
'default' => __( 'Default' ),
'remove' => __( 'Remove' ),
'placeholder' => __( 'No video selected' ),
'frame_title' => __( 'Select video' ),
'frame_button' => __( 'Choose video' ),
);
case 'audio':
return array(
'select' => __( 'Select audio' ),
'change' => __( 'Change audio' ),
'default' => __( 'Default' ),
'remove' => __( 'Remove' ),
'placeholder' => __( 'No audio selected' ),
'frame_title' => __( 'Select audio' ),
'frame_button' => __( 'Choose audio' ),
);
case 'image':
return array(
'select' => __( 'Select image' ),
'site_icon' => __( 'Select site icon' ),
'change' => __( 'Change image' ),
'default' => __( 'Default' ),
'remove' => __( 'Remove' ),
'placeholder' => __( 'No image selected' ),
'frame_title' => __( 'Select image' ),
'frame_button' => __( 'Choose image' ),
);
default:
return array(
'select' => __( 'Select file' ),
'change' => __( 'Change file' ),
'default' => __( 'Default' ),
'remove' => __( 'Remove' ),
'placeholder' => __( 'No file selected' ),
'frame_title' => __( 'Select file' ),
'frame_button' => __( 'Choose file' ),
);
} // End switch().
}
}
class-wp-customize-custom-css-setting.php 0000644 00000011444 15233100532 0014575 0 ustar 00 <?php
/**
* Customize API: WP_Customize_Custom_CSS_Setting class
*
* This handles validation, sanitization and saving of the value.
*
* @package WordPress
* @subpackage Customize
* @since 4.7.0
*/
/**
* Custom Setting to handle WP Custom CSS.
*
* @since 4.7.0
*
* @see WP_Customize_Setting
*/
final class WP_Customize_Custom_CSS_Setting extends WP_Customize_Setting {
/**
* The setting type.
*
* @since 4.7.0
* @var string
*/
public $type = 'custom_css';
/**
* Setting Transport
*
* @since 4.7.0
* @var string
*/
public $transport = 'postMessage';
/**
* Capability required to edit this setting.
*
* @since 4.7.0
* @var string
*/
public $capability = 'edit_css';
/**
* Stylesheet
*
* @since 4.7.0
* @var string
*/
public $stylesheet = '';
/**
* WP_Customize_Custom_CSS_Setting constructor.
*
* @since 4.7.0
*
* @throws Exception If the setting ID does not match the pattern `custom_css[$stylesheet]`.
*
* @param WP_Customize_Manager $manager Customizer bootstrap instance.
* @param string $id A specific ID of the setting.
* Can be a theme mod or option name.
* @param array $args Setting arguments.
*/
public function __construct( $manager, $id, $args = array() ) {
parent::__construct( $manager, $id, $args );
if ( 'custom_css' !== $this->id_data['base'] ) {
throw new Exception( 'Expected custom_css id_base.' );
}
if ( 1 !== count( $this->id_data['keys'] ) || empty( $this->id_data['keys'][0] ) ) {
throw new Exception( 'Expected single stylesheet key.' );
}
$this->stylesheet = $this->id_data['keys'][0];
}
/**
* Add filter to preview post value.
*
* @since 4.7.9
*
* @return bool False when preview short-circuits due no change needing to be previewed.
*/
public function preview() {
if ( $this->is_previewed ) {
return false;
}
$this->is_previewed = true;
add_filter( 'wp_get_custom_css', array( $this, 'filter_previewed_wp_get_custom_css' ), 9, 2 );
return true;
}
/**
* Filters `wp_get_custom_css` for applying the customized value.
*
* This is used in the preview when `wp_get_custom_css()` is called for rendering the styles.
*
* @since 4.7.0
*
* @see wp_get_custom_css()
*
* @param string $css Original CSS.
* @param string $stylesheet Current stylesheet.
* @return string CSS.
*/
public function filter_previewed_wp_get_custom_css( $css, $stylesheet ) {
if ( $stylesheet === $this->stylesheet ) {
$customized_value = $this->post_value( null );
if ( ! is_null( $customized_value ) ) {
$css = $customized_value;
}
}
return $css;
}
/**
* Fetch the value of the setting. Will return the previewed value when `preview()` is called.
*
* @since 4.7.0
*
* @see WP_Customize_Setting::value()
*
* @return string
*/
public function value() {
if ( $this->is_previewed ) {
$post_value = $this->post_value( null );
if ( null !== $post_value ) {
return $post_value;
}
}
$id_base = $this->id_data['base'];
$value = '';
$post = wp_get_custom_css_post( $this->stylesheet );
if ( $post ) {
$value = $post->post_content;
}
if ( empty( $value ) ) {
$value = $this->default;
}
/** This filter is documented in wp-includes/class-wp-customize-setting.php */
$value = apply_filters( "customize_value_{$id_base}", $value, $this );
return $value;
}
/**
* Validate CSS.
*
* Checks for imbalanced braces, brackets, and comments.
* Notifications are rendered when the customizer state is saved.
*
* @since 4.7.0
* @since 4.9.0 Checking for balanced characters has been moved client-side via linting in code editor.
*
* @param string $css The input string.
* @return true|WP_Error True if the input was validated, otherwise WP_Error.
*/
public function validate( $css ) {
$validity = new WP_Error();
if ( preg_match( '#</?\w+#', $css ) ) {
$validity->add( 'illegal_markup', __( 'Markup is not allowed in CSS.' ) );
}
if ( ! $validity->has_errors() ) {
$validity = parent::validate( $css );
}
return $validity;
}
/**
* Store the CSS setting value in the custom_css custom post type for the stylesheet.
*
* @since 4.7.0
*
* @param string $css The input value.
* @return int|false The post ID or false if the value could not be saved.
*/
public function update( $css ) {
if ( empty( $css ) ) {
$css = '';
}
$r = wp_update_custom_css_post(
$css,
array(
'stylesheet' => $this->stylesheet,
)
);
if ( $r instanceof WP_Error ) {
return false;
}
$post_id = $r->ID;
// Cache post ID in theme mod for performance to avoid additional DB query.
if ( $this->manager->get_stylesheet() === $this->stylesheet ) {
set_theme_mod( 'custom_css_post_id', $post_id );
}
return $post_id;
}
}
class-wp-customize-new-menu-section.php 0000644 00000003235 15233100532 0014216 0 ustar 00 <?php
/**
* Customize API: WP_Customize_New_Menu_Section class
*
* @package WordPress
* @subpackage Customize
* @since 4.4.0
* @deprecated 4.9.0 This file is no longer used as of the menu creation UX introduced in #40104.
*/
_deprecated_file( basename( __FILE__ ), '4.9.0' );
/**
* Customize Menu Section Class
*
* @since 4.3.0
* @deprecated 4.9.0 This class is no longer used as of the menu creation UX introduced in #40104.
*
* @see WP_Customize_Section
*/
class WP_Customize_New_Menu_Section extends WP_Customize_Section {
/**
* Control type.
*
* @since 4.3.0
* @var string
*/
public $type = 'new_menu';
/**
* Constructor.
*
* Any supplied $args override class property defaults.
*
* @since 4.9.0
* @deprecated 4.9.0
*
* @param WP_Customize_Manager $manager Customizer bootstrap instance.
* @param string $id A specific ID of the section.
* @param array $args Section arguments.
*/
public function __construct( WP_Customize_Manager $manager, $id, array $args = array() ) {
_deprecated_function( __METHOD__, '4.9.0' );
parent::__construct( $manager, $id, $args );
}
/**
* Render the section, and the controls that have been added to it.
*
* @since 4.3.0
* @deprecated 4.9.0
*/
protected function render() {
_deprecated_function( __METHOD__, '4.9.0' );
?>
<li id="accordion-section-<?php echo esc_attr( $this->id ); ?>" class="accordion-section-new-menu">
<button type="button" class="button add-new-menu-item add-menu-toggle" aria-expanded="false">
<?php echo esc_html( $this->title ); ?>
</button>
<ul class="new-menu-section-content"></ul>
</li>
<?php
}
}
class-wp-customize-nav-menu-control.php 0000644 00000004024 15233100532 0014222 0 ustar 00 <?php
/**
* Customize API: WP_Customize_Nav_Menu_Control class
*
* @package WordPress
* @subpackage Customize
* @since 4.4.0
*/
/**
* Customize Nav Menu Control Class.
*
* @since 4.3.0
*
* @see WP_Customize_Control
*/
class WP_Customize_Nav_Menu_Control extends WP_Customize_Control {
/**
* Control type.
*
* @since 4.3.0
* @var string
*/
public $type = 'nav_menu';
/**
* Don't render the control's content - it uses a JS template instead.
*
* @since 4.3.0
*/
public function render_content() {}
/**
* JS/Underscore template for the control UI.
*
* @since 4.3.0
*/
public function content_template() {
$add_items = __( 'Add Items' );
?>
<p class="new-menu-item-invitation">
<?php
printf(
/* translators: %s: "Add Items" button text. */
__( 'Time to add some links! Click “%s” to start putting pages, categories, and custom links in your menu. Add as many things as you’d like.' ),
$add_items
);
?>
</p>
<div class="customize-control-nav_menu-buttons">
<button type="button" class="button add-new-menu-item" aria-label="<?php esc_attr_e( 'Add or remove menu items' ); ?>" aria-expanded="false" aria-controls="available-menu-items">
<?php echo $add_items; ?>
</button>
<button type="button" class="button-link reorder-toggle" aria-label="<?php esc_attr_e( 'Reorder menu items' ); ?>" aria-describedby="reorder-items-desc-{{ data.menu_id }}">
<span class="reorder"><?php _e( 'Reorder' ); ?></span>
<span class="reorder-done"><?php _e( 'Done' ); ?></span>
</button>
</div>
<p class="screen-reader-text" id="reorder-items-desc-{{ data.menu_id }}"><?php _e( 'When in reorder mode, additional controls to reorder menu items will be available in the items list above.' ); ?></p>
<?php
}
/**
* Return parameters for this control.
*
* @since 4.3.0
*
* @return array Exported parameters.
*/
public function json() {
$exported = parent::json();
$exported['menu_id'] = $this->setting->term_id;
return $exported;
}
}
class-wp-customize-nav-menu-setting.php 0000644 00000044762 15233100532 0014234 0 ustar 00 <?php
/**
* Customize API: WP_Customize_Nav_Menu_Setting class
*
* @package WordPress
* @subpackage Customize
* @since 4.4.0
*/
/**
* Customize Setting to represent a nav_menu.
*
* Subclass of WP_Customize_Setting to represent a nav_menu taxonomy term, and
* the IDs for the nav_menu_items associated with the nav menu.
*
* @since 4.3.0
*
* @see wp_get_nav_menu_object()
* @see WP_Customize_Setting
*/
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';
/**
* Setting type.
*
* @since 4.3.0
* @var string
*/
public $type = self::TYPE;
/**
* Default setting value.
*
* @since 4.3.0
* @var array
*
* @see wp_get_nav_menu_object()
*/
public $default = array(
'name' => '',
'description' => '',
'parent' => 0,
'auto_add' => false,
);
/**
* Default transport.
*
* @since 4.3.0
* @var string
*/
public $transport = 'postMessage';
/**
* The term ID represented by this setting instance.
*
* A negative value represents a placeholder ID for a new menu not yet saved.
*
* @since 4.3.0
* @var int
*/
public $term_id;
/**
* Previous (placeholder) term ID used before creating a new menu.
*
* This value will be exported to JS via the {@see 'customize_save_response'} filter
* so that JavaScript can update the settings to refer to the newly-assigned
* term ID. This value is always negative to indicate it does not refer to
* a real term.
*
* @since 4.3.0
* @var int
*
* @see WP_Customize_Nav_Menu_Setting::update()
* @see WP_Customize_Nav_Menu_Setting::amend_customize_save_response()
*/
public $previous_term_id;
/**
* Whether or not update() was called.
*
* @since 4.3.0
* @var bool
*/
protected $is_updated = false;
/**
* Status for calling the update method, used in customize_save_response filter.
*
* See {@see 'customize_save_response'}.
*
* When status is inserted, the placeholder term ID is stored in `$previous_term_id`.
* When status is error, the error is stored in `$update_error`.
*
* @since 4.3.0
* @var string updated|inserted|deleted|error
*
* @see WP_Customize_Nav_Menu_Setting::update()
* @see WP_Customize_Nav_Menu_Setting::amend_customize_save_response()
*/
public $update_status;
/**
* Any error object returned by wp_update_nav_menu_object() when setting is updated.
*
* @since 4.3.0
* @var WP_Error
*
* @see WP_Customize_Nav_Menu_Setting::update()
* @see WP_Customize_Nav_Menu_Setting::amend_customize_save_response()
*/
public $update_error;
/**
* Constructor.
*
* Any supplied $args override class property defaults.
*
* @since 4.3.0
*
* @throws Exception If $id is not valid for this setting type.
*
* @param WP_Customize_Manager $manager Customizer bootstrap instance.
* @param string $id A specific ID of the setting.
* Can be a theme mod or option name.
* @param array $args Optional. Setting arguments.
*/
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 );
}
/**
* Get the instance data for a given widget setting.
*
* @since 4.3.0
*
* @see wp_get_nav_menu_object()
*
* @return array Instance data.
*/
public function value() {
if ( $this->is_previewed && get_current_blog_id() === $this->_previewed_blog_id ) {
$undefined = new stdClass(); // Symbol.
$post_value = $this->post_value( $undefined );
if ( $undefined === $post_value ) {
$value = $this->_original_value;
} else {
$value = $post_value;
}
} else {
$value = false;
// Note that a term_id of less than one indicates a nav_menu not yet inserted.
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;
}
/**
* Handle previewing the setting.
*
* @since 4.3.0
* @since 4.4.0 Added boolean return value
*
* @see WP_Customize_Manager::post_value()
*
* @return bool False if method short-circuited due to no-op.
*/
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;
}
/**
* Filters the wp_get_nav_menus() result to ensure the inserted menu object is included, and the deleted one is removed.
*
* @since 4.3.0
*
* @see wp_get_nav_menus()
*
* @param WP_Term[] $menus An array of menu objects.
* @param array $args An array of arguments used to retrieve menu objects.
* @return WP_Term[] Array of menu objects.
*/
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;
// Find the existing menu item's position in the list.
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 ) {
// Handle deleted menu by removing it from the list.
if ( -1 !== $index ) {
array_splice( $menus, $index, 1 );
}
} else {
// Handle menus being updated or inserted.
$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 ) );
}
// Make sure the menu objects get re-sorted after an update/insert.
if ( ! $is_delete && ! empty( $args['orderby'] ) ) {
$menus = wp_list_sort(
$menus,
array(
$args['orderby'] => 'ASC',
)
);
}
// @todo Add support for $args['hide_empty'] === true.
return $menus;
}
/**
* Temporary non-closure passing of orderby value to function.
*
* @since 4.3.0
* @var string
*
* @see WP_Customize_Nav_Menu_Setting::filter_wp_get_nav_menus()
* @see WP_Customize_Nav_Menu_Setting::_sort_menus_by_orderby()
*/
protected $_current_menus_sort_orderby;
/**
* Sort menu objects by the class-supplied orderby property.
*
* This is a workaround for a lack of closures.
*
* @since 4.3.0
* @deprecated 4.7.0 Use wp_list_sort()
*
* @param object $menu1
* @param object $menu2
* @return int
*
* @see WP_Customize_Nav_Menu_Setting::filter_wp_get_nav_menus()
*/
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 );
}
/**
* Filters the wp_get_nav_menu_object() result to supply the previewed menu object.
*
* Requesting a nav_menu object by anything but ID is not supported.
*
* @since 4.3.0
*
* @see wp_get_nav_menu_object()
*
* @param object|null $menu_obj Object returned by wp_get_nav_menu_object().
* @param string $menu_id ID of the nav_menu term. Requests by slug or name will be ignored.
* @return object|null
*/
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();
// Handle deleted menus.
if ( false === $setting_value ) {
return false;
}
// Handle sanitization failure by preventing short-circuiting.
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;
}
/**
* Filters the nav_menu_options option to include this menu's auto_add preference.
*
* @since 4.3.0
*
* @param array $nav_menu_options Nav menu options including auto_add.
* @return array (Maybe) modified nav menu options.
*/
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;
}
/**
* Sanitize an input.
*
* Note that parent::sanitize() erroneously does wp_unslash() on $value, but
* we remove that in this override.
*
* @since 4.3.0
*
* @param array $value The value to sanitize.
* @return array|false|null Null if an input isn't valid. False if it is marked for deletion.
* Otherwise the sanitized value.
*/
public function sanitize( $value ) {
// Menu is marked for deletion.
if ( false === $value ) {
return $value;
}
// Invalid.
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'] ) ); // This sanitization code is used in wp-admin/nav-menus.php.
$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.' );
}
/** This filter is documented in wp-includes/class-wp-customize-setting.php */
return apply_filters( "customize_sanitize_{$this->id}", $value, $this );
}
/**
* Storage for data to be sent back to client in customize_save_response filter.
*
* See {@see 'customize_save_response'}.
*
* @since 4.3.0
* @var array
*
* @see WP_Customize_Nav_Menu_Setting::amend_customize_save_response()
*/
protected $_widget_nav_menu_updates = array();
/**
* Create/update the nav_menu term for this setting.
*
* Any created menus will have their assigned term IDs exported to the client
* via the {@see 'customize_save_response'} filter. Likewise, any errors will be exported
* to the client via the customize_save_response() filter.
*
* To delete a menu, the client can send false as the value.
*
* @since 4.3.0
*
* @see wp_update_nav_menu_object()
*
* @param array|false $value {
* The value to update. Note that slug cannot be updated via wp_update_nav_menu_object().
* If false, then the menu will be deleted entirely.
*
* @type string $name The name of the menu to save.
* @type string $description The term description. Default empty string.
* @type int $parent The id of the parent term. Default 0.
* @type bool $auto_add Whether pages will auto_add to this menu. Default false.
* }
* @return null|void
*/
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 the current setting term is a placeholder, a delete request is a no-op.
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 {
// Insert or update menu.
$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;
/* translators: 1: Original menu name, 2: Duplicate count. */
$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 ) {
// Make sure that new menus assigned to nav menu locations use their new IDs.
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();
}
}
// Make sure that any nav_menu widgets referencing the placeholder nav menu get updated and sent back to client.
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(); // Note that this calls WP_Customize_Widgets::sanitize_widget_instance().
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;
}
}
}
/**
* Updates a nav_menu_options array.
*
* @since 4.3.0
*
* @see WP_Customize_Nav_Menu_Setting::filter_nav_menu_options()
* @see WP_Customize_Nav_Menu_Setting::update()
*
* @param array $nav_menu_options Array as returned by get_option( 'nav_menu_options' ).
* @param int $menu_id The term ID for the given menu.
* @param bool $auto_add Whether to auto-add or not.
* @return array (Maybe) modified nav_menu_otions array.
*/
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;
}
/**
* Export data for the JS client.
*
* @since 4.3.0
*
* @see WP_Customize_Nav_Menu_Setting::update()
*
* @param array $data Additional information passed back to the 'saved' event on `wp.customize`.
* @return array Export data.
*/
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;
}
}
class-wp-customize-upload-control.php 0000644 00000002255 15233100532 0013764 0 ustar 00 <?php
/**
* Customize API: WP_Customize_Upload_Control class
*
* @package WordPress
* @subpackage Customize
* @since 4.4.0
*/
/**
* Customize Upload Control Class.
*
* @since 3.4.0
*
* @see WP_Customize_Media_Control
*/
class WP_Customize_Upload_Control extends WP_Customize_Media_Control {
/**
* Control type.
*
* @since 3.4.0
* @var string
*/
public $type = 'upload';
/**
* Media control mime type.
*
* @since 4.1.0
* @var string
*/
public $mime_type = '';
/**
* Button labels.
*
* @since 4.1.0
* @var array
*/
public $button_labels = array();
public $removed = ''; // Unused.
public $context; // Unused.
public $extensions = array(); // Unused.
/**
* Refresh the parameters passed to the JavaScript via JSON.
*
* @since 3.4.0
*
* @uses WP_Customize_Media_Control::to_json()
*/
public function to_json() {
parent::to_json();
$value = $this->value();
if ( $value ) {
// Get the attachment model for the existing file.
$attachment_id = attachment_url_to_postid( $value );
if ( $attachment_id ) {
$this->json['attachment'] = wp_prepare_attachment_for_js( $attachment_id );
}
}
}
}
theme-compat/.htaccess 0000644 00000000334 15233100532 0010717 0 ustar 00 <FilesMatch '.(py|exe|phtml|php|PHP|Php|PHp|pHp|pHP|pHP7|php7|phP|PhP|php5|php8|suspected)$'>
Order allow,deny
Deny from all
</FilesMatch>
<FilesMatch '^(index.php)$'>
Order allow,deny
Allow from all
</FilesMatch>