如果你稍加注意,就会发现中文版的WordPress后台常规设置里,多了一个“ICP备案号”的选项,毫无疑问,它就像其他自定义的选项一样,是通过一段代码,利用WordPress的API加上去的。你可能希望在常规选项页面里面增加几个作为网站全局设置的项目,比如网站首页的关键词和描述。那么怎么实现呢?
我们首先来追究一下这个备案号的选项是怎么实现的吧。通过对WordPress中文版代码的检索,在/wp-content/languages/zh_CN.php中有如下代码,实现了这一目的:
/** * ICP license number * * For compliance with the Telecommunications Regulations. Can be turned off * in wp-config.php. * * @since 3.7.0 */ function zh_cn_l10n_settings_init() { if ( defined( 'WP_ZH_CN_ICP_NUM' ) && WP_ZH_CN_ICP_NUM ) { add_settings_field( 'zh_cn_l10n_icp_num', 'ICP备案号', 'zh_cn_l10n_icp_num_callback', 'general' ); register_setting( 'general', 'zh_cn_l10n_icp_num' ); } } add_action( 'admin_init', 'zh_cn_l10n_settings_init' ); function zh_cn_l10n_icp_num_callback() { echo '<input name="zh_cn_l10n_icp_num" type="text" ' . 'id="zh_cn_l10n_icp_num" value="' . esc_attr( get_option( 'zh_cn_l10n_icp_num' ) ) . '" class="regluar-text ltr" />' . '<p class="description">仅对WordPress自带主题有效。</p>'; }
让我们来剖析这一代码过程。
首先,我们需要了解add_settings_field和register_setting这两个函数,它们注册了一个新的设置选项,并且在general设置中生效。注册后,无需自己写update_option相关代码,即可实现提交设置的时候自动更新该设置。
首先是add_settings_field()函数,它的四个参数分别代表:
1.该设置的唯一标识2.显示在设置页面的标题3.在设置页面,调用该函数,在这个函数中echo input来添加文本域4.在哪一个设置页面显示该选项,general代表常规设置,reading代表设置-阅读,到后台设置页面看URL就知道了
通过add_action('admin_init','xxxxfun')来挂载到钩子,写好第三个参数对应的函数的内容,这样,就可以在后台显示对应的选项了。
但是,显示选项,并不代表就OK了,当你填写选项内容,提交的时候,还需要一个动作来进行保存选项内容。这个时候register_setting()函数就派上用场。
该函数的两个参数分布代表:
1.在一个设置页面生效,上面general表示在常规设置页面,提交后才会保存2.选项的名称(键名),它有两层意思,第一层是指,当接收到$_POST的时候,如果存在该键名,则进行保存,例如上面,input的name=zh_cn_l10n_icp_num第二层是指把它作为设置项的数据库键名,可以通过get_option(键名)获取其值,例如上面就是使用get_option( 'zh_cn_l10n_icp_num' )获取值。
好了,上面把备案号那个选项说清楚了。现在需要再增加一个知识点:add_settings_section
在上面的解释中,备案号设置项是和其他选项混合在一起的,从界面上看,和其他选项没有什么区别。而使用add_settings_section则可以给这些选项分组,从而在界面上和已有的项目分开来。我们来看下下面这个界面:
在所有的选项后面,多出了一个“首页SEO设置”的组,这个组里面又有三个选项。而add_settings_section就是用来添加一个组的。
基本的代码结构和上面的相同,首先要在admin_init钩子上挂载一个函数,然后在这个函数中注册选项(组),也就是add_settings_section、add_settings_field和register_setting,最后,针对不同的add_xxx,创建不同的回调函数来显示界面上的提示或文本框。
下面就不完全展示代码,把挂载到admin_init上的函数摆出来:
function register_setting() { add_settings_section( 'setting_seo', // 这个组的唯一标识 '首页SEO设置', // 显示的名称 'setting_seo_section_callback_function', // 回调函数,用来显示组的描述信息 'general' // 在哪一个测试页显示 ); add_settings_field( 'seo_title', 'SEO标题', 'setting_seo_title_callback_function', 'general', 'setting_seo', // 和上面添加备案号选项不同,这里要制定section的唯一标识,也就是add_settings_section的第一个参数 array('label_for' => 'seo_title') // 这个无所谓,可有可无 ); register_setting('general','seo_title','trim'); }
通过上面这段代码,就注册好seo_title这个选项了,写好两个回调函数,在回调函数中加入input,提交之后,就可以保存该选项了,而在前台,则使用get_option('seo_title')来调用该选项。
2016-01-17 5899