web-dev-qa-db-ja.com

Add_rewrite_ruleについて

私はadd_rewrite_ruleがurlからパラメータを抽出し、それをリクエストに渡すように働くようにしています。これについていくつかの投稿を見ましたが、それを動かすようには思えません。

URLが特定の文字列で始まる場合は、URLから削除してクエリパラメータとして渡します。

リクエストURLの例:

http://domain.com/foo/my_page

これはに変換されます

http://domain.com/my_page?param=foo

'foo'が存在しない場合は、通常の要求としてそのまま通過するはずです。このロジックは、私のサイトのすべてのページURLまたはカスタム投稿タイプのURL(基本的にはfoo/*)に適用する必要があります。 URLが 'foo'でそれが取り除かれ、それからそれが普通のことにWordpressに渡されるならば、それがパススルーとして機能すると考えること。

私はすでに 'query_vars'として 'param'を持っています。

全体として、それは以下のために働く必要があるでしょう:

  • / foo/my_page(ページ)
  • / foo/my_folder/my_page(サブページ)
  • / foo/example_type(カスタム投稿アーカイブ)
  • / foo/example_type/example_post(カスタムポストシングル)
10
Louis W

わかりました、私は3つのタイプの要求すべてのための実用的な例を得ました。それらを機能させるためには、たくさんの試行錯誤が必要でした。私はミロが人々に彼ら自身の質問に答えるように促すのが得意であると思います。

数え切れないほどの変更とパーマリンクの更新の後、私はadd_rewrite_urlの外側のURLを把握することがはるかに容易であることに気付きました。例はindex.php?param=foo&post_type=example_typeです。

もう一つの明白なこと、しかしそれをここに追加することで他の誰かに役立つかもしれません。ページ/サブページのワイルドカードルールを定義する前に、カスタム投稿タイプのadd_rewrite_ruleルールを定義する必要があります。私はそれにかなりの時間を浪費しました、そしてそれが私がルールがうまくいかなかった理由を理解させなかった主なものだと思います。

これが私のすべてのニーズを満たす3つのルールです。ページ/サブページルールが1つにまとめられました。

// Custom Post Archive
add_rewrite_rule(
    '^foo/example_type/?$',
    'index.php?param=foo&post_type=example_type',
    'top'
    );

// Custom Post Individual
add_rewrite_rule(
    '^foo/example_type/([^/]*)/?$',
    'index.php?param=foo&example_type=$matches[1]',
    'top'
    );

// Pages, Top-Level and Sub-Pages
// This MUST be placed in the code AFTER custom post add_rewrite_rule
add_rewrite_rule(
    '^foo/(.+)/?$',    
    'index.php?param=foo&pagename=$matches[1]',
    'top'
    );

さらに、私が行ったことは、複数のカスタム投稿タイプルールを追加するためのループを設定することです。ページ/サブページのワイルドカードルールを定義する前に、カスタム投稿タイプadd_rewrite_ruleルールを定義する必要があることを忘れないでください。

$custom_types = array('example_type', 'projects', 'people');

foreach($custom_types as $type) {

    // Custom Post Archive
    add_rewrite_rule(
        '^foo/'.$type.'/?$',
        'index.php?param=foo&post_type='.$type,
        'top'
        );

    // Custom Post Individual
    add_rewrite_rule(
        '^foo/'.$type.'/([^/]*)/?$',
        'index.php?param=foo&'.$type.'=$matches[1]',
        'top'
        );

}

Miloが渡した Rewrite Analyzer は、Wordpressがページ/投稿をどのようにクエリするかをよりよく理解しようとするときに非常に役に立ちました。

6
Louis W

あなたの例のために働くだろう基本的な規則:

function wpd_foo_rewrite_rule() {
    add_rewrite_rule(
        '^foo/([^/]*)/?',
        'index.php?pagename=$matches[1]&param=foo',
        'top'
    );
}
add_action( 'init', 'wpd_foo_rewrite_rule' );

これはfoo/の後に続くものすべてを取り、それをクエリのpagenameとして設定し、そしてparamは静的な値fooを取得します。異なるURLパターンが必要な場合は、固有のパターンごとに追加の規則が必要になります。書き換えルール内で設定できるさまざまなクエリ変数については WP_Query docs を参照してください。新しいものを追加した後に書き換えルールをフラッシュすることを忘れないでください。これは、[固定リンク設定]ページにアクセスして実行できます。

今すぐあなたの例のURLにアクセスしてください。

http://domain.com/foo/my_page

正しいページをロードしますが、訪問のようには動作しません。

http://domain.com/my_page?param=foo

内部書き換えを使用する場合、param$wp_queryスーパーグローバルではなく、$_GETクエリオブジェクト内に設定されるためです。 $_GETで値を探すコードを操作する必要がある場合は、その値を設定するための追加の手順が必要になります。

function wpd_foo_get_param() {
    if( false !== get_query_var( 'param' ) ){
        $_GET['param'] = get_query_var( 'param' );
    }
}
add_action( 'parse_query', 'wpd_foo_get_param' );

考慮すべきもう1つの方法はエンドポイントの使用です。そのため/foo/はプレフィックスとしてではなくURLの最後にあります。これの利点は、APIのadd_rewrite_endpointがページネーションを有効にすることを含むあなたが必要とするすべての規則の追加を単純化することです。

7
Milo