Выбирает записи из базы данных по указанным критериям. На основе WP_Query работают функции get_posts() и query_posts() и все остальные запросы связанные с выбором записей из таблицы wp_posts.
Можно использовать следующие фильтры для внедрения непосредственно в сам SQL запрос.
Важно: если указан параметр , то все эти хуки работать не будут!
Миме тип записи. Используется только для вложений - записей с типом "attachment".
Этот параметр будет работать только когда параметр post_type = attachment и post_status = inherit . Т.е. MIME-тип может быть только у вложений.
Получает посты с указанным статусом.
Post_status(строка/массив)
Статус поста.
По умолчанию publish , а если пользователь авторизован добавляется еще и private . Если запрос запущен из админ части, добавляются еще и защищенные типы статусов: future , draft и pending . Все типы статусов:
По умолчанию: "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 , month , week , dayofyear , day , dayofweek , dayofweek_iso , hour , minute , second можно указать несколько значений, в виде массива, если параметр compare соответствует.
Запросы выше возвращают посты за указанный период в истории: "Посты за Х месяц, Х день". Они не могут получать посты за произвольный промежуток времени по отношению к настоящему. Поэтому запросы типа "Посты за последние 30 дней" или "Посты за последний год" не возможны в базовом варианте, для таких запросов нужно использовать фильтр "posts_where". Примеры ниже показывают как это делать.
Параметр "m" может быть установлен только в списке постов в админ-панели. Он полезен когда вы выбираете из выпадающего списка select где дата установлена как число YYYYmm.
Даты можно указывать цифрами и строками, потому что аргументы 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);
Аргумент 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 , может быть:
Поля по которым можно сортировать посты. Может быть
meta_value - по значения произвольного поля.
Важно: параметр meta_key так же должен быть определен. Заметка: сортировка будет алфавитной и будет не логична, если значения произвольных полей числа (будет, например, так 1, 3, 34, 4, 56, 6 и т.д., а не 1, 3, 4, 6, 34, 56).
С версии WordPress 4.0 в orderby можно указывать массив сочетающий в себе оба параметра: orderby и order . Сделано это для сортировки по нескольким колонкам одновременною Синтаксис такой:
"orderby" => array("title" => "DESC", "menu_order" => "ASC")
Отсортируем по порядку в меню, а затем по заголовку
$query = new WP_Query(array ("orderby" => "menu_order title", "order" => "DESC"));
Выведем посты отсортированные по двум полям: "title" и "menu_order" (title первостепенен):
$query = new WP_Query(array("post_type" => "page", "orderby" => "title menu_order", "order" => "ASC"));
Получим страницы отсортированные по заголовку (title) и номеру меню (menu_order) в разном порядке (ASC/DESC):
$query = new WP_Query(array("orderby" => array("title" => "DESC", "menu_order" => "ASC")));
Выведем посты типа "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);
Чтобы отсортировать результат по двум разным метаполям, например, сначала по 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", ], ]);
Количество постов на одной странице. Если выставить -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.
Прилепленные посты не будут показываться в начале списка, но они не исключаются и будут выводиться в обычном порядке.
Получим 3 поста:
$query = new WP_Query("posts_per_page=3");
Получим все посты:
$query = new WP_Query("posts_per_page=-1");
Получим все посты и отключим пагинацию:
$query = new WP_Query("nopaging=true");
Получим посты начиная с четвертого (пропустим первые 3):
$query = new WP_Query("offset=3"));
Получим 5 постов, которые идут за тремя первыми постами:
$query = new WP_Query(array("posts_per_page" => 5, "offset" => 3));
Получим посты с текущей страницы пагинации. Полезно при построении произвольной пагинации:
$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 ]);
Исключим все прилепленные посты из запроса:
$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.
Посты найденные по поисковой фразе:
$query = new WP_Query("s=keyword");
Устанавливает какие данные должен возвращать запрос.
Fields(строка/массив)
Какие данные возвращать. По умолчанию возвращаются все.
Не добавляет данные в кэш при выполнении запросов.
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
Обычно эти функции использовать не нужно - кэш необходим! Однако, такой подход может пригодится в ряде случаев. Например, если нам нужно получить список заголовков постов и не нужна никакая другая информация о постах: ни о таксономиях ни о мета данных. Не загружая эту информацию мы может сохранить время на ненужных SQL запросах.
Заметка: если используется плагин постоянного кэширования, все эти флаги устанавливаются в 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 , и как его можно использовать для создания собственных запросов. Чтобы определять, какие именно данные вы хотите извлечь из базы данных, нужно ознакомиться с аргументами этого класса и научиться правильно их применять.
Сегодня мы познакомимся с аргументами для произвольных полей (custom fields ), но сначала вспомним, как использовать аргументы в 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
для выполнения запросов к произвольным полям:
Используйте эти параметры для создания простых запросов к произвольным полям. Например, чтобы вывести записи, в которых имеются произвольные поля с ключом 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 вы можете исключить ключи или значения произвольного поля. Для того чтобы извлечь все записи, за исключением тех, в значении ключа которых используется 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 , вы узнаете о нескольких аргументах, которые можно использовать вместе с 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 для запросов записей с одним или несколькими статусами.
Доступны следующие аргументы:
Если вы не укажете статус в аргументах вашего запроса, 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 определяет, по какому полю в базе данных они будут сортироваться.
Есть всего аргумента, которые можно использовать для сортировки:
ASC
: по возрастанию (1, 2, 3; a, b, c
).
DESC
: по убыванию (3, 2, 1; c, b, a
).
Если вы не включите аргумент для order, по умолчанию WordPress будет использовать DESC .
Вы можете сортировать записи по нескольким полям:
По умолчанию, для сортировки используется поле 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"));
Этот код позволит осуществить сортировку по типу записи в возрастающем порядке, а затем, в рамках каждого типа записи, по дате в порядке убывания.
Мы переходим к еще одному набору параметров, который связан с постраничным выводом контента, с пагинацией. Эти параметры помогают определять, сколько записей будет опрошено, и как будет происходить нумерация страниц.
Доступны следующие параметры:
Чтобы показать пять самых свежих записей, используем следующий код:
$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 .
init() Initialise the object, set all properties to null, zero or false. parse_query($query) Takes a query string defining the request, parses it and populates all properties apart from $posts , $post_count , $post and $current_post . parse_query_vars() Reparse the old query string. get($query_var) Get a named query variable. set($query_var, $value) Set a named query variable to a specific value. &get_posts() Fetch and return the requested posts from the database. Also populate $posts and $post_count . Note: This is called during construction if WP_Query is constructed with arguments. It is not idempotent and should not be called more than once on the same query object. Doing so may result in a broken query. next_post() (to be used when in ) Advance onto the next post in $posts . Increment $current_post and set $post to the (new) current post object (note: this does not set the global $post variable, only the WP_Query object"s instance variable.) Returns the current post object (This is deprecated pleases use "next_post_link()") the_post() (to be used when in ) Advance onto the next post, and set the global $post variable. have_posts() (to be used when in , or just before The Loop) Determine if we have posts remaining to be displayed. Calls rewind_posts() and returns false if don"t have posts remaining. Because of the rewind, you can"t rely on have_posts() staying false. See . rewind_posts() Reset $current_post and $post . &query($query) Call parse_query() and get_posts() . Return the results of get_posts() . get_queried_object() Set $queried_object if it"s not already set and return it. get_queried_object_id() Set $queried_object_id if it"s not already set and return it. WP_Query($query = "") (constructor) If you provide a query string, call query() with it.Show posts associated with certain author.
Show Posts for one Author
Display posts by author, using author id:
$query = new WP_Query(array("author" => 123));
Display posts by author, using author " user_nicename ":
$query = new WP_Query(array("author_name" => "rami"));
Show Posts From Several Authors
Display posts from several specific authors:
$query = new WP_Query(array("author" => "2,6,17,38"));
Exclude Posts Belonging to an Author
Display all posts except those from an author(singular) by prefixing its id with a "-" (minus) sign:
$query = new WP_Query(array("author" => -12));
Multiple Author Handling
Display posts from multiple authors:
$query = new WP_Query(array("author__in" => array(2, 6)));
You can also exclude multiple author this way:
$query = new WP_Query(array("author__not_in" => array(2, 6)));
Show posts associated with certain categories.
Show Posts for One Category
Display posts that have this category (and any children of that category), using category id:
$query = new WP_Query(array("cat" => 4));
Display posts that have this category (and any children of that category), using category slug:
$query = new WP_Query(array("category_name" => "staff"));
Display posts that have this category (not children of that category), using category id:
$query = new WP_Query(array("category__in" => 4));
Show Posts From Several Categories
Display posts that have these categories, using category id:
$query = new WP_Query(array("cat" => "2,6,17,38"));
Display posts that have these categories, using category slug:
$query = new WP_Query(array("category_name" => "staff,news"));
Display posts that have "all" of these categories:
$query = new WP_Query(array("category_name" => "staff+news"));
Exclude Posts Belonging to Category
Display all posts except those from a category by prefixing its id with a "-" (minus) sign.
$query = new WP_Query(array("cat" => "-12,-34,-56"));
Multiple Category Handling
Display posts that are in multiple categories. This shows posts that are in both categories 2 and 6:
$query = new WP_Query(array("category__and" => array(2, 6)));
To display posts from either category 2 OR 6, you could use cat as mentioned above, or by using category__in (note this does not show posts from any children of these categories):
$query = new WP_Query(array("category__in" => array(2, 6)));
You can also exclude multiple categories this way:
$query = new WP_Query(array("category__not_in" => array(2, 6)));
Show posts associated with certain tags.
Show Posts for One Tag
Display posts that have this tag, using tag slug:
$query = new WP_Query(array("tag" => "cooking"));
Display posts that have this tag, using tag id:
$query = new WP_Query(array("tag_id" => 13));
Show Posts From Several Tags
Display posts that have "either" of these tags:
$query = new WP_Query(array("tag" => "bread,baking"));
Note: If WP_Query determines that the result will be singular ( is true), it will ignore the tax_query parameter. To modify tax_query , use the filter to add the required SQL statements.
Important Note: tax_query takes an array of tax query arguments arrays (it takes an array of arrays). This construct allows you to query multiple taxonomies by using the relation parameter in the first (outer) array to describe the boolean relationship between the taxonomy arrays.
Simple Taxonomy Query:
Display posts tagged with bob , under people custom taxonomy:
$args = array("post_type" => "post", "tax_query" => array(array("taxonomy" => "people", "field" => "slug", "terms" => "bob",),),); $query = new WP_Query($args);
Multiple Taxonomy Handling:
Display posts from several custom taxonomies:
$args = array("post_type" => "post", "tax_query" => array("relation" => "AND", array("taxonomy" => "movie_genre", "field" => "slug", "terms" => array("action", "comedy"),), array("taxonomy" => "actor", "field" => "term_id", "terms" => array(103, 115, 206), "operator" => "NOT IN",),),); $query = new WP_Query($args);
Display posts that are in the quotes category OR have the quote :
$args = array("post_type" => "post", "tax_query" => array("relation" => "OR", array("taxonomy" => "category", "field" => "slug", "terms" => array("quotes"),), array("taxonomy" => "post_format", "field" => "slug", "terms" => array("post-format-quote"),),),); $query = new WP_Query($args);
Nested Taxonomy Handling:
The "tax_query" clauses can be nested, to create more complex queries. Example: Display posts that are in the quotes category OR both have the quote post format AND are in the wisdom category:
$args = array("post_type" => "post", "tax_query" => array("relation" => "OR", array("taxonomy" => "category", "field" => "slug", "terms" => array("quotes"),), array("relation" => "AND", array("taxonomy" => "post_format", "field" => "slug", "terms" => array("post-format-quote"),), array("taxonomy" => "category", "field" => "slug", "terms" => array("wisdom"),),),),); $query = new WP_Query($args);
Show posts based on a keyword search.
Show Posts based on a keyword search
Display posts that match the search term "keyword":
$query = new WP_Query(array("s" => "keyword"));
Prepending a term with a hyphen will exclude posts matching that term. Eg, "pillow -sofa" will return posts containing "pillow" but not "sofa" (available since ).
Display content based on post and page parameters. Remember that default post_type is only set to display posts but not pages.
Show Post by Type
Display only pages:
$query = new WP_Query(array("post_type" => "page"));
Display " any " post type (retrieves any type except revisions and types with "exclude_from_search" set to TRUE):
$query = new WP_Query(array("post_type" => "any"));
Display multiple post types, including custom post types:
$args = array("post_type" => array("post", "page", "movie", "book")); $query = new WP_Query($args);
Show Post by Status
Display only drafts:
$query = new WP_Query(array("post_status" => "draft"));
Display multiple post status:
$args = array("post_status" => array("pending", "draft", "future")); $query = new WP_Query($args);
Display all attachments:
$args = array("post_status" => "any", "post_type" => "attachment"); $query = new WP_Query($args);
Show Sticky Posts
Display just the first sticky post:
$sticky = get_option("sticky_posts"); $query = new WP_Query(array("p" => $sticky));
Display just the first sticky post, if none return the last post published:
$sticky = get_option("sticky_posts"); $args = array("posts_per_page" => 1, "post__in" => $sticky, "ignore_sticky_posts" =>
Display just the first sticky post, add this line to above block:
If ($sticky) { // insert here your stuff... }
Don"t Show Sticky Posts
Exclude all sticky posts from the query:
$query = new WP_Query(array("post__not_in" => get_option("sticky_posts")));
Return ALL posts within the category, but don"t show ("ignore") sticky posts at the top (They will still show in their natural position, e.g. by date):
$query = new WP_Query(array("ignore_sticky_posts" => 1, "posts_per_page" => 3, "cat" => 6);
Exclude sticky posts from a category. Return posts within the category, but exclude sticky posts completely, and adhere to paging rules:
$paged = get_query_var("paged") ? get_query_var("paged") : 1; $sticky = get_option("sticky_posts"); $args = array("cat" => 3, "ignore_sticky_posts" => 1, "post__not_in" => $sticky, "paged" => $paged,); $query = new WP_Query($args);
Sort retrieved posts.
Show Posts sorted by Title, Descending order
Display posts sorted by post "title" in a descending order:
$args = array("orderby" => "title", "order" =>
Display posts sorted by "menu_order" with a fallback to post "title", in a descending order:
$args = array("orderby" => "menu_order title", "order" => "DESC",); $query = new WP_Query($args);
Show Random Post
Display one random post:
$args = array("orderby" => "rand", "posts_per_page" => 1,); $query = new WP_Query($args);
Show Popular Posts
Display posts ordered by comment count:
$args = array("orderby" => "comment_count"); $query = new WP_Query($args);
Show Products sorted by Price
Display posts with "Product" type ordered by "Price" custom field:
$args = array("post_type" => "product", "orderby" => "meta_value_num", "meta_key" => "price",); $query = new WP_Query($args);
Multiple "orderby" values
Display pages ordered by "title" and "menu_order". (title is dominant):
$args = array("post_type" => "page", "orderby" => "title menu_order", "order" => "ASC",); $query = new WP_Query($args);
Multiple "orderby" values using an array
Display pages ordered by "title" and "menu_order" with different sort orders (ASC/DESC) (available since ):
$args = array("orderby" => array("title" => "DESC", "menu_order" => "ASC")); $query = new WP_Query($args);
Mulitiple orderby/order pairs
$args = array("orderby" => array("meta_value_num" => "DESC", "title" => "ASC"), "meta_key" => "age"); $query = new WP_Query($args);
"orderby" with "meta_value" and custom post type
Display posts of type "my_custom_post_type", ordered by "age", and filtered to show only ages 3 and 4 (using meta_query).
$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);
"orderby" with multiple "meta_key"s
If you wish to order by two different pieces of postmeta (for example, City first and State second), you need to combine and link your meta query to your orderby array using "named meta queries". See the example below:
$q = new WP_Query(array("meta_query" => array("relation" => "AND", "state_clause" => array("key" => "state", "value" => "Wisconsin",), "city_clause" => array("key" => "city", "compare" => "EXISTS",),), "orderby" => array("city_clause" => "ASC", "state_clause" => "DESC",),));
Show posts associated with a certain time and date period.
Returns posts dated December 12, 2012:
$query = new WP_Query("year=2012&monthnum=12&day=12");
$args = array("date_query" => array(array("year" => 2012, "month" => 12, "day" => 12,),),); $query = new WP_Query($args);
Returns posts for today:
$today = getdate(); $query = new WP_Query("year=" . $today["year"] . "&monthnum=" . $today["mon"] . "&day=" . $today["mday"]);
$today = getdate(); $args = array("date_query" => array(array("year" => $today["year"], "month" => $today["mon"], "day" => $today["mday"],),),); $query = new WP_Query($args);
Returns posts for this week:
$week = date("W"); $year = date("Y"); $query = new WP_Query("year=" . $year . "&w=" . $week);
$args = array("date_query" => array(array("year" => date("Y"), "week" => date("W"),),),); $query = new WP_Query($args);
Return posts between 9AM to 5PM on weekdays
$args = array("date_query" => array(array("hour" => 9, "compare" => ">=",), array("hour" => 17, "compare" => "<=",), array("dayofweek" => array(2, 6), "compare" => "BETWEEN",),), "posts_per_page" =>
Return posts from January 1st to February 28th
$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);
Note that if a strtotime() -compatible string with just a date was passed in the before parameter, this will be converted to 00:00:00 on that date. In this case, even if inclusive was set to true, the date would not be included in the query. If you want a before date to be inclusive, include the time as well, such as "before" => "2013-02-28 23:59:59" , or use the array format, which is adjusted automatically if inclusive is set.
Return posts made over a year ago but modified in the past month
$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);
The "date_query" clauses can be nested, in order to construct complex queries. See for details on the syntax.
Show posts associated with a certain custom field.
This part of the query is parsed by , so check as well in case this list of arguments isn"t up to date.
meta_query also contains one or more arrays with the following keys:
The "type" DATE works with the "compare" value BETWEEN only if the date is stored at the format YYYY-MM-DD and tested with this format.
Important Note: meta_query takes an array of meta query arguments arrays (it takes an array of arrays) - you can see this in the examples below. This construct allows you to query multiple metadatas by using the relation parameter in the first (outer) array to describe the boolean relationship between the meta queries. Accepted arguments are "AND", "OR". The default is "AND".
Simple Custom Field Query:
Display posts where the custom field key is "color", regardless of the custom field value:
$query = new WP_Query(array("meta_key" => "color"));
Display posts where the custom field value is "blue", regardless of the custom field key:
$query = new WP_Query(array("meta_value" => "blue"));
Display where the custom field value is "blue", regardless of the custom field key:
$args = array("meta_value" => "blue", "post_type" => "page"); $query = new WP_Query($args);
Display posts where the custom field key is "color" and the custom field value is "blue":
$args = array("meta_key" => "color", "meta_value" => "blue"); $query = new WP_Query($args);
Display posts where the custom field key is "color" and the custom field value IS NOT "blue":
$args = array("meta_key" => "color", "meta_value" => "blue", "meta_compare" => "!="); $query = new WP_Query($args);
Display posts where the custom field value is a number. Displays only posts where that number is less than 10. (WP_Query uses this equation to compare: $post_meta . $args["meta_compare"] . $args["meta_value"] , where "$post_meta" is the value of the custom post meta stored in each post; the actual equation with the values filled in: $post_meta < 10)
$args = array("post_type" => "post", "meta_key" => "number", "meta_value_num" => 10, "meta_compare" => "<",); $query = new WP_Query($args);
Display posts where the custom field key is a set date and the custom field value is now. Displays only posts which date has not passed.
$args = array("post_type" => "event", "meta_key" => "event_date", "meta_value" => date("Ymd"), // change to how "event date" is stored "meta_compare" => ">",); $query = new WP_Query($args);
Display "product"(s) where the custom field key is 'price' and the custom field value that is LESS THAN OR EQUAL TO 22.
By using the 'meta_value' parameter the value 99 will be considered greater than 100 as the data are stored as 'strings', not 'numbers'. For number comparison use 'meta_value_num'.
$args = array('meta_key' => 'price', 'meta_value' => '22', 'meta_compare' => '<=', 'post_type' => 'product'); $query = new WP_Query($args);
Display posts with a custom field value of zero (0), regardless of the custom field key:
$args = array('meta_value' => '_wp_zero_value'); $query = new WP_Query($args);
Single Custom Field Handling:
Display posts from a single custom field:
$args = array('post_type' => 'product', 'meta_query' => array(array('key' => 'color', 'value' => 'blue', 'compare' => 'NOT LIKE',),),); $query = new WP_Query($args);
(Note that meta_query expects nested arrays, even if you only have one query.)
Если Вы работали с WordPress некоторое время, вы должны знать как трудно было раньше создавать списки записей на основе большого количества критериев и в то же время в соответствии со стандартами WordPress. Но за последние нескольких лет платформа прошла долгий путь. И сейчас, с помощью мощного класса 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()
;
?>
То же цикл, используя 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
()
;
?>
Как вы можете видеть, на первый взгляд нет большой разницы! Давайте рассмотрим его подробнее:
Построение запросов
На странице категории мы хотим получить список сообщений из этой категории. Так как мы строим запрос с нуля, используя 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 () ) : ?>
Короткий и совершенно понятный код - просто и красиво.
Значения по умолчанию
Вы, возможно, заметили, что я не уточнил количество необходимых записей в моём запросе. А сколько сообщений в списке? И что за статус поста в первом запросе, который мы сделали?
Значения по умолчанию устанавливаются для многих из наиболее распространенных аргументов. Вот несколько, которые вы не обязаны указывать, если только вы не хотите изменить их:
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 на хостинге, которая, вероятно, является ограниченным ресурсом у вас.
Убедитесь в том, что запрос по умолчанию выполняется на каждой странице. Какой смысл в создании нового запроса для получения последних сообщений на главной странице, если он там есть по умолчанию? Используйте кэширование результатов, чтобы снизить нагрузку на сервер.
Если у Вас возникли вопросы, то для скорейшего получения ответа рекомендуем воспользоваться нашим