wordpress进阶教程(十四):给分类添加字段类文件

敬告:本类文件发表于2013年,可能已经过时,请参考或直接使用Ashuwp_framework框架。

在这篇教程作者将要结束给wordpress分类添加字段的教程,教程最后当然是送出类文件,前面也放出过两个类文件:主题后台、文章自定义字段。

但是这个类文件不一样,该类文件为阿树工作室原创,所以有不完美的地方,比如没有提供图片上传的,不过如果读者需要,参考一下前面主题后台和文章自定义字段的两个类文件,完全可以自己添加进来。

版本控制:

2013.07.08,版本 1.0

1、增加删除分类删除数据功能

2、增加和更新-编辑器、图片上传、复选框等功能

类文件代码-2013年7月8日更新:

  1. <?php
  2. /*
  3. wordpress分类法自定义字段类文件
  4. Version: 1.0
  5. Author: 树是我的朋友
  6. Author URI: http://www.ashuwp.com
  7. License: http://www.ashuwp.com/courses/highgrade/313.html
  8. */
  9. class ashu_taxonomy_feild{
  10.     var $options;
  11.     var $taxonomyinfo;
  12.     function __construct($options,$taxonomyinfo){
  13.         $this->options = $options;
  14.         $this->taxonomyinfo = $taxonomyinfo;
  15.         foreach($this->taxonomyinfo as $taxonomy){
  16.                 add_action($taxonomy.'_add_form_fields', array(&$this, 'taxonomy_fields_adds'), 10, 2);
  17.                 add_action($taxonomy.'_edit_form_fields', array(&$this, 'taxonomy_metabox_edit'), 10, 2);
  18.                 add_action('created_'.$taxonomyarray(&$this, 'save_taxonomy_metadata'), 10, 1);
  19.                 add_action('edited_'.$taxonomy,array(&$this, 'save_taxonomy_metadata'), 10, 1);
  20.                 add_action('admin_menu', array(&$this, 'init_taxonomy'));
  21.                 add_action('delete_'.$taxonomyarray(&$this,'delete_taxonomy_metadata'),10,1);
  22.         }
  23.     }
  24.     function init_taxonomy(){
  25.         if(basename$_SERVER['PHP_SELF']) == "edit-tags.php") {
  26.             //注意加载的脚本的url
  27.             wp_enqueue_style('cate_fields_css', TEMJS_URI. 'cate_fields.css');
  28.             wp_enqueue_script('cate_fields_js',TEMJS_URI. 'cate_fields.js');
  29.             wp_enqueue_script('thickbox');
  30.             wp_enqueue_style('thickbox');
  31.         }
  32.     }
  33.     /*********添加分类页面*******/
  34.     function taxonomy_fields_adds($tag){
  35.         foreach($this->options as $option){
  36.             if( (!isset($option["edit_only"]) || !$option["edit_only"] ) ){
  37.             if (method_exists($this$option['type'])){
  38.                 echo '<div class="form-field">';
  39.                 echo '<label for="'.$option['id'].'" >'.$option['name'].'</label>';
  40.                 $this->$option['type']($option);
  41.                 echo '</div>';
  42.             }
  43.             }
  44.         }
  45.     }
  46.     /*************编辑分类页面*****************/
  47.     function taxonomy_metabox_edit($tag){
  48.         foreach($this->options as $option){
  49.             if (method_exists($this$option['type'])){
  50.                 if(get_term_meta($tag->term_id , $option['id']) !== ""){
  51.                     $option['std'] = get_term_meta($tag->term_id,$option['id'], true);
  52.                 }
  53.                 echo '<tr class="form-field">';
  54.                 echo '<th scope="row" valign="top">';
  55.                 echo '<label for="'.$option['id'].'" >'.$option['name'].'</label>';
  56.                 echo '</th>';
  57.                 echo '<td>';
  58.                 $this->$option['type']($option);
  59.                 echo '</td>';
  60.                 echo '</tr>';
  61.             }
  62.         }
  63.     }
  64.     /**********删除数据******/
  65.     function delete_taxonomy_metadata($term_id){
  66.         foreach($this->options as $option){
  67.             delete_term_meta($term_id,$option['id']);
  68.         }
  69.     }
  70.     /**************保存数据*****************/
  71.     function save_taxonomy_metadata($term_id){
  72.         foreach($this->options as $option){
  73.             if(isset($_POST[$option['id']])){
  74.                 if(!current_user_can('manage_categories')){
  75.                     return $term_id ;
  76.                 }
  77.                 if$option['type'] == 'tinymce' ){
  78.                     $data =  stripslashes($_POST[$option['id']]);
  79.                 }elseif$option['type'] == 'checkbox' ){
  80.                     $data =  $_POST[$option['id']];
  81.                 }else{
  82.                     $data = htmlspecialchars($_POST[$option['id']], ENT_QUOTES,"UTF-8");
  83.                 }
  84.                 if(get_term_meta($term_id , $option['id']) == "")
  85.                     add_term_meta($term_id , $option['id'], $data, true);
  86.                 elseif($data != get_term_meta($term_id , $option['id'], true))
  87.                     update_term_meta($term_id , $option['id'], $data);
  88.                 elseif($data == "")
  89.                     delete_term_meta($term_id , $option['id'], get_term_meta($term_id , $option['id'], true));
  90.             }
  91.         }
  92.     }
  93.     /******提示信息******/
  94.     function info($option){
  95.         echo '<p>'.$option['desc'].'</p>';
  96.     }
  97.     /*******文本输入框text*******/
  98.     function text($option){
  99.             echo '<input type="text" size="'.$option['size'].'" value="';
  100.             echo $option['std'];
  101.             echo '" id="'.$option['id'].'" name="'.$option['id'].'"/>';
  102.             echo '<p>'.$option['desc'].'</p>';
  103.     }
  104.     /******文本域***********/
  105.     function textarea($option){
  106.         echo '<textarea cols="40" rows="5" id="'.$option['id'].'" name="'.$option['id'].'">'.$option['std'].'</textarea>';
  107.         echo '<p>'.$option['desc'].'</p>';
  108.     }
  109.     /**********单选框************/
  110.     function radio( $option ){
  111.         foreach$option['buttons'] as $key=>$value ) {
  112.             $checked ="";
  113.             if$option['std'] == $key) {
  114.                 $checked = 'checked = "checked"';
  115.             }
  116.             echo '<input '.$checked.' type="radio" class="kcheck" value="'.$key.'" name="'.$option['id'].'"/>'.$value;
  117.         }
  118.     }
  119.     /**************复选框*******************/
  120.     function checkbox($option) {
  121.         foreach$option['buttons'] as $key=>$value ) {
  122.             $checked ="";
  123.             if( is_array($option['std']) && in_array($key,$option['std'])) {
  124.                 $checked = 'checked = "checked"';
  125.             }
  126.             echo '<input '.$checked.' type="checkbox" class="kcheck" value="'.$key.'" name="'.$option['id'].'[]"/>'.$value;
  127.         }
  128.     }
  129.     /***********下拉选择***********/
  130.     function dropdown($option){
  131.         if($option['subtype'] == 'page') {
  132.             $select = 'Select page';
  133.             $entries = get_pages('title_li=&orderby=name');
  134.         }else if($option['subtype'] == 'sidebar'){
  135.             global $wp_registered_sidebars;
  136.             $select = 'Select a special sidebar';
  137.             $entries = $wp_registered_sidebars;
  138.         }else if($option['subtype'] == 'cat'){
  139.             $select = 'Select category';
  140.             $entries = get_categories('title_li=&orderby=name&hide_empty=0');
  141.         }else{
  142.             $select = 'Select...';
  143.             $entries = $option['subtype'];
  144.         }
  145.         echo '<select class="postform" id="'. $option['id'] .'" name="'. $option['id'] .'"> ';
  146.             echo '<option value="">请选择...</option>  ';
  147.             foreach ($entries as $key => $entry){
  148.                 if($option['subtype'] == 'page'){
  149.                     $id = $entry->ID;
  150.                     $title = $entry->post_title;
  151.                 }else if($option['subtype'] == 'cat'){
  152.                     $id = $entry->term_id;
  153.                     $title = $entry->name;
  154.                 }else if($option['subtype'] == 'sidebar'){
  155.                     $id = $entry['id'];
  156.                     $title = $entry['name'];
  157.                 }else{
  158.                     $id = $key;
  159.                     $title = $entry;
  160.                 }
  161.                 $selected='';
  162.                 if$option['std'] == $id ){
  163.                     $selected = "selected='selected'";
  164.                 }
  165.                 echo"<option $selected value='"$id ."'>"$title."</option>";
  166.             }
  167.         echo '</select>';
  168.         echo '<p>'.$option['desc'].'</p>';
  169.     }
  170.     /***************图片上传**********************/
  171.     function upload($option){
  172.         $prevImg = '';
  173.         if($option['std'] != ''){$prevImg = '<img src='.$option['std'].' alt="" />';}
  174.         echo '<div class="preview_pic_optionspage" id="'.$option['id'].'_div">'.$prevImg.'</div>';
  175.         echo $option['desc'].'<br/>';
  176.         echo '<input type="text" size="60" value="'.$option['std'].'" name="'.$option['id'].'" class="upload_pic_input" />';
  177.         echo '&nbsp;<a onclick="return false;" title="" class="cat_up button thickbox" id="'.$option['id'].'" href="media-upload.php?type=image&amp;TB_iframe=true">Insert Image</a>';
  178.     }
  179.     /*******************编辑器****************************/
  180.     function tinymce($option){
  181.         wp_editor( $option['std'], $option['id'],$settings=array('tinymce'=>1,'media_buttons'=>0,) );
  182.     }
  183. }
  184. ?>

下面提供类文件下载(共两个文件):wordpress给分类添加字段类文件其中一个类文件,一个simp-term-meta.php文件

配置示例:

注意:

  1. 其中配置数组中的edit_only参数如果设置为true,则该项将只会在分类的编辑页面出现,主要考虑是,在分类的添加页面,编辑器或者图片上传可能太大,所以一般将编辑器和图片上传设置为只在编辑页面出现。
  2. 复选框保存的数据为数组
  1. $options = array();
  2. $taxonomyinfo = array('category');
  3. $options[] = array(
  4.             "id" => "_notice",
  5.             "desc" => '提示信息内容',
  6.             "type" => "info");
  7. $options[] = array"name" => "分类关键词",
  8.             "desc" => "",
  9.             "id" => "_seo_keywords",
  10.             "std" => "",
  11.             "edit_only"=>false,
  12.             "size" => 40,
  13.             "type" => "text");
  14. $options[] = array"name" => "文本域测试",
  15.     "desc" => "描述信息",
  16.     "id" => "_textarea",
  17.     "std" => "",
  18.     "edit_only"=>false,
  19.     "size" => 40,
  20.     "type" => "textarea");
  21. $options[] = array"name" => "单选框测试",
  22.     "desc" => "请选择性别",
  23.     "id" => "_radio",
  24.     "std" => "sprother",
  25.     "edit_only"=>false,
  26.     "buttons" => array(
  27.         'man'=>'男性',
  28.         'woman'=>'女性',
  29.         'sprother'=>'中性'
  30.     ),
  31.     "type" => "radio");
  32. $options[] = array"name" => "复选框--你喜欢哪几个",
  33.     "id" => "_checkbox",
  34.     "std" => "",
  35.     "buttons" => array(
  36.         'chun'=>'春哥',
  37.         'zeng'=>'曾哥',
  38.         'zhu'=>'著姐',
  39.         'feng'=>'玉凤',
  40.         'fu'=>'芙蓉'
  41.     ),
  42.     "edit_only"=>false,
  43.     "type" => "checkbox");
  44. $options[] = array"name" => "下拉框框测试-页面",
  45.     "desc" => "描述信息",
  46.     "id" => "_drop_page",
  47.     "std" => "",
  48.     "edit_only"=>false,
  49.     "subtype" => 'page',
  50.     "type" => "dropdown");
  51. $options[] = array"name" => "下拉框框测试-分类",
  52.     "desc" => "描述信息",
  53.     "id" => "_drop_cat",
  54.     "std" => "",
  55.     "edit_only"=>false,
  56.     "subtype" => 'cat',
  57.     "type" => "dropdown");
  58. $options[] = array"name" => "下拉框框测试-侧边栏",
  59.     "desc" => "描述信息",
  60.     "id" => "_drop_sidebar",
  61.     "std" => "",
  62.     "edit_only"=>false,
  63.     "subtype" => 'sidebar',
  64.     "type" => "dropdown");
  65. $options[] = array"name" => "下拉框框测试-自定义",
  66.     "desc" => "描述信息",
  67.     "id" => "_drop_custom",
  68.     "std" => "",
  69.     "edit_only"=>false,
  70.     "subtype" => array(
  71.         'apple'=>'苹果',
  72.         'banana'=>'香蕉',
  73.         'orange'=>'桔子',
  74.     ),
  75.     "type" => "dropdown");
  76. $options[] = array(
  77.     "name" => "上传图片测试",
  78.     "desc" => "",
  79.     "id" => "_upload",
  80.     "std" => "",
  81.     "edit_only"=>true,
  82.     "type" => "upload"
  83.     );
  84. $options[] = array(
  85.     "name" => "tinymce编辑器测试",
  86.     "desc" => "",
  87.     "id" => "_tinymce",
  88.     "std" => "",
  89.     "edit_only"=>true,
  90.     "type" => "tinymce"
  91.     );
  92. $new_taxonomy_feild = new ashu_taxonomy_feild($options$taxonomyinfo);

 

使用方法:

1、解压之后得到两个文件,在主题中包含这两个文件,分别是文件和simple-term-meta.php文件。

2、在你的主题中包含这两个文件这两个文件(如阿树将文件放在主题的include文件夹中,则使用如下代码):

  1. include_once(get_template_directory() .'/include/class-taxonomy-feild.php');
  2. include_once(get_template_directory() .'/include/simple-term-meta.php');

2、类文件class-taxonomy-feild.php的后面带有类文件的实例化配置方法,按照需求更改即可。

3、获取数据,使用get_term_meta函数,跟get_post_meta函数类似。以上面示例中,分类关键词的获取为例:

  1. $_seo_keywords = get_term_meta( $cat->term_id, '_seo_keywords',true );

FAQ:

1、能正确显示表单,但是无法保存数据?

本站提供的simple-term-meta.php文件在安装激活主题的时候,会在数据库中添加一个_termmeta表用来保存数据,如果无法保存数据,八成是未新建该数据表,请重新激活主题。

2、下载的压缩包是空的?

请换浏览器、换电脑。

3、如何使用该类文件给自定义分类法添加字段?

在配置代码中$taxonomyinfo数组,加入你自己的自定义分类法。

 

已有55条评论

发表评论