Memo

メモ > 技術 > CMS: WordPress > URLのリライト

■URLのリライト
■リライトルールの概要 WordPress パーマリンク リライトルール/ Web Design Leaves https://www.webdesignleaves.com/pr/wp/wp_permalink_rewrite.html 標準で利用可能なパラメーター(パブリッククエリ変数)は、 WPクラスのプロパティ $public_query_vars として wp-includes/class-wp.php に定義されている パブリッククエリ変数は直接URLクエリとして使うことができる
class WP { /** * Public query variables. * * Long list of public query variables. * * @since 2.0.0 * @var array */ public $public_query_vars = array('m', 'p', 'posts', 'w', 'cat', 'withcomments', 'withoutcomments', 's', 'search', 'exact', 'sentence', 'calendar', 'page', 'paged', 'more', 'tb', 'pb', 'author', 'order', 'orderby', 'year', 'monthnum', 'day', 'hour', 'minute', 'second', 'name', 'category_name', 'tag', 'feed', 'author_name', 'static', 'pagename', 'page_id', 'error', 'attachment', 'attachment_id', 'subpost', 'subpost_id', 'preview', 'robots', 'taxonomy', 'term', 'cpage', 'post_type', 'embed' );
プライベートクエリ変数はパブリッククエリ変数と同様、 WPクラスのプロパティ $private_query_vars として wp-includes/class-wp.php に定義されている プライベートクエリ変数はURLには使えないが、WordPressはプライベートクエリ変数を使ったクエリストリングを受け取ることができる
/** * Private query variables. * * Long list of private query variables. * * @since 2.0.0 * @var array */ public $private_query_vars = array( 'offset', 'posts_per_page', 'posts_per_archive_page', 'showposts', 'nopaging', 'post_type', 'post_status', 'category__in', 'category__not_in', 'category__and', 'tag__in', 'tag__not_in', 'tag__and', 'tag_slug__in', 'tag_slug__and', 'tag_id', 'post_mime_type', 'perm', 'comments_per_page', 'post__in', 'post__not_in', 'post_parent', 'post_parent__in', 'post_parent__not_in', 'title', 'fields' );
■リライトルールの確認 リライトルールは、WP_Rewriteで定義され、そのインスタンス $wp_rewrite に登録されている テーマの header.php などに以下のプログラムを書くことにより、内容を確認できる
<pre><?php print_r( $wp_rewrite ); ?></pre>
リライトルールだけを出力するには、以下のようにする
<pre><?php print_r( $wp_rewrite->rules ); ?></pre>
リライトルールはデータベースの options テーブルに rewrite_rules という名前で保存されているので、以下のようにしても内容を確認できる
<pre><?php print_r( get_option('rewrite_rules') ); ?></pre>
リライトルールは正規表現をキー、変換するパラメータの形式を値とした連想配列で構成されていいる リライト処理の際は、リライトルールの連想配列を先頭からURLと照合する そのため、リライトルールの中にマッチするルールが複数あった場合、より先頭に近いルールが適用されることになる ■リライトルールの変更 通常の手順でパーマリンクが test という固定ページを作成する これにより /test/ というURLでアクセスできるようになる このとき /test/foo/ というURLにアクセスすると、当然ながら404エラーとなる functions.php に以下のコードを追加する
function add_my_test_rewrite_rule() { add_rewrite_rule( '^test/([^/]+)/?$', // 正規表現パターン 'index.php?pagename=test&myvalue=$matches[1]', // 変換するパラメータ(クエリ変数)の形式 'top' // リライトルールの先頭に追加 ); } add_action( 'init', 'add_my_test_rewrite_rule' );
続いて、「管理画面 → 設定 → パーマリンク設定」で、何も変更せずに「変更を保存」をクリックする これにより、リライトルールが再生成されデータベースも更新される この状態で /test/foo/ というURLにアクセスすると、/test/ と同じ内容が表示される add_rewrite_rule() の代わりに rewrite_rules_array フィルターを使って、以下のように記述しても同じ結果を得られる
function add_my_test_rewrite ( $rules ) { $new_rules = array(); // 追加するリライトルールの配列を初期化 $new_rules['^test/([^/]+)/?$'] = 'index.php?pagename=test&myvalue=$matches[1]'; // 追加するリライトルールの配列を作成 return $new_rules + $rules; // 既存のリライトルールに作成した配列を追加 } add_filter('rewrite_rules_array', 'add_my_test_rewrite');
上記コードにある myvalue は独自のURLパラメータなので、get_query_var() を使って値を取得することができない get_query_var() を使ってカスタムパラメータ myvalue の値を取得できるようにするには、カスタムクエリ変数を追加する必要がある 以下のように query_vars フィルターを使い、myvalue をパブリッククエリ変数に追加することで対応できる
function add_myvalue_to_query_vars( $vars ) { $vars[] = 'myvalue'; return $vars; } add_filter( 'query_vars', 'add_myvalue_to_query_vars' );
もしくは以下のように myvalue と言う名前のリライトタグを追加することで、myvalue をパブリッククエリ変数に追加する
function custom_rewrite_tag() { add_rewrite_tag('%myvalue%', '([^&]+)'); } add_action('init', 'custom_rewrite_tag', 10, 0);
これで、一例だが以下のようにすると「foo」の値を取得できる (コンテンツ文字列の前に追加して表示される)
function echo_myvalue() { // スラッグが test の固定ページで、かつ myvalue というクエリ変数が空でない場合 if ( is_page( 'test' ) && !empty( get_query_var( 'myvalue' ) ) ) { // the_content フィルターに処理をフック add_filter( 'the_content', function ($content) { // クエリ変数 myvalue の値を取得 $myvalue = get_query_var( 'myvalue' ); if ( $myvalue ) { // 取得できた場合は、コンテンツの前にその値を出力 return '<p>myvalue の値は「' . esc_html($myvalue) . '」です。</p>' . $content; } else { // 取得できない場合は、そのままコンテンツを出力 return $content; } } ); } } add_filter( 'template_redirect', 'echo_myvalue' );
■リライトルールの変更例 あらかじめパーマリンクが contact のページを作成してあるものとする 以下のようにすると、/test/ にアクセスするとお問い合わせページが表示される
function add_my_test_rewrite_rule() { add_rewrite_rule( '^test$', // 正規表現パターン 'index.php?pagename=contact', // 変換するパラメータ(クエリ変数)の形式 'top' // リライトルールの先頭に追加 ); } add_action( 'init', 'add_my_test_rewrite_rule' );
あらかじめカスタム投稿タイプが staff のページを作成してあるものとする 以下のようにすると、/test/ にアクセスするとスタッフ一覧ページが表示される
function add_my_test_rewrite_rule() { add_rewrite_rule( '^test$', // 正規表現パターン 'index.php?post_type=staff', // 変換するパラメータ(クエリ変数)の形式 'top' // リライトルールの先頭に追加 ); } add_action( 'init', 'add_my_test_rewrite_rule' );
以下のようにすると、パラメータを指定することもできる この場合、/staff/tokyo/ にアクセスすると tab1 と tab2 の値も渡される
function add_my_test_rewrite_rule() { add_rewrite_rule( '^staff/tokyo$', 'index.php?post_type=staff&tab1=kantou-area&tab2=tokyo', 'top' ); add_rewrite_rule( '^staff/kanagawa$', 'index.php?post_type=staff&tab1=kantou-area&tab2=kanagawa', 'top' ); } add_action( 'init', 'add_my_test_rewrite_rule' );

Advertisement