分类与标签|WordPress获取某个分类所关联的标签

分类与标签|WordPress获取某个分类所关联的标签

常用属性:

分类几乎是所有wordpress站长都会用到的一个功能,可以让自己的网站文章归整好,更有条理,分类一般都是估计几个或者十几甚至是几十上百个,基本都是设好然后在写文章的时候选择的;标签基本上都是针对某篇文章临时加上去的。这两种都是有利于搜索和访客浏览的。


在使用WordPress做二次开发的过程中,遇到这样的一个需求,如何获取某个分类下属的标签?那什么是某个分类的下属标签呢,我们可以这么理解,如下图:

分类和标签

我在WordPress后台某篇文章的编辑页面,给这篇文章选择了分类:WordPress,接着同时选择了标签:php、主题制作,这时分类(WordPress)就与标签(php、主题制作)建立了关联,利用这种关联我们实现很多种需求,最典型的是细化WordPress文章分类功能,在子分类无法达到我们的需求时,可以使用标签来细化。我只需要提供WordPress分类的id,就可以得到它关联的标签:php、主题制作。

调用函数

我们可以先在主题目录的下的functions.php添加以下函数:

  1. function ludou_get_category_tags($args) {
  2.     global $wpdb;
  3.     $tags = $wpdb->get_results
  4.     (
  5.         SELECT DISTINCT terms2.term_id as tag_id, terms2.name as tag_name
  6.         FROM
  7.             $wpdb->posts as p1
  8.             LEFT JOIN $wpdb->term_relationships as r1 ON p1.ID = r1.object_ID
  9.             LEFT JOIN $wpdb->term_taxonomy as t1 ON r1.term_taxonomy_id = t1.term_taxonomy_id
  10.             LEFT JOIN $wpdb->terms as terms1 ON t1.term_id = terms1.term_id,
  11.             $wpdb->posts as p2
  12.             LEFT JOIN $wpdb->term_relationships as r2 ON p2.ID = r2.object_ID
  13.             LEFT JOIN $wpdb->term_taxonomy as t2 ON r2.term_taxonomy_id = t2.term_taxonomy_id
  14.             LEFT JOIN $wpdb->terms as terms2 ON t2.term_id = terms2.term_id
  15.         WHERE
  16.             t1.taxonomy = ‘category’ AND p1.post_status = ‘publish’ AND terms1.term_id IN (“.$args[‘categories’].“) AND
  17.             t2.taxonomy = ‘post_tag’ AND p2.post_status = ‘publish’
  18.             AND p1.ID = p2.ID
  19.         ORDER by tag_name
  20.     “);
  21.     $count = 0;
  22.     if($tags) {
  23.       foreach ($tags as $tag) {
  24.         $mytag[$count] = get_term_by(‘id’, $tag->tag_id, ‘post_tag’);
  25.         $count++;
  26.       }
  27.     }
  28.     else {
  29.       $mytag = NULL;
  30.     }
  31.     return $mytag;
  32. }

函数用法

然后在其他主题文件中,我们可以调用某个分类或某几个分类关联的标签:

  1. // 12,13是分类ID,多个用半角逗号隔开
  2. $args = array( ‘categories’ => ‘12,13‘);
  3. // 调用上面定义的函数,来获取ID为12,13的分类的关联标签
  4. $tags = ludou_get_category_tags($args);
  5. // 输出我们获取到的关联标签,以列表形式打印
  6. $content .= “<ul>”;
  7. if(!empty($tags)) {
  8.   foreach ($tags as $tag) {
  9.     $content .= “<li><a href=”“.get_tag_link($tag->term_id).”“>”.$tag->name.“</a></li>”;
  10.   }
  11. }
  12. $content .= “</ul>”;
  13. echo $content;

好了,基本用法就这些,具体其他用法你可以自由地进行扩展。

获取某个标签关联的分类

反过来,我们可能会有这样的需求,既然可以获取某个分类的关联标签,那我能获取某个标签的关联分类吗?答案是可以的,将上面的代码稍微改一下就可以了:

  1. function ludou_get_tag_categories($args) {
  2.     global $wpdb;
  3.     $categories = $wpdb->get_results
  4.     (
  5.         SELECT DISTINCT terms1.term_id as cat_id
  6.         FROM
  7.             $wpdb->posts as p1
  8.             LEFT JOIN $wpdb->term_relationships as r1 ON p1.ID = r1.object_ID
  9.             LEFT JOIN $wpdb->term_taxonomy as t1 ON r1.term_taxonomy_id = t1.term_taxonomy_id
  10.             LEFT JOIN $wpdb->terms as terms1 ON t1.term_id = terms1.term_id,
  11.             $wpdb->posts as p2
  12.             LEFT JOIN $wpdb->term_relationships as r2 ON p2.ID = r2.object_ID
  13.             LEFT JOIN $wpdb->term_taxonomy as t2 ON r2.term_taxonomy_id = t2.term_taxonomy_id
  14.             LEFT JOIN $wpdb->terms as terms2 ON t2.term_id = terms2.term_id
  15.         WHERE
  16.             t1.taxonomy = ‘category’ AND p1.post_status = ‘publish’ AND terms2.term_id IN (“.$args[‘tags’].“) AND
  17.             t2.taxonomy = ‘post_tag’ AND p2.post_status = ‘publish’
  18.             AND p1.ID = p2.ID
  19.         ORDER by cat_id
  20.     “);
  21.     $count = 0;
  22.     if($categories) {
  23.       foreach ($categories as $category) {
  24.         $mycategory[$count] = get_term_by(‘id’, $category->cat_id, ‘category’);
  25.         $count++;
  26.       }
  27.     }
  28.     else {
  29.       $mycategory = NULL;
  30.     }
  31.     return $mycategory;
  32. }

调用范例:

  1. // 12,13是标签ID,多个用半角逗号隔开
  2. $args = array( ‘tags’ => ‘12,13‘);
  3. // 调用上面定义的函数,来获取ID为12,13的标签的关联分类
  4. $categories = ludou_get_tag_categories($args);
  5. // 输出我们获取到的关联分类,以列表形式打印
  6. $content .= “<ul>”;
  7. if(!empty($categories)) {
  8.   foreach ($categories as $category) {
  9.     $content .= “<li><a href=”“.get_category_link( $category->term_id ).”“>”.$category->name.“</a></li>”;
  10.   }
  11. }
  12. $content .= “</ul>”;
  13. echo $content;

参考文档
http://wordpress.org/support/topic/get-tags-specific-to-category


写在后面:

代码略多,但是也不是乱七八糟的代码,条理性还是挺好的。

本文参考了 ludou.org    ,若有任何来源问题,请联系QQ:1516677079 及时更正。

最有意思的设计站点


最好的UI素材库

我们极力推荐: