カスタム投稿タイプのパーマリンク設定について、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 に入れた後は、必ず管理画面の「パーマリンク設定」で、内容そのままで保存ボタンをクリックしてください。
コメント
突然のメール失礼します。
求めていた情報です。
ありがとうございました。
大変助かりました。
ご質問ですが、
「http://ドメイン/カスタム投稿タイプ/カスタムタクソノミーのslug名/postname.html」
「postname」部分を「/%post_id%/」へ変更できますでしょうか?
未検証ですが、下記でidにならないでしょうか?
りきえるさん
お世話になります。
つっちーです。
ご連絡遅くなりました!
できました☆
ありがとうございます!
りきえるさん
お世話になります。
つっちーです。
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周りも確認してみてください。