add_rewrite_ruleについて


11

私はadd_rewrite_ruleurlからparamを抽出し、それをリクエストに渡そうとしています。これに関する多くの投稿を見ましたが、それを機能させることができないようです。

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(カスタム投稿シングル)

投稿の種類pageだけでなく、ページだけでなく、投稿、カテゴリ、タグなどを意味するURL 階層内の親/子ページはどうですか?
ミロ2016

@ミロ私はあなたのためにこれを明確にしました。私はページとカスタム投稿タイプ(アーカイブと単一ページ)のみを使用しています。
Louis W

回答:


8

あなたの例で機能する基本的なルール:

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ドキュメントを参照してください。新しいルールを追加した後、書き換えルールをフラッシュすることを忘れないでください。これは、パーマリンク設定ページにアクセスすることで実行できます。

次に、サンプル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の最後に配置します。これの利点は、add_rewrite_endpointページ付けの有効化など、必要なすべてのルールをAPIが簡単に追加できることです。


完全な説明をありがとう。近いようですが、ページでは機能しますが、カスタム投稿アーカイブと単一のURLで404エラーが発生します。
Louis W

ええ、私が言ったように、それらのパターンのそれぞれに一致する追加のルールを追加する必要があります。あなたの設定でこれらのURLがどのように見えるかわかりません。
ミロ2017年

アーカイブと単一のページを持つ「プロジェクト」という名前のカスタムページタイプがあります。その例を挙げていただければ、他のすべてを作ることができます。
Louis W

また、サブページでは機能しないようです。
Louis W

1
質問を編集して、ルールが必要な各URLパターンの例を追加します。私は自分の答えが受け入れられることについて本当に心配していません。最初に何かを与えることによって、人々をだまして自分の質問に答えさせることができます。
ミロ2017年

6

わかりました。3種類すべてのリクエストの実例があります。それらを機能させるためには、たくさんの実験といじくりが必要でした。Miloは、人々が自分の質問に答えるように導くのが得意だと思います。

数え切れないほどの変更とパーマリンクの更新を行った後、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'
        );

}

書き換えアナライザより良いWordpressのは、ページ/ポストのための照会方法を理解しようとするとミロが一緒に渡された、非常に役に立ちました。


番組に遅れますが、別の例としてpingしてもいいですか。ちなみに、私はadd_rewrite_ruleの$ tagパラメータを完全に理解していません。意味がわかりません。また、pagename = $ matches [1] 'を使用した例も理解できません。えっ?domain.com/detail?id=2&it=3のようなURLがあります。ページをdomain.com/detail/2-3/にしたい。よろしいですか?
Debbie Kurth、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.