Plains フリーランス フロントエンドエンジニア

備忘録 2021.08.31

【WordPress】URLを自由にカスタムする

固定ページに引数を使用する場合

例えば固定ページに引数によって表示内容が変わる機能を設けたとしましょう。
引数をURLの一部として表現できると、引数をそのまま表示するよりスマートで何だかカッコイイですよね。

下記のコードをfunctions.phpに記述してください。

function my_url_rewrite_rules_array( $rules ) {
  $new_rules = array( 
    '[page_name]/([^/]+)/([^/]+)/?$' => 'index.php?pagename=[page_name]&[第1引数]=$matches[1]&[第2引数]=$matches[2]',
    '[page_name]/([^/]+)/?$' => 'index.php?pagename=[page_name]&[第1引数]=$matches[1]'
  );
  return $new_rules + $rules;
}

function wp_insertMyRewriteQueryVars($vars) {
  array_push($vars, '[第1引数]', '[第2引数]');
  return $vars;
}

function flushRules() {
  global $wp_rewrite;
  $wp_rewrite->flush_rules();
}

add_filter('rewrite_rules_array', 'my_url_rewrite_rules_array' );
add_filter('query_vars', 'wp_insertMyRewriteQueryVars');
add_filter('init', 'flushRules');

具体的には[page_name]の後ろの'([^/]+)’に引数の値を代入したURL(例えば http://foo.com/foods_list/bread/croissant/)を入力することで、次のURL、’http://foo.com/index.php?pagename=foods_list&food_type=bread&kinds=croissant’のページが呼び出されます。

[第1引数]と[第2引数]は元々WordPressのシステム上には存在しない引数なので、追加登録が必要であり、’query_vars’フィルターによってこれを行っています。

カスタム投稿の個別ページの場合

カスタム投稿の個別ページは通常、'[ブログURL]/[投稿タイプslug]/[投稿名]’と表現されるのが一般的ですが、この'[投稿名]’の部分を記事の $post->ID に置き換える場合は下記のようなコードを functions.php に記述します。

function my_post_type_link( $link, $post ){
  if ( 'my_custom_post_1' === $post->post_type ) {
    return home_url( '/my_custom_post_1/' . $post->ID );
  } elseif( 'my_custom_post_2' === $post->post_type ) {
    return home_url( '/my_custom_post_2/' . $post->ID );
  } elseif( 'my_custom_post_3' === $post->post_type ) {
    return home_url( '/special/' . $post->ID );
  } else {
    return $link;
  }
}
add_filter( 'post_type_link', 'my_post_type_link', 1, 2 );

function my_posturl_rewrite_rules_array( $rules ) {
  $new_rules = array( 
    'my_custom_post_1/([0-9]+)/?$' => 'index.php?post_type=my_custom_post_1&p=$matches[1]',
    'my_custom_post_2/([0-9]+)/?$' => 'index.php?post_type=my_custom_post_2&p=$matches[1]',
    'special/([0-9]+)/?$' => 'index.php?post_type=my_custom_post_3&p=$matches[1]',
  );
  return $new_rules + $rules;
}
add_filter( 'rewrite_rules_array', 'my_posturl_rewrite_rules_array' );

function my_rule_disable_redirect_canonical($redirect_url) {
  if (is_singular()) $redirect_url = false;
  return $redirect_url;
}
add_filter('redirect_canonical','my_rule_disable_redirect_canonical');

3番目のpost_type ‘my_custom_post_3’の仮想のディレクトリを’special’と表記していますが、このようなURLの完全な置き換えも可能になります。

最後に’redirect_canonical’フィルターに対して個別ページを表示する際のURL補正、元のURL表示への変更を解除しておきます。

Go to Top