get_queried_object() возвращает null в архиве дат записей

6 янв. 2014 г., 00:32:56
Просмотры: 23.7K
Голосов: 8

get_queried_object() возвращает null в архивах дат записей (тип страницы is_date()) и на главной странице блога (тип страницы is_home()). Это задуманное поведение или просто недосмотр?

Я писал обёртку вокруг get_queried_object() для получения заголовка текущей страницы, независимо от её типа, для использования в теме. Я быстро понял, что вместо использования get_query_object() мне следует просто продублировать важные части из wp_title(), но до этого я столкнулся с интересной проблемой.

Похоже, что get_queried_object() и его основная функция WP_Query->get_queried_object() возвращают null для нескольких типов списков, включая основной список записей, выводимый через index.php (тип страницы is_home()) и архивы записей по датам (тип страницы is_date()).

Я протестировал это, добавив следующий фрагмент в несколько файлов шаблонов в разных местах, всегда после get_header() и перед the_post():

<pre><code><?php
    $queried_object = get_queried_object();
    var_dump( $queried_object );
?></code></pre>

Это отлично работает в архивах категорий, меток, пользовательских таксономий и архивах пользовательских типов записей. get_queried_object() возвращает объект запроса, который можно использовать для извлечения заголовка страницы и другой полезной информации.

Однако это не работает в archive.php для стандартных архивов дат записей и в index.php для обычного списка записей блога на главной странице.

Изучение исходного кода WP_Query->get_queried_object() показывает нечто неудивительное: там нет проверки для типа страницы is_home() или типа страницы is_date(), поэтому на этих типах страниц $this->queried_object = null; не обновляется, и функция возвращает null.

Итак, мой вопрос: это предусмотренная функциональность (например, не предполагается использовать get_queried_object() на этих страницах), техническое ограничение (нет значимого объекта для возврата на этих страницах) или просто недосмотр в реализации?

Существует ли вообще эквивалент объекта пользовательского типа записи для встроенного типа записи "запись блога" для отображения?

2
Комментарии

Отличное замечание +. WordPress мог бы сделать что-то, чтобы создать объект для архивов по дате и главной страницы курсив(примечание: он действительно возвращает объект, если страница блога установлена как страница WordPress, а не главная страница)курсив. Но в итоге нет осмысленного использования get_queried_object.

Shazzad Shazzad
6 янв. 2014 г. 00:49:23

Я не знаю, как ответить на этот вопрос, честно говоря, но да, get_queried_object очень непоследователен и возвращает несколько разных объектов, а иногда возвращает null. Хотя он полезен, работать с ним может быть неприятно.

s_ha_dum s_ha_dum
6 янв. 2014 г. 01:02:38
Все ответы на вопрос 1
7

Итак, мой вопрос: это запланированное поведение (например, не предполагается использование get_queried_object() на этих страницах), техническое ограничение (нет значимого объекта для возврата на этих страницах) или просто упущение в реализации?

get_queried_object() предназначен для получения объекта термина, автора, отдельной записи, отдельного произвольного типа записи или страницы, по которым выполняется запрос. Да, это запланированное поведение, и именно для этого была создана данная функция.

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

Редактирование:

Согласно первому комментарию ниже, автору нужно получить объект post_type. Объект post_type отличается от queried_object. Если вам нужно получить объект post_type на странице архива, вы можете получить его из query_vars.

global $wp_query;

$post_type_object = get_post_type_object( $wp_query->query_vars['post_type'] );
6 янв. 2014 г. 01:52:57
Комментарии

Это раздражает; если для архивных страниц произвольных типов записей возвращается что-то осмысленное (объект произвольного типа записи), то почему не должно возвращаться что-то подобное для стандартных архивных страниц типа записи post? Полагаю, это можно объяснить историей WP как более узконаправленного движка для блогов, но есть ли веская причина, по которой встроенные типы записей должны получать такое особое обращение и не иметь функциональности, аналогичной произвольным типам? Было бы полезнее, если бы произвольные типы записей можно было бы проще смешивать со встроенными.

Dakota Dakota
6 янв. 2014 г. 23:20:48

Есть другие способы получить то, что вам нужно. Функция get_queried_object применима ТОЛЬКО если запрос относится к категории, автору, постоянной ссылке или Странице. Содержит информацию о запрошенной категории, авторе, записи или Странице. Все остальное хранится в query_vars.

Chris_O Chris_O
6 янв. 2014 г. 23:38:05

Тогда мое недоумение касается функциональности get_queried_object() на архивных страницах произвольных типов записей, но не на стандартных архивных страницах записей. Если get_queried_object() возвращает объект типа записи на архивных и индексных страницах произвольных типов записей, то логично было бы ожидать, что он будет возвращать объект типа записи и на стандартных архивных и индексных страницах записей. Я приму ситуацию, если это просто исторически сложилось и особое обращение со встроенными типами записей нужно для обратной совместимости, но хотелось бы получить объяснение.

Dakota Dakota
7 янв. 2014 г. 06:33:08

Я думаю, есть полезная информация, которую было бы здорово иметь:

какой год/месяц/день запрашивается, количество постов/max_num_pages

Thomas Fellinger Thomas Fellinger
22 окт. 2016 г. 17:01:52

также обратите внимание, что на страницах архива автора get_queried_object() возвращает объект WP_User, тогда как на архивах, основанных на терминах, он возвращает объект WP_Term - поэтому сначала нужно проверить возвращаемые значения get_queried_object(), чтобы использовать в общем шаблоне архива - и объект WP_Date отсутствует.

поскольку в archive.php стандартных тем заголовок даты использует get_the_date(), который в свою очередь использует get_post(), он отображает только дату первого показанного поста, и это логично работает, но не точно отражает запрос, хотя на основе этого все остальное работает как ожидается.

Thomas Fellinger Thomas Fellinger
22 окт. 2016 г. 17:02:02

Я думаю, это упущение, и вероятно нужно создать тикет в треке с патчем, если кто-то заинтересован в его создании.

WraithKenny WraithKenny
15 нояб. 2017 г. 22:34:55

@Chris_O ~ "Если вы находитесь на архиве дат, главной странице или поиске, то нет единого объекта запроса." Это полный список? Документации по этому вопросу не так много.

Nathan Powell Nathan Powell
2 мар. 2019 г. 03:11:44
Показать остальные 2 комментариев