複数あるカスタム投稿の記事URL(パーマリンク)を記事IDに書き換える方法

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

この記事が気に入ったら
いいね または フォローしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

CAPTCHA


目次