WordPress 自定义器完全指南:面板、章节、设置与控件
WordPress 自定义器(Customizer)是主题开发中强大的实时预览工具,它让用户能在修改网站外观的同时即时看到效果。本文深入解析自定义器的四大核心对象——面板(Panels)、章节(Sections)、设置(Settings)和控件(Controls),从基础概念到实战代码,带你掌握如何为经典主题添加个性化配置选项。你将学会使用 customize_register 钩子注册自定义选项,理解 theme_mod 与 option 的区别,以及如何通过内置控件类型快速构建级主题设置界面。无论你是想添加颜色选择器、上传图片还是创建自定义 CSS 区域,这份指南都提供了可直接套用的代码示例和佳实践。
一、认识自定义器架构
自定义器采用面向对象设计,核心由 WP_Customize_Manager 类统一管理所有对象。这四个对象层级分明:
- 设置(Settings):负责数据的存储、验证和预览,是自定义器的基础
- 控件(Controls):用户交互界面,与设置绑定,收集用户输入
- 章节(Sections):控件的容器,用于分组组织
- 面板(Panels):章节的容器,提供更高层级的分类
php
// 所有自定义操作都从这个钩子开始
add_action( 'customize_register', 'mytheme_customize_register' );
function mytheme_customize_register( $wp_customize ) {
// $wp_customize 就是 WP_Customize_Manager 实例
// 你可以在这里添加、获取或移除任何自定义器对象
}
每个对象都有对应的 add_、get_ 和 remove_ 方法:
php
// 面板操作 $wp_customize->add_panel( 'my_panel', $args ); $panel = $wp_customize->get_panel( 'my_panel' ); $wp_customize->remove_panel( 'my_panel' ); // 章节操作 $wp_customize->add_section( 'my_section', $args ); $section = $wp_customize->get_section( 'my_section' ); $wp_customize->remove_section( 'my_section' ); // 设置操作 $wp_customize->add_setting( 'my_setting', $args ); $setting = $wp_customize->get_setting( 'my_setting' ); $wp_customize->remove_setting( 'my_setting' ); // 控件操作 $wp_customize->add_control( 'my_control', $args ); $control = $wp_customize->get_control( 'my_control' ); $wp_customize->remove_control( 'my_control' );
注意:主题通常不应修改核心章节和面板,这些应由插件处理。主题应专注于添加自己的自定义选项。
二、设置(Settings):数据的核心
设置是自定义器的数据层,负责保存、预览和验证用户输入。添加设置时,以下参数为关键:
php
$wp_customize->add_setting( 'header_color', array(
'type' => 'theme_mod', // 或 'option'
'capability' => 'edit_theme_options',
'theme_supports' => '',
'default' => '#333333',
'transport' => 'refresh', // 或 'postMessage'
'sanitize_callback' => 'sanitize_hex_color',
'sanitize_js_callback' => '',
) );
设置类型:theme_mod vs option
- theme_mod:主题专属设置,切换主题后仍保留数据。大多数主题选项应使用此类型
- option:全局选项,存储于
wp_options表,跨主题共享。通常由插件使用
php
// 主题推荐用法
$wp_customize->add_setting( 'accent_color', array(
'default' => '#f72525',
'sanitize_callback' => 'sanitize_hex_color',
) );
// 插件用法示例
$wp_customize->add_setting( 'myplugin_options[color]', array(
'type' => 'option',
'capability' => 'manage_options',
'default' => '#ff2525',
'sanitize_callback' => 'sanitize_hex_color',
) );
获取保存的值
php
function mytheme_custom_css_output() {
// 获取主题设置值
$theme_css = get_theme_mod( 'custom_theme_css', '' );
// 获取插件设置值
$plugin_css = get_option( 'custom_plugin_css', '' );
echo '<style type="text/css" id="custom-theme-css">' .
esc_html( $theme_css ) . '</style>';
}
add_action( 'wp_head', 'mytheme_custom_css_output' );
注意:设置 ID 不能以
widget_、sidebars_widgets[*]、nav_menu[*]或nav_menu_item[*]开头,这些被系统保留。如需使用 “widget”,应放在 ID 末尾,如homepage_widget。
三、控件(Controls):用户交互界面
控件是用户实际操作的界面元素,每个控件必须关联一个设置。
基础控件参数
php
$wp_customize->add_control( 'setting_id', array(
'type' => 'text', // 控件类型
'priority' => 10, // 显示顺序
'section' => 'colors', // 所属章节(必需)
'label' => __( '标题' ),
'description' => __( '描述文字' ),
'input_attrs' => array(
'class' => 'my-custom-class',
'style' => 'border: 1px solid #900',
'placeholder' => __( '输入提示' ),
),
'active_callback' => 'is_front_page',
) );
内置控件类型
基础 HTML 输入类型:text、hidden、number、range、url、tel、email、search、time、date、datetime、week
特殊控件:
checkbox– 复选框textarea– 多行文本radio– 单选按钮(需提供choices数组)select– 下拉选择(需提供choices数组)dropdown-pages– 页面下拉选择
php
// 文本域控件示例
$wp_customize->add_control( 'custom_theme_css', array(
'label' => __( '自定义 CSS' ),
'type' => 'textarea',
'section' => 'custom_css',
) );
// 范围滑块示例
$wp_customize->add_control( 'font_size', array(
'type' => 'range',
'section' => 'typography',
'label' => __( '字体大小' ),
'input_attrs' => array(
'min' => 12,
'max' => 48,
'step' => 2,
),
) );
四、核心自定义控件
颜色选择器
php
$wp_customize->add_control(
new WP_Customize_Color_Control(
$wp_customize,
'accent_color',
array(
'label' => __( '强调色' ),
'section' => 'colors',
)
)
);
媒体控件(图片、音频、视频)
php
// 图片选择
$wp_customize->add_control(
new WP_Customize_Media_Control(
$wp_customize,
'featured_image',
array(
'label' => __( '首页特色图片' ),
'section' => 'media',
'mime_type' => 'image',
)
)
);
// 音频选择
$wp_customize->add_control(
new WP_Customize_Media_Control(
$wp_customize,
'background_music',
array(
'label' => __( '背景音乐' ),
'section' => 'media',
'mime_type' => 'audio',
)
)
);
注意:
WP_Customize_Media_Control保存的是附件 ID,而旧版的WP_Customize_Upload_Control保存的是 URL。
裁剪图片控件
WordPress 4.3+ 提供了裁剪图片控件,适合需要特定比例的场景:
php
$wp_customize->add_control(
new WP_Customize_Cropped_Image_Control(
$wp_customize,
'cropped_image',
array(
'label' => __( '头像' ),
'section' => 'media',
'flex_width' => false,
'flex_height' => false,
'width' => 150,
'height' => 150,
)
)
);
五、章节(Sections):控件的容器
当控件较多时,使用章节进行分组管理。
php
// 添加自定义章节
$wp_customize->add_section( 'footer_settings', array(
'title' => __( '页脚设置' ),
'description' => __( '配置页脚区域的内容' ),
'panel' => '', // 所属面板
'priority' => 105, // 显示优先级
'capability' => 'edit_theme_options',
'theme_supports' => '',
) );
核心章节优先级参考
| 章节名称 | ID | 优先级 |
|---|---|---|
| 站点标题与副标题 | title_tagline | 20 |
| 颜色 | colors | 40 |
| 页眉图片 | header_image | 60 |
| 背景图片 | background_image | 80 |
| 菜单(面板) | nav_menus | 100 |
| 小工具(面板) | widgets | 110 |
| 静态首页 | static_front_page | 120 |
| 默认 | (空) | 160 |
| 额外 CSS | custom_css | 200 |
六、面板(Panels):高级分组
面板在 WordPress 4.0 引入,用于在更高层级组织章节。
php
$wp_customize->add_panel( 'theme_layout', array(
'title' => __( '页面布局' ),
'description' => '<p>' . __( '配置全局布局选项' ) . '</p>',
'priority' => 30,
) );
// 将章节添加到面板
$wp_customize->add_section( 'blog_layout', array(
'title' => __( '博客布局' ),
'panel' => 'theme_layout',
) );
$wp_customize->add_section( 'page_layout', array(
'title' => __( '页面布局' ),
'panel' => 'theme_layout',
) );
注意:面板通常用于功能模块(如菜单、小工具),而非简单分组。大多数主题直接使用章节即可,无需面板。
七、自定义控件、章节和面板
当内置控件不满足需求时,可以创建自定义控件类:
php
// 自定义控件类
class MyTheme_Custom_Control extends WP_Customize_Control {
public $type = 'my_custom_control';
public function render_content() {
?>
<button class="button button-primary" id="my-custom-button">
<?php _e( '执行操作' ); ?>
</button>
<?php
}
}
// 使用自定义控件
$wp_customize->add_control(
new MyTheme_Custom_Control(
$wp_customize,
'custom_action',
array(
'label' => __( '自定义操作' ),
'section' => 'custom_section',
)
)
);
自定义章节和面板的实现方式类似,通过继承 WP_Customize_Section 或 WP_Customize_Panel 并重写 render_content() 方法。
八、自定义设置类型
默认设置类型(theme_mod 和 option)无法满足所有场景,可以创建自定义类型:
php
// 指定自定义类型
$wp_customize->add_setting( 'nav_menu_order', array(
'type' => 'nav_menu', // 自定义类型
'default' => array(),
) );
然后通过钩子处理保存和预览逻辑:
php
// 自定义保存逻辑
function mytheme_custom_update_handler( $value, $setting ) {
// 处理保存逻辑
// $value 是控件提交的值
// $setting 是当前设置对象
update_option( 'my_custom_option', $value );
}
add_action( 'customize_update_nav_menu', 'mytheme_custom_update_handler', 10, 2 );
// 自定义预览逻辑
function mytheme_custom_preview_handler( $setting ) {
// 处理预览逻辑
$preview_value = $setting->post_value();
// 使用 $preview_value 修改预览输出
}
add_action( 'customize_preview_nav_menu', 'mytheme_custom_preview_handler', 10, 2 );
九、自定义器 UI 设计规范
创建自定义控件时,应遵循 WordPress 后台设计规范:
- 白色背景用于可操作元素(输入框、按钮)
#eee背景用于视觉分割1px #ddd边框分隔导航元素- 4px 边框用于悬停状态,颜色为
#0073aa - 主文本颜色
#555d66,悬停状态#0073aa - 元素间距 15px
php
// 符合规范的按钮示例
public function render_content() {
?>
<button class="button button-primary">
<?php _e( '保存设置' ); ?>
</button>
<?php
}
总结
WordPress 自定义器是主题开发不可或缺的工具,其四层架构(设置→控件→章节→面板)提供了灵活的配置能力。记住几个关键点:
- 设置是数据基础,
theme_mod是主题的类型 - 控件是用户界面,合理选择内置类型可节省大量时间
- 章节用于组织控件,合理分组提升用户体验
- 面板仅用于大型功能模块,避免过度使用
- 始终使用
sanitize_callback确保数据安全
从简单的颜色选项开始,逐步扩展至复杂的媒体控件,自定义器能让你的主题既强大又易用。实践这些代码示例,你将快速掌握 WordPress 主题定制化的精髓。