Mostrando el archivo de categorías de tipos de contenido personalizados

4 jul 2012, 18:24:10
Vistas: 24.9K
Votos: 6

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 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.

5
Comentarios

archive-actors.php es tu plantilla de archivo de tipo de entrada, no una plantilla de archivo de taxonomía. Este es un comportamiento normal y esperado.

Milo Milo
4 jul 2012 19:16:42

@Milo Entiendo. Con eso en mente, ¿existe algo como un archivo de taxonomía personalizada?

indextwo indextwo
4 jul 2012 19:34:47

Existe, pero es específico para una taxonomía personalizada. Si solo quieres forzar el uso de archive-actors.php en categorías, mira mi respuesta

Milo Milo
4 jul 2012 19:48:50

No utilices get_query_var(), usa $query->get(). Además, ¿quieres que esto afecte solo a la consulta principal? Si es así, necesitarás una verificación $query->is_main_query() junto con (is_category() || is_tag())

Stephen Harris Stephen Harris
4 jul 2012 19:53:35

6 años después, esta es una pregunta estúpida y muestra lo pobre que era mi comprensión de los CPTs. Me estoy poniendo los ojos en blanco muy fuerte ahora mismo.

indextwo indextwo
16 abr 2018 21:18:45
Todas las respuestas a la pregunta 4
0

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.

4 jul 2012 19:49:24
2

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.

4 jul 2012 18:34:37
Comentarios

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.

indextwo indextwo
4 jul 2012 18:55:07

El enlace al hilo está mal en varios lugares...

Stephen Harris Stephen Harris
4 jul 2012 19:45:42
0

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.
28 oct 2012 19:59:34
0

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

23 mar 2023 21:52:36