web-dev-qa-db-fra.com

WP Règles de réécriture - Type de message personnalisé et taxonomie

Je frappe ma tête contre le mur depuis quelques jours pour essayer de comprendre. J'ai un type de message personnalisé et une taxonomie personnalisée et j'essaie de faire fonctionner mes URL.

Voici la structure d'URL que je recherche: http://url.dev/custom-post-type/taxonomy/post-name/

Les deux premières parties fonctionnent. Je peux aller juste à custom-post-type et il utilise mon archive-custom-post-type.php fichier. Je peux aussi aller à /custom-post-type/taxonomy et il utilise mon taxonomy-name.php .

Cependant, lorsque j'essaie d'accéder à un message réel, cela me donne une page d'erreur 404. J'utilise le Rewrite Analyzer plugin, et il semble que mes règles de réécriture soient correctes. Voici quelques captures d'écran.

enter image description here

enter image description here

Cela semble juste, c'est ce qui doit arriver. Mais je reçois une erreur 404 lorsque j'essaie d'accéder à l'une des pages de produits uniques.

Voici ma règle de réécriture actuelle dans mon fichier 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');

Y a-t-il quelque chose que je fais mal?

Si je remets les permaliens à leur valeur par défaut, je peux accéder à: http: //uss.local/? Ultrasound-equipment = sequoia-512 & equipment-manufacturer = acuson et cela fonctionne très bien. Mais quand je passe à "Post Name" permalink, cela ne fonctionne pas.

2
Drew

Vous pouvez y parvenir sans ajouter de règle pour chaque terme via l'argument rewrite lorsque vous enregistrez votre type d'article et votre taxonomie. La seule règle supplémentaire dont vous avez besoin est de gérer la pagination pour la taxonomie.

Commencez par enregistrer le type de message. L'ordre que vous enregistrez après le type de poste et la taxonomie est important! J'ai omis la plupart des arguments pour mettre l'accent sur les éléments importants:

$args = array(
    'has_archive' => 'custom-type',
    'rewrite' => array(
        'slug' => 'custom-type/%custom-tax%',
        'with_front' => false
    )
);
register_post_type( 'custom-type', $args );

Puis enregistrez la taxonomie:

$args = array(
    'rewrite' => array(
        'slug' => 'custom-type',
        'with_front' => false
    )
);
register_taxonomy( 'custom-tax', array( 'custom-type' ), $args );

Ajoutez ensuite la règle de réécriture pour gérer la pagination de la taxonomie:

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

Et pour obtenir le terme sélectionné dans le permalien, filtrez 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