WooCommerce pre_get_posts

WooCommerce pre_get_posts

所以我之前在我的 functions.php 中使用过 pre_get_posts,它就像一个魅力,但出于某种原因,我无法弄清楚为什么它不适用于 WooCommerce 页面 archive-product.php 我有。

目录结构:

.
├──woocommerce
|   ├── archive-product.php
├── functions.php

里面 functions.php:

function specific_category( $query ) {
    if ( $query->is_home() && $query->is_main_query() ) {
        $query->set( 'cat', '7815' );
    }
}
add_action( 'pre_get_posts', 'specific_category' );

里面 archive-product.php:

var_dump($wp_query); //this should be the main query variable but doesn't exist.

然后我在里面试了一下 archive-product.php:

global $wp_query;

foreach($wp_query->posts as $k){
    print_r($k);
    echo "<br>";
    echo "<br>";
}

输出 posts 但 posts 与 functions.php 代码中设置的类别无关 $query->set( 'cat', '7815' );

问题:为什么我必须声明global $wp_query(它应该默认初始化),为什么post不是来自类别我选了?

在页面中时,您看到的查询是具有一页的类别,该页面基本上就是您看到的页面。它不是您希望在主页上看到的帖子列表。

如果你有一个普通的博客风格的主页并且你检查查询你可以看到 [found_posts] => 4。但尝试将 'page' 设置为主页并检查您的查询。您可以看到 [found_posts] => 1 并且在您的查询中找到的一项 (post/page) 是当前一项。

您可以尝试在页面模板中使用 Wordpress WP_Query class 添加自定义查询,它也为您提供了很多选择。

此外,如果您要检查正在显示页面的主页,请考虑使用 is_front_page()

以及关于声明 $wp_query 的其他问题,很遗憾,我没有答案。