it-swarm.com.de

Benutzerdefinierte Taxonomie-Listenseite, wenn kein Begriff festgelegt ist (alle Begriffe)

Ich habe eine benutzerdefinierte Taxonomie "foo" mit "foo" und "foo" für query_var erstellt.

Sagen wir zum Beispiel, ich habe auch die Begriffe "bar" und "baz" in der Taxonomie "foo".

Momentan funktionieren Permalinks wie /foo/bar und /foo/baz mit meiner taxonomy-foo.php-Vorlage einwandfrei.

Ich würde gerne /foo drücken und alle Posts mit einem Link zu einer "foo" -Taxonomie abrufen. Derzeit zeigt diese URL eine 404.

Wie kann ich das erreichen? Wenn ich mich irgendwie in den Code zum Umschreiben einhängen und einen Standard-Begriffswert (z. B. 'all') festlegen kann, wenn er fehlt, könnte dies eine Möglichkeit sein, voranzukommen, aber ich bin mir nicht sicher, ob dies möglich ist.

Ich möchte vorzugsweise die Vorlagendatei taxonomy-foo.php für "catch all" verwenden, um die Logik des Anzeigens von Beiträgen von einem oder allen Begriffen darin zu behandeln.

Prost

Bearbeiten : Ich habe herausgefunden, wie ich eine Anforderung für /foo abfangen und mit add_filter('request', ...) einige Standardeinstellungen festlegen kann, obwohl ich einen vorhandenen Begriff verwenden musste, da durch die Verwendung anderer Begriffe ein 404 generiert wird. Gibt es eine Möglichkeit, diese Einschränkung zu umgehen?

5
Phil Brown

Was Sie wollen, ist eine Indexseite für benutzerdefinierte Taxonomien . Es gibt ein Ticket dafür , aber es ist nicht klar, was auf dieser Seite am offensichtlichsten ist: 1) eine Liste aller Posts, die mit einem Begriff dieser Taxonomie verknüpft sind, oder 2) eine Liste aller Begriffe dieser Taxonomie? Denken Sie daran, dass category auch eine Taxonomie ist. Es wird jedoch davon ausgegangen, dass alle Posts in mindestens eine Kategorie fallen (mit Uncategorized als Standard). In diesem Fall ist Option 1 mit der regulären Nachabfrage identisch, und Option 2 ist möglicherweise sinnvoller.

Das damit verbundene Problem einer Indexseite für benutzerdefinierte Beitragstypenwird in der kommenden Version 3.1 behoben.

Ich habe selbst etwas ausprobiert. Anstatt den Hook request zu stören, ist es meiner Meinung nach besser, eine neue Umschreiberegel hinzuzufügen und die Abfrage zu ändern:

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

Die obige Antwort funktioniert jedoch für die Standardeinstellungen in WordPress. Wenn Sie die Slug-Namen für Ihre Taxonomien umschreiben, funktioniert die Antwort von Jan Fabry nicht. Es ist lediglich eine Änderung erforderlich.

Außerdem würde ich vorschlagen, dies nicht zu tun, da dies nicht zu anderen Plugins passt, die Sie möglicherweise verwenden und die nicht wissen, dass Sie eine Indexseite für Ihre Taxonomie verwenden. Es werden undefinierte Hinweise und andere Fehler angezeigt.

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