在給分類添加字段的第一篇教程中説過,保存數據有兩種方法,一種是保存到主題的_options 表中 (主題的設置選項都保存在這個表中),第二種方法是新建一個數據表,類似文章的_postmeta,我們也可以新建一個_catmeta 表。

請根據自己的需求選擇合適的方式。

下面分別介紹兩種方式,表單就以上一節教程中的表單,也就是繼續沿用上一篇教程的文件和代碼。

和表單添加一樣,數據保存也要分兩中情況,一種是,新添加分類。還有就是分類的再次編輯。使用到的兩個鈎子分別為:

  1. /*  
  2. * 創建分類鈎子  
  3. *  'created_'.$taxonomy ($taxonomy 為分類法的名稱,例如對於默認的分類,使用 creaded_category) 
  4. *  
  5. *編輯分類鈎子  
  6. *'edited_'.$taxonomy ($taxonomy 為分類法的名稱,例如對於默認的分類,使用 edited_category) 
  7. */  

一、保存到_options 表中

為了節省篇幅,直接貼上 catfield.php 文件改過之後的代碼,加了註釋:

  1. <?php   
  2. function ashu_add_cat_field(){   
  3.     echo '<div class="form-field">';   
  4.     echo '<label for="ashu_cat_value" > 分類字段</label>';   
  5.     echo '<input type="text" size="" value="" id="ashu_cat_value" name="ashu_cat_value"/>';   
  6.     echo '<p> 阿樹工作室分類字段,請輸入文字</p>';   
  7.     echo '</div>';   
  8. }   
  9. add_action('category_add_form_fields','ashu_add_cat_field', 10, 2);   
  10.   
  11. //分類再編輯需要接受參數   
  12. function ashu_edit_cat_field($tag){   
  13.     echo '<tr><th> 分類字段'.$tag->term_id .'</th><td><input type="text" size="40" value="'.get_option('ashu_cat_value_'.$tag->term_id).'" id="ashu_cat_value" name="ashu_cat_value"/> 阿樹工作室分類字段,請輸入文字</td></tr>';   
  14. }   
  15. add_action('category_edit_form_fields','ashu_edit_cat_field', 10, 2);   
  16.   
  17.   
  18. /**************保存數據接受的參數為分類 ID*****************/  
  19. function ashu_taxonomy_metadata($term_id){   
  20.     if(isset($_POST['ashu_cat_value'])){   
  21.         //判斷權限--可改   
  22.         if(!current_user_can('manage_categories')){   
  23.             return $term_id ;   
  24.         }   
  25.            
  26.         $data = $_POST['ashu_cat_value'];   
  27.         $key = 'ashu_cat_value_'.$term_id//選項名為 ashu_cat_value_1 類型   
  28.         update_option( $key$data ); //更新選項值   
  29.     }   
  30. }   
  31. /*******雖然要兩個鈎子,但是我們可以兩個鈎子使用同一個函數********/  
  32. add_action('created_category', 'ashu_taxonomy_metadata', 10, 1);   
  33. add_action('edited_category','ashu_taxonomy_metadata', 10, 1);   
  34. ?>  

二、保存到新建數據表中

將保存數據的函數更改為下面代碼,其它代碼和上面的代碼一樣:

  1. /**************保存數據接受的參數為分類 ID*****************/  
  2. function ashu_taxonomy_metadata($term_id){   
  3.     if(isset($_POST['ashu_cat_value'])){   
  4.         //判斷權限--可改   
  5.         if(!current_user_can('manage_categories')){   
  6.             return $term_id ;   
  7.         }   
  8.            
  9.         $data = htmlspecialchars($_POST['ashu_cat_value'], ENT_QUOTES,"UTF-8");   
  10.            
  11.         //注意 get_term_meta,add_term_meta,update_term_meta 函數非默認函數, 需要單獨添加   
  12.         if(get_term_meta($term_id , 'ashu_cat_value') == ""){   
  13.             //如果數據庫中沒有就新添加   
  14.             add_term_meta($term_id , 'ashu_cat_value', $data, true);   
  15.         }elseif($data != get_term_meta($term_id , 'ashu_cat_value', true)){   
  16.             //如果更改了就更新   
  17.             update_term_meta($term_id , 'ashu_cat_value', $data);   
  18.         }   
  19.            
  20.         if($data == ""){   
  21.             //如果提交的數據為空就刪除原來的值   
  22.             delete_term_meta($term_id , 'ashu_cat_value', get_term_meta($term_id , 'ashu_cat_value', true));   
  23.         }   
  24.     }   
  25. }  

關於三個新函數 get_term_meta,add_term_meta,update_term_meta 是用來操作我們新建的數據表的,現在我們即沒有新建數據表,也沒有定義這三個函數,不要運行,會出錯的。

如果你比較懶,你現在可以直接轉給一個插件 simple-term-meta,這個插件已經定義好了這三個函數,啓用插件也會添加數據庫,安裝即可使用。

限於篇幅,就不在貼出代碼了,因為這三個函數作者也是從插件中弄出來了。

可是如果你的主題是幫別人制作的,製作完之後,你還讓別人去裝個插件?這樣不合適。

建議:下載這個插件之後,因為插件只有一個文件,直接在主題中使用 include_once 函數包含這個文件即可,但是這樣會有一個問題,那就是數據表的建立,該插件建立數據表是使用插件激活的鈎子。僅僅包含這個文件是不夠的,要麼你手動去添加數據表。要麼使用代碼 (打開插件文件即可看到代碼,按照下面的代碼修改即可):

  1. global $pagenow;   
  2. if ( is_admin() && 'themes.php' == $pagenow && isset( $_GET['activated'] ) ) {   
  3.     global $wpdb;   
  4.     simple_term_meta_install();   
  5. }   
  6. //註釋掉下面這一樣,添加上面的代碼   
  7. //register_activation_hook( __FILE__, 'simple_term_meta_install' );  

這樣只要在激活這個主題的之後,就會之心創建數據表的函數。缺點就是停用主題,數據表不會刪除。 (注意要重新激活主題,才會執行新建數據表的代碼) 。

更正:

前面有網友一直糾結於這個數據表的建立,後來作者也發現這裏有個缺陷,就是數據表的編碼問題。默認建立的數據表編碼可能不是 utf8 的,所以,請手動在插件文件創建數據表的 sql 語句後面加上編碼設置,請手動改為:

  1. $sql = "CREATE TABLE " . $table_name . " (  
  2.           meta_id bigint(20) unsigned NOT NULL AUTO_INCREMENT,  
  3.           term_id bigint(20) unsigned NOT NULL DEFAULT '0',  
  4.           meta_key varchar(255) DEFAULT NULL,  
  5.           meta_value longtext,  
  6.           PRIMARY KEY (meta_id),  
  7.           KEY term_id (term_id),  
  8.           KEY meta_key (meta_key)       
  9.         ) DEFAULT CHARSET=utf8;";