Особенности функции query_posts()

При создании сайтов на WordPress для выборки постов и страниц часто приходится использовать две функции: get_posts() и query_posts(). Функции похожи — обе могут принимать одинаковые аргументы, выдают вроде бы похожий результат. Но возможности, а значит и применимость у этих функций разные. Рассмотрим эти различия и запомним некоторые нюансы их использования.

1. Самое важное отличие: при использовании функции get_posts() не создается переменная типа WP_Query. Соответственно после выполнения функции отсутствует доступ к массе информации, связанной с выбранными функцией постами, содержащейся, например, в глобальной переменной $wp_query.

2. Отсюда — два интересных следствия:

  • При использовании функции get_posts() невозможна корректировка sql-запроса постов соответствующими фильтрами, как это возможно при выполнении query_posts().
  •  Использование функции get_posts() возможно в любом месте шаблона wordpress, как внутри основного цикла, так и вне его, без искажения информации этого цикла (переменной $wp_query).

3. Еще следствие. Для использования части функций шаблона (например, the_content(), the_excerpt() требуется «синхронизация» этих  функций и  данных,  полученных с помощью get_posts(). К примеру, для отдельного поста использование функции:  setup_postdata($post) дает возможность использовать все функции шаблона как в основном цикле.

4. И еще следствие. Если функция query_posts() может «подхватить»  некоторые незаполненные аргументы из глобальной переменной $wp_query, и полученный запрос может оказаться адекватным,  то заполнять аргументы функции get_posts() требуется более тщательно. У меня был случай, когда понадеявшись на некоторые информационные источники, не заполнял, например, аргумент ‘post_type’  и долго разбирался, почему функция get_posts() возвращает пустой результат.

5. А теперь более подробно о функции get_query(). Создать новую переменную, со всеми возможностями использования запросов,  не изменяющую $wp_query, можно с помощью конструкции:

$myquery = new WP_Query( $args );

Далее содержимое переменной $myquery можно использовать так же, как и в основном цикле wordpress, только ссылаясь на  компоненты этой переменной:

if ($myquery->have_posts()) :while ($myquery->have_posts()) : $myquery->the_post();

….

6. Замена же переменной $wp_query  производится использованием функции без присвоения ее результатов какой-либо переменной. Просто:

query_posts();

…..

Только в этом случае ваши посты будут, например, разбиты правильным плагином-пажинатором на соответствующие, правильно сформированные страницы.

7. И напоследок некоторые мелочи, по которым во множестве источников встречаются ошибки:

  • Чтобы правильно сработала функция query_posts() при выборке записей из определенной через ID категории, для ввода ID  надо  использовать аргумент ‘cat’, а не ‘category’.
  • Для того, чтобы полностью уйти при выборке постов от влияния встроенной пажинации  wordpress, следует использовать аргумент ‘showposts’, задающий необходимое количество постов.
  • При выборке только опубликованных постов в аргументе ‘post_status’ следует использовать параметр ‘publish’, а не ‘published’.

Надеюсь, эти заметки позволят вам сэкономить массу времени.

 

 

 

***

Хотите обсудить? Оставьте комментарий