前言:如果不是主题制作者或折腾爱好者,以下功能可以直接改主题 css 就可实现。
后台 - 外观 - 自定义,默认主题“Twenty Fifteen”支持“颜色、顶部图像、背景图形、小工具”等设置,而且改动时所见即所得,也叫“即时预览(Live Preview)”。
之前,想给主题用户提供一些自定义选项,比较常见的是增加一个“主题设置页”,用户改动好后得保存下然后刷新页面看效果。之之前,WordPress 提供了自定义头部和背景图片的设置,在外观设置中有个独立页面,能上传图片裁剪等设置。如今,使用这个“主题定制API(Theme_Customization_API)”可以直接在类似侧边栏中设置并即时预览。
说明:WordPress 3.4 开始默认支持“站点标题和副标题”和“静态首页”的设置,其它设置项都需要主题内相应的函数支持。
Section
是每一个设置区域的“标题”。
Setting
是每一个区域内具体的设置选项。
Control
是对每一个选项进行设置。
下面让我们一起来个创建“顶部背景”,增加对主题“顶部背景颜色”和“顶部背景图片”的支持。
function mytheme_customize_register( $wp_customize ) { //三要素是添加到这里的,都挂在 customize_register } add_action( 'customize_register', 'mytheme_customize_register' );
使用 $wp_customize->add_section
来创建,定义此 section 为“header_bg”,以及显示的标题和位置。
$wp_customize->add_section('header_bg',array( 'title' => '顶部背景', 'priority' => 50 ) );
priority
设定此 section 的位置序列。默认 section 的 ID 有: title_tagline, colors, header_image, background_image, nav and static_front_page,相应的标题和位置序列如图:
使用 $wp_customize->add_setting
来添加,定义两个 setting 为 “header_bg_color”和“header_bg_image”。
$wp_customize->add_setting( 'header_bg_color', array( 'default' => '#515865', "transport" => "postMessage", 'type' => 'option' ) ); $wp_customize->add_setting( 'header_bg_image', array( 'default' => '', "transport" => "postMessage", 'type' => 'option' ) );
transport
两个值:refresh 或 postMessage,需要即时预览果断后者。
使用 $wp_customize->add_control
来添加,包括之前代码完整如下:
function mytheme_customize_register( $wp_customize ) { $wp_customize->add_section('header_bg',array( 'title' => '顶部背景', 'priority' => 50 ) ); $wp_customize->add_setting( 'header_bg_color', array( 'default' => '#515865', 'transport' => 'postMessage', 'type' => 'option' ) ); $wp_customize->add_setting( 'header_bg_image', array( 'default' => '', 'transport' => 'postMessage', 'type' => 'option' ) ); $wp_customize->add_control( new WP_Customize_Color_Control( $wp_customize, 'header_bg_color', array( 'label' => '顶部背景颜色', 'section' => 'header_bg' ) ) ); $wp_customize->add_control( new WP_Customize_Image_Control( $wp_customize, 'header_bg_image', array( 'label' => '顶部背景图片', 'section' => 'header_bg' ) ) ); } add_action( 'customize_register', 'mytheme_customize_register' );
WP_Customize_Color_Control()
– 创建一个从色轮中选择颜色的颜色选择器
WP_Customize_Image_Control()
– 创建上传图片或从媒体库中选择图片的控件
WP_Customize_Control()
– 创建一个输入纯文本的控件
WP_Customize_Upload_Control()
– 创建上传媒体文件的控件
把样式挂载到 wp_head
来生效。
function mytheme_customize_css(){ $hbc = get_option('header_bg_color','#515865'); $hbi = get_option('header_bg_image'); ?> <style type="text/css"> #header{ background-color:<?php echo $hbc;?>; <?php echo empty($hbi)? '' : 'background-image:url(' .$hbi.');' ;?> } </style> <?php } add_action( 'wp_head', 'mytheme_customize_css');
现在,你能在页面源码上查看到已设定的样式加载在 <head>
。当然 #head
的根据自己的主题模板进行修改。
说明:如果 setting 里的 type
未设定为 option,则使用: get_theme_mod
来调用。
新建个 js 文件,丢入如下代码(#header 需修改):
( function( $ ) { api = wp.customize; api( 'header_bg_color', function( value ) { value.bind( function( newval ) { $('#header').css('background-color', newval ); } ); } ); api( 'header_bg_image', function( value ) { value.bind( function( newval ) { 0 === $.trim( newval ).length ? $( '#header' ).css( 'background-image', '' ) : $( '#header' ).css( 'background-image', 'url( ' + newval + ')' ); } ); } ); } )( jQuery );
把这个 customizer.js
丢如主题 js 文件夹内。
function mytheme_customizer_live_preview(){ wp_enqueue_script('mytheme-customizer',get_template_directory_uri().'/js/customizer.js',array( 'jquery','customize-preview' ),'',true); } add_action( 'customize_preview_init', 'mytheme_customizer_live_preview' );
简单回顾下,主要用三个钩子:
function mytheme_customize_register( $wp_customize ) { //三要素 } add_action( 'customize_register', 'mytheme_customize_register' ); function mytheme_customize_css(){ //生效样式 } add_action( 'wp_head', 'mytheme_customize_css'); function mytheme_customizer_live_preview(){ //加载“即时预览”的 js wp_enqueue_script('mytheme-customizer',get_template_directory_uri().'/js/customizer.js',array( 'jquery','customize-preview' ),'',true); } add_action( 'customize_preview_init', 'mytheme_customizer_live_preview' );
$wp_customize->add_section( 'id', array( 'title' => '', 'description' => '', 'priority' => '' ) ); $wp_customize->add_setting( 'id', array( 'default' => '', 'theme-supports' => '', 'type' => '', // Default is "theme_mod" 'capability' => '', // Default is "edit_theme_options" 'sanitize_callback' => '', 'sanitize_js_callback => '', 'transport' => '', // Default is "refresh",or use "postMessage" ) ); $wp_customize->add_control( 'id', array( 'label' => '', 'settings' => // Default is id property. 'section' => '', 'type' => '', // Default is "text",or use "checkbok、radio(choices)、select、dropbown-pages、" 'choices' => '', // This is optional, depending on type's value. 'priority' => '', // Default is 10. ) );
Getting Started with the WordPress Theme Customization API:简单明了,结构清晰,推荐。
A Guide to the WordPress Theme Customizer :系列教程非常强大。