在給分類新增欄位的第一篇教程中說過,儲存資料有兩種方法,一種是儲存到主題的_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;";