Как получить тип произвольной записи на странице архива?
На моем сайте есть три типа произвольных записей: scripts, scenes и plugins. При посещении страницы архива отдельного типа записи (например, mysite.com/plugins) корректно отображаются все записи этого типа.
Как в файле archive.php определить, какой тип произвольной записи просматривает пользователь в данный момент?
Я попробовал следующее:
<?php
global $post;
$postTypeLabels = get_post_type_labels(get_post_type_object($post));
echo var_export($postTypeLabels);
?>
Но я получаю следующее:
Post name is stdClass::__set_state(
array( 'name' => 'Posts',
'singular_name' => 'Post',
'add_new' => 'Добавить новую',
'add_new_item' => 'Добавить новую запись',
'edit_item' => 'Редактировать запись',
'new_item' => 'Новая запись',
'view_item' => 'Просмотреть запись',
'search_items' => 'Поиск записей',
'not_found' => 'Записи не найдены.',
'not_found_in_trash' => 'В корзине записей не найдено.',
'parent_item_colon' => NULL,
'all_items' => 'Все записи',
'menu_name' => 'Записи',
'name_admin_bar' => NULL,
)
)
Я предполагаю, что поскольку я нахожусь на странице архива, переменная $post некорректна.
P.S. Я знаю, что могу создать archive-plugins.php для архива плагинов. К сожалению, у меня установлена тема, которая, насколько я знаю, в некотором роде препятствует этому. Так что этот вариант не подходит.
Есть несколько способов сделать это. Добавьте:
var_dump($wp_query->query,get_queried_object()); die;
В ваш файл archive.php
и вы увидите два из этих способов.
$wp_query->query
будет содержать параметр post_type
для пользовательских типов записей. Для стандартного типа записей post
этого параметра не будет. get_queried_object
вернет много данных для пользовательских типов записей, но null для стандартного типа post
.
Также существуют связанные теговые функции, которые могут помочь. Например, is_post_type_archive
.
Используя эти методы, вы сможете собрать нужную вам логику. Из вашего вопроса не совсем ясно, какой конечный результат вам нужен, поэтому я не могу дать более конкретных рекомендаций.
Поскольку вы явно указали archive.php
, я тестировал именно в этом шаблоне. Для других шаблонов может потребоваться другой код, особенно с get_queried_object
, который возвращает совершенно разные данные в зависимости от контекста.

get_query_object() - это то, что я искал. По сути, мне нужно было получить название пользовательского типа записи, но я решил оставить вопрос более общим для других пользователей. Спасибо.

Вот что я сделал, чтобы получить название пользовательского типа записи в archive.php: $qObj = get_queried_object(); echo $qObj->labels->name;

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

Вот нужная вам функция:
/**
* Получает название типа записи текущего архива (например: post, page, product).
*
* @return String|Boolean Название типа записи архива или false, если это не страница архива.
*/
function get_archive_post_type() {
return is_archive() ? get_queried_object()->name : false;
}

Я заметил, что в нескольких комментариях к принятому ответу упоминается этот момент, но хочу сделать его более понятным для тех, кто быстро просматривает ответы: объект global $wp_query
является более надежным для получения типа записи архива. Конкретно из $wp_query->query['post_type']
.
Можно использовать get_queried_object()
, но у этого метода есть ограничения. В частности, если в запросе есть другие параметры, например, таксономии, get_queried_object()
вернет объект WP_Term вместо ожидаемого типа записи.
Таким образом, если в архиве чистый запрос для типа записи, то get_queried_object()
сработает. Но для большей надежности используйте объект global $wp_query
.
Вот функция, которую вы можете использовать в своей теме для этих целей:
/*
* НАЗНАЧЕНИЕ: Если в архивном запросе нет результатов (или есть другие параметры), get_post_type() не является надежным способом определения типа записи архива. Эта функция получает тип записи из глобального объекта $wp_query.
* ПАРАМЕТРЫ: отсутствуют
* ВОЗВРАЩАЕТ: boolean / string - идентификатор типа записи из $wp_query или false, если он не найден.
* ПРИМЕЧАНИЯ:
*/
function jp_get_archive_post_type(){
$post_type = false;
global $wp_query;
if( isset($wp_query->query['post_type']) ){
$post_type = $wp_query->query['post_type'];
}
return $post_type;
}

Почему бы просто не использовать get_query_var('post_type')
?
https://developer.wordpress.org/reference/functions/get_query_var/

Попробуйте добавить немного больше информации в ваши ответы, это скорее комментарий.

Ну, другой информации нет. Вопрос звучит так: В archive.php, как я могу узнать, какой тип записей (custom post type) пользователь просматривает в данный момент?
С помощью get_query_var('post_type')
вы получите какой тип записей (custom post type) пользователь просматривает в данный момент

Нет других хороших вариантов, кроме создания шаблона!
Или включения файла шаблона, когда обращаются к архиву произвольного типа записи (в соответствии с его URL).
Дополнительная информация по ссылкам:
http://codex.wordpress.org/Function_Reference/load_template
wordpress - загрузка шаблона на основе URI
http://www.mihaivalentin.com/wordpress-tutorial-load-the-template-you-want-with-template_redirect/
