ネットで調べればいくらでもパーマリンクの書き換えに関する記事が溢れていますが、あくまでも1つのカスタム投稿に限定したものばかりだったので、使い勝手が悪いと思い自作してみました。
ベースは適当に検索して出てくる書き換え記事等と同じですが、こちらでは複数のカスタム投稿に対応したバージョンになります。
これの真価は、1ページに異なる複数のカスタム投稿記事が並んでいるときに、全てのパーマリンクを一括でリライト処理してくれるところです。
最近はカスタム投稿を作るときはCustom Post Type UIを使っていますが、直接functions.phpに書いてもいいです。
まずはCPT UIのカスタム投稿の詳細設定で、フロントのリライトをFalseにします。
もしくは、functions.phpで書いている場合は以下の箇所をfalseにしてください。
<?php
// 省略
$cpt_args = array(
'label' => __( 'カスタム投稿タイプ名', '' ),
'show_in_rest' => true,
'rewrite' => array(
'with_front' => true, // ★★★★ここをfalseに書き換える!★★★★
),
'taxonomies' => array( 'タクソノミースラッグ名' ),
);
// 省略
?>
では、次がメインの処理になります。
大きく分けると出力されるパーマリンクを変更するのと、変更されたパーマリンクにアクセスできるようにリライトする2つになります。
<?php
// 表示・出力されるパーマリンクを変更
// GLOBAL_CPTはカスタム投稿タイプの配列を返す自作の定数です。
// 定数ではなく直接配列をしていしても大丈夫です。
function custom_post_type_link($link, $post)
{
$check = 0;
foreach (GLOBAL_CPT as $cpt) {
if ($post->post_type === $cpt) {
return home_url('/' . $cpt . '/' . $post->ID);
} else {
$check++;
}
}
if ($check === count(GLOBAL_CPT)) {
return $link;
}
}
add_filter('post_type_link', 'custom_post_type_link', 1, 2);
// 変更されたパーマリンクでアクセスできるようにリライト
function cpt_rewrite_rules_array($rules)
{
foreach (GLOBAL_CPT as $cpt) {
$new_rewrite_rules[$cpt . '/([0-9]+)/?$'] = 'index.php?post_type=' . $cpt . '&p=$matches[1]';
}
return $new_rewrite_rules + $rules;
}
add_filter('rewrite_rules_array', 'cpt_rewrite_rules_array');
?>
これをfunctions.phpに記述することで、おそらくはほぼ全ての状況下でもパーマリンクを書き換えることができるようになっているはずです。
コメント