在给分类添加字段的第一篇教程中说过,保存数据有两种方法,一种是保存到主题的_options表中(主题的设置选项都保存在这个表中),第二种方法是新建一个数据表,类似文章的_postmeta,我们也可以新建一个_catmeta表。
请根据自己的需求选择合适的方式。
下面分别介绍两种方式,表单就以上一节教程中的表单,也就是继续沿用上一篇教程的文件和代码。
和表单添加一样,数据保存也要分两中情况,一种是,新添加分类。还有就是分类的再次编辑。使用到的两个钩子分别为:
/* * 创建分类钩子 * 'created_'.$taxonomy ($taxonomy为分类法的名称,例如对于默认的分类,使用creaded_category) * *编辑分类钩子 *'edited_'.$taxonomy ($taxonomy为分类法的名称,例如对于默认的分类,使用edited_category) */ <?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)); } } } 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' ); $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;";
一、保存到_options表中
为了节省篇幅,直接贴上catfield.PHP文件改过之后的代码,加了注释:
/* * 创建分类钩子 * 'created_'.$taxonomy ($taxonomy为分类法的名称,例如对于默认的分类,使用creaded_category) * *编辑分类钩子 *'edited_'.$taxonomy ($taxonomy为分类法的名称,例如对于默认的分类,使用edited_category) */ <?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)); } } } 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' ); $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;";
二、保存到新建数据表中
将保存数据的函数更改为下面代码,其它代码和上面的代码一样:
/* * 创建分类钩子 * 'created_'.$taxonomy ($taxonomy为分类法的名称,例如对于默认的分类,使用creaded_category) * *编辑分类钩子 *'edited_'.$taxonomy ($taxonomy为分类法的名称,例如对于默认的分类,使用edited_category) */ <?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)); } } } 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' ); $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;";
关于三个新函数get_term_meta,add_term_meta,update_term_meta是用来操作我们新建的数据表的,现在我们即没有新建数据表,也没有定义这三个函数,不要运行,会出错的。
如果你比较懒,你现在可以直接转给一个插件simple-term-meta,这个插件已经定义好了这三个函数,启用插件也会添加数据库,安装即可使用。
限于篇幅,就不在贴出代码了,因为这三个函数作者也是从插件中弄出来了。
可是如果你的主题是帮别人制作的,制作完之后,你还让别人去装个插件?这样不合适。
建议:下载这个插件之后,因为插件只有一个文件,直接在主题中使用include_once函数包含这个文件即可,但是这样会有一个问题,那就是数据表的建立,该插件建立数据表是使用插件激活的钩子。仅仅包含这个文件是不够的,要么你手动去添加数据表。要么使用代码(打开插件文件即可看到代码,按照下面的代码修改即可):
/* * 创建分类钩子 * 'created_'.$taxonomy ($taxonomy为分类法的名称,例如对于默认的分类,使用creaded_category) * *编辑分类钩子 *'edited_'.$taxonomy ($taxonomy为分类法的名称,例如对于默认的分类,使用edited_category) */ <?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)); } } } 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' ); $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;";
这样只要在激活这个主题的之后,就会之心创建数据表的函数。缺点就是停用主题,数据表不会删除。(注意要重新激活主题,才会执行新建数据表的代码)。
更正:
前面有网友一直纠结于这个数据表的建立,后来作者也发现这里有个缺陷,就是数据表的编码问题。默认建立的数据表编码可能不是utf8的,所以,请手动在插件文件创建数据表的sql语句后面加上编码设置,请手动改为:
/* * 创建分类钩子 * 'created_'.$taxonomy ($taxonomy为分类法的名称,例如对于默认的分类,使用creaded_category) * *编辑分类钩子 *'edited_'.$taxonomy ($taxonomy为分类法的名称,例如对于默认的分类,使用edited_category) */ <?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)); } } } 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' ); $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;";