例として、カスタム投稿タイプ「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/」でアクセスできるようにする際のメモ。
functions.php に記述してある「register_taxonomy()」に「rewrite」のパラメータを追加し、「slug」パラメータの値を表表示させたい文字列に指定する。
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() 」の設定を反映させるためには、管理画面「設定」→「パーマリンク」で「変更を保存」をクリック(空クリック)する必要がある。
リライトルールの設定の確認
リライトルールの設定は、$wp_rewrite->rules で取得することができるので以下のように記述するとリライトルールを出力することができる。
<?php print_r($wp_rewrite->rules); ?>
前提:カスタムタクソノミーで作成したカテゴリーのスラッグ(カスタム分類名)の値は「カスタム投稿タイプのスラッグ_cat」という形にしてある。
$mycpts = get_post_types(array('_builtin' => false)); foreach($mycpts as $mycpt) { add_rewrite_rule($mycpt.'/cat/([^/]+)/?$', 'index.php?'.$mycpt.'_cat=$matches[1]', 'top'); }
上記の例では、「http://site_url/works_cat/gold」にアクセスがあった場合、「http://site_url/?works_cat=gold」にリダイレクトすることでページを表示している。
このリダイレクトをどのように行うかを設定しているのが「リライトルール」。
独自に設定したフレンドリー URL でエラーが出る場合には、リライトルールを追加する必要がある。