WordPress 在4.3版本中增加了分类项目自定义字段的支持,为主题和插件的开发提供了便利。在增加API的同时,WordPress 却没有提供添加和管理分类法项目的 UI 界面。由于是刚增加的功能,支持分类法项目的插件还没有跟上。虽然 WordPress 为我们提供了添加分类自定义字段的示例代码,遗憾的是该代码提供的方法直接使用 HTML 构建用户输入表单,把 PHP 和 HTML 代码混杂在一起,效率低下不说,管理和维护非常困难。
在开发一个WordPress主题的时候,我发现我们可以用本站之前介绍过的 Nette Form 类库为自定义分类法项目添加自定义字段表单,相比 WordPress 官方提供的方法,可以节省不少时间,管理和维护自定义字段表单也变得比较容易了。
首先,引入 Nette Form 并创建编辑自定义字段的表单
Nette Form 表单支持 Autoload,我们已经通过 Composer 安装好了这个类库,所以直接引入就可以了使用了。创建表单的方法非常简单,首先获取分类项目自定义字段已经保存的值,作为表单的默认值供用户编辑,如果之前没有添加过该自定义分类法自定义字段,默认值就是空的,用户添加自己的内容就可以了。下面的示例代码中可以很清楚的说明使用 Nette Form 添加表单的方法,更详细的类库文章可以参考 Nette Form 官方文档。
require_once( dirname( __FILE__ ) . '/../vendor/autoload.php' );
use Nette\Forms\Form;
// 添加自定义字段到编辑分类表单
add_action( 'product_cat_edit_form_fields', 'edit_feature_group_field', 10, 2 );
function edit_feature_group_field( $term, $taxonomy ) {
$form = new Form;
// 修改表单输出以适配 WordPress 后台的表单结构
$renderer = $form->getRenderer();
$renderer->wrappers[ 'controls' ][ 'container' ] = '';
$renderer->wrappers[ 'pair' ][ 'container' ] = 'tr';
$renderer->wrappers[ 'label' ][ 'container' ] = 'th';
$renderer->wrappers[ 'control' ][ 'container' ] = 'td';
// 获取表单默认值
$hlf_url = get_term_meta( $term->term_id, 'hlf_url', true );
$hlf_text = get_term_meta( $term->term_id, 'hlf_text', true );
$show_in_home = get_term_meta( $term->term_id, 'show_in_home', true );
// 添加表单字段并设置默认值
$form->addText( 'hlf_url', '自定义链接:' )
->setAttribute( 'size', '80' )
->setDefaultValue( $hlf_url );
$form->addText( 'hlf_text', '显示名称:' )
->setAttribute( 'size', '80' )
->setDefaultValue( $hlf_text );
$form->addCheckbox( 'show_in_home', '在首页显示' )
->setDefaultValue( $show_in_home );
// 显示表单
echo $form;
}
保存用户提交的自定义字段数据
如果只是添加了分类法项目自定义字段数据的表单,没有保存用户输入的内容到数据库里面,那么这个表单是没有任何意义的,而保存的方法非常简单。基本上就是获取用户提交过的数据,然后使用 WordPress 提供的更新分类法项目自定义字段的函数 update_post_meta
保存获取到的数据到数据库里面即可。
// 保存分类法自定义字段数据
add_action( 'edited_product_cat', 'update_feature_meta', 10, 2 );
function update_feature_meta( $term_id, $tt_id ) {
$hlf_url = $_POST[ 'hlf_url' ];
$hlf_text = $_POST[ 'hlf_text' ];
$show_in_home = sanitize_title( $_POST[ 'show_in_home' ] );
update_term_meta( $term_id, 'hlf_url', $hlf_url );
update_term_meta( $term_id, 'hlf_text', $hlf_text );
update_term_meta( $term_id, 'show_in_home', $show_in_home );
}
除了直接使用官方的函数保存到数据库,我们还可以在保存之前做一个预处理,获取使用我们自己的函数保存用户提交到数据到其他数据表中,这期中有很大的发挥空间供我们想象。以上方法同样可用于添加文章自定义字段、用户自定义字段和增加设置选项表单,有需要的朋友可以尝试一下,相信会节省不少开发时间来看看美剧把把妹子啥的。