✅ Новости WEB и WordPress, темы, плагины. Здесь мы делимся советами и лучшими решениями для веб-сайтов.

Руководство: Как запрашивать сообщения в WordPress

23

Какие методы доступны для создания пользовательского почтового запроса и когда их лучше всего использовать? Этот пост направлен на то, чтобы установить твердое понимание двух методов запроса сообщений, как получить доступ к результатам, как построить аргументы и, наконец, как очистить после этого. Мы рассмотрим два метода: get_posts()и WP_Query.

Когда дело доходит до создания нового почтового запроса, на самом деле есть два варианта (на момент написания). Выбор действительно зависит только от ваших предпочтений (и некоторого незначительного влияния на производительность). Один вариант может испортить глобальный цикл/запрос, в котором вы сейчас находитесь, если вы не справитесь с ним правильно. В одном варианте вы обрабатываете объекты, а в другом — массив. Однако аргументы для настройки почтового запроса идентичны.

Глобальный запрос?

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

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

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

Два метода запроса сообщений

Вы можете запрашивать сообщения с помощью функции get_posts()или создания нового экземпляра WP_Query.. Первый вариант возвращает массив сообщений, а второй вы обрабатываете объект. Поскольку get_posts()возвращает массив только сообщений, обычно проще использовать его где угодно. Однако, если вы хотите разбить свой запрос на страницы, вам обязательно нужно создать WP_Queryэкземпляр.

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

Если производительность является проблемой (например, на сайте много сообщений), get_postsэто быстрее, чем использование WP_Query, потому что он пропускает расчет для разбивки на страницы.

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

if (have_posts()) { while (have_posts()): the_post(); // Access to each post; you can use template tags here endwhile; }

Зацикливание с использованием WP_Query

Зацикливание результатов использования WP_Queryточно такое же, за исключением того, что мы специально ссылаемся на экземпляр объекта в цикле. Нам также нужно помнить о «сбросе состояния» после того, как мы закончим цикл, чтобы глобальный объект записи вернулся к тому, что было раньше. Для этого мы используем wp_reset_postdata().

Если вы выгрузите объект, созданный WP_Query( $custom_queryв приведенном выше примере), вы найдете полный запрос и используемые аргументы. Интересными частями здесь являются свойства ‘ found_posts‘ и ‘ posts‘. Свойство ‘ posts‘ содержит результат размещения объектов, через которые будет проходить цикл. Количество сообщений, соответствующих вашему запросу, возвращается в ‘ found_posts‘ и полезно, если вы хотите создать пользовательскую нумерацию страниц. Разделите это значение на параметр WordPress для количества сообщений на странице, чтобы выяснить, сколько страниц вам нужно для вашего запроса, или просто обратитесь к свойству ‘ max_num_pages‘.

Примечание. При использовании get_postsWordPress возвращает только postsсвойство ‘ ‘ (которое является массивом) WP_Queryобъекта.

Зацикливание с использованием get_posts

При использовании get_postsмы не используем обычный «цикл WordPress», вместо этого мы используем обычный цикл массива PHP. Каждый элемент в массиве является почтовым объектом, и после завершения цикла сброс не требуется. Имейте в виду, что теги шаблона (например the_title(), и the_permalink()т. д.) недоступны внутри этого цикла. Вам нужно будет обратиться к свойствам объекта сообщения (например, $custom_post->ID).

Я рекомендую вам называть ваши пост-объекты иначе, чем $post. Вы можете столкнуться с проблемами при попытке доступа к свойствам сообщения (это может относиться к глобальному объекту сообщения, а не к сообщению в цикле).

Если вы хотите использовать теги шаблона для более легкого доступа к информации о публикации (например, the_title()и the_permalink()), вы можете это сделать. Сделайте это, сказав WordPress настроить глобальный объект записи внутри цикла с помощью setup_postdata(). Если вы сделаете это, вам нужно будет сбросить состояние wp_reset_postdata()после цикла.

$custom_query = get_posts([/ Arguments here /]); foreach ($custom_query as $post) { setup_postdata($post); // Template tags are available here, for example: the_title(); } wp_reset_postdata();

Имейте в виду, что setup_postdataобъекты, которые вы просматриваете (часть «as» в цикле foreach), должны быть названы $post! В первом примере я дал имена почтовым объектам $custom_post, и это не сработает с setup_postdata().

Однако, если вам просто нужен доступ к основной информации поста, вы можете пропустить настройку глобального объекта поста и вместо этого использовать соответствующие теги " get_"-template и идентификатор поста. Например, тег the_permalink()работает правильно только в том случае, если настроен глобальный объект публикации, но вы можете запросить постоянную ссылку на публикацию без глобального объекта публикации, просто используя echo get_the_permalink($custom_post->ID).

Аргументы запроса

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

Пример 1: Связанные посты из той же категории

Допустим, вы хотите показать «похожие сообщения» в конце одного сообщения. Он должен отображать случайный выбор из 3 сообщений, которые находятся в той же категории, что и текущий пост, и должен исключать текущий пост из результатов.

Аргументы довольно понятны. Прошу только ‘ post‘в’ post_type‘ и максимум 3 поста в’ posts_per_page'.

Для запроса сообщений в категориях вы можете создать tax_query или использовать более простой ‘ category__in‘ (NB: работает только для категории сообщений). В приведенном выше примере я использую wp_get_post_categories()для получения массива идентификаторов терминов, назначенных предоставленному сообщению, и использую его для аргумента ‘ category__in‘.

Вы можете исключить идентификаторы сообщений с помощью ‘ post__not_in‘, тогда как я указал текущий идентификатор сообщения. Наконец, я попросил случайный порядок сообщений, установив ‘ rand‘ в ‘ orderby‘. Вы можете указать, например, ‘ title‘ или ‘ date‘, чтобы упорядочить их по-другому. Взгляните на документацию по заказу, чтобы увидеть, что возможно.

Пример 2. Все сообщения пользовательского типа с несколькими аргументами упорядочения.

В этом примере мы предполагаем, что у вас есть настраиваемый тип записи ‘ book‘ и в пользовательском шаблоне страницы вы хотите отображать все опубликованные книги. Вы хотите упорядочить сообщения в первую очередь по menu_order (атрибут страницы, это число, которое вы можете установить для каждого сообщения), а во-вторых, по заголовку сообщения.

Опять же, аргументы говорят сами за себя. Я запрашиваю тип сообщения ‘ book‘ as’ post_type‘. Когда вы устанавливаете для ‘ posts_per_page‘ значение -1, он будет получать все (опубликованные сообщения, если вы не укажете что-то другое в post_statusаргументе ‘ ‘). Наконец, я предоставляю массив для ‘ orderby‘, чтобы указать WordPress сортировать сообщения в первую очередь по порядку меню в порядке возрастания, а затем по заголовку публикации в порядке убывания.

Пример 3: сообщения с пользовательскими метаданными

Предположим, у вас есть настраиваемый тип записи ‘ book‘ и вы хотите запросить все книги, которые либо не опубликованы, либо книги, опубликованные в период с 1990 по 2019 год.

Построение запроса с использованием метаданных сообщений лучше всего выполнять с помощью meta_query(для очень простых мета-аргументов вы можете использовать meta_keyи meta_valueнапрямую). Для meta_queryаргумента ‘ ‘ требуется массив, где каждый аргумент является массивом. Вы можете управлять отношением между каждым аргументом с помощью ‘ relation‘, для которого я установил значение ‘ OR‘ в приведенном выше примере.

Я предоставляю два аргумента метаданных для ‘ meta_query‘. Первый просто сравнивает метаключ ‘ book_status‘ с текстом ‘ unpublished‘, и если он равен, он будет включен. Во втором аргументе я говорю WordPress получить любое значение в мета-ключе «year_published», которое находится между числами 1990 и 2019.

Вывод

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

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

Источник записи: awhitepixel.com

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