カスタム投稿タイプのパーマリンクを書き換えるフィルターフックを定義する

リンクを書き換える

もうひとつの投稿表示「カスタム投稿機能」

本筋ではないのでざっと行きますが、WordPressでは標準の投稿とはまた別枠で投稿を編集・表示できる「カスタム投稿」というものがあります。

functions.phpに記述することで追加

functions.phpに「register_post_type関数」を記述してカスタム投稿タイプを登録します。詳しくは関数リファレンスを要チェケラ。

WordPress Codex – 関数リファレンス/register post type

ただ、後々の説明で必要になってくるので例を示しておきます。こんな感じです。

// アクションフック
// 定義したカスタム投稿タイプを読み込む
add_action('init', 'makeCustomPostType');

function makeCustomPostType(){
  register_post_type('mynews', array(
    'label' => 'ニュース',
    'public' => true,
    'has_archive' => true,
    // ※1 パーマリンクの設定を変更する場合
    'rewrite' => array('slug' => 'news', 'with_front' => false)
  ));
}

カスタム投稿のパーマリンクを書き換えるには

デフォルトでは、カスタム投稿へのパーマリンクは、「【投稿タイプ名】/【投稿タイトル】」と表示されます。
例)http://siteaddress.com/mynews/タイトル

投稿タイプ名の部分を書き換える

register_post_type関数の引数で指定します。
上述のサンプルコードの【※1】部分。

'rewrite' => array(
  'slug' => '書き換え後のスラッグ名',
  'with_front' => false
  /*
  * trueの場合、パーマリンク設定でのリンク構造が引き継がれる
  * /blog/なら、「/blog/書き換え後のスラッグ名/~」になる
  */
)

投稿タイトルをパーマリンクにしない方法

デフォルトで、【/投稿タイプ名/投稿タイトル】となっているパーマリンクの「投稿タイトル」部分を書き換えます。

これまたfunctions.phpに記述します。以下の例では投稿IDをパーマリンクにしています。

add_filter('post_type_link', 'generateCustomPostLink', 1, 2);
add_filter('rewrite_rules_array', 'addRewriteRules');

function generateCustomPostLink($link, $post){
  if($post->post_type === 'mynews'){
    // 投稿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;
}

WordPressは渡されたURLを内部でルールに従って変換

一つ目の関数(generateCustomPostLink)では、特定のカスタム投稿へのリンクを書き出す際に、WordPressのhome_url関数を使って新しいリンク文字列を作成し、書き出しています。

WordPressは与えられたパーマリンク文字列を解析し、内部で「index.php?◯◯=△△&●●=■■」のパラメータ付きの文字列に変換して該当ページを読み込みます。そのため、ページ上に書き出されたパーマリンク文字列(例:/◯◯/△△/)をどのようにパラメータに変換するかを指定した配列【※】を内部で保持しています。
上の二つ目の関数(addRewriteRules)では、その配列に新しい変換ルールを追加するものです。

【※】配列の中身
キー:与えられたパーマリンク文字列(正規表現を使用)
値:実際にサーバーにリクエストするクエリ文字列

フィルターフックの記述に注意!

カスタム投稿タイプのパーマリンクを生成する関数をフィルターフックに登録しました。この時、フィルターフックの第4引数を省略すると書き換えられたパーマリンクで投稿にアクセスすることができません。

// これは書き換えられたリンクがうまく動作しない
add_filter('post_type_link', 'generateCustomPostLink');

// フィルター関数の引数の数を決める第4引数に「2」と記述
add_filter('post_type_link', 'generateCustomPostLink', 1, 2);

これで、カスタム投稿の記事パーマリンクが、「/news/【投稿ID】」となりました。

ちなみに…

WordPressのプラグインにカスタム投稿タイプのパーマリンクをお手軽に書き換えることができるプラグインがあるんだってよ…。

(Visited 22,973 times, 1 visits today)