Meta 定义事物本身的元信息。对于日常发布的网站文章,Meta 信息的应用有助于描述文章本身,提升文章的立体感,对于一些常见类型文章的信息,比如文章的浏览量、点赞数、评论数;视频文章的更新集数、演员信息以及产品展示文章的产品价格、产品类型等都是通过文章的 Meta 信息存储、获取并更新的。

WordPress 提供了丰富的 Meta 处理函数用于生成各种 Meta 信息,比如:add_post_meta()、delete_post_meta()、update_post_meta()、get_post_meta(),通过这些处理函数我们可以方便地增加、删除、修改、查询对应的 Meta 信息,以丰富文章结构。本文即提供一段封装号的函数代码用于快速生成各种 Meta 信息,具体操作如下:

引入 class_create_post_meta.php 文件

新建一个名为 class_create_post_meta.php 的文件,将以下代码复制进去:

<?php
/** 
  * @ name 文章新增相关 Meta
  * @description 创建 Meta 时请参照如下方式
	$meta_conf = array(
	    'box_id'    => "box_id",
	    'box_title' => "box_title",
	    'ipt_id'    => "ipt_id",
	    'ipt_name'  => "ipt_name",
	    'div_class' => "div_class",
	);
	$my_meta = array(
		array(
		    'name'   => "Meta_name",                             // 对应数据库中meta_key
		    'std'    => "", 
		    'title'  => 'Meta_title:'
		),
	    );
	new CreateMyMetaBox($meta_conf,$my_meta);
  */

class CreateMyMetaBox{
    
    var $meta_conf, $my_meta, $post_id;
	
    function __construct( $meta_conf,$my_meta) {
	$this -> meta_conf   = $meta_conf;
	$this -> my_meta     = $my_meta;
	
	add_action('admin_menu', array(&$this, 'my_meta_box_create'));
	add_action('save_post', array(&$this, 'my_meta_box_save'));
    }
	
    public function my_meta_box_create(){
	if ( function_exists('add_meta_box') ){
	    add_meta_box( $this -> meta_conf['box_id'], __($this -> meta_conf['box_title'], 'QGG'), array(&$this, 'my_meta_box_init'), 'post', 'normal', 'high' );
	}
    }
	
    public function my_meta_box_init( $post_id ){
	
	$class = $this -> meta_conf['div_class'] ? $this -> meta_conf['div_class'] : '';
	$post_id = $_GET['post'];
	
	foreach($this->my_meta as $meta_box){
	    $meta_box_value = get_post_meta($post_id, $meta_box['name'], true);
	    if($meta_box_value == ""){
	        $meta_box_value = $meta_box['std'];
	    }
	    if( isset($meta_box['title']) ){
		echo'<div class= '.$class.'>
		    <p>'.$meta_box['title'].'</p>
		    <p><input type="text" style="width:100%;" value="'.$meta_box_value.'" name="'.$meta_box['name'].'"></p>
		    </div>';
	    }
	}
	echo '<input type="hidden" name="'.$this -> meta_conf['ipt_name'].'" id="'.$this -> meta_conf['ipt_id'].'" value="'.wp_create_nonce( plugin_basename(__FILE__) ).'" />';
    }
	
    public function my_meta_box_save( $post_id ){
	
	$post_id = $_POST['post_ID'];
	
	if ( !wp_verify_nonce( isset($_POST[ $this -> meta_conf['ipt_name'] ]) ? $_POST[ $this -> meta_conf['ipt_name'] ] : '', plugin_basename(__FILE__) ))
	    return;
	if ( !current_user_can( 'edit_posts', $post_id ))
	    return;
			
	foreach($this->my_meta as $meta_box) {
			
	    $data = $_POST[$meta_box['name']] ? $_POST[$meta_box['name']] : "";

	    if(get_post_meta($post_id, $meta_box['name']) == ""){
		add_post_meta($post_id, $meta_box['name'], $data, true);
	    }elseif($data != get_post_meta($post_id, $meta_box['name'], true)){
		update_post_meta($post_id, $meta_box['name'], $data);
	    }elseif($data == ""){
		delete_post_meta($post_id, $meta_box['name'], get_post_meta($post_id, $meta_box['name'], true));
	    }
	}
    }
}

然后,在主题 functions.php 文件中添加如下代码引入。

require get_stylesheet_directory() . '/functions/class_create_post_meta.php';

当然,你也可以直接将代码丢到主题函数文件中去,这里建议单独新建个文件,方便管理。

生成自定义 Meta 字段

其实上面 class_create_post_meta.php 文件中已经有如何生成 Meta ,这里给个示例特别说明一下。代码如下:

// 文章新增产品相关 Meta
$product_conf = array(
    'box_id'    => "product_meta_box",
    'box_title' => "产品设置",
    'ipt_id'    => "product_meta_ipt_id",
    'ipt_name'  => "product_meta_ipt_name",
    'div_class' => "post-meta-box-s2",
);
$product_meta = array(
    array(
	"name" => "original_price",
	"std" => "", 
	"title" => '原价:'
    ),
    array(
	"name" => "bargain_price",
	"std" => "",
	"title" => '特价:'
    ),
    array(
	"name" => "link",
	"std" => "",
	"title" => '直达链接:'
    )
);

$product_meta_box = new CreateMyMetaBox($product_conf,$product_meta);
  • box_id:后台 Meta 盒子的 ID 属性。
  • box_title:后台 Meta 盒子的标题属性。
  • ipt_id:代码中提交元素的 ID 属性。
  • ipt_name:代码中提交元素的 Name 属性。
  • div_class:后台 Meta 盒子中各项目的 Class 样式属性。
  • name:后台每一个 Meta 项目的 name 属性,用于生成数据库中对应的字段。
  • std:后台每一个 Meta 项目的默认值。
  • title:后台每一个 Meta 项目的标题属性。

创建完成后后台生成的代码如下:

<div id="product_meta_box" class="postbox ">
    <button type="button" class="handlediv" aria-expanded="true"><span class="screen-reader-text">切换面板:产品设置</span><span class="toggle-indicator" aria-hidden="true"></span></button><h2 class="hndle ui-sortable-handle"><span>产品设置</span></h2>
    <div class="inside">
        <div class="post-meta-box-s2">
	    <p>原价:</p>
	    <p><input type="text" style="width:100%;" value="" name="original_price"></p>
        </div>
        <div class="post-meta-box-s2">
	    <p>特价:</p>
	    <p><input type="text" style="width:100%;" value="" name="bargain_price"></p>
	</div>
        <div class="post-meta-box-s2">
	    <p>直达链接:</p>
	    <p><input type="text" style="width:100%;" value="" name="link"></p>
        </div>
        <input type="hidden" name="product_meta_ipt_name" id="product_meta_ipt_id" value="95c46872d6">
    </div>
</div>

显示效果如下: