WordPressで通常使用する「投稿」のURL(パーマリンク設定)は、ダッシュボードの「設定 > パーマリンク設定」で設定・変更が可能です。
しかし、カスタム投稿タイプのURLは、ダッシュボードからは設定・変更ができません。
「Custom Post Type Permalinks」というプラグインを使用すれば、手軽に変更もできるようですが、今回はプラグインを使わず、「register_post_type関数」で実装しましたので、その方法をご紹介します。
functions.phpに記述するコード
まずは、実際に使用したコードを記載しておきます。
※カスタム投稿タイプで「お知らせ(news)」と「日記(diary)」を作成し、それぞれに対応したタクソノミー(カテゴリー、タグ)を追加しています。
function init_func() {
//カスタム投稿、カテゴリ、タグを追加
register_post_type('news', [
'labels' => [
'name' => 'お知らせ',
],
'public' => true,
'has_archive' => true,
'hierarchical' => false,
'rewrite' => array('with_front' => false),
'menu_position' => 5,
'menu_icon' => 'dashicons-welcome-write-blog',
'supports' => array('title', 'editor', 'thumbnail')
]);
register_taxonomy('news-cat', 'news', [
'label' => 'カテゴリー',
'hierarchical' => true,
]);
register_taxonomy('news-tag', 'news', [
'label' => 'タグ',
'hierarchical' => false,
]);
}
add_action('init', 'init_func');
/*カスタム投稿のパーマリンクをpostIDに*/
add_filter('post_type_link', 'generateCustomPostLink', 1, 2);
add_filter('rewrite_rules_array', 'addRewriteRules');
function generateCustomPostLink($link, $post){
if($post->post_type === 'news'){
// 投稿IDに書き換えたパーマリンク文字列を返す
return home_url('/news/'.$post->ID);
} else {
return $link;
}
}
function addRewriteRules($rules){
// 書き換えたパーマリンクに対応したクエリルールを追加
$new_rule = array(
'news/([0-9]+)/?$' => 'index.php?post_type=mynews&p=$matches[1]'
);
// ルール配列に結合
return $new_rule + $rules;
}
カスタム投稿タイプのパーマリンク設定
カスタム投稿タイプのURLは、デフォルトでは、「ドメイン/【投稿タイプ名】/【投稿タイトル】」となります。
例)https://abc.com/news/タイトル
そこで、「register_post_type関数」を使用して、パーマリンクに投稿IDを設定するために、functions.phpに下記のコードを記述します。
add_filter('post_type_link', 'generateCustomPostLink', 1, 2);
add_filter('rewrite_rules_array', 'addRewriteRules');
function generateCustomPostLink($link, $post){
if($post->post_type === 'news'){
// 投稿IDに書き換えたパーマリンク文字列を返す
return home_url('/news/'.$post->ID);
} else {
return $link;
}
}
function addRewriteRules($rules){
// 書き換えたパーマリンクに対応したクエリルールを追加
$new_rule = array(
'news/([0-9]+)/?$' => 'index.php?post_type=mynews&p=$matches[1]'
);
// ルール配列に結合
return $new_rule + $rules;
}
最後に、ダッシュボードのパーマリンクで、変更を保存しましょう。
※これを忘れると、functions.phpの記述が正しくても、上手く反映されないことがあります。
今回のパーマリンク設定を行うにあたって、参考にさせていただいたのは、下記の記事です。