Mostrando el archivo de categorías de tipos de contenido personalizados
Llego bastante tarde a la fiesta de los Tipos de Contenido Personalizados y solo comencé a usarlos recientemente, así que me disculpo si mi pregunta parece tonta, pero no puedo encontrar una respuesta a mi duda.
He configurado un tipo de contenido personalizado llamado actors con algunos valores de campos personalizados y (crucialmente), estoy usando categorías estándar para separar estos actores en listados de hombres, mujeres y niños:
'taxonomies' => array('category', 'post_tag')
...ya que pensé que sería una forma mucho más limpia y ordenada de... bueno, categorizar los actores. Sin embargo, estoy completamente perdido sobre cómo mostrar estas categorías de cualquier manera, forma o estilo.
Tengo un archivo personalizado archive-actors.php
que muestra todos los actores, pero quiero poder filtrarlos por categoría; por ejemplo, mostrar solo los hombres. Sin embargo, si intento una URL estándar como misitio.com/category/actors/hombres
solo obtengo
Lo siento, pero aún no hay publicaciones en la categoría Hombres.
Lo mismo sucede si solo intento misitio.com/category/hombres
- en ningún caso está usando la plantilla archive-actors.php
.
¿Puede alguien ayudar a despejar mi niebla mental y señalarme en la dirección correcta para poder filtrar estos molestos actores?
Edición:
Como @mrwweb menciona abajo (y olvidé mencionar que lo había intentado), se puede agregar lo siguiente al archivo functions.php
:
function query_post_type($query) {
$post_types = get_post_types();
if ( is_category() || is_tag()) {
$post_type = get_query_var('actors');
if ( $post_type ) {
$post_type = $post_type;
} else {
$post_type = $post_types;
}
$query->set('post_type', $post_type);
return $query;
}
}
add_filter('pre_get_posts', 'query_post_type');
...como se referencia aquí, que sí funciona, en la medida en que mostrará mis tipos de contenido personalizados categorizados en la página regular archive.php
, pero no utiliza mi archive-actors.php
, que es lo fundamental.

Puedes forzar el uso de tu plantilla para categorías con el filtro category_template
:
function wpa57439_category_template( $templates = '' ){
if( !is_array( $templates ) && !empty( $templates ) ) {
$templates = locate_template( array( 'archive-actors.php', $templates ), false );
}
elseif( empty( $templates ) ) {
$templates = locate_template( 'archive-actors.php', false );
}
else {
$new_template = locate_template( array( 'archive-actors.php' ) );
if( !empty( $new_template ) ) array_unshift( $templates, $new_template );
}
return $templates;
}
add_filter( 'category_template', 'wpa57439_category_template' );
adaptado de Filter Hierarchy en el codex.

Ese es el comportamiento esperado de los archivos de categoría. Como se menciona aquí en los foros de Soporte, el siguiente fragmento de código debería resolver tu problema (solo cambia "article" por tu tipo de contenido):
add_filter('pre_get_posts', 'query_post_type');
function query_post_type($query) {
if(is_category() || is_tag()) {
$post_type = get_query_var('post_type');
if($post_type)
$post_type = $post_type;
else
$post_type = array('post','articles','nav_menu_item');
$query->set('post_type',$post_type);
return $query;
}
}
ACTUALIZACIÓN: Ups. Tomé el fragmento incorrecto. Quería usar este otro.

Por sí solo ese fragmento de código no hará nada; hay un corchete extra al final y $query
no está definido. Había encontrado el hilo que mencionaste antes y lo probé en el contexto de un filtro pre_get_posts
en mi archivo functions.php
; esto parece funcionar, pero no utiliza mi propia plantilla archive-actors.php
, lo cual es frustrante.

Alternativamente, lo que puedes hacer es agregar una nueva regla de wp_rewrite para crear una estructura de URL nueva que muestre solo publicaciones en un CPT y categoría específicos. Algo como el .gist que publiqué aquí:
[edición: no se pueden incrustar .gists así que aquí está el código y el enlace ]
/**
* Esto podría extrapolarse y usarse para etiquetas o cualquier otra taxonomía realmente.
*/
add_action('init', 'category_cpt_rewrites');
function category_cpt_rewrites() {
$custom_post_types = array('video', 'audio', 'photo', 'file'); //algunos ejemplos de tipos de publicación
foreach ( $custom_post_types as $post_type ) {
$rule = '^' . $post_type . '/category/(.+?)/?$';
$rewrite = 'index.php?post_type=' . $post_type . '&category_name=$matches[1]';
add_rewrite_rule($rule,$rewrite,'top');
}
}
//asegúrate de limpiar las reglas
//esto tomará la siguiente estructura de URL (ejemplo con CPT video y categoría política) -> video/category/politics y devolverá publicaciones pertenecientes a la categoría política que están en el tipo de publicación personalizado "video".
//nota que si quieres que esto sea realmente efectivo, deberás crear una función de plantilla personalizada "the_category()" o similar para devolver la estructura de URL correcta para una lista de categorías pertenecientes a una publicación de tipo de publicación personalizado.

Plantillas de Taxonomías
https://developer.wordpress.org/themes/template-files-section/taxonomy-templates/#custom-taxonomy
Cuando el slug de tu taxonomía de categoría es "actors-category":
Créala a partir de la plantilla de categoría: taxonomy-actors-category.php
