Выбор правильного запроса для разработки WordPress
Допустим, вы хотите сделать что-то уникальное с тем, как сообщения запрашиваются и отображаются на определенной странице вашего веб-сайта. Возможно, вы хотите иметь несколько запросов — один для избранных сообщений и один для последних сообщений. Или, возможно, вы хотите исключить определенные категории сообщений со страницы своего блога.
Какой бы ни была ваша цель, вы решили создать собственный шаблон страницы с запросом, который делает что-то немного другое. Однако, прежде чем вы начнете программировать, вам нужно принять решение: какой инструмент запросов WordPress вы должны использовать?
WordPress включает в себя несколько разных запросов: WP_query , query_posts() , get_posts() , get_pages() и pre_get_posts . Во многих случаях для достижения желаемых результатов можно использовать более одного из этих инструментов. Однако остается вопрос, какой на использовать ?
В этом посте мы подробно рассмотрим каждую из этих пяти функций запросов WordPress.
Мы узнаем, как работает каждый из них, выявим любые внутренние ограничения или подводные камни и определим сценарии, в которых следует использовать каждый из них. К концу этого поста вы будете знать, что сможете принять взвешенное решение относительно подходящего инструмента для ваших запросов к постам.
Щелкните ссылку ниже, чтобы изучить определенный элемент, или продолжайте читать, чтобы узнать обо всех этих параметрах:
- WP_Query
- pre_get_posts
- запрос_сообщений ()
- get_posts()
- get_pages()
- Применение теории на практике
WP_Query WP_Query — это класс, стоящий за (почти) каждым запросом WordPress. Когда вы загружаете страницу или сообщение в WordPress, Объект WP_query , $query , создается и извлекает соответствующие данные публикации или страницы. Думайте о WP_Query как о движке, который поддерживает большинство запросов WordPress.
Вы используете WP_Query , даже не подозревая об этом. Когда вы загружаете URL-адрес, ядро WordPress создает запрос к базе данных с WP_Query на основе URL-адреса и настроек, которые вы применили к своему веб-сайту. Итак, если вы обращаетесь к странице с URL-адресом, например, http://example.com/category/wordpress WordPress создает объект WP_Query , который находит все записи в категории WordPress и загружает все данные записей.
WP_Query поддерживает стандартные запросы записей и страниц, встроенные в WordPress, а также может использоваться для создания пользовательских запросов. Это делается с помощью объектно-ориентированного программирования. Все, что вам нужно сделать, это создать новую переменную и объявить ее как новый экземпляр класса WP_Query , например:0003
Конечно, потом нужно что-то делать с результатами запроса. Однако это выходит за рамки этого урока. Вместо этого обратитесь к списку руководств в конце этого поста, если вам нужна помощь в применении WP_Query на практике.
Как разработчик WordPress, вы, вероятно, будете использовать WP_Query чаще, чем любую другую функцию запроса или хук. Он универсальный и мощный. Хотя некоторые другие запросы, описанные в этом посте, в некоторых случаях могут сэкономить вам несколько нажатий клавиш, в целом вы не ошибетесь, выбрав 9.0007 WP_Query для написания пользовательских запросов.
Единственным исключением является случай, когда все, что вам нужно сделать, это отфильтровать результаты стандартного запроса. В этом случае вам следует использовать pre_get_posts . Итак, давайте посмотрим на это дальше.
pre_get_posts pre_get_posts — это хук, а не функция. Вместо того, чтобы запрашивать базу данных заново, pre_get_posts позволяет изменять объект $query до того, как будет сделан запрос к базе данных, эффективно фильтруя результаты, возвращаемые стандартным запросом.
В большинстве случаев pre_get_posts сочетается с условными тегами для фильтрации результатов запроса в определенных ситуациях.
Например, вы можете использовать pre_get_posts , чтобы вернуть другое количество сообщений на главной странице сайта. По сути, если вы хотите запустить стандартный запрос, но каким-то образом изменить его, — это инструмент для этой работы.
В некоторых случаях pre_get_posts не работает и не должен использоваться. Кодекс WordPress предлагает два таких случая:
- Фильтр
pre_get_postsне следует использовать для изменения запроса в шаблоне для одной страницы, поскольку это повлияет на свойства, уже установленные с помощьюparse_query(). - Фильтр
pre_get_postsне будет работать, если добавить в шаблон файлы, такие как archive.php , потому что эти файлы загружаются после того, как основной запрос уже запущен.
Что нам остается? Это означает, что pre_get_posts — отличный выбор для изменения запроса загрузки сообщений в основной цикл домашней страницы, страницы блога и отдельных страниц, таких как page.
php и single.php .
Однако иногда фильтрации стандартного запроса недостаточно. Возможно, вы хотите использовать несколько запросов WordPress или манипулировать результатами запросов способом, который не позволит pre_get_posts . В этом случае вы можете вернуться к WP_Query или прочитать о нескольких дополнительных параметрах.
query_posts() Если вы покопаетесь в учебниках WordPress, выпущенных несколько лет назад, вы найдете множество руководств, рекомендующих использование query_posts() . Однако современные учебники почти повсеместно не рекомендуют этого делать. Вот почему.
Функция query_posts() заменяет основной объект запроса, $query , который создается и используется циклом по умолчанию, запускаемым ядром WordPress. Он делает это, создавая новый Экземпляр WP_Query и назначение его объекту $query .
Может показаться, что query_posts() действительно мощный и полезный.
query_posts() имеет серьезные недостатки, и их следует избегать. В официальном справочнике по коду WordPress приводится несколько причин, по которым в подавляющем большинстве случаев следует избегать использования query_posts() . Основные причины, приведенные для этого, включают:
- Использование
query_posts()может значительно замедлить время загрузки страницы, увеличив вдвое объем работы, необходимой для обработки запроса. - Поскольку
query_posts()заменяет стандартные данные запроса, это может вызвать множество проблем с нумерацией страниц и нанести ущерб страницам, которые используют несколько запросов.
Короче говоря, использование query_posts() — опасное предложение. Собственно говоря, официальная документация начинается с оговорки: Эта функция полностью переопределит основной запрос и не предназначена для использования плагинами или темами .
Его чрезмерно упрощенный подход к изменению основного запроса может быть проблематичным, и его следует по возможности избегать.
Другими словами, если вы пишете тему или плагин — именно этим занимается большинство из нас — избегайте использования query_posts() WP_Query или используйте get_posts() , get_pages() или вместо этого pre_get_posts .
get_posts() Думайте о функции get_posts() как о модифицируемом, предопределенном экземпляре класса WP_Query , потому что это именно то, чем оно является. Когда вы используете get_posts() , вы фактически вызываете предустановленные значения по умолчанию и используете их для создания экземпляра класса WP_Query .
В каком-то смысле get_posts() очень похож на query_posts() : они оба являются предопределенными экземплярами WP_Query .
Однако они также сильно отличаются, потому что query_posts() заменяет объект $query по умолчанию, а get_posts() просто создает совершенно новый запрос, который не взаимодействует с глобальными переменными, как это делает query_posts() . .
Итак, какой смысл использовать get_posts() ? Почему бы просто не использовать WP_Query ? Ответ — удобство. Если вы думаете об использовании get_posts() , вы определенно можете выполнить все, что вы пытаетесь выполнить, с помощью WP_Query . Однако, используя get_posts() , вы экономите несколько нажатий клавиш.
Есть еще одно различие между WP_Query и get_posts() . То есть последний возвращает массив сообщений, а первый возвращает сообщения по одному с помощью функции the_post() . Это означает, что get_posts() возвращает все сообщения сразу в виде массива, в то время как WP_Query перебирает сообщения по одному, отображая соответствующий контент каждого сообщения по мере его повторения.
На практике это означает, что при использовании get_posts() вы используете функцию foreach для отображения результатов, но вы используете стандартную структуру цикла if...while для вывода содержимого при использовании WP_Query .
Следует также помнить, что с get_posts() не изменяет глобальный объект $query , вам нужно использовать setup_postdata() для каждого сообщения, чтобы получить доступ к методам и свойствам WP_Query . Хотя это может показаться сложным, на самом деле это не так. Взгляните:
Загрузка gist jpen365/67592c6e5f70553692a002fea13da63f
Таким образом, этот фрагмент кода вернет четыре сообщения из категории слайдера (предположительно, чтобы отобразить их в слайдере сообщений). Во-первых, мы убеждаемся, что запрос вернул что-то с if ( $slider_posts ) код, а затем прокручивайте сообщения, отображающие заголовок и содержание.
Используя setup_postdata() , мы можем использовать глобальные переменные, такие как $id и $authordata , а также теги шаблонов, такие как the_title() и the_content() . Без настройки данных публикации мы не смогли бы использовать эти переменные и теги шаблона.
get_pages() Одной из функций запроса, которой не уделяется много внимания, является get_pages() запрос. В отличие от всех других запросов в этом посте, которые так или иначе связаны с WP_Query , get_pages() — это функция, которая обходит WP_Query и напрямую запрашивает базу данных.
Подобно get_posts() , эта функция возвращает содержимое, найденное в массиве. Однако, в отличие от get_posts() , который можно использовать для извлечения любых сообщений любого типа (сообщений, страниц, пользовательских типов сообщений и т. д.), get_pages() можно использовать только для получения иерархических типов сообщений, таких как страницы и иерархические пользовательские типы сообщений.
Кроме того, get_pages() позволяет указать несколько параметров запроса, уникальных для иерархических типов записей, включая 'child_of' , 'parent' и 'hierarchical' . Доступ к этим параметрам является основной причиной, по которой вы можете рассмотреть возможность использования этого конкретного запроса.
Применение теории на практике
В этом посте мы представили пять мощных инструментов запросов WordPress, но не показали, как их использовать. Тем не менее, мы писали о написании пользовательских запросов в прошлом, и вы можете узнать больше о том, как использовать эти запросы в своих темах и плагинах, изучив эти другие ресурсы в нашем блоге:
- Подробное руководство по преодолению WP_Query
- Объяснение цикла WordPress
- Как расположить записи WordPress в любом порядке
- Разработка WordPress для пользователей среднего уровня: запросы и циклы
- 5 простых методов создания пользовательских запросов в WordPress
Резюме
Как видите, когда дело доходит до запросов к базе данных WordPress, нет недостатка в вариантах.
Существует как минимум пять мощных инструментов, которые разработчики WordPress могут использовать для получения записей базы данных, которые они хотят отобразить. Давайте повторим каждый из доступных вариантов:
-
WP_Query: универсальный класс, который поддерживает большинство запросов WordPress. Он гибкий и может использоваться для создания любого типа запроса. -
pre_get_posts: хук, который можно использовать для уточнения объекта$queryперед запросом к базе данных, тем самым безопасно изменяя запрос по умолчанию. Используйте его вместе с условными тегами для уточнения результатов стандартного запроса. -
query_posts(): мощный экземплярWP_Query, который заменяет объект$queryпо умолчанию и не предназначен для разработки тем или плагинов. Не используйте его. -
get_posts(): экземпляр классаWP_Query, который возвращает массив сообщений.
Он включает в себя ряд значений по умолчанию, которые могут сэкономить вам несколько нажатий клавиш по сравнению с созданием собственного экземпляраWP_Query, но только если параметры по умолчанию соответствуют вашим потребностям. -
get_pages(): функция, которую можно уточнить с помощью иерархических параметров и которая возвращает массив иерархических типов записей, таких как страницы или иерархические пользовательские типы записей.
Метки:
Как получить все посты из запроса wp в результатах поиска в wordpress
1 ответ на этот вопрос.
0 голосов
Связанные вопросы в PHP
Привет @картик, Если вы используете PDO, используйте PDO::lastInsertId. Если вы …
ответил 22 окт. 2020 г. в PHP к Нирой • 82 840 баллов • 1540 просмотров
- PHP
- HTML
- CSS
- JavaScript
- ларавель
Привет @картик,
__CLASS__ всегда возвращает имя .
.. ПОДРОБНЕЕ
ответил 27 окт. 2020 г. в PHP к Нирой • 82 840 баллов • 392 просмотра
- HTML
- CSS
- JavaScript
- ларавель
- PHP
- узлов
Привет @картик, Предположим, item_id – это целочисленный столбец идентификации в таблице items … ПОДРОБНЕЕ
ответил 9 апр, 2020 в PHP к Нирой • 82 840 баллов • 9614 просмотров
- HTML
- CSS
- JavaScript
- PHP
- ларавель
Привет @картик, Это действительно даст результат… ПОДРОБНЕЕ
ответил 8 мая 2020 г. в PHP к Нирой • 82 840 баллов • 2372 просмотра
- HTML
- CSS
- JavaScript
- PHP
- ларавель
Привет К сожалению, нет, вы должны знать … ПОДРОБНЕЕ
ответил 23 апр.
2020 г. в веб-разработке к
Чьянит • 160 баллов • 1564 просмотра
- HTML
- CSS
- JavaScript
- PHP
- MySQL
- linux-база данных
- линукс
- узлов
Привет ребята, Может ли кто-нибудь помочь мне найти … ПОДРОБНЕЕ
17 января 2020 г. в веб-разработке к анонимный • 37 510 баллов • 540 просмотров
- HTML
- CSS
- JavaScript
- узлов
- PHP
- sql
Рассмотрим следующий блок:
ответил 20 января 2020 г. в веб-разработке к
Нирой • 82 840 баллов
отредактировано 21 января 2020 г. от Нирой • 544 просмотра
- угловой
- HTML
- CSS
- JavaScript
- узлов
- PHP
Привязка данных – это синхронизация данных между .
.. ПОДРОБНЕЕ
ответил 23 января 2020 г. в веб-разработке к Нирой • 82 840 баллов • 492 просмотра
- HTML
- CSS
- JavaScript
- угловой
- PHP
Привет @картик, Каждое видео на YouTube имеет четыре сгенерированных … ПОДРОБНЕЕ
ответил 16 июня 2020 г. в PHP к Нирой • 82 840 баллов • 4126 просмотров
- JavaScript
- PHP
- HTML
- CSS
- ларавель
Привет @картик, Если ваш сервер PHP разрешает URL … ПОДРОБНЕЕ
ответил 6 октября 2020 г. в PHP к Нирой • 82 840 баллов • 3435 просмотров
- HTML
- CSS
- JavaScript
- ларавель
- PHP
- Я хочу напечатать от 1 до 100 чисел, используя массивы только в Javascript 16 ноября 2022 г.
- Не удается прочитать свойство «push» неопределенного при объединении массивов 2022
- Когда дженерики Java требуют расширяет T> вместо
и есть ли недостатки переключения? 29 сентября, 2022 - Для чего полезно ключевое слово volatile? 29 сентября 2022 г.



