WordPressでサイトを構築するときに頭を悩ますものにパーマリンク(サイト内URLの構造)があります。
以前の記事で、パーマリンクのカスタマイズについて少し書きました。
そこでは、カスタム投稿でのパーマリンク設定と記事ごとの自由なパーマリンク設定について書きました。
今回は、パーマリンクのルールを自由に設定する方法についてまとめました。
例を挙げながらの方が分かりやすいので、カスタムフィールドの値をパーマリンクに組み込みたい、というケースについて考えます。
「country_area」というカスタムフィールドに「Asia」という値を入れた場合、投稿と紐付いたメタ情報として、
‘meta_value’ => ‘Asia’
というようにデータが格納されます。
この値を利用して、
http://●●.com/country_area/Asia/ や、
http://●●.com/country_area/Oceania/ などのようにパーマリンクを設定したい、という状況です。
つまり、
http://●●.com/[meta_key]/[meta_value]/ というパーマリンクを設定したい、という時の例です。
WordPressの基本のパーマリンク設定では、カテゴリーや投稿者などは設定できますが、カスタムフィールドの値は設定できません。
そこで、パーマリンクのルールを手動で追加してやります。function.phpに以下のコードを追加します。
パーマリンクのルール追加
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | // パーマリンクルールの設定 function myRewriteRule(){ add_rewrite_rule('country_area/([a-zA-Z_]+)/?$' ,'index.php?meta_key=country_area&meta_value=$matches[1]', 'top'); } // パーマリンクルールの追加 add_action( 'init', 'myRewriteRule' ); // 新しいリクエストkeyの名前の設定 function add_query_vars_filter( $vars ){ $vars[] = "meta_key"; $vars[] = "meta_value"; return $vars; } add_filter( 'query_vars', 'add_query_vars_filter' ); |
上記のコードの3行目を見るとピンと来る方もいるかもしれませんが、WordPressの動きというのは、パーマリンクを正規表現により解析して [wpフォルダ]/index.php にGETでリクエストを渡し、条件や値を判別してテーマ内の各ページ表示用phpを呼び出しています。
上記の処理は、その解析ルールに独自のルールを追加して、リクエストkeyの値をグローバル変数query_varsに格納するための箱も追加した、というものです。
このように add_rewrite_rule によりルールを追加することにより、自由にパーマリンクを設定することができます。もちろん、ルールに矛盾がない範囲ですけど。
WP管理画面の [設定]→[パーマリンク設定]の[変更を保存]ボタンを押すと
ルールを更新してくれます。
他にも例えば、
WPのデフォルトのページングではなく独自のページング処理をしたいが、パーマリンクは、
http://●●.com/page/2/ のようにしたい、という場合にも自由に対応できます。
のようにルールを追加すると、追加したルールが優先されるので、WPのデフォルトのページングを行わず、my_paged というkeyを利用したページング処理を書くことができます。
ちなみに、この値を実際に利用するには、get_query_var() にkey名を指定して取得します。
archive.php
1 2 3 4 5 6 7 | ・・・ if ( $meta_key = get_query_var('meta_key') && $meta_value = get_query_var('meta_value') ) { query_posts( array('meta_key'=>$meta_key, 'meta_value'=>$meta_value) ); } ・・・ |
これで、パーマリンクで指定されたメタ情報に一致する投稿を取得することができます。
南本貴之