我正在使用的客户端有数千篇文章和媒体(音频/视频)文件。在WordPress上,所有这些都是由作者ID 1发布的,我们将其命名为STAFF。
实际上,所有内容都是由不同的人和来源创建的,当然不是由工作人员创建的。
为了保留这些信息(创建内容的人或源所在地),我使用了一种称为“源”的非层次自定义分类法。如果源恰好是一个机构名称,我会按机构名称标记内容,如下所示。
示例:
来源:CNN来源:华盛顿邮报
如果来源恰好是个人,我会在名字前面加上前缀“by”。
示例:
资料来源:安德森·库珀资料来源:乔恩·斯图尔特
当然,内容已经相应地进行了标记和分类。
现在的问题是,如何有效地找出XYZ类中排名前5位的来源是谁?
我认为这不能通过使用wp\\u query args来实现-通过点击高级税务查询部分,因为wp\\u query args最终只返回帖子。在这里,我们要求条件作为回报。
一种可能的方法如下
以XYX类别为例
逐一浏览所有XYX分类的帖子,尤其要注意这些帖子中的源数据,在浏览的同时,将这些帖子中遇到的每个源术语id转储到一个临时表中。(为此,您将使用wp\\u terms、wp\\u term\\u关系和wp\\u term\\u分类法,以及您创建的mySQL表)
浏览完该类别中的所有帖子后,您最终将注意力转移到临时表上
并在该表上获得摘要,在分组之后获得(源)术语计数,最后获得前5名。
但是把所有这些都放在一份声明中?那还不是我喜欢的。
SO网友:Average Joe
感谢wp黑客列表中关于这个问题的一些线索,以及一些Google搜索,以下是我问题的答案
$sql = "SELECT count(*) as count,terms2.name as tag FROM wp_posts as p1
LEFT JOIN wp_term_relationships as r1 ON p1.ID = r1.object_ID
LEFT JOIN wp_term_taxonomy as t1 ON r1.term_taxonomy_id = t1.term_taxonomy_id
LEFT JOIN wp_terms as terms1 ON t1.term_id = terms1.term_id,
wp_posts as p2
LEFT JOIN wp_term_relationships as r2 ON p2.ID = r2.object_ID
LEFT JOIN wp_term_taxonomy as t2 ON r2.term_taxonomy_id =t2.term_taxonomy_id
LEFT JOIN wp_terms as terms2 ON t2.term_id = terms2.term_id
WHERE
t1.taxonomy = \'category\' AND p1.post_status = \'publish\' AND terms1.name = \'YOUR CATEGORY NAME HERE\'
AND
t2.taxonomy = \'THAT OTHER CUSTOM TAXONOMY HERE - IN MY CASE THAT IS TO BE SOURCE\' AND p2.post_status = \'publish\'
AND p1.ID = p2.ID
GROUP BY tag
ORDER BY count DESC limit 5
";
global $wpdb;
$terms = $wpdb->get_results($sql,ARRAY_A);
foreach ($terms as $term):
extract($term);
echo "$tag,";
endforeach;
当我将WHERE to be调整为
WHERE t1.taxonomy = \'category\' AND p1.post_status = \'publish\' AND
terms1.name = \'DESIRED CATEGORY NAME HERE\' AND t2.taxonomy = \'Source\'
AND p2.post_status = \'publish\'
我不建议在高流量站点中使用SQL,但要使用一些临时缓存,为什么不呢?