wordpress強大之處在于有很強的可自定義性,使得插件、主題的開發(fā)變得及其便利。愛掏網(wǎng) - it200.com就拿我們今天要說的自定義文章添加自定義字段來說,就很便捷。愛掏網(wǎng) - it200.com
比如我們要錄入一個客戶信息到wordpress中,那么需要的字段可不僅僅是什么標(biāo)題、內(nèi)容、摘要這么簡單了,我們可能需要錄入客戶的性別、姓名、電話、郵件等等。愛掏網(wǎng) - it200.com又比如產(chǎn)品,需要額外的產(chǎn)品價格、產(chǎn)品大小等屬性,那么就需要給文章類型添加Meta Box,通俗點理解就是自定義字段表單,下面我們以添加產(chǎn)品價格為例進(jìn)行說明。愛掏網(wǎng) - it200.com
自定義Meta Box需要用到add_meta_box函數(shù),其新增的信息會保存到數(shù)據(jù)庫wp_postmeta表。愛掏網(wǎng) - it200.com
add_meta_box函數(shù)說明:
add_meta_box( $id, $title, $callback, $post_type, $context,$priority, $callback_args );
$id:字段id,唯一
$title:標(biāo)題名稱
$callback:回調(diào)函數(shù)
$post_type:文章類型
$context:顯示位置
$priority:優(yōu)先級
接下來開始從0寫一個字段吧
1、注冊一個 Meta Box 示例:
add_action( add_meta_boxes, product_director );//創(chuàng)建字段,注冊作用
function product_director() {//創(chuàng)建字段時調(diào)用的函數(shù)
add_meta_box(
product_director,//字段的唯一ID吧
產(chǎn)品價格,//字段的名稱,在表單上方顯示
product_director_meta_box,//回調(diào)函數(shù)
product,//所添加的文章類型
side,
low
);
}
2、創(chuàng)建回調(diào)函數(shù)product_director_meta_box
配置參數(shù)里面指定了回調(diào)函數(shù)product_director_meta_box,需要在這個函數(shù)里面創(chuàng)建表單:
function product_director_meta_box($post) {
// 創(chuàng)建臨時隱藏表單,為了安全
wp_nonce_field( product_director_meta_box, product_director_meta_box_nonce );
// 獲取之前存儲的值
$value = get_post_meta( $post->ID, _product_director, true );
?>
placeholder=輸入產(chǎn)品價格>
}
3、提示:添加上面代碼后,新建文章時,在右則就可以看到一個產(chǎn)品價格的輸入框。愛掏網(wǎng) - it200.com 這時候表單還不能用,因為提交文章之后并沒有保存這個 Meta Box 的內(nèi)容,下面是驗證保存內(nèi)容的代碼:
add_action( save_post, product_director_save_meta_box );//在保存文章時,執(zhí)行回調(diào)函數(shù)
function product_director_save_meta_box($post_id){//回調(diào)函數(shù),顯示表單,用于新建和編輯顯示表單
// 安全檢查
// 檢查是否發(fā)送了一次性隱藏表單內(nèi)容(判斷是否為第三者模擬提交)
if ( ! isset( $_POST[product_director_meta_box_nonce] ) ) {//安全判斷
return;
}
// 判斷隱藏表單的值與之前是否相同
if ( ! wp_verify_nonce( $_POST[product_director_meta_box_nonce], product_director_meta_box ) ) {//主要是修改時,判斷product_director_meta_box函數(shù)提交過來的是不是和之前的一樣,一樣就不再次提交了
return;
}
// 判斷該用戶是否有權(quán)限
if ( ! current_user_can( edit_post, $post_id ) ) {//判斷有沒有權(quán)限進(jìn)行新建、編輯。愛掏網(wǎng) - it200.com。愛掏網(wǎng) - it200.com。愛掏網(wǎng) - it200.com。愛掏網(wǎng) - it200.com
return;
}
// 判斷 Meta Box 是否為空
if ( ! isset( $_POST[product_director] ) ) {//提交的字段為空字段
return;
}
$product_director = sanitize_text_field( $_POST[product_director] );//過濾凈化表單數(shù)據(jù)
update_post_meta( $post_id, _product_director, $product_director );//這句就是sql語句吧,_product_director為保存在數(shù)據(jù)庫的meta_key字段
把上面的代碼按順序添加到主題的functions.php文件,至此,Meta Box注冊完成,就可以開始添加參數(shù)了。愛掏網(wǎng) - it200.com
4、如何調(diào)用?
if(get_post_meta($post->ID,_product_director,true)){
echo get_post_meta($post->ID,_product_director,true);
}
?>
5、把Meta Box添加把后臺所有產(chǎn)品列表字段中顯示,通過manage_$post_type_posts_custom_column實現(xiàn)。愛掏網(wǎng) - it200.com
add_action(manage_posts_custom_column, product_custom_columns);
add_filter(manage_edit-product_columns, product_edit_columns);
function product_custom_columns($column){
global $post;
switch ($column) {
case product_director:
echo get_post_meta( $post->ID, _product_director, true );
break;
}
}
function product_edit_columns($columns){
$columns[product_director] = 產(chǎn)品價格;
return $columns;
}
上面的全部代碼:
add_action( add_meta_boxes, product_director );
function product_director() {
add_meta_box(
product_director,
產(chǎn)品價格,
product_director_meta_box,
product,
side,
low
);
}
function product_director_meta_box($post) {
// 創(chuàng)建臨時隱藏表單,為了安全
wp_nonce_field( product_director_meta_box, product_director_meta_box_nonce );
// 獲取之前存儲的值
$value = get_post_meta( $post->ID, _product_director, true );
?>
placeholder=輸入產(chǎn)品價格>
}
add_action( save_post, product_director_save_meta_box );
function product_director_save_meta_box($post_id){
if ( ! isset( $_POST[product_director_meta_box_nonce] ) ) {
return;
}
if ( ! wp_verify_nonce( $_POST[product_director_meta_box_nonce], product_director_meta_box ) ) {
return;
}
if ( ! current_user_can( edit_post, $post_id ) ) {
return;
}
if ( ! isset( $_POST[product_director] ) ) {
return;
}
$product_director = sanitize_text_field( $_POST[product_director] );
update_post_meta( $post_id, _product_director, $product_director );
}
add_action(manage_posts_custom_column, product_custom_columns);
add_filter(manage_edit-product_columns, product_edit_columns);
function product_custom_columns($column){
global $post;
switch ($column) {
case product_director:
echo get_post_meta( $post->ID, _product_director, true );
break;
}
}
function product_edit_columns($columns){
$columns[product_director] = 產(chǎn)品價格;
return $columns;
}
別人寫的例子:
頁面添加自定義字段的
/**
* Custom Post metadata functions
*
* @package Bravada
*/
// Add Layout Meta Box
function bravada_add_meta_boxes( $post ) {
global $wp_meta_boxes;
$layout_context = apply_filters( bravada_layout_meta_box_context, side ); // normal, side, advanced
$layout_priority = apply_filters( bravada_layout_meta_box_priority, default ); // high, core, low, default
// Add page layouts
add_meta_box(
bravada_layout,
__( Static Page Layout, bravada ),
bravada_layout_meta_box,
page,
$layout_context,
$layout_priority
);
} // bravada_add_meta_boxes()
// Hook meta boxes into add_meta_boxes
add_action( add_meta_boxes, bravada_add_meta_boxes );
// Define Layout Meta Box
function bravada_layout_meta_box() {
global $post;
global $bravada_big;
$options = $bravada_big[options][0];
$custom = ( get_post_custom( $post->ID ) ? get_post_custom( $post->ID ) : false );
$layout = ( isset( $custom[_cryout_layout][0] ) ? $custom[_cryout_layout][0] : 0 );
?>
$data ) {
$data[url] = sprintf( $data[url], get_template_directory_uri() ); ?>
value= />
/>
value=0 />
/admin/images/0def.png />
} //bravada_layout_meta_box()
function bravada_meta_style( $hook ) {
if ( post.php != $hook && post-new.php != $hook && page.php != $hook ) {
return;
}
wp_enqueue_style( bravada_meta_style, get_template_directory_uri() . /admin/css/meta.css, NULL, _CRYOUT_THEME_VERSION );
}
add_action( admin_enqueue_scripts, bravada_meta_style );
/**
* Validate, sanitize, and save post metadata.
*
*/
function bravada_save_custom_post_metadata() {
// Dont break on quick edit
global $post;
if ( ! isset( $post ) || ! is_object( $post ) ) {
return;
}
global $bravada_big;
$valid_layouts = $bravada_big[options][0][choices];
$layout = ( isset( $_POST[_cryout_layout] ) && array_key_exists( sanitize_text_field( $_POST[_cryout_layout] ), $valid_layouts ) ? sanitize_text_field( $_POST[_cryout_layout] ) : 0 );
// Layout - Update
update_post_meta( $post->ID, _cryout_layout, $layout );
} //bravada_save_custom_post_metadata()
// Hook the save post custom meta data into
add_action( publish_page, bravada_save_custom_post_metadata );
add_action( draft_page, bravada_save_custom_post_metadata );
add_action( future_page, bravada_save_custom_post_metadata );
// FIN