Выбор правильного запроса для разработки 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 г.