今天在开发一个SEO插件时,希望为分类category添加一个自定义栏目,以实现在分类页使用与分类栏目有所不同的网页标题。但在网上找了半天,大部分都是推荐category meta插件,而没有简单的实现代码。为此,我在国外一些WP牛人的博客上找了半天,最终找到了实现的方法,并在此基础上加以梳理,最终写出了自己的代码,这里与大家分享。
如果你熟悉wordpress的数据库就会发现,wordpress的分类基于taxonomy(分类法),category只是其中的一种。分类与用户、文章、评论不同的是,其他三个都有meta表,而taxonomy没有meta表。因此,一切都需要我们自己添加,但我们又不希望自己增加一个新的tax_meta表来实现,因为新的表就无法直接使用wordpress的内置函数。在外国佬的博客上找到了思路,即使用option表。废话不多,直接上代码:
add_action ( 'edit_category_form_fields', 'extra_category_fields'); function extra_category_fields( $term ) { ??? $cat_id = $term->term_id; ??? $cat_meta = get_option( "category_{$cat_id}_meta"); ?> <tr> <th scope="row" valign="top"><label for="cat_seo_title">分类SEO标题</label></th> <td> ??? <input type="text" name="cat_meta[seo_title]" id="cat_seo_title" size="3" value="<?php echo $cat_meta['seo_title'] ? $cat_meta['seo_title'] : ''; ?>"><br /> ??? <span>这里的标题将在分类页代替上面的分类标题,例如原标题为“南昌SEO”,这里可以设置为“南昌SEO 网站排名优化”,那么在前台分类页的<title>标签中将使用后者而不会显示前者。注:本功能需要add_filter(wp_title)支持。</span> </td> </tr> <?php }
这段代码的功效就是在后台编辑某个分类的时候,在其下方增加一个文本框input[type=text],用以填写自己的分类标题。你可以发现,其中使用到了get_option( "category_{$cat_id}_meta")
,这个就是问题的关键,即将cat_meta存储在_options表中,而没有自己修改数据表结构。
接下来实现点击提交更新时,把数据写进数据库:
add_action ( 'edited_category', 'save_extra_category_fileds'); function save_extra_category_fileds( $term_id ) { ??? if ( isset( $_POST['cat_meta'] ) ) { ??????? $cat_id = $term_id; ??????? $cat_meta = get_option( "category_{$cat_id}_meta"); ??????? $cat_keys = array_keys($_POST['cat_meta']); ??????? foreach($cat_keys as $key){ ??????????? if (isset($_POST['cat_meta'][$key])){ ??????????????? $cat_meta[$key] = $_POST['cat_meta'][$key]; ??????????? } ??????? } ??????? //save the option array ??????? update_option( "category_{$cat_id}_meta", $cat_meta ); ??? } }
这样一来,我们就可以直接将提交过来的cat_meta写入options表中,其中一个分类ID,对应一条option记录。我们知道,在wordpress中,meta可以直接存储array数据类型。
最后,我们写一个调用函数,以帮助更好的使用某一个category的meta信息:
function get_category_meta($cat_id,$meta_key = false){ ??? $cat_meta = get_option( "category_{$cat_id}_meta"); ??? if(!$meta_key)return $cat_meta; ??? elseif(!isset($cat_meta[$meta_key]) || empty($cat_meta[$meta_key]))return false; ??? else return $cat_meta[$meta_key]; }
这样,就可以使用get_category_meta函数来调用某个分类的meta信息了。你就可以在主题中自由的为category增加新字段。不过需要提醒的是,我这里实现的是SEO title的功能,还需要另外一个插件支持,并不适用于你,你要学习的是如何利用本文的思路开发自己的category meta。