WooCommerce pre_get_posts

#php #wordpress #woocommerce #hook-woocommerce

#php #wordpress #woocommerce #hook-woocommerce

Вопрос:

Итак, я использовал pre_get_posts functions.php это раньше, и это работает как шарм, но по какой-то причине я не могу понять, почему это не работает для моей страницы WooCommerce archive-product.php .

Структура каталогов:

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

Внутри functions.php :

 function specific_category( $query ) {
    if ( $query->is_home() amp;amp; $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>";
}
 

Который выводит сообщения, но сообщения не относятся к категории, установленной в functions.php коде $query->set( 'cat', '7815' );

Вопрос: Почему я должен объявлять global $wp_query (по умолчанию он должен быть инициализирован) и почему сообщение не из выбранной мной категории?

Ответ №1:

Когда вы находитесь на странице, запрос, который вы видите, — это категория с одной страницей, которая в основном является страницей, которую вы видите. Это не список сообщений, который вы ожидали увидеть на главной странице.

если у вас есть обычная домашняя страница в стиле блога, и вы проверяете запрос, который вы можете увидеть [found_posts] => 4 . но попробуйте установить «страницу» в качестве домашней страницы и проверьте свой запрос. Вы можете видеть [found_posts] => 1 , что один найденный элемент (сообщение / страница) в вашем запросе является текущим.

Вы можете попробовать добавить пользовательский запрос с WP_Query классом WordPress в свой шаблон страницы, и это тоже даст вам много возможностей.

Кроме того, если вы пытаетесь проверить домашнюю страницу, на которой отображается страница, рассмотрите возможность использования is_front_page() .

и на ваш другой вопрос об объявлении $wp_query , к сожалению, у меня нет ответа.