web-dev-qa-db-fra.com

Page de liste de taxonomie personnalisée quand aucun terme n'est défini (tous les termes)

J'ai créé une taxonomie personnalisée "foo" avec le slug de réécriture "foo" et query_var "foo".

Disons par exemple que j'ai aussi les termes "bar" et "baz" dans la taxonomie "foo".

Pour le moment, les liens permanents comme /foo/bar et /foo/baz fonctionnent correctement, à l'aide de mon modèle taxonomy-foo.php.

Ce que j'aimerais faire, c'est pouvoir cliquer sur /foo et récupérer toutes les publications avec un lien vers n'importe quelle taxonomie "foo". Actuellement, cette URL affiche un 404.

Comment puis-je atteindre cet objectif? Si je peux en quelque sorte intégrer le code de réécriture et définir une valeur de terme par défaut ('all' par exemple) s'il manque, cela pourrait être un moyen d'avancer, mais je ne suis pas sûr que cela soit possible.

Je préférerais utiliser le fichier modèle taxonomy-foo.php pour le "catch all", décrivant la logique d'affichage des messages d'un ou de tous les termes qu'il contient.

À votre santé

Edit : J'ai compris comment intercepter une demande pour /foo et définir des valeurs par défaut en utilisant add_filter('request', ...) bien que je sois obligé d'utiliser un terme existant, car toute autre utilisation génère un 404. Existe-t-il un moyen d'éviter cette limitation?

5
Phil Brown

Ce que vous voulez, c'est une page d'index pour les taxonomies personnalisées . Il y a un ticket pour cela , mais la chose la plus évidente à afficher sur cette page n'est pas claire: 1) une liste de tous les messages attachés à un terme de cette taxonomie, ou 2) une liste de tous les termes de cette taxonomie? N'oubliez pas que category est également une taxonomie, mais il est supposé que tous les messages tombent dans au moins une catégorie (avec Uncategorized par défaut). Dans ce cas, l'option 1 serait identique à la requête standard et l'option 2 aurait plus de sens.

Le problème connexe d’une page d’index personnalisée types de publicationsera résolu dans la prochaine version 3.1 .

J'ai essayé quelque chose moi-même et au lieu d'interférer avec le hook request, je pense que la meilleure façon de faire est d'ajouter une nouvelle règle de réécriture et de modifier la requête:

add_action( 'init', 'wpse4663_init' );
function wpse4663_init()
{
    // The custom taxonomy rewrite rules end up at the top of the rewrite array
    register_taxonomy(
        'wpse4663',
        array( 'post' ),
        array(
            'label' => 'WPSE 4663',
        )
    );

    // So there probably is no danger in adding this specific rewrite rule there too
    // We re-use the existing `taxonomy` query var, but with no `term`
    // We clean this up in `parse_query`, otherwise get_posts() complains
    // You could make this work for all taxonomies (categories, tags, ...) by doing this repeatedly
    // But then it's probably better to do this in the `rewrite_rules_array` filter
    add_rewrite_rule( 'wpse4663(/page/([0-9]+))?/?$', 'index.php?taxonomy=wpse4663&paged=$matches[2]', 'top' );
}

add_filter( 'parse_query', 'wpse4663_parse_query' );
function wpse4663_parse_query( &$wp_query )
{
    // is_tax is only true if both a taxonomy and a term are set, otherwise is_home is true
    // But we don't want that: is_tax and is_archive should be true, is_home should be false
    if ( !$wp_query->is_tax && $taxonomy_query = $wp_query->get( 'taxonomy' ) ) {
        foreach ( $GLOBALS['wp_taxonomies'] as $taxonomy => $t ) {
            if ( $t->query_var && $taxonomy_query == $t->query_var ) {
                // Make sure the conditional tags work, so the right template is loaded
                $wp_query->is_tax = true;
                $wp_query->is_archive = true;
                $wp_query->is_home = false;

                // Make is_tax($taxonomy) work
                $wp_query->queried_object = $t;
                $wp_query->queried_object->taxonomy = $taxonomy;

                // If term is null, get_terms (query.php line 2043) will get all terms of this taxonomy
                $wp_query->set( 'term', null );
                break;
            }
        }
    }
}
6
Jan Fabry

Bien que la réponse ci-dessus fonctionne pour les configurations par défaut dans wordpress. Si vous réécrivez les noms de slug pour vos taxonomies, la réponse de Jan Fabry ne fonctionnera pas. Cela nécessite juste une modification.

Aussi, je suggérerais de ne pas le faire car cela ne correspond pas aux autres plug-ins que vous utilisez, qui ne savent pas que vous utilisez une page d'index pour votre taxonomie. Il va commencer à cracher des avis non définis et d'autres erreurs.

add_action( 'init', 'wpse4663_init' );
function wpse4663_init()
{
    // The custom taxonomy rewrite rules end up at the top of the rewrite array
    register_taxonomy(
        'wpse4663',
        array( 'post' ),
        array(
            'label' => 'WPSE 4663',
        )
    );

    // So there probably is no danger in adding this specific rewrite rule there too
    // We re-use the existing `taxonomy` query var, but with no `term`
    // We clean this up in `parse_query`, otherwise get_posts() complains
    // You could make this work for all taxonomies (categories, tags, ...) by doing this repeatedly
    // But then it's probably better to do this in the `rewrite_rules_array` filter
    add_rewrite_rule( 'wpse4663(/page/([0-9]+))?/?$', 'index.php?taxonomy=wpse4663&paged=$matches[2]', 'top' );
}

add_filter( 'parse_query', 'wpse4663_parse_query' );
function wpse4663_parse_query( &$wp_query )
{
    // is_tax is only true if both a taxonomy and a term are set, otherwise is_home is true
    // But we don't want that: is_tax and is_archive should be true, is_home should be false
    if ( !$wp_query->is_tax && $taxonomy_query = $wp_query->get( 'taxonomy' ) )       {
        foreach ( $GLOBALS['wp_taxonomies'] as $taxonomy => $t ) {
            if($t->rewrite && isset($t->rewrite['slug']){
                $slug = $t->rewrite['slug'];
            }
            else{
                $slug = $t->query_var;
            }

            if ( $t->query_var && $taxonomy_query == $slug ) {
                // Make sure the conditional tags work, so the right template is loaded
                $wp_query->is_tax = true;
                $wp_query->is_archive = true;
                $wp_query->is_home = false;

                // Make is_tax($taxonomy) work
                $wp_query->queried_object = $t;
                $wp_query->queried_object->taxonomy = $taxonomy;

                // If term is null, get_terms (query.php line 2043) will get all terms of this taxonomy
                $wp_query->set( 'term', null );
                break;
            }
        }
    }
}
3
Vivek Gounder