Ich habe seit ein paar Tagen meinen Kopf gegen die Wand geschlagen, um das herauszufinden. Ich habe einen benutzerdefinierten Beitragstyp und eine benutzerdefinierte Taxonomie und versuche, meine URLs zum Laufen zu bringen.
Hier ist die URL-Struktur, die ich anstrebe: http://url.dev/custom-post-type/taxonomy/post-name/
Die ersten beiden Teile funktionieren. Ich kann nur custom-post-type
aufrufen und es wird meine archive-custom-post-type.php -Datei verwendet. Ich kann auch zu /custom-post-type/taxonomy
gehen und es verwendet mein taxonomy-name.php .
Wenn ich jedoch versuche, zu einem tatsächlichen Beitrag zu wechseln, erhalte ich eine 404-Fehlerseite. Ich verwende das Rewrite Analyzer Plugin und es sieht so aus, als ob meine Rewrite-Regeln korrekt sind. Hier sind ein paar Screenshots.
Das sieht richtig aus, das muss passieren. Ich erhalte jedoch eine 404-Fehlermeldung, wenn ich versuche, auf eine der einzelnen Produktseiten zuzugreifen.
Hier ist meine aktuelle Rewrite-Regel in meiner functions.php
function taxonomy_slug_rewrite($wp_rewrite) {
$rules = array();
// get all custom taxonomies
$taxonomies = get_taxonomies(array('_builtin' => false), 'objects');
// get all custom post types
$post_types = get_post_types(array('public' => true, '_builtin' => false), 'objects');
foreach ($post_types as $post_type) {
foreach ($taxonomies as $taxonomy) {
// go through all post types which this taxonomy is assigned to
foreach ($taxonomy->object_type as $object_type) {
// check if taxonomy is registered for this custom type
if ($object_type == $post_type->rewrite['slug']) {
// get category objects
$terms = get_categories(array('type' => $object_type, 'taxonomy' => $taxonomy->name, 'hide_empty' => 0));
// make rules
foreach ($terms as $term) {
$rules[$object_type . '/' . $term->slug . '/([^/]*)/?'] = 'index.php?pagename=$matches[1]&' . $term->taxonomy . '=' . $term->slug;
}
}
}
}
}
// merge with global rules
$wp_rewrite->rules = $rules + $wp_rewrite->rules;
}
add_filter('generate_rewrite_rules', 'taxonomy_slug_rewrite');
Was mache ich falsch?
Wenn ich die Permalinks wieder auf die Standardeinstellung zurücksetze, kann ich zu folgender Adresse wechseln: http: //uss.local/? Ultrasound-equipment = sequoia-512 & equipment-manufacturer = acuson und es funktioniert einwandfrei. Aber wenn ich auf den Permalink "Post Name" umschalte, funktioniert das nicht.
Sie können dies erreichen, ohne für jeden Begriff eine Regel über das Argument rewrite
hinzuzufügen, wenn Sie Ihren Beitragstyp und Ihre Taxonomie registrieren. Die einzige zusätzliche Regel, die Sie benötigen, ist die Behandlung der Paginierung für die Taxonomie.
Registrieren Sie zuerst den Beitragstyp. Die Reihenfolge, in der Sie den Post-Typ und die Taxonomie registrieren, ist wichtig! Ich habe die meisten Argumente ausgelassen, um mich auf die wichtigen Punkte zu konzentrieren:
$args = array(
'has_archive' => 'custom-type',
'rewrite' => array(
'slug' => 'custom-type/%custom-tax%',
'with_front' => false
)
);
register_post_type( 'custom-type', $args );
Dann registriere die Taxonomie:
$args = array(
'rewrite' => array(
'slug' => 'custom-type',
'with_front' => false
)
);
register_taxonomy( 'custom-tax', array( 'custom-type' ), $args );
Fügen Sie dann die Umschreiberegel hinzu, um die Taxonomie-Paginierung zu handhaben:
function wpd_taxonomy_pagination_rewrites(){
add_rewrite_rule(
'custom-type/([^/]+)/page/([0-9]+)/?$',
'index.php?custom-tax=$matches[1]&paged=$matches[2]',
'top'
);
}
add_action( 'init', 'wpd_taxonomy_pagination_rewrites' );
Und um den ausgewählten Begriff im Permalink zu erhalten, filtern Sie post_type_link
:
function wpd_post_link( $post_link, $id = 0 ){
$post = get_post($id);
if ( is_object( $post ) && $post->post_type == 'custom-type' ){
$terms = wp_get_object_terms( $post->ID, 'custom-tax' );
if( $terms ){
foreach( $terms as $term ){
if( 0 == $term->parent ){
return str_replace( '%custom-tax%' , $term->slug , $post_link );
}
}
} else {
return str_replace( '%custom-tax%' , 'uncategorized', $post_link );
}
}
return $post_link;
}
add_filter( 'post_type_link', 'wpd_post_link', 1, 3 );