问题在于post_author
岗位类型,主要post
涉及post_author
: 每一个post
有一个post_author
.
我需要有一个所有帖子作者的列表,按作者的帖子数量降序排列,然后按作者的姓名排序,即post_title
的post_author
岗位类型。
SQL中的解决方案
SELECT a.ID, a.post_title FROM wp_posts a
WHERE a.post_type = \'author_cpt\'
AND a.post_status = \'publish\'
ORDER BY (
SELECT count(DISTINCT p.ID) AS post_count FROM wp_posts p
LEFT JOIN wp_postmeta pm ON (p.ID = pm.post_id)
WHERE pm.meta_key = \'author_id\'
AND pm.meta_value = a.ID
AND p.post_type = \'post\'
AND p.post_status = \'publish\'
) DESC, a.post_title ASC;
问题是,有没有办法在WP_Query
?
当前解决方案
我将解决方案应用于两个后续步骤:1) 获取所有帖子作者
$queryArgs = [
\'post_type\' => \'author_cpt\',
\'post_status\' => \'publish\',
\'posts_per_page\' => -1,
\'orderby\'=> \'title\',
\'order\' => \'ASC\',
];
$allAuthorsQuery = new WP_Query($queryArgs);
2) 循环查询,用post count构造一个新数组,对结果数组进行排序。$orderedAuthors = [];
if ( $allAuthorsQuery->have_posts() ) {
while ( $allAuthorsQuery->have_posts() ) {
$allAuthorsQuery->the_post();
$postCount = getPostMetaCount(\'\', get_the_ID());
$orderedAuthors[] = [
\'ID\' => get_the_ID(),
\'post_content\' => get_the_excerpt(get_the_ID()),
\'post_count\' => $postCount,
];
}
}
wp_reset_query();
sortBy(\'post_count\', $orderedAuthors, \'desc\');
辅助函数/**
* Get post count by meta_key and meta_value
*/
function getPostMetaCount($key = \'\', $value = \'\', $type = \'post\', $status = \'publish\')
{
if (empty($key))
return;
if (empty($value))
return;
$query = new WP_Query([
\'post_type\' => $type,
\'post_status\' => $status,
\'meta_query\' => [
[
\'key\' => $key,
\'value\' => $value,
]
],
]);
return $query->found_posts;
}
/**
* Sort an associative array by $field
*/
function sortBy($field, &$array, $direction = \'asc\')
{
usort($array, create_function(\'$a, $b\', \'
$a = $a["\' . $field . \'"];
$b = $b["\' . $field . \'"];
if ($a == $b) return 0;
$direction = strtolower(trim($direction));
return ($a \' . ($direction == \'desc\' ? \'>\' : \'<\') .\' $b) ? -1 : 1;
\'));
return true;
}
当前解决方案的问题是,在数组中应用排序后,我丢失了按标题排序的顺序。总体目标是将订单过程转换为SQL或等效的WP\\U查询,以便不需要像上述解决方案中引入的那样对数组进行排序。
谢谢