it-swarm.com.de

Mischen von eigenen Post-Typ- und Taxonomie-Umschreibestrukturen?

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 BuchstabenA: 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's (functions.php im Theme):

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');
30
maryisdead

Sie können die Vorlage, die aufgerufen wird, immer mit dem template_include oder einem verwandten Filter ü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-term Posts sein
  • /glossary/[letter]/ sollte eine Archivseite für Posts mit dem Taxonomiebegriff [letter] in der Taxonomie sumo-glossary-letter sein
  • /glossary/[letter]/[term-name]/ sollte ein individueller sumo-glossary-term Beitrag sein

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

Ich habe dies in WordPress 3.2 erreicht, indem ich explizit den Taxonomie-Umschreibe-Slug sowie den Umschreibe-Slug und den Archiv-Slug für den Beitragstyp und keine anderen Umschreiberegeln festgelegt habe. Außerdem habe ich zuerst die Taxonomie und danach den Post-Typ registriert, um sicherzustellen, dass die Prioritäten stimmen (andernfalls wird eine URL wie /glossary/f/page/2 zum Glossarbegriff page anstelle von Seite 2 des Glossarbriefs 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;
}
29
Jan Fabry

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.

0
eeMZee