Поддержка Проблемы и решения Ajax подгрузка страниц, is_home и pre_get_posts

  • Я сделал для главной страницы сайта подгрузку новостей с помощью AJAX, новости подгружаются но есть проблема: не срабатывают фильтры которые применяются для вывода новостей на главную страницу.

    Немного кода чтобы объяснить:

    <?php
    // Этим хуком я убираю с главной страницы новости
    // из категорий cat1 и cat2
    add_action('pre_get_posts', function($query) {
    	// $query->is_home() && $query->is_main_query()
    	// На главной эти 2 метода возвращают true,
    	// но когда я выполняю запрос через ajax то оба
    	// метода возвращают false и приходят 
    	// новости содержащиеся в категорях cat1 и cat2
    	if($query->is_home()  && $query->is_main_query()) {
    		$tax_query = array(
    			array(
    				'taxonomy' => 'category',
    				'field'    => 'slug',
    				'terms'    => 'cat1,cat2',
    				'operator' => 'NOT IN',
    			),
    		);
    		$query->tax_query->queries[] = $tax_query;
    		$query->query_vars['tax_query'] = $query->tax_query->queries;
    	}
    });
    

    При запросе через AJAX:

    <?php
    // Тут и начинается проблема
    $loop = new WP_Query(array(
    	'post_type'      => 'post',
    	'posts_per_page' => $_POST['ppp'],
    	'post_status'    => 'publish',
    	'offset'         => $_POST['offset']
    ));
    // По тому что:
    // $loop->is_home() == false
    // $loop->is_main_query() == false
    

    Как мне указать wordpress-у что запрос этот является главным?

    • Тема изменена 3 года/лет назад пользователем  uginroot.
    • Тема изменена 3 года/лет назад пользователем  uginroot.
Просмотр 5 ответов — с 1 по 5 (всего 5)
  • Модератор Denis Yanchevskiy

    (@denisco)

    WordPress-разработчик, wpcute.ru

    При запросе через AJAX:

    А почему просто не добавить нужные параметры к запросу?

    
    $loop = new WP_Query(array(
    	'post_type'      => 'post',
    	'posts_per_page' => $_POST['ppp'],
    	'post_status'    => 'publish',
    	'offset'         => $_POST['offset'],
            'tax_query' => array(
    			array(
    				'taxonomy' => 'category',
    				'field'    => 'slug',
    				'terms'    => 'cat1,cat2',
    				'operator' => 'NOT IN',
    			),
    		);
    ));
    

    Это один из фильтров, там их несколько и их тогда придётся собирать по всем плагинам которые установлены в этой теме. + исключаемые категории устанавливаются через настройки темы и их в любой момент могут поменять.

    Тут прибавляются новые условия к уже существующим:

    $query->tax_query->queries[] = $tax_query;
    $query->query_vars['tax_query'] = $query->tax_query->queries;

    Неужели нельзя сделать что-то типо
    $wp_query->is_home(true); $loop->is_main_query(true)

    Сам wordpress ведь как-то устанавливает эти параметры. Осталось только выяснить как он это делает.

    • Ответ изменён 3 года/лет назад пользователем  uginroot.
    • Ответ изменён 3 года/лет назад пользователем  uginroot.
    Модератор Denis Yanchevskiy

    (@denisco)

    WordPress-разработчик, wpcute.ru

    Тут прибавляются новые условия к уже существующим:

    Тогда, я думаю, Вам нужно копать куда-то в сторону query_posts.

    И делать что-нибудь типа:

    
    global $wp_query;
    $args = array_merge( $wp_query->query_vars, array( 'post_type' => 'product' ) );
    query_posts( $args );
    

    К сожалению не вышло, $wp_query->query_vars это пустой массив

    Вот так сработало на локальном сервере:

    global $wp_the_query; // это типо 
    $wp_the_query = $loop = new WP_Query($args);
    wp($loop);
    

    Вот кусочки кода из wordpress что-бы понять что я делаю:

    //./wp-includes/query.php:4765
    public function is_main_query() {
    	global $wp_the_query;
    	return $wp_the_query === $this;
    }
    
    //./wp-includes/functions.php:961
    function wp( $query_vars = '' ) {
    	global $wp, $wp_query, $wp_the_query;
    	$wp->main( $query_vars );
    
    	if ( !isset($wp_the_query) )
    		$wp_the_query = $wp_query;
    }
    

    Но на продакшене этот же код генерирует ошибку:

    PHP Catchable fatal error: Object of class WP_Query could not be converted to string in /public_html/wp-includes/class-wp.php on line 166

    • Ответ изменён 3 года/лет назад пользователем  uginroot.
    • Ответ изменён 3 года/лет назад пользователем  uginroot.

    В итоге сделал дополнительную проверку на то что запрос выполняется через AJAX:
    ($query->is_home() && $query->is_main_query()) || (defined('DOING_AJAX') && DOING_AJAX)

    печально…

Просмотр 5 ответов — с 1 по 5 (всего 5)
  • Тема «Ajax подгрузка страниц, is_home и pre_get_posts» закрыта для новых ответов.