Obtener el ID de categoría dentro de la plantilla de categoría
¿Cómo obtengo el ID de la categoría dentro de la Plantilla? Muy importante: No puedo hacerlo por el nombre, porque tenemos múltiples categorías con el mismo nombre. Solo el slug es diferente. Si pudiera obtener el slug, también estaría bien. Pero como dije: No puedo usar el título de la categoría.....

$wp_query->get_queried_object()
te dará el "objeto actualmente consultado". En un archivo de categoría este es el objeto de categoría, en una página de autor este es el autor, en una publicación individual esta es la publicación misma... bueno, ya entiendes la idea. Si solo quieres el ID también puedes usar $wp_query->get_queried_object_id()
.

Supongo que recibiste el voto negativo porque no estás explicando por qué ayuda, solo afirmando que lo hace. Podrías inspeccionar el código fuente de esa función y añadir tus hallazgos como edición a tu respuesta. Pista: Si un comentario necesita ser más largo que tu respuesta, entonces debería haber sido un comentario :)

No puedo comentar todavía, pero la respuesta de VicePrez sí funciona. Lo siguiente funciona bien en una página de archivo de categoría (aunque probablemente quieras hacer algo más que solo mostrarlo):
<?php
$category = get_the_category();
echo $category[0]->cat_ID;
?>
EDITADO: Olvida eso, funcionó para mí hasta que me encontré con una categoría que no tenía una publicación, entonces tomó la subcategoría en lugar de la categoría principal. No puedes confiar en get_the_category en una página de plantilla de categoría.

La respuesta de @Jan Fabry es en realidad la correcta, aquí está el porqué: Dado que WordPress permite múltiples categorías para una publicación, usar $category = get_the_category()
y consultar $category[0]
no funcionará en todos los casos, ya que lo que realmente estás haciendo es pedir la primera categoría de la primera publicación. Imagina que tienes las categorías A, B y C. Si solo tienes una publicación, que tiene las categorías A y B, y estás dentro de la página de la categoría B, podrías terminar con la información de A en lugar de la de B.
Por eso es mejor usar $category = $wp_query->get_queried_object()
, porque en el ejemplo anterior siempre te dará la información de B cuando estés dentro de la página de la categoría B.

Podrías usar get_the_category()
para hacer eso.
Ejemplo:
<?php
$category = get_the_category();
// usa esto para mostrar el slug
echo $category[0]->slug;
// usa esto para mostrar el ID de la categoría
echo $category[0]->cat_ID;
// si tienes múltiples categorías puedes ejecutar un bucle foreach así
foreach ( $category as $cat ) :
echo '<li>' . $cat->name . '</li>';
endforeach;
?>
Podrías usar:
<?php
echo '<pre>';
print_r($category);
echo '</pre>';
?>
para ver el array de objetos que se devuelve.

la pregunta 'cómo obtengo el ID de la categoría dentro de la plantilla' está abierta a diferentes interpretaciones. dentro de una plantilla de publicación única, tienes razón. funciona dentro del bucle para obtener las categorías de una publicación única; sin embargo, get_the_category()
no funcionará en una página de archivo de categorías para obtener el ID de la categoría, el resultado sería arbitrario.

@Michael cierto. @Jan parece haber dado una respuesta más apropiada en relación a ese contexto específico.

$category = get_category( get_query_var( 'cat' ) ); // Obtener la categoría actual
$cat_id = $category->cat_ID; // Obtener el ID de la categoría
$catname=explode(",",get_category_parents($cat_id,'',',')); // Obtener nombres de categorías padres separados por comas
print_r($catname); // Mostrar el array resultante

La mayoría de los ejemplos anteriores funcionan, pero si estás usando múltiples categorías, NINGUNO (al momento de escribir esto, versión WP 3.6) de los otros métodos funciona para obtener todas las categorías que se han pasado a "cat" o "category_name".
Este es el tipo de URL de archivo con múltiples categorías: https://yoursite.com/cateogry/blue+yellow/ (sí, este tipo de URL funciona en cualquier sitio de WordPress pero no se usa mucho)
La única forma que he encontrado es extraer los datos de:
$wp_query->query['category_name']
Por alguna razón, esto devuelve un valor diferente a get_query_var( 'category_name' )
, que solo devuelve la primera categoría.
Cuando usas múltiples categorías, tendrás que usar alguna función como explode
para obtener un array de slugs de categoría, luego iterar sobre ese array para obtener todos los IDs:
<?php
global $wp_query;
//obtener todas las categorías de la cadena de consulta (si usas `category_name`)
$category_slugs_array = explode("+",esc_attr($wp_query->query['category_name']));
$categories = array();
$category_ids = array();
//iterar sobre todos los slugs
foreach($category_slugs_array as $category_slug)
{
//obtener el objeto de categoría usando el slug
$category = get_category_by_slug( $category_slug );
//verificar que se haya encontrado una categoría coincidente
if(isset($category->cat_ID))
{
$categories[] = $category;
$category_ids[] = $category->cat_ID;
}
}
var_dump($categories); //array de categorías
var_dump($category_ids); //array de IDs de categoría
?>
Obviamente, hay que tener en cuenta algunas consideraciones al usar los operadores AND (+) u 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;
}
También puedes usar get_the_terms dentro de tu plantilla de archivo o archivo de funciones y usar el segundo parámetro para especificar tu taxonomía como categoría.
