在給分類新增欄位的第一篇教程中說過,儲存資料有兩種方法,一種是儲存到主題的_options 表中 (主題的設定選項都儲存在這個表中),第二種方法是新建一個資料表,類似文章的_postmeta,我們也可以新建一個_catmeta 表。
請根據自己的需求選擇合適的方式。
下面分別介紹兩種方式,表單就以上一節教程中的表單,也就是繼續沿用上一篇教程的檔案和程式碼。
和表單新增一樣,資料儲存也要分兩中情況,一種是,新新增分類。還有就是分類的再次編輯。使用到的兩個鉤子分別為:
- /*
- * 建立分類鉤子
- * 'created_'.$taxonomy ($taxonomy 為分類法的名稱,例如對於預設的分類,使用 creaded_category)
- *
- *編輯分類鉤子
- *'edited_'.$taxonomy ($taxonomy 為分類法的名稱,例如對於預設的分類,使用 edited_category)
- */
一、儲存到_options 表中
為了節省篇幅,直接貼上 catfield.php 檔案改過之後的程式碼,加了註釋:
- <?php
- function ashu_add_cat_field(){
- echo '<div class="form-field">';
- echo '<label for="ashu_cat_value" > 分類欄位</label>';
- echo '<input type="text" size="" value="" id="ashu_cat_value" name="ashu_cat_value"/>';
- echo '<p> 阿樹工作室分類欄位,請輸入文字</p>';
- echo '</div>';
- }
- add_action('category_add_form_fields','ashu_add_cat_field', 10, 2);
- //分類再編輯需要接受引數
- function ashu_edit_cat_field($tag){
- 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>';
- }
- add_action('category_edit_form_fields','ashu_edit_cat_field', 10, 2);
- /**************儲存資料接受的引數為分類 ID*****************/
- function ashu_taxonomy_metadata($term_id){
- if(isset($_POST['ashu_cat_value'])){
- //判斷許可權--可改
- if(!current_user_can('manage_categories')){
- return $term_id ;
- }
- $data = $_POST['ashu_cat_value'];
- $key = 'ashu_cat_value_'.$term_id; //選項名為 ashu_cat_value_1 型別
- update_option( $key, $data ); //更新選項值
- }
- }
- /*******雖然要兩個鉤子,但是我們可以兩個鉤子使用同一個函式********/
- add_action('created_category', 'ashu_taxonomy_metadata', 10, 1);
- add_action('edited_category','ashu_taxonomy_metadata', 10, 1);
- ?>
二、儲存到新建資料表中
將儲存資料的函式更改為下面程式碼,其它程式碼和上面的程式碼一樣:
- /**************儲存資料接受的引數為分類 ID*****************/
- function ashu_taxonomy_metadata($term_id){
- if(isset($_POST['ashu_cat_value'])){
- //判斷許可權--可改
- if(!current_user_can('manage_categories')){
- return $term_id ;
- }
- $data = htmlspecialchars($_POST['ashu_cat_value'], ENT_QUOTES,"UTF-8");
- //注意 get_term_meta,add_term_meta,update_term_meta 函式非預設函式, 需要單獨新增
- if(get_term_meta($term_id , 'ashu_cat_value') == ""){
- //如果資料庫中沒有就新新增
- add_term_meta($term_id , 'ashu_cat_value', $data, true);
- }elseif($data != get_term_meta($term_id , 'ashu_cat_value', true)){
- //如果更改了就更新
- update_term_meta($term_id , 'ashu_cat_value', $data);
- }
- if($data == ""){
- //如果提交的資料為空就刪除原來的值
- delete_term_meta($term_id , 'ashu_cat_value', get_term_meta($term_id , 'ashu_cat_value', true));
- }
- }
- }
關於三個新函式 get_term_meta,add_term_meta,update_term_meta 是用來操作我們新建的資料表的,現在我們即沒有新建資料表,也沒有定義這三個函式,不要執行,會出錯的。
如果你比較懶,你現在可以直接轉給一個外掛 simple-term-meta,這個外掛已經定義好了這三個函式,啟用外掛也會新增資料庫,安裝即可使用。
限於篇幅,就不在貼出程式碼了,因為這三個函式作者也是從外掛中弄出來了。
可是如果你的主題是幫別人制作的,製作完之後,你還讓別人去裝個外掛?這樣不合適。
建議:下載這個外掛之後,因為外掛只有一個檔案,直接在主題中使用 include_once 函式包含這個檔案即可,但是這樣會有一個問題,那就是資料表的建立,該外掛建立資料表是使用外掛啟用的鉤子。僅僅包含這個檔案是不夠的,要麼你手動去新增資料表。要麼使用程式碼 (開啟外掛檔案即可看到程式碼,按照下面的程式碼修改即可):
- global $pagenow;
- if ( is_admin() && 'themes.php' == $pagenow && isset( $_GET['activated'] ) ) {
- global $wpdb;
- simple_term_meta_install();
- }
- //註釋掉下面這一樣,新增上面的程式碼
- //register_activation_hook( __FILE__, 'simple_term_meta_install' );
這樣只要在啟用這個主題的之後,就會之心建立資料表的函式。缺點就是停用主題,資料表不會刪除。 (注意要重新啟用主題,才會執行新建資料表的程式碼) 。
更正:
前面有網友一直糾結於這個資料表的建立,後來作者也發現這裡有個缺陷,就是資料表的編碼問題。預設建立的資料表編碼可能不是 utf8 的,所以,請手動在外掛檔案建立資料表的 sql 語句後面加上編碼設定,請手動改為:
- $sql = "CREATE TABLE " . $table_name . " (
- meta_id bigint(20) unsigned NOT NULL AUTO_INCREMENT,
- term_id bigint(20) unsigned NOT NULL DEFAULT '0',
- meta_key varchar(255) DEFAULT NULL,
- meta_value longtext,
- PRIMARY KEY (meta_id),
- KEY term_id (term_id),
- KEY meta_key (meta_key)
- ) DEFAULT CHARSET=utf8;";