在給分類添加字段的第一篇教程中説過,保存數據有兩種方法,一種是保存到主題的_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;";