Mischen von benutzerdefinierten Post-Typ- und Taxonomie-Umschreibstrukturen?

30

Grundsätzlich möchte ich ein Glossar mit benutzerdefinierten Beitragstypen erstellen und habe einige Probleme beim Einrichten von Umschreibungen, wie ich sie haben möchte. Ich will es so:

Die Hauptglossar-URL: http://example.com/glossary/

Glossarbegriffe beginnend mit dem Buchstaben A : http://example.com/glossary/a/

Die URL für einen einzelnen Glossarbegriff: http://example.com/glossary/a/atomic/

Ich habe dies tatsächlich mit dem folgenden Code erreicht, aber ich bin sicher, dass dies eine sehr umständliche Methode ist, und ich weiß, dass es irgendwo eine Fehlfunktion gibt, da beim Anzeigen der Seiten die falschen Vorlagen aufgerufen werden. Mit Ausnahme von http://example.com/glossary/ , wo archive-sumo-glossary-term.php wie erwartet aufgerufen wird, aktivieren die beiden anderen einfach index.php in meinem Theme.

Hier geht es ( functions.phpim Thema):

add_action('init', 'create_glossary');
function create_glossary()
{
    register_post_type
    (
        'sumo-glossary-term',
        array
        (
            'labels' => array
            (
                'name' => _x('Glossary Terms', 'post type general name'),
                'singular_name' => _x('Glossary Term', 'post type singular name')
                # And so on …
            ),
            'supports' => array('title', 'editor', 'thumbnail'),
            'public' => true,
            'rewrite' => array
            (
                'slug' => 'glossary',
                'with_front' => false

            ),
            'query_var' => 'glossary-term',
            'has_archive' => true
        )
    );

    register_taxonomy
    (
        'sumo-glossary-letter',
        'sumo-glossary-term',
        array
        (
            'hierarchical' => true,
            'labels' => array
            (
                'name' => _x('Letters', 'taxonomy general name'),
                'singular_name' => _x('Letter', 'taxonomy singular name')
                # And so one
            ),
            'show_ui' => true,
            'query_var' => 'glossary-letter',
            'rewrite' => false
        )
    );
}

add_filter('post_type_link', 'glossary_term_permalink', 10, 4);
function glossary_term_permalink($post_link, $post, $leavename, $sample)
{
    if ($post->post_type == 'sumo-glossary-term')
    {
        $permalink = str_replace('glossary/', 'glossary/' . $post->post_name[0] . '/', $post_link);
    }
    return $permalink;
}

add_rewrite_rule('^glossary/([^/]*)?$','index.php?glossary-letter=$matches[1]','top');
add_rewrite_rule('^glossary/([^/]*)/([^/]*)?$','index.php?glossary-term=$matches[2]','top');
Maryisdead
quelle

Antworten:

30

Sie können die Vorlage, die mit dem template_includeoder einem verwandten Filter aufgerufen wird, jederzeit überschreiben , dies kann jedoch tiefere Probleme mit benutzerdefinierten Archiven verbergen.

Nach meinem Verständnis möchten Sie die folgende Struktur verwenden:

  • /glossary/sollte eine Archivseite für alle sumo-glossary-termBeiträge sein
  • /glossary/[letter]/sollte eine Archivseite für Beiträge mit dem Taxonomiebegriff [letter]in der sumo-glossary-letterTaxonomie sein
  • /glossary/[letter]/[term-name]/sollte ein einzelner sumo-glossary-termBeitrag sein

Dies bedeutet, dass die erste die Vorlage lädt archive-sumo-glossary-term.php, die zweite lädt taxonomy-sumo-glossary-letter.phpund die dritte lädt single-sumo-glossary-term.php.

Ich habe dies in WordPress 3.2 erreicht, indem ich explizit den Taxonomie-Überschreibungs-Slug sowie den Überschreibungs-Slug und den Archiv-Slug für den Beitragstyp und keine anderen Überschreibungsregeln festgelegt habe. Außerdem habe ich zuerst die Taxonomie und danach den Beitragstyp registriert, um sicherzustellen, dass die Prioritäten stimmen (andernfalls wird eine URL wie /glossary/f/page/2zum Glossarbegriff pageanstelle von Seite 2 des Glossarbriefs gesendet f).

add_action('init', 'create_glossary');
function create_glossary()
{

    register_taxonomy
    (
        'sumo-glossary-letter',
        array(),
        array
        (
            'hierarchical' => true,
            'labels' => array
            (
                'name' => _x('Letters', 'taxonomy general name'),
                'singular_name' => _x('Letter', 'taxonomy singular name')
                # And so one
            ),
            'show_ui' => true,
            'query_var' => 'glossary-letter',
            'rewrite' => array(
                'slug' => 'glossary',
            ),
        )
    );

    register_post_type
    (
        'sumo-glossary-term',
        array
        (
            'labels' => array
            (
                'name' => _x('Glossary Terms', 'post type general name'),
                'singular_name' => _x('Glossary Term', 'post type singular name')
                # And so on …
            ),
            'supports' => array('title', 'editor', 'thumbnail'),
            'public' => true,
            'rewrite' => array
            (
                'slug' => 'glossary/%sumo-glossary-letter%',
                'with_front' => false

            ),
            'query_var' => 'glossary-term',
            'has_archive' => 'glossary',
            'taxonomies' => array( 'sumo-glossary-letter' ),
        )
    );
}

add_filter('post_type_link', 'glossary_term_permalink', 10, 4);
function glossary_term_permalink($post_link, $post, $leavename, $sample)
{
    if ( false !== strpos( $post_link, '%sumo-glossary-letter%' ) ) {
        $glossary_letter = get_the_terms( $post->ID, 'sumo-glossary-letter' );
        $post_link = str_replace( '%sumo-glossary-letter%', array_pop( $glossary_letter )->slug, $post_link );
    }
    return $post_link;
}
Jan Fabry
quelle
Ich werde das morgen versuchen und sehen, ob es den Trick macht und hierher zurückkehren. Vielen Dank!
Maryisdead
Ok, nicht gerade für morgen ... Es hat fast perfekt funktioniert! Vielen Dank! Was nicht funktioniert ist /glossary/. Gibt mir einen 404 ( archive-sumo-glossary-term.phpist eingerichtet). Irgendwelche Ideen? Ich muss sagen, ich bleibe bei WP 3.0.1 und es ist möglicherweise ein Versionsproblem. Muss ich nochmal testen, wenn ich ein Upgrade durchführen kann. Auf jeden Fall funktioniert es größtenteils und im Moment brauche ich es nicht unbedingt /glossary/und leite einfach zu Buchstabe A weiter. Nochmals vielen Dank!
Maryisdead
hey @maryisdead, ich hatte genau das gleiche Problem und fand genau die gleiche Lösung, aber ich hatte genau das gleiche Problem - wie kommst du zu / glossary, um zur Vorlage archive-glossery.php zu gelangen? Ich habe gerade die Antwort gefunden - benutze 'has_archive' => 'glossary', anstatt zu has_archive => true bemerken, dass Jan sie so in seiner Antwort hat, aber du hast sie nicht so in deinem ursprünglichen Code - hast du diesen Teil aktualisiert? Es begann für mich zu arbeiten, sobald ich diese Änderung vornahm
Jeff
Hey Jeff! Ja, diesen Teil aktualisiert. Nur nochmal überprüft, funktioniert immer noch nicht. Die betreffende WordPress-Installation ist noch nicht auf dem neuesten Stand (3.0.1). Vielleicht ist das noch die Wurzel des Problems.
Maryisdead
Gleiches Problem hier mit WP 3.2.1. Immer noch keine Lösung?
Richard B
0

Ich habe dies nicht persönlich verwendet, aber was Sie vielleicht sehen möchten, ist "add_rewrite_rule".

http://codex.wordpress.org/Rewrite_API/add_rewrite_rule

Vergiss auch nicht, Permalinks zu speichern, wenn du sie geändert hast.

eeMZee
quelle
Ich benutze eigentlich add_rewrite_rule, scrolle einfach meinen Code nach unten. :-) Bisher funktioniert es einwandfrei, nur dass bei dieser Vorgehensweise die falschen Vorlagen aufgerufen werden.
Maryisdead