恐怕orderby
分类术语后计数不可能通过WP_Query
. See this answer. 因此,这里我为您编写了一个基于SQL的函数。它会根据帖子数量对你的帖子进行排序。
function the_dramatist_order_posts_by_tag_count( $args = \'\' ) {
global $wpdb;
$param = empty($args) ? \'post_tag\' : $args;
$sql = $wpdb->prepare("SELECT posts.*, terms.name AS tag, count
FROM {$wpdb->posts} AS posts
LEFT JOIN {$wpdb->term_relationships} AS t_rel
ON (t_rel.object_id = posts.ID)
LEFT JOIN {$wpdb->term_taxonomy} AS t_tax
ON (t_rel.term_taxonomy_id = t_tax.term_taxonomy_id)
LEFT JOIN {$wpdb->terms} AS terms
ON (terms.term_id = t_tax.term_id)
WHERE taxonomy LIKE \'%s\'
ORDER BY t_tax.count DESC, terms.name",
array( $param )
);
return $wpdb->get_results($sql);
}
它将返回posts表中的所有数据
post_tag
术语名称和此术语后计数。但是它有一个简单的限制,那就是如果你在多篇文章中有一个标签,那么每一篇文章都会出现多次
post_tag
它所附加的术语。您可以使用
GROUP BY posts.ID
删除重复的帖子,但它不会给你所有的条款和条款计数。因此
GROUP BY posts.ID
功能如下所示-
function the_dramatist_order_posts_by_tag_count( $args = \'\' ) {
global $wpdb;
$param = empty($args) ? \'post_tag\' : $args;
$sql = $wpdb->prepare("SELECT posts.*, terms.name AS tag, count
FROM {$wpdb->posts} AS posts
LEFT JOIN {$wpdb->term_relationships} AS t_rel
ON (t_rel.object_id = posts.ID)
LEFT JOIN {$wpdb->term_taxonomy} AS t_tax
ON (t_rel.term_taxonomy_id = t_tax.term_taxonomy_id)
LEFT JOIN {$wpdb->terms} AS terms
ON (terms.term_id = t_tax.term_id)
WHERE taxonomy LIKE \'%s\'
GROUP BY posts.ID
ORDER BY t_tax.count DESC, terms.name",
array( $param )
);
return $wpdb->get_results($sql);
}
使用更适合您需要的。
此功能适用于post_tag
默认情况下的分类。如果要将其用于其他分类法,只需将其作为参数传递,如the_dramatist_order_posts_by_tag_count( \'category\' )
你最好做一个print_r
在将此函数用于生产之前,了解其数据结构。
希望这有帮助。