wordpress进阶教程(十三):给分类添加字段-数据的保存

在给分类添加字段的第一篇教程中说过,保存数据有两种方法,一种是保存到主题的_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;";  

 

已有19条评论

  1. 唐小狼
    唐小狼 : 回复

    请问数据是如何插入到新建表中的,没有看到哪里用到了新建表的表名呀??

    • 阿树工作室
      阿树工作室 回复唐小狼: 回复

      插件simple-term-meta

  2. kbdsbx
    kbdsbx : 回复

    编码应该是DEFAULT CHARSET=” . get_bloginfo( ‘charset’ ) . “;”;啦

  3. laiydesign.com
    laiydesign.com : 回复

    如果分类用到了下拉框的功能,前台怎么调用呢?if条件语句怎么写呀?

  4. xuexi
    xuexi : 回复
    $keywords = get_term_meta($currentterm->term_id , '_seo_keywords',true);

    这个输出直接报错哦   _seo_keywords  这里改成自己name了      

  5. xuexi
    xuexi : 回复

    博主 谢谢你的教程  我把分类已经加好了字段,   

    请问标签怎么添加字段。 我直接改成tag根本不能用。


    需要改哪些地方 麻烦说下  谢谢

  6. 珲珲
    珲珲 : 回复

    请问一下,标签能不能添加类似的功能?

    • 阿树工作室
      阿树工作室 回复珲珲: 回复

      可以

  7. 小拇指
    小拇指 : 回复

    请问下前台如何输出呢?

    • 阿树工作室
      阿树工作室 回复小拇指: 回复
      $keywords = get_term_meta($currentterm->term_id , '_seo_keywords',true);
    • 阿树工作室
      阿树工作室 回复小拇指: 回复

      使用get_term_meta()函数

      • 小拇指
        小拇指 回复阿树工作室: 回复

        顺便给楼主报告一个问题,就是你的这个留言版,就如我刚刚问你问题的那条留言,内容占两行,后面i就跟日期重叠了,我试过其他的浏览器了,都是这个问题。

      • 小拇指
        小拇指 回复阿树工作室: 回复

        谢谢您的教程,让我获益匪浅。弱弱地问一句,那个你说的_seo_keywords在这篇文章里应该是哪个呢?(如果以保存在option表里的这个例子来说。)感觉自己弱爆了……

        • 阿树工作室
          阿树工作室 回复小拇指: 回复

          分类的字段名称哇。。一般id\name name就是字段名

  8. QQ80805588
    QQ80805588 : 回复

    正宗的wordpress 勤快高手

  9. lonly
    lonly : 回复

    我看的只篇文章,教程里的写入新建的数据库搞不懂~~~麻烦了~~~

    • 阿树工作室
      阿树工作室 回复lonly: 回复

      可以直接看下一篇教程,下载已经编辑好的文件。。

发表评论