wordpress カスタム分類のページの URL を変更する

2013年5月23日

例として、カスタム投稿タイプ「works」とそのカスタム分類「works_cat」を登録した場合、カスタム分類のページは「taxonomy-works_cat.php」というテンプレートで作成できる。

その際、カスタム分類「works_cat」に「gold」というカテゴリー(ターム)を追加し、カスタムメニューで「gold」を追加した場合、その URL は「http://mysite/wp/woks_cat/gold/」のようになる(この場合、WordPress は wp というディレクトリにインストールしてある)。

これを「http://mysite/wp/woks/cat/gold/」でアクセスできるようにする際のメモ。

  • 「register_taxonomy()」に「rewrite」のパラメータを追加する。
  • 設定を追加したら、管理画面「設定」→「パーマリンク」で「変更を保存」をクリックして、URL に関する設定を反映させる。
  • リライトルールを設定する。
  • 再度、管理画面「設定」→「パーマリンク」で「変更を保存」をクリックして、URL に関する設定を反映させる。

register_taxonomy() の rewrite パラメータ

functions.php に記述してある「register_taxonomy()」に「rewrite」のパラメータを追加し、「slug」パラメータの値を表表示させたい文字列に指定する。

rewrite パラメータ
「true」の場合(デフォルト)、
「http://ブログのアドレス / カスタム分類名 / 個々のカスタム分類のスラッグ / 」でアクセスできる。
「rewrite => array('slug' => '表示させたい文字列')」と指定すると
「http://ブログのアドレス / 表示させたい文字列 / 個々のカスタム分類のスラッグ / 」でアクセスできる。
register_taxonomy(
    'works_cat',
    'works',
    array(
      'label' =>  __('Works Category', 'mysite'),
      ...省略...
      ),
      'public' => true,
      'hierarchical' => true,
      //以下を追加する
      'rewrite' => array('slug' => 'works/cat')  
    )
  );

このままではメニューが出力する URL をクリックすると正しく表示されないので、リライトルールを設定。

リライトルールの設定

リライトルールを追加するには、functions.php に「add_rewrite_rule() 」を利用し、1つ目のパラメータにフレンドリー URL を、2つ目のパラメータにリダイレクト先の URL(WordPress の内部的なパラメータ形式の URL) を指定する。

「http://mysite/wp/woks/cat/gold/」にアクセスがあった場合、
「http://mysite/wp/?works_cat=gold」にリダイレクトする

add_rewrite_rule('works/cat/([^/]+)/?$', 'index.php?works_cat=$matches[1]', 'top');

([^/]+):任意の文字列(「/」以外)にマッチさせる正規表現。マッチした文字列は$matches[1]に代入される。

1つ目のパラメータの「works/cat/」は register_taxonomy() の「rewrite」パラメータで登録したもの。

また「add_rewrite_rule() 」の設定を反映させるためには、管理画面「設定」→「パーマリンク」で「変更を保存」をクリック(空クリック)する必要がある。

add_rewrite_rule 関数

add_rewrite_rule($rule, $rewrite, $position)
パラメータ:
$rule(文字列):リクエストされる URL にマッチする正規表現(URL に表示したい文字列)
$rewrite(文字列):リダイレクト先の URL 。通常は「index.php?」から始まるクエリの形(第1パラメータでマッチした文字列を取得する$matches[] 配列が使える。$matches[] 配列のインデックスは「1」から始まる。)
$position(文字列) :'top' または 'bottom' 。「top」は WordPress のその他のルールより優先。「bottom」はその他の WordPressのルールが優先される。

リライトルールの設定の確認
リライトルールの設定は、$wp_rewrite->rules で取得することができるので以下のように記述するとリライトルールを出力することができる。
<?php print_r($wp_rewrite->rules); ?>

複数のカスタムタクソノミーのリライトルールの設定を自動的に追加する

前提:カスタムタクソノミーで作成したカテゴリーのスラッグ(カスタム分類名)の値は「カスタム投稿タイプのスラッグ_cat」という形にしてある。

  • 全てのカスタムタクソノミーのリライトルールの設定を自動的に指定するようにする。
  • 「get_post_types()」ですべてのカスタム投稿タイプのスラッグを「$mycpts」に取得
  • foreach() で「$mycpt」に各スラッグを取り出して「add_rewrite_rule」を実行
  • 設定を反映させるためには、管理画面「設定」→「パーマリンク」で「変更を保存」をクリックする
$mycpts = get_post_types(array('_builtin' => false));
foreach($mycpts as $mycpt) {
 add_rewrite_rule($mycpt.'/cat/([^/]+)/?$', 'index.php?'.$mycpt.'_cat=$matches[1]', 'top');
}

WordPress のページの処理「リライトルール」

  • WordPress は内部的にはパラメータ形式の URL でページの処理をおこなっている。
  • 例:「http://site_url/?works_cat=gold」
  • パラメータ形式の URL ではわかりにくいため、パーマリンクの設定を利用することで、フレンドリー URL によるアクセスを有効にすることができ、上記の URL は、以下で生成されるようになる
  • 例:「http://site_url/works_cat/gold」
  • この処理は、WordPress に用意された「リライトルール」という設定を利用して、URL のリダイレクトを行うことで実現している。

上記の例では、「http://site_url/works_cat/gold」にアクセスがあった場合、「http://site_url/?works_cat=gold」にリダイレクトすることでページを表示している。

このリダイレクトをどのように行うかを設定しているのが「リライトルール」。

独自に設定したフレンドリー URL でエラーが出る場合には、リライトルールを追加する必要がある。