WordPress 在4.3版本中增加了分類項(xiàng)目自定義字段的支持,為主題和插件的開發(fā)提供了便利。在增加API的同時(shí),WordPress 卻沒有提供添加和管理分類法項(xiàng)目的 UI 界面。由于是剛增加的功能,支持分類法項(xiàng)目的插件還沒有跟上。雖然 WordPress 為我們提供了添加分類自定義字段的示例代碼,遺憾的是該代碼提供的方法直接使用 HTML 構(gòu)建用戶輸入表單,把 PHP 和 HTML 代碼混雜在一起,效率低下不說,管理和維護(hù)非常困難。
在開發(fā)一個(gè)WordPress主題的時(shí)候,我發(fā)現(xiàn)我們可以用本站之前介紹過的 Nette Form 類庫為自定義分類法項(xiàng)目添加自定義字段表單,相比 WordPress 官方提供的方法,可以節(jié)省不少時(shí)間,管理和維護(hù)自定義字段表單也變得比較容易了。
首先,引入 Nette Form 并創(chuàng)建編輯自定義字段的表單
Nette Form 表單支持 Autoload,我們已經(jīng)通過 Composer 安裝好了這個(gè)類庫,所以直接引入就可以了使用了。創(chuàng)建表單的方法非常簡(jiǎn)單,首先獲取分類項(xiàng)目自定義字段已經(jīng)保存的值,作為表單的默認(rèn)值供用戶編輯,如果之前沒有添加過該自定義分類法自定義字段,默認(rèn)值就是空的,用戶添加自己的內(nèi)容就可以了。下面的示例代碼中可以很清楚的說明使用 Nette Form 添加表單的方法,更詳細(xì)的類庫文章可以參考 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 后臺(tái)的表單結(jié)構(gòu)
$renderer = $form->getRenderer();
$renderer->wrappers[ 'controls' ][ 'container' ] = '';
$renderer->wrappers[ 'pair' ][ 'container' ] = 'tr';
$renderer->wrappers[ 'label' ][ 'container' ] = 'th';
$renderer->wrappers[ 'control' ][ 'container' ] = 'td';
// 獲取表單默認(rèn)值
$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 );
// 添加表單字段并設(shè)置默認(rèn)值
$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;
}
保存用戶提交的自定義字段數(shù)據(jù)
如果只是添加了分類法項(xiàng)目自定義字段數(shù)據(jù)的表單,沒有保存用戶輸入的內(nèi)容到數(shù)據(jù)庫里面,那么這個(gè)表單是沒有任何意義的,而保存的方法非常簡(jiǎn)單?;旧暇褪谦@取用戶提交過的數(shù)據(jù),然后使用 WordPress 提供的更新分類法項(xiàng)目自定義字段的函數(shù) update_post_meta 保存獲取到的數(shù)據(jù)到數(shù)據(jù)庫里面即可。
// 保存分類法自定義字段數(shù)據(jù)
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 );
}
除了直接使用官方的函數(shù)保存到數(shù)據(jù)庫,我們還可以在保存之前做一個(gè)預(yù)處理,獲取使用我們自己的函數(shù)保存用戶提交到數(shù)據(jù)到其他數(shù)據(jù)表中,這期中有很大的發(fā)揮空間供我們想象。以上方法同樣可用于添加文章自定義字段、用戶自定義字段和增加設(shè)置選項(xiàng)表單,有需要的朋友可以嘗試一下,相信會(huì)節(jié)省不少開發(fā)時(shí)間來看看美劇把把妹子啥的。


