説明
add_rewrite_rule() は、独自のURLの規則(リライトルール)を追加する関数です。追加したあとは、ルールの更新が必要です。
基本構文
add_rewrite_rule( string $regex, string|array $query, string $after = 'bottom' ): void
引数
$regex:URLにマッチする、正規表現$query:対応するクエリ(index.php?...の形)$after:topかbottom(ルールを置く位置)
戻り値
戻り値はありません。
使い方(サンプル)
add_action( 'init', function () {
add_rewrite_rule( '^shop/([0-9]+)/?$', 'index.php?post_type=product&p=$matches[1]', 'top' );
} );
注意点
initフックの中で、呼びます。- 追加したあとは、ルールを、一度だけ更新します(
flush_rewrite_rules()、またはパーマリンク設定の保存)。 - 独自のクエリ変数を使うときは、
query_varsフィルターで、登録します。
実務での使いどころ
- カスタムのURL(
/shop/123/など)を、投稿や、クエリに、結びつけるとき。
よくあるミスと対処
initフックの外で、呼んでいる。- 追加しただけで、ルールを更新しておらず、404になる。
- ルールの更新(
flush_rewrite_rules())を、毎回のリクエストで呼んでいる。 - 独自のクエリ変数を、登録していない。値が、取得できない。
NG例
add_action( 'init', function () {
add_rewrite_rule( '^shop/([0-9]+)/?$', 'index.php?shop_id=$matches[1]', 'top' );
flush_rewrite_rules(); // 毎回のリクエストで、実行される
} );
OK例
add_action( 'init', function () {
add_rewrite_rule( '^shop/([0-9]+)/?$', 'index.php?shop_id=$matches[1]', 'top' );
} );
add_filter( 'query_vars', function ( $vars ) {
$vars[] = 'shop_id';
return $vars;
} );
// ルールの更新は、有効化時などに、一度だけ
使い分け早見表
| 関数 | 役割 |
|---|---|
add_rewrite_rule() |
リライトルールを追加する |
flush_rewrite_rules() |
ルールを更新する |
get_query_var() |
クエリ変数の値を取得する |

コメント