Как получить тип произвольной записи на странице архива?

17 мар. 2013 г., 21:02:10
Просмотры: 46.1K
Голосов: 9

На моем сайте есть три типа произвольных записей: 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 для архива плагинов. К сожалению, у меня установлена тема, которая, насколько я знаю, в некотором роде препятствует этому. Так что этот вариант не подходит.

0
Все ответы на вопрос 6
4
15

Есть несколько способов сделать это. Добавьте:

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, который возвращает совершенно разные данные в зависимости от контекста.

17 мар. 2013 г. 21:36:10
Комментарии

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

pek pek
18 мар. 2013 г. 01:18:27

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

pek pek
18 мар. 2013 г. 01:19:25

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

Mark Mark
3 сент. 2015 г. 18:14:32

get_queried_object() возвращает различные объекты в зависимости от контекста.

s_ha_dum s_ha_dum
3 сент. 2015 г. 18:26:42
0
10

Вот нужная вам функция:

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

Я заметил, что в нескольких комментариях к принятому ответу упоминается этот момент, но хочу сделать его более понятным для тех, кто быстро просматривает ответы: объект 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;
}
29 окт. 2020 г. 16:50:00
1
die(var_dump(get_taxonomy(get_queried_object()->taxonomy)->object_type));

Думаю, это ответ на ваш вопрос.

Удачного кодинга!!!

21 окт. 2016 г. 12:12:28
Комментарии

Возвращает NULL, даже если я попробовал это на странице архива. Не хорошо.

WordPress Mechanic WordPress Mechanic
7 дек. 2016 г. 12:17:46
3

Почему бы просто не использовать get_query_var('post_type')?

https://developer.wordpress.org/reference/functions/get_query_var/

10 февр. 2021 г. 14:46:08
Комментарии

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

Tony Djukic Tony Djukic
10 февр. 2021 г. 21:26:47

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

GantangPedia GantangPedia
11 февр. 2021 г. 05:05:12

Честно говоря, это должен быть принятый ответ

MikeeeG MikeeeG
11 окт. 2024 г. 14:07:04
0

Нет других хороших вариантов, кроме создания шаблона!

Или включения файла шаблона, когда обращаются к архиву произвольного типа записи (в соответствии с его 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/

17 мар. 2013 г. 21:57:29