Использование WP_Query в WordPress. #3 Отсортируем посты по количеству комментариев. Создание экземпляра класса и запросов для сообщений

Если вы следили за нашей серией статей, то уже наверняка знаете, как устроен класс WP_Query , и как его можно использовать для создания собственных запросов. Чтобы определять, какие именно данные вы хотите извлечь из базы данных, нужно ознакомиться с аргументами этого класса и научиться правильно их применять.

Сегодня мы познакомимся с аргументами для произвольных полей (custom fields ), но сначала вспомним, как использовать аргументы в WP_Query .

Вспоминаем, как работают аргументы в WP_Query

Когда вы используете WP_Query в темах оформления или плагинах, приходится включать в код четыре основных элемента:

  • Аргументы для запроса, в которых используются параметры;
  • Сам запрос;
  • Цикл;
  • Завершающий этап: сброс данных записи.

На практике это выглядит следующим образом:

have_posts()) { // начало цикла обработки данных из результатов запроса while ($query->have_posts()) { $query->the_post(); // содержимое опрашиваемой записи } } // восстановление исходных данных записи wp_reset_postdata(); ?>

Аргументы сообщают WordPress , какие данные нужно извлекать из базы данных:

$args = array(// Аргументы для вашего запроса);

Как видно, аргументы заключены в массив.

Создаем код для аргументов

Существует специальный способ задания аргументов в массиве:

$args = array("parameter1" => "value", "parameter2" => "value", "parameter3" => "value");

Нужно заключать параметры и их значения в одинарные кавычки, а также использовать => между ними. Каждый аргумент разделяется запятой. Если здесь что-то сделать неправильно, то WordPress может опросить не все указанные вами аргументы, и на экран ничего не выведется.

Параметры произвольных полей

Произвольные поля (также известные как метаданные записей ) могут использовать отдельный класс WP_Meta_Query . Поэтому для получения метаданных записи, можно использовать либо WP_Meta_Query , либо WP_Query (который все равно обращается к WP_Meta_Query ). Но если требуется сделать запрос метаданных и других элементов (вроде типа записи ), то следует использовать только WP_Query .

Основное отличие в применении этого класса и WP_Query заключается в том, что WP_Query позволяет вам создавать простые аргументы без необходимости использовать вложенные массивы.

Параметры для простого запроса произвольного поля

Основные параметры WP_Query для выполнения запросов к произвольным полям:

  • meta_key (string ): ключ произвольного поля;
  • meta_value (string
  • meta_value_num (number ): значение произвольного поля;
  • meta_compare (string ): оператор для тестирования "meta_value ". Допустимые значения: "=", "!=", ">", ">=", "<", "<=", "LIKE", "NOT LIKE", "IN", "NOT IN", "BETWEEN", "NOT BETWEEN", "NOT EXISTS", "REGEXP", "NOT REGEXP" или "RLIKE". Значение по умолчанию: "=".

Используйте эти параметры для создания простых запросов к произвольным полям. Например, чтобы вывести записи, в которых имеются произвольные поля с ключом key1 (независимо от его значения ), нужно использовать следующий аргумент:

$args = array("meta_key" => "key1");

Этот аргумент позволит получить все записи с произвольным полем с ключом key1 , независимо от значения. Для присваивания конкретного значения нужно добавить дополнительный аргумент:

$args = array("meta_key" => "key1", "meta_value" => "value1");

Такой аргумент выведет все записи с произвольным полем, у которого имеется ключ key1 со значением value1 .

Также можно извлечь все записи с произвольным полем, значение которого будет value1 , независимо от ключа. Это необходимо, когда используется несколько ключей произвольного поля с повторяющимися значениями:

$args = array("meta_value" => "value1");

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

Используем аргумент meta_compare

Вы могли заметить, что для аргумента meta_compare существует множество параметров. Давайте рассмотрим те, которые применяются чаще всего:

  • =: Равно. Это параметр по умолчанию. То есть, если вы не используете аргумент meta_compare , WP_Query будет использовать именно его;
  • !+: Не равно;
  • >: Больше чем;
  • >=: Больше или равно;
  • LIKE: Этот параметр игнорирует регистр, в котором вы вносите значение. Здесь даже можете использовать специальные символы для поиска значений;
  • NOT LIKE: Работает по тому же принципу, что и LIKE, только абсолютно противоположно;
  • IN: Используйте этот параметр с массивом в аргументе ‘value’ для поиска записей с одним или несколькими значениями в массиве;
  • BETWEEN: Используется с массивом из двух числовых значений (указанных в аргументе meta_value) для поиска записей со значением произвольного поля, находящимся между этими двумя значениями (но не равным им);
  • NOT BETWEEN: Осуществляет запрос записей со значением произвольного поля, находящимся за пределами указанного интервала из двух цифровых значений в meta_value.

При помощи аргумента meta_compare вы можете исключить ключи или значения произвольного поля. Для того чтобы извлечь все записи, за исключением тех, в значении ключа которых используется key1 , нужно использовать следующий код:

$args = array("meta_key" => "key1", "meta_compare" => "!=");

Можно использовать значение ‘NOT IN’ в аргументе meta_compare , который также может применяться со строкой из нескольких значений:

$args = array("meta_key" => "key1, key2", "meta_compare" => "NOT IN");

Этот код выполняет запрос записей, у которых нет произвольных полей со значениями key1 или key2 . Если нужно запросить записи с определенным произвольным полем, но не с другим, то можно использовать вложенный массив, о котором я вам расскажу позже.

В приведенных выше примерах используются нецифровые значения. Вы можете использовать WP_Query с произвольными полями, в которых указаны числовые значения, не только для извлечения записей с этими значениями, но и для запросов к тем постам, значение произвольных полей которых выше или ниже указанных. Для примера, такое может пригодиться в интернет-магазине, когда нужно осуществить поиск товаров дешевле или дороже указанной стоимости.

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

$args = array("meta_key" => "numkey", "meta_value" => "100", "meta_compare" => ">");

Этот запрос позволит получить все записи, значением произвольного поля которых является значение выше 100. Если нужно запросить записи со значениями от 100 и выше, то можно использовать параметр "meta_compare" => ">=" .

Также при помощи аргумента BETWEEN и массива можно находить записи, в произвольных полях которых используются значения в определенном диапазоне:

$args = array("meta_key" => "numkey", "meta_value" => array ("100", "200"), "meta_compare" => "BETWEEN");

Такой запрос позволит найти все записи со значением произвольных полей между 100 и 200.

Запросы для вложенных произвольных полей

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

Структура запроса будет следующей:

$args = array("meta_query" => array("relation" => "", // Опциональный аргумент. array(// здесь будут аргументы `meta_query`.)));

Структура аргумента "meta_query" в классе WP_Query будет такой же, как и при использовании класса WP_Meta_Query , о котором мы подробно поговорим в следующих статьях.

После выхода WordPress версии 4.1 стало можно использовать несколько уровней вложенных массивов для создания еще более сложных и точных запросов. Структура таких запросов выглядит примерно так:

$args = array("meta_query" => array("relation" => "", // Опциональный аргумент. array("relation" => "", array (// Первый набор аргументов `meta_query`.), array (// Второй набор аргументов `meta_query`.))));

Такой подход позволяет использовать различные взаимосвязи на разных уровнях в запросе. К примеру, можно создать запрос записей с одним значением в одном произвольном поле, и обоими значениями в другом произвольном поле.

В завершение

Применение класса WP_Query для создания запросов метаданных записей (или произвольных полей ) предоставляет гибкость при работе с множеством различных аргументов в сочетании с операторами.

Если в своем запросе вы хотите использовать только аргументы метаданных записей (и не комбинировать их с другими ), то можно также использовать класс WP_Meta_Query , о котором мы поговорим позже.

Перевод статьи “WP_Query Arguments: Custom Fields ” был подготовлен дружной командой проекта Сайтостроение от А до Я.

Prestashop представляет собой движок для управления интернет-магазином. В интернете можно найти множество как платных, так и бесплатных модулей Prestashop, которые помогают улучшить страницы товаров и увеличить количество переходов. В этой статье мы рассмотрим 5 лучших SEO-модулей.

Выбирает записи из базы данных по указанным критериям. На основе WP_Query работают функции get_posts() и query_posts() и все остальные запросы связанные с выбором записей из таблицы wp_posts.

Заметки по фильтрам

Можно использовать следующие фильтры для внедрения непосредственно в сам SQL запрос.

Важно: если указан параметр , то все эти хуки работать не будут!

Фильтры срабатывающие до установки запроса пагинации:
  • - изменяет SQL "WHERE"
  • posts_join - изменяет SQL "JOIN"
Фильтры срабатывающие после установки запроса пагинации:
  • - изменяет SQL "WHERE" во время пагинации
  • posts_groupby - изменяет SQL "GROUP BY"
  • posts_join_paged - изменяет SQL "JOIN" во время пагинации
  • posts_orderby - изменяет SQL "ORDER BY"
  • posts_distinct - изменяет SQL "DISTINCTROW"
  • post_limits - изменяет SQL "LIMIT"
  • posts_fields - изменяет получаемые поля таблицы
  • post_mime_type(строка/массив)

    Миме тип записи. Используется только для вложений - записей с типом "attachment".

    Этот параметр будет работать только когда параметр post_type = attachment и post_status = inherit . Т.е. MIME-тип может быть только у вложений.

    Получим только картинки любого типа

    $query = new WP_Query(array("post_mime_type" => "image", "post_type" => "attachment", "post_status" => "inherit",));

    Получим только картинки gif типа

    $query = new WP_Query(array("post_mime_type" => "image/gif", "post_type" => "attachment", "post_status" => "inherit",));

    Получим все типы вложений, кроме картинок

    $query = new WP_Query(array("post_mime_type" => array("application","text","video","audio"), "post_type" => "attachment", "post_status" => "inherit",));

    Параметры Статусов

    Получает посты с указанным статусом.

    Post_status(строка/массив)

    Статус поста.

    По умолчанию publish , а если пользователь авторизован добавляется еще и private . Если запрос запущен из админ части, добавляются еще и защищенные типы статусов: future , draft и pending . Все типы статусов:

    • publish - опубликованный пост.
    • pending - пост на модерации.
    • draft - черновик.
    • auto-draft - черновик, сохраненный самим WordPress (авто-сохранение).
    • future - запланированный пост.
    • private - личный пост.
    • inherit - ревизия или вложение.
    • trash - удаленный пост (в корзине). С версии 2.9.
    • any - все статусы, кроме статусов в параметре которых указано exclude_from_search=true . См. register_post_status() и get_post_stati() .

    По умолчанию: "publish"

    Посты по статусам

    Получим только черновики:

    $query = new WP_Query("post_status=draft");

    Получим посты с разными статусами:

    $query = new WP_Query(array("post_status" => array("pending", "draft", "future")));

    Получим все виды вложений:

    $query = new WP_Query(array("post_status" => "any", "post_type" => "attachment"));

    Параметры Даты (времени)

    Выводит посты принадлежащие определенному периоду времени.

    Year(число) 4 цифры года (2013) monthnum(число) Номер месяцы (1 - 12) w(число) Неделя в году (с 0 до 53) day(число) День месяца (1 - 31) hour(число) Час (0 - 23) minute(число) Минута (0 - 60) second(число) Секунда (0 - 60) m(число) ГодМесяц (201306) date_query(массив)

    Параметры по которым будет отстроиться запрос. Работает на основе отдельного класса: WP_Date_Query .

    Этот параметр указывается как массив, который может содержать вложенные массивы. Параметры: column , compare , relation для основного массива работают как параметры по умолчанию для вложенных массивов (если они есть).

      column - поле в базе данных для запроса. Может быть:
      post_date
      post_date_gmt
      post_modified
      post_modified_gmt
      comment_date
      comment_date_gmt
      user_registered
      По умолчанию: "post_date"

      compare - Оператор сравнения для всех вложенных массивов по умолчанию. Может быть: Может быть: = , != , > , >= , < , <= , IN , NOT IN , BETWEEN , NOT BETWEEN .
      По умолчанию: "="

      relation - оператор, если указаны несколько массивов с датами:
      AND (учитывать одновременно все указанные массивы).
      OR (если есть совпадения хотя бы с одним указанным массивом).
      По умолчанию - OR

      Параметры ниже должны использоваться во вложенных массивах. Они определяют запрос для отдельной даты.

      Также все параметры ниже, могут быть использованы в основном массиве.

      • before (строка/массив) - Дата записи "до" которой будут получены. Принимает строку которую поймет функция strtotime() : все возможные форматы . Или можно передать массив с индексами: year , month , day: array("year"=>"2015", "month"=>"5", "day"=>"28")

        after (строка/массив) - Дата записи "после" которой будут получены. Принимает строку которую поймет функция strtotime() : все возможные форматы . Или можно передать массив с индексами: year , month , day: array("year" => "2015", "month" => "5", "day" => "28")
        Относительно текущего времени сайта (не UTC).

        column (строка) - см. выше, только для конкретной даты. По умолчанию: значение верхнего массива.

        compare (строка) - см. выше, только для конкретной даты. По умолчанию "=".

        inclusive (логический) - аргументы before и after обрабатываются включительно, если true. По умолчанию: false.

      • year (число/массив) - год, например 2013
      • dayofyear (число/массив) - номер дня в году, 1-366.
      • month (число/массив) - месяц, 1-12
      • week (число/массив) - неделя, 0-53
      • day (число/массив) - день, 1-31
      • dayofweek (число/массив) - день недели, 1-7, где 1 - воскресенье
      • dayofweek_iso (число/массив) - день недели, 1-7, где 1 - понедельник
      • hour (число/массив) - час, 0-23
      • minute (число/массив) - минута, 0-60
      • second (число/массив) - секунда, 0-60

      В параметрах: year , month , week , dayofyear , day , dayofweek , dayofweek_iso , hour , minute , second можно указать несколько значений, в виде массива, если параметр compare соответствует.

    #1. Получим посты за сегодня:

    $today = getdate(); $query = new WP_Query("year=" . $today["year"] . "&monthnum=" . $today["mon"] . "&day=" . $today["mday"]);

    #2. Получим посты за последнюю неделю:

    $week = date("W"); $year = date("Y"); $query = new WP_Query("year=" . $year . "&w=" . $week);

    #3. Получим посты за 20 Декабря:

    $query = new WP_Query("monthnum=12&day=20");

    #4. Получим посты за промежуток времени с 1 марта по 15 марта 2010 года:

    // Создадим новую функцию которая добавит условие where в запрос function filter_where($where = "") { // с 1 марта по 15 марта 2010 года $where .= " AND post_date >= "2010-03-01" AND post_date < "2010-03-16""; return $where; } add_filter("posts_where", "filter_where"); $query = new WP_Query($query_string); remove_filter("posts_where", "filter_where");

    Запросы выше возвращают посты за указанный период в истории: "Посты за Х месяц, Х день". Они не могут получать посты за произвольный промежуток времени по отношению к настоящему. Поэтому запросы типа "Посты за последние 30 дней" или "Посты за последний год" не возможны в базовом варианте, для таких запросов нужно использовать фильтр "posts_where". Примеры ниже показывают как это делать.

    #5. Получим посты за последние 30 дней:

    // Создадим новую функцию которая добавит условие where в запрос function filter_where($where = "") { // за последние 30 дней $where .= " AND post_date > "" . date("Y-m-d", strtotime("-30 days")) . """; return $where; } add_filter("posts_where", "filter_where"); $query = new WP_Query($query_string); remove_filter("posts_where", "filter_where");

    #6. Получим посты за промежуток от 30 до 60 дней, до настоящего:

    // Создадим новую функцию которая добавит условие where в запрос function filter_where($where = "") { // от 30 до 60 дней $where .= " AND post_date >= "" . date("Y-m-d", strtotime("-60 days")) . """ . " AND post_date <= "" . date("Y-m-d", strtotime("-30 days")) . """; return $where; } add_filter("posts_where", "filter_where"); $query = new WP_Query($query_string); remove_filter("posts_where", "filter_where");

    Параметр "m" может быть установлен только в списке постов в админ-панели. Он полезен когда вы выбираете из выпадающего списка select где дата установлена как число YYYYmm.

    Примеры с параметром date_query

    #1. Получим посты между 9 и 17 часами:

    $args = array("date_query" => array(array("hour" => 9, "compare" => ">=",), array("hour" => 17, "compare" => "<=",), array("dayofweek" => array(2, 6), "compare" => "BETWEEN",),), "posts_per_page" =>

    #2. Получим посты за промежуток времени: 1 января по 28 февраля:

    Даты можно указывать цифрами и строками, потому что аргументы before и after обрабатываются функцией PHP strtotime() , а она понимает строки.

    $args = array("date_query" => array(array("after" => "January 1st, 2013", "before" => array("year" => 2013, "month" => 2, "day" => 28,), "inclusive" => true,),), "posts_per_page" => -1,); $query = new WP_Query($args);

    #3. Получим посты опубликованные год назад, но измененные в последний месяц:

    $args = array("date_query" => array(array("column" => "post_date_gmt", "before" => "1 year ago",), array("column" => "post_modified_gmt", "after" => "1 month ago",),), "posts_per_page" => -1,); $query = new WP_Query($args);

    #4. Получим посты за последние 2 недели, использовав строку "2 weeks ago":

    $query = new WP_Query(array("date_query" => array("after" => "2 weeks ago",),));

    #5. Получим записи за последние 2 месяца, опубликованные в будние дни:

    $query = new WP_Query(array("date_query" => array("after" => "2 months ago", array("dayofweek" => array(1, 5), "compare" => "BETWEEN",),),));

    Аргумент date_query работает и с классом WP_Comment_Query, поэтому его точно также можно использовать в функции: get_comments() .

    Параметры Отступов

    Можно установить отступ от первого поста в результатах запроса. Например, стандартно запрос возвращает 6 постов, а если в тот же запрос добавить параметр offset=1 , то будут возвращены 5 постов (первый пост из запроса будет пропущен).

    Offset(число) Сколько постов из результатов запроса пропустить.

    Пример использования

    Пропустим первый/один пост (offset=1) и вернем следующие 5:

    $query = new WP_Query("posts_per_page=5&offset=1");

    Параметры Сортировки и порядка

    Сортирует и устанавливает направление сортировки.

    Параметры сортировки не будут работать, если указать параметр fields = ids , потому что в этом случае, в запросе не будет полей по которым можно отсортировать результат.

    Order(строка)

    Направление сортировки по параметру orderby , может быть:

    • ASC - по порядку, от меньшего к большему (1, 2, 3; a, b, c).
    • DESC - в обратном порядке, от большего к меньшему (3, 2, 1; c, b, a) .
    orderby(строка)

    Поля по которым можно сортировать посты. Может быть

    • none - не сортировать, выводить как есть в БД. Равносильно сортировке по ID. С версии 2.8.
    • ID - сортировка по ID.
    • author - сортировка по ID авторов.
    • title - сортировка по заголовку.
    • name - по названию поста (ярлык, слаг поста).
    • date - сортировка по дате публикации.
    • modified - сортировка по дате изменения.
    • type - по типу поста (post_type). С версии 4.0
    • parent - сортировка по значению поля parent.
    • rand - случайный порядок.
    • RAND(x) - в случайном порядке для числовых значений. Тут "x" - это целое число.
    • comment_count - сортировка по количеству комментариев. С версии 2.9.
    • relevance - по условию поиска (параметр s). Сортировка идет в следующем порядке: 1) соответствует ли все предложение. 2) все условия поиска в заголовке записи. 3) какие-либо слова из запроса поиска в заголовке записи. 4) полное предложение найдено в контенте записи.
    • menu_order - стандартно используется для страниц и вложений. Порядковый номер указывается на странице редактирования поста.
    • meta_value - по значения произвольного поля.

      Важно: параметр meta_key так же должен быть определен. Заметка: сортировка будет алфавитной и будет не логична, если значения произвольных полей числа (будет, например, так 1, 3, 34, 4, 56, 6 и т.д., а не 1, 3, 4, 6, 34, 56).

    • meta_value_num - сортировка по произвольным полям, значения которых являются числами. С версии 2.8.
    • ключ массива из meta_query - в этом случае сортировка будет по значению произвольного поля указанного в массиве meta_query .
    • post__in - учитывает порядок указанных ID в параметре post__in . Параметр order игнорируется.
    • post_name__in - учитывает порядок указанных имен в параметре post_name__in . Параметр order игнорируется.
    • post_parent__in - учитывает порядок указанных ID в параметре post_parent__in . Параметр order игнорируется.
    orderby = array()

    С версии WordPress 4.0 в orderby можно указывать массив сочетающий в себе оба параметра: orderby и order . Сделано это для сортировки по нескольким колонкам одновременною Синтаксис такой:

    "orderby" => array("title" => "DESC", "menu_order" => "ASC")

    #1 Сортировка по заголовку

    $query = new WP_Query(array ("orderby" => "title", "order" => "DESC"));

    Отсортируем по порядку в меню, а затем по заголовку

    $query = new WP_Query(array ("orderby" => "menu_order title", "order" => "DESC"));

    #2 Выведем один случайный пост:

    $query = new WP_Query(array ("orderby" => "rand", "posts_per_page" => "1"));

    #3 Отсортируем посты по количеству комментариев:

    $query = new WP_Query(array("orderby" => "comment_count"));

    #4 Отсортируем продукты по цене (произвольное поле price):

    $query = new WP_Query(array ("post_type" => "product", "orderby" => "meta_value", "meta_key" => "price"));

    #5 Множественная сортировка

    Выведем посты отсортированные по двум полям: "title" и "menu_order" (title первостепенен):

    $query = new WP_Query(array("post_type" => "page", "orderby" => "title menu_order", "order" => "ASC"));

    #6 Множественная сортировка с использованием массива (с версии 4.0)

    Получим страницы отсортированные по заголовку (title) и номеру меню (menu_order) в разном порядке (ASC/DESC):

    $query = new WP_Query(array("orderby" => array("title" => "DESC", "menu_order" => "ASC")));

    #7 Сортировка по "meta_value" для нового типа поста (post_type)

    Выведем посты типа "my_custom_post_type" отсортированные по ключу произвольного поля "age" и отфильтрованные, чтобы показывались только посты со значением поля 3 и 4:

    $args = array("post_type" => "my_custom_post_type", "meta_key" => "age", "orderby" => "meta_value_num", "order" => "ASC", "meta_query" => array(array("key" => "age", "value" => array(3, 4), "compare" => "IN",))); $query = new WP_Query($args);

    #8 Сортировка по нескольким метаполям

    Чтобы отсортировать результат по двум разным метаполям, например, сначала по city , а затем по state , нужно указать ключи для массивов в массиве meta_query и затем использовать эти ключи в параметре orderby:

    $query = new WP_Query([ "meta_query" => [ "relation" => "AND", "state_clause" => [ "key" => "state", "value" => "Wisconsin", ], "city_clause" => [ "key" => "city", "compare" => "EXISTS", ], ], "orderby" => [ "city_clause" => "ASC", "state_clause" => "DESC", ], ]);

    Параметры Пагинации

    nopaging(логический) Отключит пагинацию, выведет все посты на одной странице. posts_per_page(число)

    Количество постов на одной странице. Если выставить -1 , то будут выведены все посты (без пагинации).

    С версии 2.1 заменяет параметр showposts . Установите параметр paged , если пагинация не работает, после использования этого параметра.

    Заметка: если запрос в feed части, WP перезаписывает этот параметр опцией posts_per_rss . Чтобы повлиять на вывод постов в фиде используйте фильтры post_limits или pre_option_posts_per_rss .

    Posts_per_archive_page(число) Количество постов для страниц архивов: для страниц, которые удовлетворяют условиям is_archive() или is_search() . Этот параметр перезаписывает параметры " posts_per_page " и " showposts ". offset(число) Сколько постов пропустить сверху выборки (верхний отступ).
    Внимание: Установка этого параметра переписывает/игнорирует параметр "paged" и ломает пагинацию (решение проблемы). paged(число) Номер страницы пагинации. Показывает посты, которые в обычном режиме должны были быть показаны на странице пагинации Х. Переписывает параметр posts_per_page page(число) Номер для статической домашней страницы. Показывает записи, которые в обычном режиме должны были быть показаны на странице пагинации Х главной статической странице (front page). ignore_sticky_posts(логический)

    Игнорировать прилепленные посты или нет (true/false). С версии 3.1. Заменяет параметр caller_get_posts.

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

    #1 Посты на странице

    Получим 3 поста:

    $query = new WP_Query("posts_per_page=3");

    Получим все посты:

    $query = new WP_Query("posts_per_page=-1");

    Получим все посты и отключим пагинацию:

    $query = new WP_Query("nopaging=true");

    #2 Отступы сверху

    Получим посты начиная с четвертого (пропустим первые 3):

    $query = new WP_Query("offset=3"));

    Получим 5 постов, которые идут за тремя первыми постами:

    $query = new WP_Query(array("posts_per_page" => 5, "offset" => 3));

    #3 Записи со страницы пагинации 6

    $query = new WP_Query("paged=6");

    #4 Записи с текущей страницы

    Получим посты с текущей страницы пагинации. Полезно при построении произвольной пагинации:

    $query = new WP_Query([ "paged" => get_query_var("paged") ]);

    Получим посты с текущей страницы и установим параметр paged в 1, когда переменная не определена на первой странице пагинации:

    $paged = get_query_var("paged") ? get_query_var("paged") : 1; $query = new WP_Query([ "paged" => $paged ]);

    Используйте get_query_var("page") если нужно получить номер страницы пагинации статической главной страницы сайта - is_front_page() . Переменная page в этом случае, содержит номер пагинации на страницах типа post, когда в контенте используется тег разбиения контента на страницы .

    Вывод текущей страницы пагинации на статической главной странице:

    $paged = get_query_var("page") ?: 1; $query = new WP_Query([ "paged" => $paged ]);

    #5 Прилепленные записи (посты)

    # Все прилепленные записи
    $sticky = get_option("sticky_posts"); $query = new WP_Query([ "post__in" => $sticky ]);
    # Только первый прилепленный пост
    $sticky = get_option("sticky_posts"); $query = new WP_Query("p=" . $sticky);
    # Первый прилепленный пост, если такого поста нет, то последний опубликованный
    $args = array("posts_per_page" => 1, "post__in" => get_option("sticky_posts"), "ignore_sticky_posts" => 1); $query = new WP_Query($args);
    # Первый прилепленный пост, если такого поста нет, то ничего не выводим
    $sticky = get_option("sticky_posts"); if (! empty($sticky)) { $query = new WP_Query(array("posts_per_page" => 1, "post__in" => $sticky, "ignore_sticky_posts" => 1)); // формируем вывод... }
    # 5 последних прилепленных записей
    $sticky = get_option("sticky_posts"); // все Sticky записи rsort($sticky); // отсортируем - новые вверху $sticky = array_slice($sticky, 0, 5); // получим первые 5 $query = new WP_Query([ "post__in"=>$sticky, "ignore_sticky_posts"=>1 ]);

    #6 Скрытие прилепленных постов

    Исключим все прилепленные посты из запроса:

    $query = new WP_Query([ "post__not_in" => get_option("sticky_posts") ]);

    Исключим прилепленные посты из категории. Вернет все посты рубрики, но прилепленные посты не будут сверху, они будут выводится как обычные посты (по дате):

    $query = new WP_Query([ "ignore_sticky_posts" => 1, "posts_per_page" => 3, "cat" => 6 ]);

    Исключим прилепленные посты из категории. Вернет все посты рубрики, но прилепленные посты будут полностью исключены. Также добавим сюда правило для правильной пагинации:

    $paged = get_query_var("paged") ?: 1; $sticky = get_option("sticky_posts"); $query = new WP_Query(array("cat" => 3, "ignore_sticky_posts" => 1, "post__not_in" => $sticky, "paged" => $paged));

    Параметры Комментариев

    В объект WP_Query добавляются данные комментариев записи, если это отдельная запись. В параметрах ниже, указывается как нужно получать комментарии в таких случаях.

    Comment_status(строка) Статус комментария. ping_status(число) Статус пинга. comments_per_page(число) Число комментариев для получения на отдельной странице комментариев. По умолчанию опция: comments_per_page . comment_count(число/массив)

    Количество комментариев, которое должен иметь пост. С версии 4.9.

    • Если указать число, получит посты с указанным числом комментариев (оператор поиска =).
    • Массив позволяет указать вариант сравнения числа комментариев. В массиве можно указать параметры:
      • value (число) - количество комментариев для сравнения.
      • compare (строка) - как сравнивать кол-во комментов. Может быть: = , != , > , >= , < , <= . По умолчанию: = .

    Параметры Поиска

    s(строка) Поисковая фраза. exact(логический) true - искать по точной фразе указанной в параметре s - без добавления % на концы поисковой фразы в SQL запрос.
    По умолчанию: false sentence(true/false) true - искать по полной поисковой фразе, прям как есть.
    false - поисковая фраза делится на слова и поиск происходит по словам из поисковой фразы.
    По умолчанию: false

    Посты найденные по поисковой фразе:

    $query = new WP_Query("s=keyword");

    Параметры Возвращаемых полей

    Устанавливает какие данные должен возвращать запрос.

    Fields(строка/массив)

    Какие данные возвращать. По умолчанию возвращаются все.

    • ids - вернет массив с ID постов.
    • id=>parent - вернет ассоциативный массив [ parent => ID, … ].
    • Вставка любых других параметров, вернет все поля (по умолчанию) - массив объектов постов.
    no_found_rows(логический) true - не подсчитывать количество найденных строк. В некоторых случаях может ускорить запрос.
    По умолчанию: false

    Параметры Кэширования

    Не добавляет данные в кэш при выполнении запросов.

    Cache_results(true/false) Кэшировать ли информацию о посте.
    По умолчанию: true update_post_meta_cache(true/false) Кэшировать ли информацию о мета данных поста.
    По умолчанию: true update_post_term_cache(true/false) Кэшировать ли информацию о привязке поста к терминам и таксономиям.
    По умолчанию: true lazy_load_term_meta(true/false) Следует ли «лениво» загружать метаданные термина.
    false - отключит отложенную загрузку метаданных термина и каждый вызов get_term_meta() будет обращаться в базу данных.
    По умолчанию: значение $update_post_term_cache

    #1 Выведем 50 постов, но не будет добавлять информацию о постах в кэш:

    $query = new WP_Query(array("posts_per_page" => 50, "cache_results" => false));

    #2 Выведем 50 постов, но не будем добавлять мета данные поста в кэш

    $query = new WP_Query(array("posts_per_page" => 50, "update_post_meta_cache" => false));

    #3 Выведем 50 постов, но не будем добавлять в кэш информацию о терминах постов

    $query = new WP_Query(array("posts_per_page" => 50, "update_post_term_cache" => false));

    Обычно эти функции использовать не нужно - кэш необходим! Однако, такой подход может пригодится в ряде случаев. Например, если нам нужно получить список заголовков постов и не нужна никакая другая информация о постах: ни о таксономиях ни о мета данных. Не загружая эту информацию мы может сохранить время на ненужных SQL запросах.

    Заметка: если используется плагин постоянного кэширования, все эти флаги устанавливаются в false по умолчанию, так как нет необходимости обновлять кэш при каждой загрузке страницы.

    Параметры Фильтров (хуков)

    suppress_filters(true/false)

    Следует ли отключать работу некоторых фильтров (хуков) в классе WP_Query. Включение этого параметра отменяет все фильтры изменения SQL запроса, такого типа posts_* или comment_feed_* .

    true - отключить обработку следующих хуков:

    Posts_search posts_search_orderby posts_where posts_join posts_where_paged posts_groupby posts_join_paged posts_orderby posts_distinct post_limits posts_fields posts_clauses posts_where_request posts_groupby_request posts_join_request posts_orderby_request posts_distinct_request posts_fields_request post_limits_request posts_clauses_request posts_request posts_results the_posts comment_feed_join comment_feed_where comment_feed_groupby comment_feed_orderby comment_feed_limits init() Активирует объект, выставляет все значение свойств в null, 0 или false. parse_query($query) Получает параметры запроса, анализирует их и выставляет базовые свойства класса: $posts , $post_count , $post и $current_post . parse_query_vars() Анализирует старый запрос заново. get($query_var) Получает переменную запроса по имени. set($query_var, $value) Устанавливает переменную запроса. Указываются: название переменной и её значение. &get_posts() Получает требуемые посты из БД. Также заполняет свойства $posts и $post_count . next_post() Используется во время цикла. Переходит к следующему посту в массиве $posts . Устанавливает $current_post и $post . Метод не устанавливает глобальную переменную $post , а влияет на переменную внутри класса. Возвращает данные текущего поста (объект). the_post() Используется во время цикла. Переходит к следующему посту и меняет глобальную переменную $post . have_posts() Используется прям перед циклом. Проверяет есть ли посты для вывода. rewind_posts() Сбрасывает переменные $current_post и $post . &query($query) Вызывает методы: parse_query() и get_posts() . Возвращает результат get_posts() . get_queried_object() Заполняет переменную $queried_object , если она еще не заполнена и возвращает её. get_queried_object_id() Заполняет переменную $queried_object_id , если она еще не заполнена и возвращает её. __construct($query = "") Конструктор класса. Если переданы данные запроса, вызывает метод query() и передает ему данные.

В сегодняшней статье из нашей серии, посвященной изучению класса WP_Query , вы узнаете о нескольких аргументах, которые можно использовать вместе с WP_Query для осуществления запросов по:

  • статусу;
  • порядку;
  • пагинации.

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

Вспоминаем, как работают аргументы в WP_Query

Когда вы используете WP_Query в собственных темах оформления или плагинах, приходится включать в код четыре основных элемента:

  • Аргументы для запроса, в которых используются параметры;
  • Сам запрос;
  • Цикл;
  • Завершающий этап: сброс данных записи.

На практике это выглядит следующим образом:

have_posts()) { // начало цикла обработки данных из результатов запроса while ($query->have_posts()) { $query->the_post(); // содержимое опрашиваемой записи } } // восстановление исходных данных записи wp_reset_postdata(); ?>

Аргументы сообщают WordPress , какие данные нужно извлекать из базы данных. Давайте сосредоточим внимание на самом начале кода:

$args = array(// Аргументы для вашего запроса);

Как видно, аргументы заключены в массив.

Создаем код для аргументов

Существует определенный синтаксис инициализации аргументов в массиве:

$args = array("parameter1" => "value", "parameter2" => "value", "parameter3" => "value");

Вам следует заключать параметры и их значения в одинарные кавычки, а также использовать => между ними. Аргументы разделяются запятой. Если не соблюдать установленный синтаксис, то WordPress может опросить не все указанные вами аргументы, и в итоге на экран ничего не выведется.

Параметры статуса

Как вы знаете, WordPress задает каждой записи отдельный статус. Можно использовать параметр post_status для запросов записей с одним или несколькими статусами.

Доступны следующие аргументы:

  • publish : опубликованная запись или страница;
  • pending : запись ожидает рассмотрения;
  • draft : запись в статусе черновика;
  • auto-draft : только что созданная запись, без какого-либо контента;
  • future : запланированная запись;
  • private : запись не видна посетителям, которые не авторизовались на сайте;
  • inherit : измененная версия записи или статус для прикрепленных записей;
  • trash : запись находится в корзине;
  • any : запрашивает любой статус, за исключением тех, у которых параметр ‘exclude_from_search’ выставлен на true (например , auto-draf t или trash ).

Если вы не укажете статус в аргументах вашего запроса, WordPress по умолчанию будет ориентироваться на publish ; если пользователь авторизован на сайте, то в запросе также будут учитываться записи со статусом private . Если вы запускаете запрос от имени администратора, то WordPress также будет учитывать защищенные статусы: future , draft и pending .

Предположим, что у вас есть сайт-афиша, на котором используется собственный тип записей event , и в качестве даты публикации используется дата, на которую запланировано то или иное мероприятие. По умолчанию, WordPress не будет отображать еще не состоявшиеся события. Несмотря на то, что вы запланировали, дата публикации находится в будущем, а, значит, статус записи будет future .

Чтобы обойти эту проблему, можно использовать следующие аргументы:

$args = array("post_type" => "event", "post_status" => "future");

Этот код позволит отобразить те события, которые еще не состоялись, так как для опубликованных записей используется статус publish . Но если необходимо показать и состоявшиеся мероприятия, то нужно использовать массив, в котором указано больше одного статуса:

$args = array("post_type" => "event", "post_status" => array("future", "publish"));

Параметр post_status важен при осуществлении запросов к вложениям, потому что используется статус inherit , а не publish . Чтобы осуществить запрос всех вложений, можно использовать следующий код:

$args = array("post_type" => "attachment", "post_status" => "inherit");

Но вы можете заменить inherit на любой другой статус, который позволит получить аналогичный результат.

Параметры сортировки

Существует два параметра, которые можно использовать для сортировки записей, полученных при помощи WP_Query : order и orderby . Как вы уже поняли, order определяет порядок, в котором записи выводятся в цикле, а orderby определяет, по какому полю в базе данных они будут сортироваться.

Параметр order

Есть всего аргумента, которые можно использовать для сортировки:

ASC : по возрастанию (1, 2, 3; a, b, c ).
DESC : по убыванию (3, 2, 1; c, b, a ).

Если вы не включите аргумент для order, по умолчанию WordPress будет использовать DESC .

Параметр orderby

Вы можете сортировать записи по нескольким полям:

  • none : нет условий сортировки (доступно с версии 2.8 );
  • ID : сортировка по id записи. Не забывайте про верхний регистр;
  • author : сортировка по автору;
  • title : сортировка по заголовку;
  • name : сортировка по slug записи;
  • type : сортировка по типу записи;
  • date : сортировка по дате;
  • modified : сортировка по последней дате изменения;
  • parent : сортировка по id родительской записи/страницы;
  • rand : случайный порядок;
  • comment_count : сортировка по количеству комментариев;
  • menu_order : сортировка по порядку расположения страниц. Наиболее часто используется для страниц (здесь используется значение, которое указывается в мета-блоке при редактировании страницы ), а также для вложений (используется целое число из диалогового окна Вставка / Загрузить медиафайл ). Также можно использовать для любого типа записи с включенным параметром menu_order ;
  • meta_value : сортировка по значению мета-ключа или пользовательского;
  • поля : Будет работать только в том случае, если установлен параметр meta_key . Мета-значения сортируются по алфавиту, а не по числам (то есть 34 выведется раньше цифры 4 );
  • meta_value_num : сортировка по числовому мета-значению. Как и в случае с meta_value , в запросе должен использоваться аргумент meta_key ;
  • post__in : сохраняет сортировку по ID записей, выставленную в массиве post__in .

По умолчанию, для сортировки используется поле date . То есть, сортируется по дате публикации.

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

$args = array("orderby" => "title", "order" => "ASC");

Сортировка по нескольким полям

Чтобы отсортировать записи по нескольким полям, нужно воспользоваться массивом с параметром orderby и с параметром order , если нужна сортировка каждого поля в разном порядке.

Предположим, что у вас есть произвольное поле ratings , которое вы хотите использовать для сортировки в интернет-магазине. Вы можете осуществить сортировку по возрастанию рейтинга, а затем по заголовку при помощи следующего кода:

$args = array("orderby" => array("meta_value_num", "title"), "order" => "ASC", "meta_key" => "rating");

Я включила в запрос аргумент meta_key , и это позволит WordPress понять, какое произвольное поле мы используем. Это нужно делать именно потому, что WordPress хранит метаданные записей в таблице wp_postmeta , а не в wp_posts .

Но что если нужно выполнить сортировку по убыванию рейтинга, а затем по заголовку в порядке возрастания? В таком случае следует использовать другой массив:

$args = array("orderby" => array("meta_value_num", "title"), "order" => array("DESC", "ASC"), "meta_key" => "rating");

Также можно выполнить сортировку по нескольким полям, если не требуется использовать метаданные записи. Например, чтобы сортировать записи по типу, а затем по дате, можно использовать следующий код:

$args = array("orderby" => array("type", "date"), "order" => array("ASC", "DESC"));

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

Параметры пагинации

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

Доступны следующие параметры:

  • nopaging (boolean ) : отображать все записи или использовать пагинацию. По умолчанию выставлено значение ‘false’ , то есть, используется постраничный вывод;
  • posts_per_page (int ) : количество записей на странице;
  • posts_per_archive_page (int ) : количество записей на странице, но только на странице архива;
  • offset (int ) : количество записей, после которого начинается вывод;
  • paged (int ) : страница в архиве, из которого выводятся страницы;
  • page (int ) : количество страниц для статичной главной страницы. Отображение записей, которые должны в обычном режиме показываться только на странице Х при включении статичной главной страницы (Front Page );
  • ignore_sticky_posts (boolean ) : игнорируем прикрепленные записи. По умолчанию используется значение false .

Количество записей и пропуск записей

Чтобы показать пять самых свежих записей, используем следующий код:

$args = array("posts_per_page" => "5");

Показываем пять самых свежих записей, за исключением самой последней опубликованной:

$args = array("posts_per_page" => "5", "offset" => "1");

Учтите, что, несмотря на то, что вы извлекаете записи из шести последних записей в базе данных, вы по-прежнему используете ‘posts_per_page’ => ‘5’ , так как именно такое количество записей должно быть отображено.

Можно создать два запроса: один для отображения самых свежих записей, а второй – для отображения еще 10 записей, за исключением той записи:

Для отображения всех записей можно использовать posts_per_page :

$args = array("posts_per_page" => "-1");

Прикрепленные записи

Обычно прикрепленные записи отображаются первыми в любом запросе. Если нужно переопределить эту установку, то воспользуйтесь параметром ignore_sticky_posts :

$args = array("posts_per_page" => "5", "ignore_sticky_posts" => true);

Приведенные выше аргументы позволят получить последние пять записей, независимо от того, являются они прикрепленными или нет.

Если нужно отобразить только прикрепленные записи, то нужно использовать функцию get_option() и аргумент post__in следующим образом:

$sticky = get_option("sticky_posts"); $args = array("posts_per_page" => "5", "post__in" => $sticky);

Приведенный выше код позволит получить пять последних прикрепленных записей. Если их будет меньше пяти (например, три ), то будет выведено только доступное количество прикрепленных записей.

Пагинация в архивах

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

К примеру, следующий код можно использовать на странице архива, чтобы вывести по 20 записей на каждую страницу:

$args = array("posts_per_archive_page" => "20");

Примечание: аргумент posts_per_archive_page переопределяет posts_per_page .

Если Вы работали с WordPress некоторое время, вы должны знать как трудно было раньше создавать списки записей на основе большого количества критериев и в то же время в соответствии со стандартами WordPress. Но за последние нескольких лет платформа прошла долгий путь. И сейчас, с помощью мощного класса WP_Query , мы можем создавать списки сообщений ни в чем себя не ограничивая.

Что такое WP_Query?

Класс WP_Query является одной из важнейших частей в движке WordPress. Среди прочего, он определяет запросы, которые вам необходимы на любой странице и выводит сообщения в соответствии с заданными критериями. Он также сохраняет много информации о запросах которые делает, что помогает при оптимизации страниц (и устранении ошибок).

WP_Query позволяет нам выполнять сложные запросы к базе данных безопасно, просто и модульным способом.

Безопасность

На протяжении всего нашего взаимодействия с этим объектом, мы указываем лишь параметры и используем функции для достижения нашей цели. Внутренние объекты сами заботятся о многих проблемах, таких как защита от SQL-инъекций и проверка использования правильного типа данных.

Простота

При использовании этого объекта нам не нужно изучать особенности нашей базы данных. Поскольку мы используем массив, чтобы передавать наши параметры, нет нужды вручную писать запросы с join или вложенные запросы, нужно просто создать массив аргументов и экземпляр класса!

Модульность

WP_Query позволяет избежать использования SQL-запросов в коде, класс использует ассоциативный массив в качестве аргумента. Это позволяет получить множество преимуществ: вы можете объединить аргументы из разных мест кода, запустить массив функций и управлять ими всевозможными способами.

Итак, начнем!

"Стандартный" цикл в WordPress

Давайте посмотрим вначале на обычный цикл, и затем создадим такой же цикл, используя WP_Query . Давайте предположим, что мы создаем файл category.php для своей темы.

if (have_posts() ) :
while (have_posts() ) :
the_post() ;
?>



endwhile ;
else :
?>
Упс, записей не найдено!
endif ;
?>

То же цикл, используя WP_Query:

$args = array ("cat" => 4 ) ;
$category_posts = new WP_Query($args ) ;

if ($category_posts -> have_posts () ) :
while ($category_posts -> have_posts () ) :
$category_posts -> the_post () ;
?>



endwhile ;
else :
?>
Упс, записей не найдено!
endif ;
?>

Как вы можете видеть, на первый взгляд нет большой разницы! Давайте рассмотрим его подробнее:

Построение запросов

На странице категории мы хотим получить список сообщений из этой категории. Так как мы строим запрос с нуля, используя WP_Query, мы должны определить это сами. Мы немного углубимся в это чуть позже.

Создание экземпляра класса и запросов для сообщений

С помощью экземпляра класса и массива аргументов, WP_Query будет пытаться получить указанные сообщения.

Создание цикла

Вы можете использовать любые обычные функции, только не забудьте использовать их в качестве методов объекта:

Вместо have_posts() , используйте $category_posts->have_posts() .
Вместо the_post() , используйте $category_posts->the_post() .

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

Если вы посмотрите на это подробнее, то вы увидите, что глобальный объект $post также доступен. Это означает, что если вы используете пользовательский цикл, что-нибудь может пойти не так. Обязательно сохраните первоначальное значение объекта $post и восстановите его после цикла.

Идем дальше...

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

Очень часто пользователи вашей темы хотят видеть на своих сайтах великолепно выглядящие слайдеры, но они могут быть немного ленивы при создании контента. Многие пользователи также хотят показать будущие записи, которые планируется опубликовать. Давайте создадим запрос для получения предстоящих (т.е. неопубликованых) сообщений, которые имеют изображение.

$args = array (
"post_status" => "future" ,
"meta_query" => array (
array (
"key" => "_thumbnail_id" ,
"value" => "" ,
"compare" => "!="
)
) ;
$slider_posts = new WP_Query($args ) ;
?>

have_posts () ) : ?>


have_posts () ) : $slider_posts -> the_post () ?>




Короткий и совершенно понятный код - просто и красиво.

Значения по умолчанию

Вы, возможно, заметили, что я не уточнил количество необходимых записей в моём запросе. А сколько сообщений в списке? И что за статус поста в первом запросе, который мы сделали?

Значения по умолчанию устанавливаются для многих из наиболее распространенных аргументов. Вот несколько, которые вы не обязаны указывать, если только вы не хотите изменить их:

posts_per_page
По умолчанию используется значение, указанное в параметрах сайта о количестве сообщений на странице.

post_type
По умолчанию используется post .

post_status
По умолчанию используется publish .

Вы можете найти полный список параметров в документации !

Массивы

Во многих случаях вам нужно будет указать несколько значений, которые может принимать аргумент. И WP_Query позволяет использовать массивы, чтобы сделать вашу жизнь проще. Вот несколько примеров:

Вы можете использовать массив для post_status , чтобы получить сообщения с различными статусами. Обратите внимание, что вы можете использовать строку any , чтобы получить сообщения со всевозможными статусами.

Работаем с метаданными

Вы уже видели, что WP_Query отлично справляется с мета-данными - мы использовали meta_query во втором примере, когда строили слайдер с записями, которые имеют изображения.

Представим, что мы создаем тему WordPress, которая будет использоваться для сайта сдающего квартиру(ы) в аренду. Мы будем хранить квартиры в пользовательском типе записей и использовать мета-данные для хранения дополнительной информации. Таким образом, мы можем легко получать, например, все квартиры, которые могут вместить четырех или более человек, или те у которых есть балкон, или только квартиры на сутки с джакузи.

$args = array (
"post_type" => "apartment" ,
"meta_query" => array (
"relation" => "AND" ,
"=" => "="
)
) ;
?>

Чтобы узнать больше о параметрах, которые можно использовать, просто зайдите в раздел Custom Field Parameters в документации по WP_Query.

Методы и свойства

Как только Вы сделали запрос, можно вытянуть много информации из Вашего объекта. Вы можете найти полный список "Методов и свойств " в документации. Вот те, которые я предпочитаю использовать чаще всего:

$query
Показывает строку запроса, которая передается в объект $wp_query. Это очень полезно для устранения неполадок в некоторых случаях.

$query_vars
Показывает ассоциативный массив аргументов, которые вы передали. Если вы делаете много смешиваний и сопоставлений перед передачей аргументов, этот инструмент может быть полезным, чтобы проверить, что все передано правильно.

$post
Содержит запрошенные записи из базы данных.

$found_posts
Удобная вещь, которая показывает общее число найденных элементов (без ограничения установленного аргументом posts_per_page).

С большой силой приходит большая ответственность

WP_Query дает вам большие возможности, но у него есть свои недостатки. Многие люди "сходят с ума", когда они понимают, как легко можно вызывать запросы повсюду.

Имейте в виду, что чем больше запросов, тем больше нагрузка на сервер. При создании сложных запросов могут возникнуть проблемы с RAM на хостинге, которая, вероятно, является ограниченным ресурсом у вас.

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


Если у Вас возникли вопросы, то для скорейшего получения ответа рекомендуем воспользоваться нашим