ネットで調べればいくらでもパーマリンクの書き換えに関する記事が溢れていますが、あくまでも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に記述することで、おそらくはほぼ全ての状況下でもパーマリンクを書き換えることができるようになっているはずです。


	
コメント