Разное

Pre get posts: pre_get_posts | Hook | WordPress Developer Resources

21.06.2023

Получение сообщений в WordPress путем настройки запроса с помощью хука pre_get_posts. | от Прасана | Timeless

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

Например,

Не показывать сообщения определенных категорий на главной странице блога.

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

Список связанных статей на основе категории в конце сообщения.

Мы будем использовать хук WordPress pre_get_posts для изменения настроек запроса перед выполнением основного запроса. WordPress необходимо построить запрос, чтобы выяснить, какой шаблон загрузить, поэтому, если вы поместите это в файл шаблона, такой как archive.php, будет слишком поздно для загрузки этих

Все наши функции будут иметь аналогичную структуру. Во-первых, мы собираемся убедиться, что мы обращаемся к основному запросу. Мы сделаем это, проверив $запрос->is_main_query() .

Нам также необходимо подтвердить, что код не запускается в административных запросах. Возможно, вы захотите исключить категорию из блога для своих посетителей, но вы все равно хотите получить доступ к этим сообщениям в разделе «Сообщения» бэкэнда. Для этого мы добавим ! is_admin() .

Затем мы проверим, подходят ли условия для нашей модификации. Если вы хотите, чтобы это было только на главной странице вашего блога, мы позаботимся о том, чтобы запрос был для дома ( $query->is_home() ).

is_home() используется, чтобы указать запросу работать с домашней страницей блога WordPress, чтобы указать, какая страница будет домашней для блога, установите это в «Администратор»> «Настройки»> «Чтение». Выберите домашнюю страницу блога в раскрывающемся списке страницы сообщений. Когда условия if истинны, сообщение с идентификатором 4 исключается из категории.

Допустим, у вас есть пользовательский тип сообщения под названием «Событие». поэтому вместо стандартных 10 сообщений на странице вы хотите 18. Если вы перейдете в «Настройки»> «Чтение» и измените количество сообщений на странице, это повлияет на ваши сообщения в блоге, а также на ваши события.

Мы будем использовать pre_get_posts для изменения posts_per_page только при соблюдении следующих условий:

  • В основном запросе
  • Не в области администрирования (мы хотим, чтобы это влияло только на отображение внешнего интерфейса)
  • В типе сообщения о событиях страница архива

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

приведенный выше код даст вам сообщения, относящиеся к категории одного загруженного сообщения. Структура статьи предоставит вам заголовок изображения связанных сообщений и постоянную ссылку, связанную с заголовком, текущие сообщения не будут снова загружаться в связанные сообщения и располагаться случайным образом, с сообщением на странице из 3 сообщений. Чтобы получить связанные статьи, мы также можем получить их с помощью pre_get_posts вышеуказанными методами, вместо запроса назначив их как is_single(), пожалуйста, найдите список условных тегов, таких как is_single(), is_home() здесь.

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

Изменение текущего запроса с помощью pre_get_posts

Pre_get_posts — это хук

«pre_get_posts» — это хук WordPress, который позволяет вам изменять текущий запрос. Небольшое напоминание: когда вы посещаете любую страницу установки WordPress, система создает запрос, который зависит от URL-адреса, который вы посещаете. Это в основном то, что делает иерархия шаблонов. Хук «pre_get_posts» вызывается после создания объекта переменной запроса, но до фактического выполнения запроса. Вот почему это позволяет вам изменить запрос до того, как результаты будут напечатаны на вашем экране. Это очень полезно для изменения, например, страницы архива, результатов поиска или страницы пользовательского типа записи. Вот информация о «pre_get_posts» в кодексе:

Действие pre_get_posts предоставляет разработчикам доступ к объекту $query по ссылке (любые изменения, которые вы вносите в $query, вносятся непосредственно в исходный объект — возвращаемое значение не требуется).

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

Ориентация на основной запрос

Большую часть времени при доступе к странице на веб-сайте WordPress вы загружаете больше, чем запросы, поэтому важно знать запрос, который вы хотите изменить при использовании «pre_get_posts». . Отличный способ узнать это — использовать обновление is_main_query() : $query->is_main_query() . Вот что кодекс говорит о функции is_main_query():

Эта функция позволяет кому-то подключиться к `pre_get_posts` и изменить *только* основной запрос. Это логическая функция, то есть она возвращает либо ИСТИНА, либо ЛОЖЬ. ПРИМЕЧАНИЕ. На экранах администратора также есть основной запрос, и эту функцию можно использовать для его обнаружения.

ПРИМЕЧАНИЕ : Марк Джекит объяснил мне через Twitter, что функцию is_main_query() больше нельзя использовать, так как она бесполезна, а условный оператор следует выполнять через

$query->is_main_query() ;

Ошибка @remicorson: is_main_query() должно быть $query->is_main_query(). Функция is_main_query() *бесполезна и не должна использоваться.

— Марк Джакит (@markjaquith) 27 января 2013 г.

Вот небольшой пример использования is_main_query и pre_get_posts:

Этот код просто удаляет сообщения из категории ID 5 из основного запроса.

Идем немного дальше

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *