WordPress查询-按日期排序和按类别替换
我有一个名为“services”的自定义post类型和一个名为“location”的自定义分类法。每个职位被归类为“位置A”或“位置B” 我需要从“服务”帖子类型查询所有帖子,并按日期排序。但是,我不想简单地按日期列出,而是想按每个类别交替发布帖子,如下所示:WordPress查询-按日期排序和按类别替换,wordpress,Wordpress,我有一个名为“services”的自定义post类型和一个名为“location”的自定义分类法。每个职位被归类为“位置A”或“位置B” 我需要从“服务”帖子类型查询所有帖子,并按日期排序。但是,我不想简单地按日期列出,而是想按每个类别交替发布帖子,如下所示: “地点A”的最新帖子 来自“位置B”的最新帖子 “地点A”的第二篇最新帖子 “位置B”的第二篇最新帖子 “地点A”的第三篇最新帖子 “位置B”的第三篇最新帖子 等等 是否可以修改以下查询以实现此目的?或者我必须做一些高级的数据库连接/合并
补充说明:
- 在每个类别中不会有偶数个帖子,所以我需要查询来继续列出位置A中的帖子,一旦位置B中的帖子用完,反之亦然李>
- 如果一篇文章被分为两个类别,会发生什么?我不想让它表现出来 两次李>
- 自定义分类法“位置”由几个不同的帖子类型共享。但我一次只想查询一个帖子类型
- 我需要保留的能力,使某些职位粘性
这可能吗?非常感谢。请检查代码是否适合您。对不起,代码太长了
<?php
$a1 = get_posts(array(
'post_type' => 'services',
'posts_per_page' => '-1',
'order_by' => 'date',
'order' => 'DESC',
'tax_query' => array(
array(
'taxonomy' => 'location',
'field' => 'slug',
'terms' => 'location-a'
)
),
'fields' => 'ids' // only get post IDs.
));
$a2 = get_posts(array(
'post_type' => 'services',
'posts_per_page' => '-1',
'order_by' => 'date',
'order' => 'DESC',
'tax_query' => array(
array(
'taxonomy' => 'location',
'field' => 'slug',
'terms' => 'location-b'
)
),
'fields' => 'ids' // only get post IDs.
));
if (count($a1) >= count($a2)) {
$count = count($a1);
} else {
$count = count($a2);
}
$newArray = array();
for ($i = 0; $i < $count; $i++) {
$newArray[] = $a1[$i];
$newArray[] = $a2[$i];
}
$wp_query = new WP_Query(array(
'post_type' => 'product',
'post__in' => $newArray,
'orderby' => 'post__in'
));
if ($wp_query -> have_posts()):
while ($wp_query -> have_posts()):
the_post();
echo get_the_title() . '<br>';
endwhile;
endif;
?>
这可以在一个查询中通过适当的排序完成:-)。只是一个提示,千万不要使用query\u posts
。这里要使用的正确函数是WP\u Query
或get\u posts
@Pieter Goosen Thanx。我会记住你的建议。你能发布一个好的解决方案吗?它将在未来帮助我们所有人。我已经按照Pieter的建议制作了chnegs。如果今晚有时间,我会看一看:-)我认为这是一个值得回答的问题。感谢@Pieter Goosen thanx提出的解决方案,我觉得它确实不错。但是我会测试它,让你知道我已经测试并重新测试了我的代码,它是有效的。我认为你的价值观在某个地方犯了错误。我现在已经把我的答案移到了WPSE,因为它会更有用。嗯,也许我已经这样做了。如果你得到了正确的结果,我一定是弄错了。我将使用您的代码重新测试并仔细查看。看起来你已经删除了你的答案,但是如果我能够让你的代码正常工作,我想把它标记为正确的,因为它更精简。对于任何感兴趣的人来说,@PieterGoosen code有效,并且比下面的答案更有效,尽管这个答案也是正确的。您可以在此处找到Pieter的代码:
<?php
$a1 = get_posts(array(
'post_type' => 'services',
'posts_per_page' => '-1',
'order_by' => 'date',
'order' => 'DESC',
'tax_query' => array(
array(
'taxonomy' => 'location',
'field' => 'slug',
'terms' => 'location-a'
)
),
'fields' => 'ids' // only get post IDs.
));
$a2 = get_posts(array(
'post_type' => 'services',
'posts_per_page' => '-1',
'order_by' => 'date',
'order' => 'DESC',
'tax_query' => array(
array(
'taxonomy' => 'location',
'field' => 'slug',
'terms' => 'location-b'
)
),
'fields' => 'ids' // only get post IDs.
));
if (count($a1) >= count($a2)) {
$count = count($a1);
} else {
$count = count($a2);
}
$newArray = array();
for ($i = 0; $i < $count; $i++) {
$newArray[] = $a1[$i];
$newArray[] = $a2[$i];
}
$wp_query = new WP_Query(array(
'post_type' => 'product',
'post__in' => $newArray,
'orderby' => 'post__in'
));
if ($wp_query -> have_posts()):
while ($wp_query -> have_posts()):
the_post();
echo get_the_title() . '<br>';
endwhile;
endif;
?>