WordPress 自定义数据创建及应用
在网站建设中往往需要对 WordPress 已有的功能进行扩展,比如开发自己的主题、插件等,这些新的功能模块一般都会有初始的配置数据以及功能相关联的数据。这些数据通过 WordPress 后台管理工具的菜单界面展现给用户,然后再把用户修改后的数据保存到数据库中。这些用户自定义数据的创建和管理在 WordPress 中使用 Settings API 和 Options API 来完成。本篇文章以 “课程” 为例详细介绍用户自定义数据的创建和使用方法。
创建用户自定义数据可以根据需求采用完全独立的方式实现以及使用 WordPress 系统核心提供的 API 来实现,而使用 WordPress API 实现的优点是形式统一、外观一致、兼容性好、代码量少。本篇文章介绍第二种实现方法,该方法主要分成三个步骤来完成,即数据定义、数据展现(提取、修改、保存)和工具菜单关联。
一、数据定义
用户自定义数据使用前需要先进行定义,也就是告诉 WordPress 系统核心我有自定义数据的需求,请在后台数据库中建立相关的数据描述和定义,这个过程使用下面的代码完成:
<?php
/**
* 数据定义
*/
function course_settings_init() {
// 注册“课程”数据(course_options)及其配置接口(course)
register_setting( 'course', 'course_options' );
// 在“课程”配置接口里面注册配置区块
add_settings_section(
'course_section_items',
__( 'Choose default course.', 'course' ),
'course_section_items_cb',
'course'
);
// 在“课程”配置区块里面注册“编程”和“每页课程数”两个自定义数据
add_settings_field(
'course_field_program', // 课程数据“编程”的定义
__( 'Program', 'course' ),
'course_field_program_cb', // 该数据的显示界面函数
'course',
'course_section_items',
[
'label_for' => 'course_field_program',
'class' => 'course_class',
'course_custom_data' => 'custom',
] // 传入到界面显示函数里的参数
);
add_settings_field(
'courses_per_page_field', //课程数据“每页课程数”的定义
__( 'Courses per page', 'course' ),
'courses_per_page_field_cb', // 数据显示函数
'course',
'course_section_items',
[
'label_for' => 'courses_per_page_field',
'class' => 'small-text',
'course_custom_data' => 'custom',
] // 传入的参数定义
);
}
/**
* 以上定义在钩链 “admin_init” 中启动运行
*/
add_action( 'admin_init', 'course_settings_init' );
二、数据展现
数据定义好后需要展现出来,并提供数据修改和保存接口,就是实现上面定义好的数据展现函数,代码如下:
function course_section_items_cb( $args ) {
?>
<p id="<?php echo esc_attr( $args['id'] ); ?>"><?php esc_html_e( 'Choose default course from the following list.', 'course' ); ?></p>
<?php
}
// 数据“编程”显示函数
function course_field_program_cb( $args ) {
// 提取数据,第一步使用 register_setting() 做的定义
$options = get_option( 'course_options' );
// 显示“编程”数据
?>
<select id="<?php echo esc_attr( $args['label_for'] ); ?>"
data-custom="<?php echo esc_attr( $args['course_custom_data'] ); ?>"
name="course_options[<?php echo esc_attr( $args['label_for'] ); ?>]"
>
<option value="php" <?php echo isset( $options[ $args['label_for'] ] ) ? ( selected( $options[ $args['label_for'] ], 'php', false ) ) : ( '' ); ?>>
<?php esc_html_e( 'PHP', 'course' ); ?>
</option>
<option value="javascript" <?php echo isset( $options[ $args['label_for'] ] ) ? ( selected( $options[ $args['label_for'] ], 'javascript', false ) ) : ( '' ); ?>>
<?php esc_html_e( 'JavaScript', 'course' ); ?>
</option>
<option value="cplusplus" <?php echo isset( $options[ $args['label_for'] ] ) ? ( selected( $options[ $args['label_for'] ], 'cplusplus', false ) ) : ( '' ); ?>>
<?php esc_html_e( 'c++', 'course' ); ?>
</option>
</select>
<p class="description">
<?php esc_html_e( 'The program courses includes php, javascript and c++.', 'wporg' ); ?>
</p>
<?php
}
//数据“每页课程数”显示函数
function courses_per_page_field_cb( $args ) {
$options = get_option( 'course_options' );
?>
<input name="course_options[<?php echo esc_attr( $args['label_for'] ); ?>]" type="number" step="1" min="1" id="<?php echo esc_attr( $args['label_for'] ); ?>" value="<?php echo isset( $options[ $args['label_for'] ] ) ? $options[ $args['label_for'] ] : 5; ?>" class="<?php echo esc_attr( $args['class'] ); ?>">
<p class="description">
<?php esc_html_e( 'Display courses per page.' ); ?>
</p>
<?php
}
三、工具菜单关联
在后台管理工具中显示一个菜单项,当用户选择该项菜单时调出第二部实现好的数据操作界面,代码如下:
/**
* 放在工具菜单的第一级(最高一级)
*/
function course_options_page() {
add_menu_page(
'Course',
'Course Options',
'manage_options',
'course',
'course_options_page_html'
);
}
/**
* 注册“课程”菜单项
*/
add_action( 'admin_menu', 'course_options_page' );
/**
* 点击菜单后显示数据操作接口
*/
function course_options_page_html() {
// 判断是否有操作权限
if ( ! current_user_can( 'manage_options' ) ) {
return;
}
if ( isset( $_GET['settings-updated'] ) ) {
add_settings_error( 'course_messages', 'course_message', __( 'Settings Saved', 'course' ), 'updated' );
}
settings_errors( 'course_messages' );
?>
<div class="wrap">
<h1><?php echo esc_html( get_admin_page_title() ); ?></h1>
<form action="options.php" method="post">
<?php
// 调出系统使用的数据接口(隐藏的数据)
settings_fields( 'course' );
// 调出数据操作接口
do_settings_sections( 'course' );
// 保存数据按钮
submit_button( 'Save Settings' );
?>
</form>
</div>
<?php
}
用户自定义数据的功能建议放到插件里面实现,而且放到插件的二级目录 admin 下用一个单独的文件存放代码,然后在插件的主程序中调用,比如像下面这样:
require_once plugin_dir_path( __FILE__ ) . 'admin/custom-setting.php';