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

下面提供类文件下载 (共两个文件):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.   
  15. $options[] = array"name" => "文本域测试",   
  16.     "desc" => "描述信息",   
  17.     "id" => "_textarea",   
  18.     "std" => "",   
  19.     "edit_only"=>false,   
  20.     "size" => 40,   
  21.     "type" => "textarea");   
  22.        
  23. $options[] = array"name" => "单选框测试",   
  24.     "desc" => "请选择性别",   
  25.     "id" => "_radio",   
  26.     "std" => "sprother",   
  27.     "edit_only"=>false,   
  28.     "buttons" => array(   
  29.         'man'=>'男性',   
  30.         'woman'=>'女性',   
  31.         'sprother'=>'中性'   
  32.     ),   
  33.     "type" => "radio");   
  34.        
  35. $options[] = array"name" => "复选框--你喜欢哪几个",   
  36.     "id" => "_checkbox",   
  37.     "std" => "",   
  38.     "buttons" => array(   
  39.         'chun'=>'春哥',   
  40.         'zeng'=>'曾哥',   
  41.         'zhu'=>'著姐',   
  42.         'feng'=>'玉凤',   
  43.         'fu'=>'芙蓉'   
  44.     ),   
  45.     "edit_only"=>false,   
  46.     "type" => "checkbox");   
  47.        
  48. $options[] = array"name" => "下拉框框测试-页面",   
  49.     "desc" => "描述信息",   
  50.     "id" => "_drop_page",   
  51.     "std" => "",   
  52.     "edit_only"=>false,   
  53.     "subtype" => 'page',   
  54.     "type" => "dropdown");   
  55.        
  56. $options[] = array"name" => "下拉框框测试-分类",   
  57.     "desc" => "描述信息",   
  58.     "id" => "_drop_cat",   
  59.     "std" => "",   
  60.     "edit_only"=>false,   
  61.     "subtype" => 'cat',   
  62.     "type" => "dropdown");   
  63.        
  64. $options[] = array"name" => "下拉框框测试-侧边栏",   
  65.     "desc" => "描述信息",   
  66.     "id" => "_drop_sidebar",   
  67.     "std" => "",   
  68.     "edit_only"=>false,   
  69.     "subtype" => 'sidebar',   
  70.     "type" => "dropdown");   
  71. $options[] = array"name" => "下拉框框测试-自定义",   
  72.     "desc" => "描述信息",   
  73.     "id" => "_drop_custom",   
  74.     "std" => "",   
  75.     "edit_only"=>false,   
  76.     "subtype" => array(   
  77.         'apple'=>'苹果',   
  78.         'banana'=>'香蕉',   
  79.         'orange'=>'桔子',   
  80.     ),   
  81.     "type" => "dropdown");   
  82.        
  83. $options[] = array(   
  84.     "name" => "上传图片测试",   
  85.     "desc" => "",   
  86.     "id" => "_upload",   
  87.     "std" => "",   
  88.     "edit_only"=>true,   
  89.     "type" => "upload"  
  90.     );   
  91. $options[] = array(   
  92.     "name" => "tinymce 编辑器测试",   
  93.     "desc" => "",   
  94.     "id" => "_tinymce",   
  95.     "std" => "",   
  96.     "edit_only"=>true,   
  97.     "type" => "tinymce"  
  98.     );   
  99.   
  100. $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 数组,加入你自己的自定义分类法。