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');
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 seinDies 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;
}
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.