我正在尝试创建一个自定义搜索结果页面,其中Woocommerce产品结果会单独显示在博客/常规帖子中。
我的目标是将它们显示为具有不同样式的单独块。
$channels = explode('"', $string_array);
foreach($channels as &$channel) {
echo $channel.'<br>';
}
我设法在一个循环中显示产品,但我很难从post循环中排除产品。
我已尝试创建自定义循环,但这只会显示这些字词中的所有帖子,而不是搜索中返回的帖子。
我经常使用的循环是:
[Block 1] - Woocommerce results
[Block 2] - Blog / Post results
但我相信这并不适合我的需要。
如果有更好的解决方法来分离这些,我绝对希望听到更多。
答案 0 :(得分:1)
您遇到的问题是您有一个主查询,您实际上想要执行两个查询。你当然可以修改主要查询以包含两种帖子类型,但是你最终会得到两个帖子类型的随机数,而你实际上想要填充两列。
如果您将主查询修改为仅返回其中一列,则最终会出现运行其他查询以获取其余帖子的情况。我认为您应该能够使用posts_join
和posts_where
过滤器,但我不确定posts_search
。您可以使用WP_Query
或get_posts
来最终执行您需要的两个查询。
<?php
// Since we are searching, we probably should get the search keyword
$search = get_query_var('s');
// Since we want to be able to navigate, we probably should figure out on which page we are
$paged = get_query_var('paged');
// Anything else we want to do in search queries we should be able to do in
// a posts_join or posts_where filter by checking if is_search() is true
// With that out of the way, we can construct our queries
$query_posts_page = new WP_Query([
's' => $search,
'paged' => $paged,
'post_type' => ['post', 'page']
]);
$query_woocommerce = new WP_Query([
's' => $search,
'paged' => $paged,
'post_type' => 'product'
]);
?>
<div class="col">
<?php
if ( $query_posts_page->have_posts() ) {
while ( $the_query->have_posts() ) {
$query_posts_page->the_post();
echo get_the_title();
}
/* Restore original Post Data */
wp_reset_postdata();
} else {
echo 'Nope, no more data';
}
?>
</div>
<div class="col">
<?php
if ( $query_woocommerce->have_posts() ) {
while ( $query_woocommerce->have_posts() ) {
$query_posts_page->the_post();
echo get_the_title();
}
/* Restore original Post Data */
wp_reset_postdata();
} else {
echo 'Nope, no more data';
}
?>
</div>
然而还有另一个问题。考虑到我们正在运行两个自定义查询而不是主查询,我们无法自动生成分页。此外,我们不太可能拥有相同数量的正常页面/帖子和产品。
我们可以使用max_num_pages
找出每个循环的最大页数。您可以使用它自己生成一些东西。
<?php
$maximum_page = max($query_posts_page->max_num_pages, $query_woocommerce->max_num_pages);
for( $i = 1; $i < $maximum_page; $i++) {
echo "{$i} ";
}