web-dev-qa-db-ja.com

書き換えルールはリダイレクトされ、VARを渡しません

Functions.phpファイルに次のコードがあります。

<?php
add_action('init', 'flush_rewrite_rules');

function custom_add_rewrite_rules( $wp_rewrite ) {
    $new_rules = array( 
        'insurance-leads-types/auto-insurance-leads/([^/\.]+)/?$' => 'index.php?pagename=auto-insurance-leads&state=' . $wp_rewrite->preg_index(1),
        'insurance-leads-types/home-insurance-leads/([^/\.]+)/?$' => 'index.php?pagename=home-insurance-leads&state=' . $wp_rewrite->preg_index(1)
    );
    $wp_rewrite->rules = $new_rules + $wp_rewrite->rules;
}
add_action('generate_rewrite_rules', 'custom_add_rewrite_rules');

function add_query_vars( $query_vars ) {
  $query_vars[] = 'state';
  return $query_vars;
}
add_filter( 'query_vars', 'add_query_vars' ); 

ページ/ insurance-leads-types/auto-insurance-leads/STATENAME /に移動すると、URLは末尾のSTATENAME /なしで/ insurance-leads-types/auto-insurance-leads /にリダイレクトされ、変数は渡されません$ query_varsに。

私はMonkeymanのRewrite Analyzerを使用しましたが、すべて正常に見えます。

ページ名:auto-insurance-leads

状態:(。[^ /] +)

URLがリダイレクトする理由はありますか?

1

add_rewrite_endpoint()関数を使用してこれにアプローチします。

クエリ変数の追加を処理し、セットアップがはるかに簡単であり、ページスラッグの変更などを心配する必要はありません...

コードは次のようになります。

// in functions.php
add_action( 'init', 'wpse42604_add_endpoints' );
function wpse42604_add_endpoints() {
   add_rewrite_endpoint( 'state', EP_PAGES );
}

// in template file eg. page.php   
if ( '' != get_query_var( 'state' ) ) {
    // ... do stuff with the state query var
}

1つの欠点(見方によって異なります)は、上記で指定した正確なURLを取得できないことです。これらは次のようになります。

insurance-leads-types/auto-insurance-leads/state/tx/

しかし、より堅牢で柔軟なソリューションであり、さらにそのURLは見た目も見やすく、読みやすいものです。

あなたが見ている問題は、書き換えを見る前に正規リダイレクトを実行する書き換えルールのWordPressの処理で以前に遭遇した問題です。残念ながら、私はそれをたどってから詳細を思い出せないのでしばらくしていますが、wp-includes/canonical.phpのredirect_canonical()関数が同様の問題を引き起こしていました。

1
sanchothefat

おそらく、generate_rewrite_rulesフィルターを使用するのではなく、組み込みの rewrite api 関数を使用する必要があります。書き換え正規表現にはいくつかの問題があります。 URLの先頭から一致するようにWPに指示するには、ニンジン^でそれぞれを開始する必要があります。

([^/\.]+)で何を達成しようとしているのか本当にわかりません。スラッシュでもピリオドでもないものはありますか?その場合は、おそらく期待どおりに動作しません。誰かがinsurance-leads-types/auto-insurance-leads/tx.state/と入力できますが、正規表現はドットに続くものを考慮しないため、一致しません。

最後のグループのスラッシュではないものに一致する作業バージョンがあります。

<?php
add_action( 'init', 'wpse42604_add_rewrite' );
function wpse42604_add_rewrite()
{
    add_rewrite_rule(
        '^insurance-leads-types/auto-insurance-leads/([^/]+)/?$',
        'index.php?pagename=auto-insurance-leads&state=$matches[1]',
        'top'
    );
    add_rewrite_rule(
        '^insurance-leads-types/home-insurance-leads/([^/]+)/?$',
        'index.php?pagename=home-insurance-leads&state=$matches[1]',
        'top'
    );
}

すべてのコード プラグインとして 。私は本当に大きな rewrite apiに関するチュートリアル を書いたので、一見の価値があります。

編集:また、コードのように1ページの読み込みだけで、書き換えルールをフラッシュする予期しない動作が発生する場合があります。

1
chrisguitarguy