it-swarm.com.de

WP Rewrite Rules - Benutzerdefinierter Beitragstyp und Taxonomie

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.

enter image description here

enter image description here

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.

2
Drew

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 );
3
Milo