web-dev-qa-db-fra.com

Le changement de permalien de la taxonomie personnalisée provoque une erreur 404 pour une autre taxonomie personnalisée

J'ai créé des permaliens personnalisés basés sur la hiérarchie à l'aide de ce lien , mais il provoque maintenant une erreur 404 sur une autre taxonomie personnalisée utilisée dans le site. Je veux aussi des permaliens personnalisés sur cette autre taxonomie, mais si je n'utilise aucun argument de réécriture et si je le laisse sur son permalien par défaut, cela ne fonctionne toujours pas.

Mon code pour la deuxième taxonomie:

register_post_type( 
    'gallery',
    array(
        'public'               => true,
        'menu_position'        => 15,
        'supports'             => array( 'title', 'editor', 'comments', 'thumbnail' ),
        'taxonomies'           => array( '' ),
        'menu_icon'            => get_template_directory_uri() . '/img/icon_gallery.png',
        'register_meta_box_cb' => 'add_gallery_metaboxes'
    )
);
register_taxonomy(
    'gallery_category',
    'gallery',
    array(
        'hierarchical' => true,
        'labels'       => $labels
    )
);

Et voici mon premier code de taxonomie personnalisé:

register_post_type( 
    'article',
    array(
        'public'        => true,
        'hierarchical'  => true,
        'menu_position' => 15,
        'supports'      => array( 'title', 'editor', 'comments', 'thumbnail' ),
        'taxonomies'    => array( '' ),
        'menu_icon'     => get_template_directory_uri() . '/img/icon_article.png',
        'query_var'     => true,
        'rewrite'       => array(
            'slug'       => '%article_category%/articles',
            'with_front' => true
        ),
        'has_archive'          => '%article_category%',
        'register_meta_box_cb' => 'add_article_metaboxes'
    )
);
register_taxonomy(
    'article_category',
    'article',
    array(
        'hierarchical' => true,
        'labels'       => $labels,
        'query_var'    => true,
        'rewrite'      => array( 'slug' => '', 'hierarchical' => true ),
    )
);

Fonction pour permalien personnalisé:

function filter_post_type_link( $link, $post ) {
    if ( $post->post_type != 'article' )
        return $link;
    if ( $cats = get_the_terms( $post->ID, 'article_category' ) ) {
        $link = str_replace( '%article_category%', get_taxonomy_parents( array_pop( $cats )->term_id, 
            'article_category', false, '/', true ), $link ); // See custom function defined below
    }
    return $link;
}
add_filter( 'post_type_link', 'filter_post_type_link', 10, 2 );
2
Noman

Après de nombreux efforts, je l'ai résolu, mais ce n'est pas tout à fait ce que je veux, car je devais faire un compromis sur une chose et passer quelques séparateurs dans l'URL. Exemple:

example.com/separator1/parentatx/childtax/separator2/postname/

Afin d'éviter les erreurs 404, en cas de pagination et d'une autre taxonomie personnalisée, j'ai créé des règles de réécriture. Voici mon code:

Premier type de message et code d'enregistrement de taxonomie personnalisée:

register_post_type( 
    'article',
    array(
        'public'        => true,
        'hierarchical'  => true,
        'menu_position' => 15,
        'supports'      => array( 'title', 'editor', 'comments', 'thumbnail' ),
        'taxonomies'    => array( '' ),
        'menu_icon'     => get_template_directory_uri().'/img/icon_article.png',
        'query_var'     => true                              
        'rewrite'       => array(
            'slug'       => 'articles/%article_category%/topic/',
            'with_front' => true
        ),
        'has_archive'          => '/all-articles/',
        'register_meta_box_cb' => 'add_article_metaboxes'
    )
);
register_taxonomy( 
    'article_category',
    'article',
    array(
        'hierarchical' => true,
        'labels'       => $labels,
        'query_var'    => true,
        'rewrite'      => array( 'slug' => '/articles/', 'hierarchical' => true ),
    )
);

Dans la première taxonomie personnalisée, j'ai utilisé "articles" et "sujet" comme séparateurs; vous pouvez utiliser n'importe lequel selon votre scénario.

Deuxième type de poste et code d'enregistrement de taxonomie personnalisée:

register_post_type( 
    'gallery',
    array(
        'public'        => true,
        'menu_position' => 15,
        'supports'      => array( 'title', 'editor', 'comments', 'thumbnail' ),
        'taxonomies'    => array( '' ),
        'menu_icon'     => get_template_directory_uri().'/img/icon_gallery.png',
        'query_var'     => true,
        'rewrite'       => array(
            'slug'       => 'galleries/%gallery_category%/images/',
            'with_front' => true
        ),
        'has_archive'          => '/all-galleries/',
        'register_meta_box_cb' => 'add_gallery_metaboxes'
    )
);

Dans la deuxième taxonomie personnalisée, j'ai utilisé les "galeries" et les "images" comme séparateurs; vous pouvez utiliser n'importe lequel selon votre scénario.

La fonction pour réécrire les règles:

add_filter( 'rewrite_rules_array', 'mmp_rewrite_rules' );
function mmp_rewrite_rules( $rules ) {
    $newRules  = array();
    //Rules for First Taxonomy
    $newRules['articles/(.+)/(.+)/(topic)/(.+)/?$'] = 'index.php?article=$matches[4]'; 
    $newRules['articles/(.+)/(topic)/(.+)/?$'] = 'index.php?article_category=$matches[1]&article=$matches[3]';
    $newRules['articles/(.+)/(.+)/?([0-9]{1,})/?$'] = 'index.php?article_category=$matches[1]&page=$matches[3]';
    $newRules['articles/(.+)/(.+)/(page)/?([0-9]{1,})/?$'] = 'index.php?article_category=$matches[1]&page=$matches[4]';
    $newRules['articles/(.+)/?$'] = 'index.php?article_category=$matches[1]';
    //Rules for Second Taxonomy
    $newRules['galleries/(.+)/(.+)/(images)/(.+)/?$'] = 'index.php?gallery=$matches[4]'; 
    $newRules['galleries/(.+)/(images)/(.+)/?$'] = 'index.php?gallery_category=$matches[1]&gallery=$matches[3]';
    $newRules['galleries/(.+)/(.+)/?([0-9]{1,})/?$'] = 'index.php?gallery_category=$matches[1]&page=$matches[3]';
    $newRules['galleries/(.+)/(.+)/(page)/?([0-9]{1,})/?$'] = 'index.php?gallery_category=$matches[1]&page=$matches[4]';
    $newRules['galleries/(.+)/?$'] = 'index.php?gallery_category=$matches[1]'; 

    return array_merge( $newRules, $rules );
}

Les fonctions permettant de modifier l'URL de type d'article personnalisé en fonction de la hiérarchie de taxonomie personnalisée:

function filter_post_type_link( $link, $post ) {
    if ( $post->post_type != 'article' && $post->post_type != 'gallery' )
        return $link;       
    if ( $post->post_type == 'article' ) {
        if ( $cats = get_the_terms( $post->ID, 'article_category' ) ) {
            $link = str_replace( '%article_category%', get_taxonomy_parents( array_pop( $cats )->term_id, 
                'article_category', false, '/', true ), $link ); // See custom function defined below
        }
        return $link;
    } elseif ( $post->post_type == 'gallery' ) {
        if ( $cats = get_the_terms( $post->ID, 'gallery_category' ) ) {
            $link = str_replace('%gallery_category%', get_taxonomy_parents( array_pop( $cats )->term_id, 
                'gallery_category', false, '/', true ), $link); // See custom function defined below
        }
        return $link;
    }
}
add_filter( 'post_type_link', 'filter_post_type_link', 10, 2 );

// My own function to do what get_category_parents does for other taxonomies
function get_taxonomy_parents( $id, $taxonomy, $link = false, $separator = '/', $nicename = false, $visited = array() ) {
    $chain = '';   
    $parent = &get_term( $id, $taxonomy );
    if ( is_wp_error( $parent ) ) {
        return $parent;
    }
    if ( $nicename )    
        $name = $parent -> slug; 
    else    
        $name = $parent -> name;
    if ( $parent -> parent && ( $parent -> parent != $parent -> term_id ) && !in_array( $parent -> parent, $visited ) ) {
        $visited[] = $parent -> parent;    
        $chain .= get_taxonomy_parents( $parent -> parent, $taxonomy, $link, $separator, $nicename, $visited );
    }
    if ( $link ) {
        // Nothing, can't get this working :(
    } else {   
        $chain .= $name . $separator;    
    }
    return $chain;    
}
1
Noman