カスタム投稿タイプのパーマリンク設定について、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にならないでしょうか?
<?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周りも確認してみてください。