填写您的邮件地址,订阅我们的精彩内容:

为WordPress分类添加meta自定义字段

今天在开发一个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 网站排名优化”,那么在前台分类页的&lt;title&gt;标签中将使用后者而不会显示前者。注:本功能需要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。

下面我简单说几句