在這篇教程作者將要結束給 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 陣列,加入你自己的自定義分類法。