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

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

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

Пока не могу комментировать, но ответ VicePrez действительно работает. Следующий код отлично работает на странице архива категории (хотя вам, вероятно, нужно сделать что-то большее, чем просто вывести ID):
<?php
$category = get_the_category();
echo $category[0]->cat_ID;
?>
ИЗМЕНЕНО: Забудьте, это работало до тех пор, пока я не столкнулся с категорией, в которой не было записей — тогда код стал выводить ID подкатегории вместо основной категории. Нельзя полагаться на get_the_category() в шаблоне страницы категории.

Ответ @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.

Вы можете использовать функцию 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>';
?>
чтобы просмотреть массив возвращаемых объектов.

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

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

// Получаем текущую категорию
$category = get_category( get_query_var( 'cat' ) );
// Получаем ID категории
$cat_id = $category->cat_ID;
// Получаем цепочку родительских категорий, разделенных запятыми и разбиваем в массив
$catname = explode(",", get_category_parents($cat_id, '', ','));
print_r($catname);

Большинство приведённых выше примеров работают, но если вы используете несколько категорий, НИ ОДИН (на момент написания, версия 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 (,) необходимо учитывать некоторые нюансы.

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