web-dev-qa-db-fra.com

Affichage des archives de catégories de types d'articles personnalisés

Je suis terriblement en retard à la soirée sur les types de publications personnalisées et je n'ai commencé à les utiliser que très récemment. Je vous prie de m'excuser si mes questions me paraissent idiotes, mais je n'arrive pas à trouver de réponse à ma question.

J'ai configuré un type de publication personnalisé appelé acteurs avec quelques valeurs de champ personnalisées, et (élément crucial), j'utilise des catégories standard pour séparer ces acteurs en hommes , femmes et enfants listings:

'taxonomies' => array('category', 'post_tag')

... puisque je pensais que ce serait une façon beaucoup plus propre et plus ordonnée de ... eh bien, catégoriser les acteurs. Cependant, je suis complètement perplexe sur la manière d'afficher ces catégories de quelque manière que ce soit.

J'ai un fichier personnalisé archive-actors.php qui affiche tous des acteurs, mais je veux pouvoir les filtrer par catégorie; par exemple. affiche uniquement le men . Cependant, si je suppose qu’à une URL standard telle que mysite.com/category/actors/men, je viens d’obtenir

Désolé, il n'y a pas encore d'article dans la catégorie Hommes.

La même chose se produit si j'essaie juste mysite.com/category/men - dans les deux cas, le modèle archive-actors.php n'est pas utilisé non plus.

Quelqu'un peut-il m'aider à débarrasser mon esprit de brouillard et à me diriger dans la bonne direction afin que je puisse filtrer ces acteurs embêtants?

Modifier:

Comme @mrwweb fait allusion ci-dessous (et j'ai oublié de mentionner que j'avais déjà essayé), les éléments suivants peuvent être ajoutés au fichier 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');

... comme référencé ici qui fonctionne fonctionne dans la mesure où il affiche mes types de publication personnalisés catégorisés sur la page archive.php normale, mais n'utilise pas mon archive-actors.php, qui est la clé.

4
indextwo

Vous pouvez forcer l'utilisation de votre modèle pour les catégories avec le filtre 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' );

adapté de Hiérarchie des filtres en codex.

4
Milo

C'est le comportement attendu des archives de catégorie. Comme trouvé ici sur les forums d’assistance, le fragment de code suivant devrait résoudre votre problème (remplacez simplement "article" par votre type de publication):

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;
    }
}

MISE À JOUR: Gah. J'ai saisi le mauvais extrait. Je voulais utiliser celui-ci.

0
mrwweb

Alternativement, vous pouvez simplement ajouter une nouvelle règle wp_rewrite pour créer une nouvelle structure d'URL permettant d'afficher uniquement les publications dans un cpt et une catégorie donnés. Quelque chose comme le .Gist que j'ai posté ici:

[edit: impossible d'intégrer .gists alors voici le code et linky ]

/**
* This could be extrapolated and used for tags or any other taxonomy really.
*/

add_action('init', 'category_cpt_rewrites');

function category_cpt_rewrites() {
    $custom_post_types = array('video', 'audio', 'photo', 'file'); //some example post types
    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');
    }
}

//make sure you flush rules
//this will take the following url structure (video cpt as an example, and politics as a category example) -> video/category/politics and return posts belonging to the politics category that are in the "video" custom post type.

//note that if you want this to be truly effective you'll want to make a custom "the_category()" or similar template function to return the correct url structure for a category list belonging to a custom post type post.
0
Darren