WordPress调用某个分类关联的标签或者标签关联的分类

对于 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. 
    
  12. 			$wpdb->posts as p2
  13. 			LEFT JOIN $wpdb->term_relationships as r2 ON p2.ID = r2.object_ID
  14. 			LEFT JOIN $wpdb->term_taxonomy as t2 ON r2.term_taxonomy_id = t2.term_taxonomy_id
  15. 			LEFT JOIN $wpdb->terms as terms2 ON t2.term_id = terms2.term_id
  16. 		WHERE
  17. 			t1.taxonomy = 'category' AND p1.post_status = 'publish' AND terms1.term_id IN (".$args['categories'].") AND
  18. 			t2.taxonomy = 'post_tag' AND p2.post_status = 'publish'
  19. 			AND p1.ID = p2.ID
  20. 		ORDER by tag_name
  21. 	");
  22. 	$count = 0;
  23. 
    
  24. 	if($tags) {
  25. 	  foreach ($tags as $tag) {
  26. 	    $mytag[$count] = get_term_by('id', $tag->tag_id, 'post_tag');
  27. 	    $count++;
  28. 	  }
  29. 	}
  30. 	else {
  31. 	  $mytag = NULL;
  32. 	}
  33. 
    
  34. 	return $mytag;
  35. }

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

  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;

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

获取某个标签关联的分类

反过来,我们可能会有这样的需求,既然可以获取某个分类的关联标签,那我能获取某个标签的关联分类吗?答案是可以的,将上面的代码稍微改一下就可以了,在当前主题的 functions.php 文件中添加以下函数代码:

  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. 
    
  23.     if($categories) {
  24.       foreach ($categories as $category) {
  25.         $mycategory[$count] = get_term_by('id', $category->cat_id, 'category');
  26.         $count++;
  27.       }
  28.     }
  29.     else {
  30.       $mycategory = NULL;
  31.     }
  32. 
    
  33.     return $mycategory;
  34. }

调用范例:添加多个标签 ID 就调用多个标签的关联的分类

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

原创文章,作者:DavidWu,如若转载,请注明出处:https://www.davidwu.net/archives/84470

WordPress安全防护插件
服务项目 服务内容 收费标准(元)
主题/插件汉化 汉化团队WordPress主题/插件,翻译率95% (以标的主题/插件的句子数量为准)
服务器环境配置 基于您现有服务器,搭建配置网站运行环境,结合我们多年来实战经验,可完美支持WordPress等PHP程序运行,并配置伪静态规则、优化目录权限等问题。服务器我们强烈推荐使用Linux系统。 100元/次
网站托管 若贵站目前尚无技术人员,无法完成服务器环境配置,可选择我们的网站托管服务,直接交付正常运行的WordPress站点,并且无需担心服务器的后续维护工作,一切都由我们来帮您完成。 标配套餐:1000元/年/站点 高配套餐:联系客服获取
网站加速优化 从服务器后端配置优化到WordPress数据库缓存、前端页面缓存、JS和CSS压缩合并,全方位优化网站加载速度,实现秒开。(此服务仅针对(云)服务器/VPS) 500元/次(仅站内优化200元/次)
主题配置 本站所有主题均支持,可快速实现,若有任何问题可以咨询客服解决,若您希望我们提供配置服务,可选购此服务。 英文主题安装 60元/次 汉化主题安装 30元/次
HTTPS配置 HTTPS已经不断普及,并且有着更高的安全性以及SEO上的优待。该服务收取的为服务费,SSL证书产生的费用请自行承担。 100元/次
网站搬家 迁移网站所有文件和数据库信息、网站相关配置的调整、以及迁移中的疑难问题故障排除。 标准收费:500元/次 若网站数据量大,需协商
网站运维 提供整站的运维服务,保证网站正常运行。包含:网站故障定位及排除、网站数据备份和恢复、网站攻击及木马等问题的处理等 标准收费:2000元/年 IP 5000以上需协商

发表评论

电子邮件地址不会被公开。 必填项已用*标注

51建站客服微信二维码
点击这里购买