カスタム投稿の「タクソノミー一覧ページ」「投稿ページ」のURLを動的に変更する - WordPress
はじめに
「カスタム投稿」と「カスタムタクソノミー」を作成して、それらの「投稿ページ」と「タクソノミー一覧ページ」のURLをカスタマイズする方法を本記事にて紹介します。
前提として、「投稿ページ」はsingle-○○.php、「タクソノミー一覧ページ」はtaxonomy-○○.phpで作成するとします。
※上記の○○は、「カスタム投稿名」と「カスタムタクソノミー名」です。
この記事では、下記のようなURLの形式に変更します。
変更前 | 変更後 | |
投稿ページ | /domain/カスタム投稿名/記事タイトル/ | /domain/カスタム投稿名/ランダムな数字/ |
タクソノミー一覧ページ | /domain/カスタムタクソノミー名/ | /domain/カスタム投稿名/カスタムタクソノミー名/ |
「投稿ページ」と「タクソノミー一覧ページ」のURLを変更するメリット
投稿ページ
記事を投稿する際に、デフォルトでは記事タイトルがURLに設定されます。
基本的に、記事のタイトルは日本語です。
そして、URLに日本語を使うのはよろしくないので、自動でURLを変える処理をしないと、手動で記事を投稿するたびにURLを編集しなければいけません。
これだと、記事を作成する側も毎回手間がかかってしまうので、ぜひ投稿ページのURLを自動で書き換わる設定をしてあげましょう。
タクソノミー一覧ページ
何も設定をしないとタクソノミー一覧ページのデフォルトのURLは前述の通り、/domain/カスタムタクソノミー名/になります。
カスタム投稿を作成する場合、大抵/domain/カスタム投稿名/がそのページのトップとなるので、カスタムタクソノミーの一覧ページのURLは/domain/カスタム投稿名/カスタムタクソノミー名/になるべきです。
URLの構造化を正しく行うと、SEO評価にも繋がります。なので、この設定もしっかりと対応しましょう。
実際のコード
下記サンプルでは、「カスタム投稿の追加」「カスタムタクソノミーの追加」「URLの変更の処理」の3つを記載しています。
また、カスタム投稿名は「news」、カスタムタクソノミーは「news-category」で設定していますので、ここはご自身のコードに合わせて書き換えて頂ければと思います。
これら全てをfunctions.phpに記述することで、URLがカスタマイズされたカスタム投稿を設定することが出来ます。
「カスタム投稿の追加」「カスタムタクソノミーの追加」はごく一般的な設定で記述しているので、既にご自身のコードでカスタム投稿などを追加している場合は、「URLの変更の処理」だけ追加すれば良いかと思います。
カスタム投稿追加
// カスタム投稿追加
function my_add_post_type() {
register_post_type(
'news',
array(
'label' => 'ニュース',
'labels' => array(
'name' => 'ニュース',
'singular_name' => 'ニュース',
'all_items' => 'ニュース一覧',
),
'public' => true,
'has_archive' => true,
'menu_position' => 5,
'supports' => array(
'title',
'editor',
'author',
'thumbnail',
'custom-fields',
'revisions',
),
)
);
}
add_action('init', 'my_add_post_type');
カスタムタクソノミー追加
// カスタムタクソノミー追加
function my_add_taxonomy() {
register_taxonomy(
'news-category',
'news',
array(
'label' => 'ニュースの種類',
'singular_label' => 'ニュースの種類',
'labels' => array(
'all_items' => '全ての種類',
'add_new_item' => 'ニュースの種類を追加'
),
'public' => true,
'show_ui' => true,
'show_in_nav_menus' => true,
'hierarchical' => true,
'rewrite' => array('slug' => 'news'),
)
);
}
add_action('init', 'my_add_taxonomy');
URLの変更の処理
// URLの変更の処理
function custom_posttype_rewrite() {
global $wp_rewrite;
// --- --- --- start
$wp_rewrite->add_rewrite_tag('%_custom_post_%', '(_custom_post_)','post_type=');
$wp_rewrite->add_permastruct('_custom_post_', '/%_custom_post_%/%post_id%/', false);
// end --- --- ---
}
add_action('init', 'custom_posttype_rewrite');
function custom_posttype_permalink($post_link, $id = 0, $leavename) {
global $wp_rewrite;
$post_delivery = get_post($id);
$post = $post_delivery;
if(is_wp_error( $post )){
return $post;
}
// --- --- --- start
if('_custom_post_' === $post->post_type){
$newlink = $wp_rewrite->get_extra_permastruct($post->post_type);
$newlink = str_replace('%_custom_post_%', $post->post_type, $newlink);
$newlink = str_replace('%post_id%', $post->ID, $newlink);
$newlink = home_url(user_trailingslashit($newlink));
return $newlink;
}
// end --- --- ---
return $post_link;
}
add_filter('post_type_link', 'custom_posttype_permalink', 1, 3);
※カスタム投稿が複数ある場合、// --- --- --- start 〜〜〜〜〜 // end --- --- ---の部分を複製すればOKです
// カスタム投稿が複数ある場合の例
// --- --- --- start
$wp_rewrite->add_rewrite_tag('%_custom_post_01_%', '(_custom_post_01_)','post_type=');
$wp_rewrite->add_permastruct('_custom_post_01_', '/%_custom_post_01_%/%post_id%/', false);
// end --- --- ---
// --- --- --- start
$wp_rewrite->add_rewrite_tag('%_custom_post_02_%', '(_custom_post_02_)','post_type=');
$wp_rewrite->add_permastruct('_custom_post_02_', '/%_custom_post_02_%/%post_id%/', false);
// end --- --- ---
まとめ
「カスタム投稿」と「カスタムタクソノミー」のURLを意図的に変えることで、SEO対策や運用のしやすいサイトになるのでしっかりと対応しましょう。