web-dev-qa-db-fra.com

La taxonomie des parents et des enfants dans les messages personnalisés permalien

J'ai enregistré un type de message personnalisé "livre" et une taxonomie "auteurs" comme ci-dessous:

add_action( 'init', 'post_book_init' );

function post_book_init() {

    $labels = array(
        'name'               => 'BOOKs',
        'singular_name'      => 'BOOK',
        'menu_name'          => 'BOOKs',
        'name_admin_bar'     => 'BOOK',
        'add_new'            => 'Add New',
        'add_new_item'       => 'Add New BOOK',
        'new_item'           => 'New BOOK',
        'edit_item'          => 'Edit BOOK',
        'view_item'          => 'View BOOK',
        'all_items'          => 'All BOOKs',
        'search_items'       => 'Search BOOKs',
        'parent_item_colon'  => 'Parent BOOKs',
        'not_found'          => 'No BOOK found.',
        'not_found_in_trash' => 'No BOOK found in Trash.'
    );

    $args = array(
        'labels'             => $labels,
        'taxonomies'         => array('authors'),       
        'public'             => true,
        'publicly_queryable' => true,
        'show_ui'            => true,
        'show_in_menu'       => true,
        'query_var'          => true,
        'rewrite'            => false,  
        'with_front' => false,      
        'capability_type'    => 'post',
        'has_archive'        => 'bookarchives',
        'hierarchical'       => false,
        'menu_position'      => null,
        'supports'           => array( 'title', 'editor', 'author', 'thumbnail', 'excerpt', 'trackbacks','custom-fields','comments','revisions','page-attributes','post-formats' )
    );
    register_post_type('book', $args );

$labels = array(
        'name'              => 'Authors',
        'singular_name'     => 'Author',
        'search_items'      => 'Search Author',
        'all_items'         => 'All Authors',
        'parent_item'       => 'Parent Author',
        'parent_item_colon' => 'Parent Author:',
        'edit_item'         => 'Edit Author',
        'update_item'       => 'Update Author',
        'add_new_item'      => 'Add New Author',
        'new_item_name'     => 'New Author Name',
        'menu_name'         => 'Author'
    );

    $args = array(
        'hierarchical'      => true,
        'labels'            => $labels,
        'show_ui'           => true,
        'show_admin_column' => true,
        'show_in_nav_menus' => true,
        'query_var'         => true,
        'rewrite'           => array( 'slug' => 'authors' ),
    );

    register_taxonomy('authors', 'book', $args );

        global $wp_rewrite;
    $book_structure = '/book/%authors%/%book%-blah-blah-blah';
$wp_rewrite->add_rewrite_tag("%book%", '([^/]+)', "book=");
$wp_rewrite->add_permastruct('book', $book_structure, false);

    unset($labels);
    unset($args);
}

Je veux utiliser le terme taxonomie dans permalink et appliquer les règles de réécriture après l'enregistrement de post & taxonomy. Et également remplacé terme taxonomie en utilisant le code ci-dessous:

add_filter('post_type_link', 'author_permalink_structure', 10, 4);
function author_permalink_structure($post_link, $post, $leavename, $sample) {
    if (false !== strpos($post_link, '%authors%')) {
        $author_type_term = get_the_terms($post->ID, 'authors');
        if (!empty($author_type_term))
        {
            $author_slug = array_pop($author_type_term)->slug;
            $parent_slug=get_term(get_term_by('slug',$author_slug,'authors')->parent,'authors')->slug;
            $post_link = str_replace('%authors%', $author_slug, $post_link);
        }
        else
            $post_link = str_replace('%authors%', 'uncategorized', $post_link);
    }
    return $post_link;
}

Les liens suivants fonctionnent donc très bien: localhost/livre/[auteurs]/[titre-du-livre] -blah-blah blah et localhost/livre/[auteurs], mais j'ai aussi besoin de slugs taxonomie parentale avec taxonomie enfantine comme ]/[child-taxonomy-slug] J'ai essayé de concilier les slug parents et enfants avec "/", mais le résultat renvoyant une page 404 non trouvée, bien que concaténer avec "-" fonctionne correctement.

$author_slug = array_pop($author_type_term)->slug;
$parent_slug=get_term(get_term_by('slug',$author_slug,'authors')->parent,'authors')->slug;
$post_link = str_replace('%authors%', $parent_slug . "-" .$author_slug , $post_link);

Comment utiliser "[parent-taxonomy-slug]/[child-taxonomy-slug]" dans le permalien?

1
Mihir

Pour gérer le segment d'URL supplémentaire, vous devez ajouter une autre règle de réécriture similaire à celle générée par add_permastruct, mais avec un groupe de capture supplémentaire et une barre oblique pour le niveau supplémentaire de termes:

add_rewrite_rule(
    'book/([^/]+)/([^/]+)/([^/]+)-blah-blah-blah?(:/([0-9]+))?/?$',
    'index.php?post_type=book&name=$matches[3]',
    'top'
);

De plus, comme je l’ai mentionné dans mon commentaire, les requêtes var et slug author sont déjà utilisées par le noyau, vous devriez probablement les changer.

Également dans votre fonction post_type_link, vous devriez vérifier si les termes/termes parents existent avant d'essayer d'accéder à leurs propriétés, ce qui produira des avertissements lorsque le débogage est activé .

2
Milo