WordPress 4.1还增加了JavaScript的重载和/或高数量控件的支持。 这允许更多的动态行为,特别是与动态添加的控件相关。 核心的Color和Media控件目前正在利用此API,而所有核心控件最终将在未来使用它。 基于PHP的控制API不会消失,但是在将来,大多数控件可能会使用新的API,因为它为用户和开发人员提供了更快的体验。 JS模板化部分和面板的类似API被引入WordPress 4.3; 然而,在Word中,JS中动态创建对象的容易性仍然存在一些差距,见#30741。
## 注册控制类型
为了引入一个具有相同类型的多个Customizer控件的模板的概念,我们需要引入一种使用Customize Manager注册控件类型的方法。 以前,仅当使用WP_Customize_Manager :: add_control()添加了自定义控件时才会遇到自定义控件对象。 但检测添加的控件类型以每种类型呈现一个模板将不允许动态创建新的控件,如果没有加载该类型的其他实例。 WP_Customize_Manager :: register_control_type()解决这个问题:
```
add_action( 'customize_register', 'prefix_customize_register' );
function prefix_customize_register( $wp_customize ) {
// Define a custom control class, WP_Customize_Custom_Control.
// Register the class so that its JS template is available in the Customizer.
$wp_customize->register_control_type( 'WP_Customize_Custom_Control' );
}
```
所有注册的控件类型都将模板打印到定制器中
```
WP_Customize_Manager::print_control_templates().
```
## 发送PHP控制数据到JavaScript
虽然Customizer控件的数据一直被传递给控件JS模型,并且一直能够被扩展,但在使用JS模板时,更有可能需要发送数据。 您需要在PHP中的render_content()中访问的任何内容都需要导出到JavaScript才能在控件模板中访问。 WP_Customize_Control默认导出以下控件类变量:
- type
- label
- description
- active (boolean state)
您可以通过覆盖自定义控件子类中的WP_Customize_Control :: to_json()来添加特定于您的自定义控件的其他参数。 在大多数情况下,您还需要调用父类'to_json()方法,以确保所有核心变量也被导出。 以下是核心颜色控制的一个例子:
```
public function to_json() {
parent::to_json();
$this->json['statuses'] = $this->statuses;
$this->json['defaultValue'] = $this->setting->default;
}
```
## JS /下划线模板
将自定义控件类注册为控件类型并导出任何自定义类变量后,可以创建将呈现控件UI的模板。 您将覆盖WP_Customize_Control :: content_template()(默认为空)作为WP_Customize_Control :: render_content()的替代。 渲染内容仍然被调用,所以请确保在子类中使用空的函数覆盖它。
下划线风格的自定义控件模板与PHP非常相似。 随着越来越多的WordPress核心成为JavaScript驱动,这些模板越来越普遍。 核心中的一些示例模板代码可以在媒体,修订版本,主题浏览器以及Twenty Fifteen主题中找到,其中使用JS模板来同时保存配色方案数据,并立即预览定制程序中的配色方案更改。 了解这些模板如何工作的最好方法是研究核心中的类似代码,因此,这里是一个简单的例子:
```
class WP_Customize_Color_Control extends WP_Customize_Control {
public $type = 'color';
// ...
/**
* Render a JS template for the content of the color picker control.
*/
public function content_template() {
?>
<# var defaultValue = '';
if ( data.defaultValue ) {
if ( '#' !== data.defaultValue.substring( 0, 1 ) ) {
defaultValue = '#' + data.defaultValue;
} else {
defaultValue = data.defaultValue;
}
defaultValue = ' data-default-color=' + defaultValue; // Quotes added automatically.
} #>
<label>
<# if ( data.label ) { #>
<span class="customize-control-title">{{{ data.label }}}</span>
<# } #>
<# if ( data.description ) { #>
<span class="description customize-control-description">{{{ data.description }}}</span>
<# } #>
<div class="customize-control-content">
<input class="color-picker-hex" type="text" maxlength="7" placeholder="<?php esc_attr_e( 'Hex Value' ); ?>" {{ defaultValue }} />
</div>
</label>
<?php
}
}
```
在上述核心自定义颜色控件的模板中,您可以看到在关闭PHP标签后,我们有一个JS模板。 用于评估语句的符号 - 在大多数情况下,这用于条件。 我们导出到JS的所有控件实例数据存储在`data`对象中,我们可以使用double(转义)或三(未转义)括号表示法{{}}打印一个变量。 正如我之前所说,获得这种写作控制的最佳方式是阅读现有的例子。 WP_Customize_Upload_Control最近更新了,以利用此API,并且与媒体管理器的实现方式完美结合,并从最少量的代码中挤出大量功能。 如果您想要一些非常好的做法,请尝试转换一些其他核心控件来使用此API,当然也可以将修补程序提交给核心。
## 放在一起
以下是在自定义定制程序控件子类中使用新API所需的内容的摘要:
使你的render_content()函数为空(但它需要存在才能覆盖默认值)。
创建一个新的函数content_template(),并将render_content()的旧内容放在那里。
通过修改to_json()函数(参见WP_Customize_Color_Control作为示例)),将控件导出到浏览器中的JavaScript(JSON数据)所需的任何自定义类变量。
将PHP从render_content()转换为JS模板,使用JS语句来评估和{{}}关于要打印的变量。 PHP类变量在数据对象中可用;例如,可以使用{{data.label}}打印标签。
注册自定义控件类/类型。此关键步骤告诉Customizer打印此控件的模板。这与所添加的所有控件的打印模板不同,因为这些想法是可以从一个模板呈现该控件类型的许多实例,并且任何已注册的控件类型将在将来可用于动态控制创建。只要做一些像$ wp_customize-> register_control_type('WP_Customize_Color_Control');.
自定义API中仅PHP的部分仍然完全支持,使用非常好。但是,为了使定制工具更加灵活,在定制程序中切换主题而没有页面加载的长期目标,强烈建议您在可行的情况下为所有自定义定制器对象使用JS / Underscore模板。
- 简介
- 主题开发
- WordPress许可证
- 什么是主题
- 开发环境
- 主题开发示例
- 主题基础
- 模板文件
- 主样式表(style.css)
- 文章类型
- 规划主题文件
- 模板层级
- 模板标签
- 循环
- 主题函数
- 连接主题文件和目录
- 使用CSS和JavaScript
- 条件标签
- 类别,标签和自定义分类
- 模板文件
- 内容模板文件
- 页面模板文件
- 附件模板文件
- 自定义内容类型
- 部分和其他模板文件
- 评论模板
- 分类模板
- 404页面
- 主题功能
- 核心支持的功能
- 管理菜单
- 自定义Headers
- 自定义Logo
- 文章格式
- 置顶文章
- Sidebars
- Widgets
- 导航菜单
- 分页
- 媒体
- Audio
- Images
- Galleries
- Video
- 精选图片和缩略图
- 国际化
- 本地化
- 辅助功能
- 主题选项 – 自定义API
- 定制对象
- 改进用户体验的工具
- 定制JavaScript API
- JavaScript / Underscore.js渲染的自定义控件
- 高级用法
- 主题安全
- 数据消毒/逃避
- 数据验证
- 使用随机数
- 常见漏洞
- 高级主题
- 子主题
- UI最佳实践
- JavaScript最佳做法
- 主题单元测试
- 验证你的主题
- Plugin API Hooks
- 发布你的主题
- 所需的主题文件
- 测试
- 主题评论指南
- 写文档
- 提交你的主题到WordPress.org
- 参考文献
- 模板标签列表
- 条件标签列表
- 编码标准
- HTML编码标准
- CSS编码标准
- JavaScript编码标准
- PHP编码标准
- 插件开发
- 插件开发简介
- 什么是插件
- 插件基础
- 头部要求
- 包括软件许可证
- 启用 / 停用 Hooks
- 卸载方法
- 最佳做法
- 插件安全
- 检查用户功能
- 数据验证
- 保护输入
- 保护输出
- 随机数
- Hooks
- Actions
- Filters
- 自定义Hooks
- 高级主题
- 管理菜单
- 顶级菜单
- 子菜单
- 短代码
- 基本短码
- 封闭短码
- 带参数的短代码
- TinyMCE增强型短码
- 设置
- 设置API
- 使用设置API
- 选项API
- 自定义设置页面
- 元数据
- 管理帖子元数据
- 自定义元数据
- 渲染元数据
- 自定义文章类型
- 注册自定义文章类型
- 使用自定义文章类型
- 分类
- 使用自定义分类
- 在WP 4.2+中使用“split术语”
- 用户
- 创建和管理用户
- 使用用户元数据
- 角色和功能
- HTTP API
- JavaScript
- jQuery
- Ajax
- 服务器端PHP和入队
- Heartbeat API
- 概要
- 计划任务
- 了解WP-Cron计划
- 安排WP-Cron 事件
- 将WP-Cron挂接到系统任务计划程序中
- WP-Cron简单测试
- 国际化
- 本地化
- 如何国际化您的插件
- 国际化安全
- WordPress.org
- 详细插件指南
- 规划您的插件
- 如何使用Subversion
- 插件开发者常见问题
- 开发工具
- Debug Bar 和附加组件
- 辅助插件
- REST API手册
- 资源
- 文章
- 文章修订
- 文章类型
- 文章状态
- 类别
- 标签
- 页面
- 评论
- 分类
- 媒体
- 用户
- 设置
- 使用REST API
- 全局参数
- 分页
- 链接和嵌入
- 发现
- 认证
- 经常问的问题
- 骨干JavaScript客户端
- 客户端库
- 扩展REST API
- 添加自定义端点
- 自定义内容类型
- 修改回应
- 模式
- 词汇表
- 路由和端点
- 控制器类