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>
显示效果如下:
评论 抢沙发