カスタム投稿タイプのパーマリンク設定

WordPress

カスタム投稿タイプのパーマリンク設定について、IDに置き換えるなどはいろいろと情報がありますが、カスタムタクソノミーのslugを含めたいという記事があまりなかったので、コピペ用に纏めました。

permalink構造を下記のようにすることが出来ます。
http://ドメイン/カスタム投稿タイプ/カスタムタクソノミーのslug名/postname.html
http://ドメイン/%post_type%/%term%/%postname%.html

[blog]となっているところ、適当に変えれば、他名称も問題ないと思います。

<?php
function custom_post_types_register() {
    //カスタム投稿タイプ作成
    register_post_type(
        'blog',
        array(
            'label'                 => 'ブログ',
            'description'           => '',
            'public'                => true,
            'show_ui'               => true,
            'show_in_menu'          => true,
            'capability_type'       => 'post',
            'hierarchical'          => false,
            'rewrite'               => array('slug' => 'blog', 'with_front' => FALSE),
            'query_var'             => true,
            'has_archive'           => true,
            'exclude_from_search'   => false,
            'menu_position'         => 5,
            'supports'              => array('title','editor','revisions','author'),
            'taxonomies'            => array('blog-term'),
            'labels'                => array (
                'name'                  => 'ブログ一覧',
                'singular_name'         => 'ブログ',
                'menu_name'             => 'ブログ',
                'add_new'               => '新規追加',
                'add_new_item'          => '新規 ブログを追加',
                'edit'                  => '編集',
                'edit_item'             => '投稿の編集',
                'new_item'              => '新規項目',
                'view'                  => '表示',
                'view_item'             => '投稿を表示',
                'search_items'          => '投稿を検索',
                'not_found'             => '投稿が見つかりませんでした。',
                'not_found_in_trash'    => 'ゴミ箱内に投稿が見つかりませんでした。',
                'parent'                => '親'
            )
        )
    );
    //カスタムタクソノミー作成
    register_taxonomy(
        'blog-term',
        array (
            0                   => 'blog'
        ),
        array(
            'hierarchical'      => true,
            'label'             => 'カテゴリー',
            'show_ui'           => true,
            'query_var'         => true,
            'rewrite'           => array('slug' => 'blog'),
            'singular_label'    => 'blog-term'
        )
    );
}
add_action('init', 'custom_post_types_register', 0);
?>

次の add_action / add_filter で、URLを書き換えて設定します。
一つでも欠けると、404となり、ページが表示されません。

<?php
function myposttype_rewrite() {
    global $wp_rewrite;
    
    $queryarg = 'post_type=blog&name=';
    $wp_rewrite->add_rewrite_tag('%blog_postname%', '([^/]+)', $queryarg);
    $wp_rewrite->add_permastruct('blog', '/blog/%blog-term%/%blog_postname%.html', false);
}
add_action('init', 'myposttype_rewrite');

function myposttype_permalink($post_link, $id = 0, $leavename) {
    global $wp_rewrite;
    $post = &get_post($id);
    if ( is_wp_error( $post ) )
        return $post;
    $newlink = $wp_rewrite->get_extra_permastruct($post->post_type);
    $newlink = str_replace('%'.$post->post_type.'_postname%', $post->post_name, $newlink);
    $newlink = home_url(user_trailingslashit($newlink));
    return $newlink;
}
add_filter('post_type_link', 'myposttype_permalink', 1, 3);

function custom_term_link( $post_link, $id = 0 ) {
    $post = get_post($id);
    if ( is_wp_error($post) || 'blog' != $post->post_type || empty($post->post_name) )
        return $post_link;
    
    $terms = get_the_terms($post->ID, 'blog-term');
    if( is_wp_error($terms) || !$terms ) {
        $term_slug = 'uncategorised';
    } else {
        $term_obj = array_pop($terms);
        $term_slug = $term_obj->slug;
    }
    return home_url(user_trailingslashit( "blog/$term_slug/$post->post_name.html" ));
}
add_filter( 'post_type_link', 'custom_term_link' , 1, 3 );
?>

上記をコードを functions.php に入れた後は、必ず管理画面の「パーマリンク設定」で、内容そのままで保存ボタンをクリックしてください

コメント

  1. つっちー より:

    突然のメール失礼します。

    求めていた情報です。
    ありがとうございました。
    大変助かりました。

    ご質問ですが、

    「http://ドメイン/カスタム投稿タイプ/カスタムタクソノミーのslug名/postname.html」

    「postname」部分を「/%post_id%/」へ変更できますでしょうか?

    • りきえる より:

      未検証ですが、下記でidにならないでしょうか?

      <?php
      function myposttype_rewrite() {
      	global $wp_rewrite;
      	
      	$queryarg = 'post_type=blog&p=';
      	$wp_rewrite->add_rewrite_tag('%blog_id%', '([^/]+)', $queryarg);
      	$wp_rewrite->add_permastruct('blog', '/blog/%blog-term%/%blog_id%/', false);
      }
      add_action('init', 'myposttype_rewrite');
       
      function myposttype_permalink($post_link, $id = 0, $leavename) {
      	global $wp_rewrite;
      	$post = &get_post($id);
      	if ( is_wp_error( $post ) )
      		return $post;
      	$newlink = $wp_rewrite->get_extra_permastruct($post->post_type);
      	$newlink = str_replace('%'.$post->post_type.'_id%', $post->ID, $newlink);
      	$newlink = home_url(user_trailingslashit($newlink));
      	return $newlink;
      }
      add_filter('post_type_link', 'myposttype_permalink', 1, 3);
       
      function custom_term_link( $post_link, $id = 0 ) {
      	$post = get_post($id);
      	if ( is_wp_error($post) || 'blog' != $post->post_type || empty($post->ID) )
      		return $post_link;
      	
      	$terms = get_the_terms($post->ID, 'blog-term');
      	if( is_wp_error($terms) || !$terms ) {
      		$term_slug = 'uncategorised';
      	} else {
      		$term_obj = array_pop($terms);
      		$term_slug = $term_obj->slug;
      	}
      	return home_url(user_trailingslashit( "blog/$term_slug/$post->ID/" ));
      }
      add_filter( 'post_type_link', 'custom_term_link' , 1, 3 );
      ?>
      • つっちー より:

        りきえるさん

        お世話になります。
        つっちーです。

        ご連絡遅くなりました!

        できました☆

        ありがとうございます!

        • つっちー より:

          りきえるさん

          お世話になります。
          つっちーです。

          Search Consoleで404エラーが出てしまうのですが、どのように修正したらよいでしょうか?

          404エラーで出力されているURL内容は「/blog/$term_slug/$post->ID/$term_slug/」になります。

      • つっちー より:

        りきえるさん

        お世話になります。
        つっちーです。

        上記のIDバージョンを使用したところ、Google Search Consoleでクロールで404エラーが出るようになりました。

        エラー内容は、「http://ドメイン/カスタム投稿タイプ/カスタムタクソノミーのslug名/%post_id%/カスタムタクソノミーのslug名/」になります。

        解消方法をご教授いただけませんでしょうか?

        • りきえる より:

          つっちーさん、
          お返事遅くなりましたが、解決されておりますでしょうか?

          コメントいただいた内容だけでは、原因の特定が難しそうです。

          404エラーになるのは、Search Consoleだけですか?
          通常アクセスのページは表示されてURLも正常ということでしょうか?
          一度、送信しているsitemap.xml周りも確認してみてください。

スポンサーリンク
タイトルとURLをコピーしました