WordPress как на ладони
Недорогой хостинг для сайтов на WordPress: wordpress.jino.ru

is_main_query() WP 3.3

Проверяет в главном ли цикле WordPress выполняется действие. Условный тег.

Функцию нужно использовать только внутри циклов, так как тег предназначен для определения главного цикла WordPress.

✈ 1 раз = 0.000011с = очень быстро | 50000 раз = 0.01с = скорость света | PHP 7.0.14, WP 4.7

Хуков нет.

Возвращает

true или false.

Использование

if( is_main_query() ){ ... };

Примеры

#1. Выполним код, только если это главный цикл:

if( is_main_query() ){
	 // здесь код который нужно выполнить.
}

#2. Как исключить категорию из основного цикла

Альтернативный пример, показывающий как изменить только основной цикл и исключить из него категорию 5. Разумеется исключать категорию 5 будем, только в том случае, если в запросе не указан параметр cat (напрямую не указана категория). Для этого мы будем использовать фильтр (хук) pre_get_posts:

add_action( 'pre_get_posts', 'foo_modify_query_exclude_category' );
function foo_modify_query_exclude_category( $query ) {
	if ( $query->is_main_query() && ! $query->get( 'cat' ) )
		$query->set( 'cat', '-5' );
}

Код is_main_query: wp-includes/query.php VER 5.0.1

<?php
function is_main_query() {
	if ( 'pre_get_posts' === current_filter() ) {
		$message = sprintf(
			/* translators: 1: pre_get_posts 2: WP_Query->is_main_query() 3: is_main_query() 4: link to codex is_main_query() page. */
			__( 'In %1$s, use the %2$s method, not the %3$s function. See %4$s.' ),
			'<code>pre_get_posts</code>',
			'<code>WP_Query->is_main_query()</code>',
			'<code>is_main_query()</code>',
			__( 'https://codex.wordpress.org/Function_Reference/is_main_query' )
		);
		_doing_it_wrong( __FUNCTION__, $message, '3.7.0' );
	}

	global $wp_query;
	return $wp_query->is_main_query();
}

Cвязанные функции

Из метки: Условные теги (все)

Еще из раздела: Запросы

5 комментов
  • Денис

    Добрый день!
    Использовал алтернативный метод

    function prefix_pre_get_posts($query) {
    	if ($query->is_main_query()){
    		$query->set('orderby', 'comment_count');
    	}
    	 return $query;
    }
    add_action('pre_get_posts', 'prefix_pre_get_posts');

    Почему сортировка срабатывает везде, где только можно? даже на список страниц в админке влияет...

    Ответить5 лет назад #
    • Kama7144

      Используйте условные тег. Например так, для всего кроме админки:

      function prefix_pre_get_posts($query) {
      	// выходим если это админ-панель
      	if( is_admin() )
      		return;
      
      	if ($query->is_main_query()){
      		$query->set('orderby', 'comment_count');
      	}
      	 return $query;
      }
      add_action('pre_get_posts', 'prefix_pre_get_posts');

      Еще пример, если нужно чтобы сработало только для главной страницы блога:

      if( ! is_front_page() )
      		return;

      П.С. Вы используете хук, который срабатывает всякий раз, когда вызывается WP_query, а на его основе строятся все запросы в WP связанные с записями.

      Ответить5 лет назад #
      • Денис

        Большое спасибо за столь быстрый ответ!
        А возможно ли сделать чтоб этот хук срабатывал только для записей типа 'post'?

        Ведь сортируются и страницы...

        кроме того я использую сортировку по произвольному полю:

        $query->set('orderby', 'meta_value');
        $query->set('meta_key', 'vk_comments_number');
        $query->set('order','ASC');

        У страниц этого поля вообще нет, поэтому при переходе на страницу получаю 404ю

        Ответить5 лет назад #
  • Олег

    Что такое главный цикл WordPress?
    Допустим, есть какой-то цикл.
    Как понять, он главный или нет?

    Ответить1.3 года назад #
Здравствуйте, !     Войти . Зарегистрироваться