WP_Customize_Custom_CSS_Setting
云策文档标注
概述
WP_Customize_Custom_CSS_Setting 是 WordPress 自定义器中用于处理自定义 CSS 设置的类,继承自 WP_Customize_Setting。它管理 CSS 值的预览、验证、存储和获取,支持通过 custom_css 自定义文章类型存储样式表相关的 CSS。
关键要点
- 类继承自 WP_Customize_Setting,类型为 'custom_css',传输方式为 'postMessage',所需权限为 'edit_css'。
- 构造函数验证设置 ID 格式为 `custom_css[$stylesheet]`,并设置 stylesheet 属性。
- 提供预览功能,通过 filter_previewed_wp_get_custom_css 方法过滤 wp_get_custom_css 以应用自定义值。
- value 方法获取设置值,优先返回预览值,否则从 custom_css 文章类型中获取。
- validate 方法验证 CSS 值,检查非法标记,如不平衡的括号和注释,但自 4.9.0 起平衡字符检查已移至客户端。
- update 方法将 CSS 值存储到 custom_css 自定义文章类型中,并缓存文章 ID 到主题修改中以提高性能。
代码示例
final class WP_Customize_Custom_CSS_Setting extends WP_Customize_Setting {
public $type = 'custom_css';
public $transport = 'postMessage';
public $capability = 'edit_css';
public $stylesheet = '';
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];
}
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;
}
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;
}
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;
}
$value = apply_filters( "customize_value_{$id_base}", $value, $this );
return $value;
}
public function validate( $value ) {
$css = $value;
$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;
}
public function update( $value ) {
$css = $value;
if ( empty( $css ) ) {
$css = '';
}
$r = wp_update_custom_css_post(
$css,
array(
'stylesheet' => $this->stylesheet,
)
);
if ( is_wp_error( $r ) ) {
return false;
}
$post_id = $r->ID;
if ( $this->manager->get_stylesheet() === $this->stylesheet ) {
set_theme_mod( 'custom_css_post_id', $post_id );
}
return $post_id;
}
}注意事项
- 自 4.9.0 版本起,CSS 平衡字符(如括号)的验证已移至客户端代码编辑器中的 linting 工具,服务器端仅检查非法标记。
- 设置 ID 必须符合 `custom_css[$stylesheet]` 格式,否则构造函数会抛出异常。
- 预览功能通过添加 wp_get_custom_css 过滤器实现,确保自定义值在预览时正确应用。
- update 方法使用 wp_update_custom_css_post 函数存储 CSS,并缓存文章 ID 到主题修改中,以提高后续查询性能。
原文内容
Custom Setting to handle WP Custom CSS.
Description
See also
Methods
| Name | Description |
|---|---|
| WP_Customize_Custom_CSS_Setting::__construct | WP_Customize_Custom_CSS_Setting constructor. |
| WP_Customize_Custom_CSS_Setting::filter_previewed_wp_get_custom_css | Filters `wp_get_custom_css` for applying the customized value. |
| WP_Customize_Custom_CSS_Setting::preview | Add filter to preview post value. |
| WP_Customize_Custom_CSS_Setting::update | Store the CSS setting value in the custom_css custom post type for the stylesheet. |
| WP_Customize_Custom_CSS_Setting::validate | Validate a received value for being valid CSS. |
| WP_Customize_Custom_CSS_Setting::value | Fetch the value of the setting. Will return the previewed value when `preview()` is called. |
Source
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 a received value for being valid 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.
* @since 5.9.0 Renamed `$css` to `$value` for PHP 8 named parameter support.
*
* @param string $value CSS to validate.
* @return true|WP_Error True if the input was validated, otherwise WP_Error.
*/
public function validate( $value ) {
// Restores the more descriptive, specific name for use within this method.
$css = $value;
$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
* @since 5.9.0 Renamed `$css` to `$value` for PHP 8 named parameter support.
*
* @param string $value CSS to update.
* @return int|false The post ID or false if the value could not be saved.
*/
public function update( $value ) {
// Restores the more descriptive, specific name for use within this method.
$css = $value;
if ( empty( $css ) ) {
$css = '';
}
$r = wp_update_custom_css_post(
$css,
array(
'stylesheet' => $this->stylesheet,
)
);
if ( is_wp_error( $r ) ) {
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;
}
}
Changelog
| Version | Description |
|---|---|
| 4.7.0 | Introduced. |