Question

J'ai créé une taxonomie personnalisée "foo" avec slug Transforme "foo" et query_var "toto".

Dites par exemple, j'ai aussi des termes "bar" et "baz" dans la taxonomie "foo".

À l'heure actuelle, permaliens comme /foo/bar et /foo/baz excellent travail, en utilisant mon modèle de taxonomy-foo.php.

Ce que je voudrais faire est d'être en mesure de frapper /foo et récupérer tous les messages avec un lien vers une taxonomie « foo ». À l'heure actuelle, cette URL montre un 404.

Comment puis-je y parvenir? Si je peux en quelque sorte accrocher dans le code de réécriture et de définir une valeur à long terme par défaut ('all' par exemple) si elle est manquante, cela pourrait être un moyen d'aller de l'avant, mais je ne sais pas si cela est possible.

Je préférence comme d'utiliser le fichier modèle de taxonomy-foo.php pour le « fourre-tout », qui traite de la logique de montrer les messages d'un ou tous les termes là-dedans.

Vive

Modifier : J'ai pensé comment attraper une demande de /foo et définir des valeurs par défaut à l'aide add_filter('request', ...) si je devais utiliser un terme existant en utilisant rien d'autre génère un 404. Est-il possible de éviter cette limitation?

Était-ce utile?

La solution

Qu'est-ce que vous voulez est une page d'index pour taxonomies personnalisées . Il y a un billet pour cette , mais il est clair pas ce qui est la chose la plus évidente à afficher sur cette page: 1 ) une liste de tous les postes attaché à un terme de cette taxonomie, ou 2) une liste de tous les termes de cette taxonomie? Rappelez-vous que category est également une taxonomie, mais on suppose que tous les postes entrent dans au moins une catégorie (avec Uncategorized comme valeur par défaut). Dans ce cas, l'option 1 serait la même que la requête de la poste, et l'option 2 pourrait faire plus de sens.

La question connexe d'une page d'index pour coutume types de poste sera corrigé dans la prochaine 3.1 libérer .

J'ai essayé quelque chose de moi-même, et au lieu d'interférer avec le crochet de request, je pense que la meilleure façon de le faire est d'ajouter une nouvelle règle de réécriture et la modification de 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;
            }
        }
    }
}

Autres conseils

Bien que la réponse ci-dessus fonctionnera pour les configurations par défaut dans WordPress. Si vous réécrivez les noms de limaces pour vos taxonomies puis la réponse de Jan Fabry ne fonctionnera pas. Il faut juste une modification.

Aussi je suggère de ne le faire, car cela ne rentre pas avec d'autres plug-ins que vous utilisez peut-être qui ne sait pas que vous utilisez une page d'index pour votre taxonomie. Il commencera avis undefined crachant 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;
            }
        }
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à wordpress.stackexchange
scroll top