web-dev-qa-db-ja.com

カスタムポストパーマリンクの親子のタクソノミナメクジ

以下のように、カスタムの投稿タイプ「book」と分類法「authors」を登録しました。

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

分類語句をパーマリンクで使いたいと思い、ポスト&分類法の登録後に書き換え規則を適用しました。また、以下のコードを使用して分類用語を置き換えます。

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;
}

そのため、次のリンクはうまくいきます:localhost/book/[著者]/[book-title] -blah-blah blahとlocalhost/book/[著者]しかし、私は[parent-taxonomy-slug]のような子タクソノミーを持つ親タクソノミースラグも必要]/[child-taxonomy-slug]親と子のスラグを "/"で連結しようとしましたが、404ページが見つかりませんが、 " - "で連結しても問題ありません。

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

パーマリンクで "[parent-taxonomy-slug]/[child-taxonomy-slug]"を使えますか?

1
Mihir

追加のURLセグメントを処理するには、 add_permastructで生成されたものに似た別の書き換え規則 を追加する必要がありますが、追加のキャプチャグループと追加の用語レベルのスラッシュを使用します。

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

また、私のコメントで述べたように、クエリvarとslug authorはすでにコアで使用されているので、おそらくそれらを変更するべきです。

また、post_type_link関数では、それらのプロパティにアクセスする前に用語/親用語が存在するかどうかをチェックする必要があります。これにより、 debugging enabled で警告が表示されます。

2
Milo