Получение ID категории внутри шаблона категории

29 мая 2011 г., 21:41:37
Просмотры: 88.6K
Голосов: 27

Как мне получить ID категории внутри шаблона. Очень важно: Я не могу сделать это по названию, потому что у нас есть несколько категорий с одинаковым названием. Различаются только slug'и. Если бы я мог получить slug, это тоже подошло бы. Но как я уже сказал: я не могу использовать название категории.....

0
Все ответы на вопрос 9
0
43

$wp_query->get_queried_object() возвращает "текущий запрашиваемый объект". На странице архива категории это объект категории, на странице автора - объект автора, на отдельной записи - сама запись... в общем, вы поняли идею. Если вам нужен только ID, вы можете использовать $wp_query->get_queried_object_id().

29 мая 2011 г. 23:06:39
1
20

на основе моего поиска вам следует использовать это:

$category = get_queried_object();
echo $category->term_id;
4 февр. 2017 г. 10:45:53
Комментарии

Я предполагаю, что вы получили минус, потому что не объясняете, почему это помогает, а просто утверждаете, что это работает. Возможно, вам стоит изучить исходный код этой функции и добавить свои выводы в виде правки к ответу. Подсказка: если комментарий получается длиннее вашего ответа, то, вероятно, это должен был быть комментарий :)

kaiser kaiser
4 февр. 2017 г. 14:44:58
1

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

<?php
$category = get_the_category(); 
echo $category[0]->cat_ID;
?>

ИЗМЕНЕНО: Забудьте, это работало до тех пор, пока я не столкнулся с категорией, в которой не было записей — тогда код стал выводить ID подкатегории вместо основной категории. Нельзя полагаться на get_the_category() в шаблоне страницы категории.

1 июл. 2011 г. 15:53:16
Комментарии

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

cj5 cj5
21 нояб. 2017 г. 19:34:51
0

Если я правильно понял вопрос, можно также добавить ID или slug категории в класс body:

<?php if(is_category()) { $cat_ID = 'cat-'.get_query_var('cat'); } ?>
<body <?php body_class($cat_ID); ?>>
30 мая 2011 г. 01:51:48
0

Ответ @Jan Fabry на самом деле является правильным, и вот почему: Поскольку WordPress позволяет использовать несколько категорий для записи, использование $category = get_the_category() и запрос $category[0] не будет работать во всех случаях, потому что фактически вы запрашиваете первую категорию первой записи. Представьте, у вас есть категории A, B и C. Если у вас есть только одна запись, которая относится к категориям A и B, и вы находитесь на странице категории B, вы можете получить информацию о категории A вместо B.

Вот почему лучше использовать $category = $wp_query->get_queried_object(), потому что в предыдущем примере это всегда даст вам информацию о категории B, когда вы находитесь на странице категории B.

12 июл. 2011 г. 20:26:34
3

Вы можете использовать функцию get_the_category() для этого.

Пример:

<?php

$category = get_the_category(); 

// используйте это для вывода slug (ярлыка категории)
echo $category[0]->slug;

// используйте это для вывода ID категории
echo $category[0]->cat_ID;

// если у вас несколько категорий, можно использовать цикл foreach
foreach ( $category as $cat ) :

    echo '<li>' . $cat->name . '</li>';

endforeach;

?>

Также вы можете использовать:

<?php
    echo '<pre>';
    print_r($category);
    echo '</pre>';
?>

чтобы просмотреть массив возвращаемых объектов.

29 мая 2011 г. 22:51:19
Комментарии

вопрос 'как получить ID категории внутри шаблона' можно интерпретировать по-разному. внутри шаблона отдельной записи вы правы. это работает внутри цикла для получения категорий отдельной записи; однако, get_the_category() не будет работать на странице архива категории для получения ID категории, результат будет произвольным.

Michael Michael
30 мая 2011 г. 00:00:40

@Michael верно подмечено. @Jan дал более подходящий ответ в контексте этой конкретной ситуации.

VicePrez VicePrez
30 мая 2011 г. 00:16:40

get_the_category() действительно работает внутри category.php

Lea Cohen Lea Cohen
5 июл. 2011 г. 11:19:24
1
// Получаем текущую категорию
$category = get_category( get_query_var( 'cat' ) );

// Получаем ID категории
$cat_id = $category->cat_ID;

// Получаем цепочку родительских категорий, разделенных запятыми и разбиваем в массив
$catname = explode(",", get_category_parents($cat_id, '', ','));
print_r($catname);
11 янв. 2013 г. 13:20:26
Комментарии

Пожалуйста, объясните, почему это может решить проблему. Фрагмент кода не является ответом.

fuxia fuxia
11 янв. 2013 г. 14:38:24
0

Большинство приведённых выше примеров работают, но если вы используете несколько категорий, НИ ОДИН (на момент написания, версия WP 3.6) из других методов не работает для получения всех категорий, переданных в параметры "cat" или "category_name".

Пример URL архива с несколькими категориями: https://yoursite.com/cateogry/blue+yellow/ (да, такой URL работает на любом сайте WordPress, но используется редко)

Единственный способ, который я нашёл — это извлечь данные из:

$wp_query->query['category_name']

По какой-то причине это возвращает другое значение, чем get_query_var( 'category_name' ), который возвращает только первую категорию.

При использовании нескольких категорий вам придётся использовать функцию типа explode, чтобы получить массив слагов категорий, а затем пройтись по нему в цикле, чтобы получить все ID:

<?php
global $wp_query;

// получаем все категории из строки запроса (если используется `category_name`)
$category_slugs_array = explode("+",esc_attr($wp_query->query['category_name']));

$categories = array();
$category_ids = array();

// проходим по всем слагам
foreach($category_slugs_array as $category_slug)
{
    // получаем объект категории по слагу
    $category = get_category_by_slug( $category_slug );

    // проверяем, найдена ли соответствующая категория
    if(isset($category->cat_ID))
    {
        $categories[] = $category;
        $category_ids[] = $category->cat_ID;
    }
}

var_dump($categories); // массив категорий
var_dump($category_ids); // массив ID категорий

?>

Очевидно, что при использовании операторов AND (+) или OR (,) необходимо учитывать некоторые нюансы.

23 сент. 2013 г. 13:37:15
0
add_action( 'loop_start', 'demo_cat_id' );
function demo_cat_id() {

$terms = get_the_terms( get_queried_object_ID(), 'category' );

$term = array_pop( $terms );

echo $term->term_id;

}

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

10 янв. 2022 г. 08:12:35