web-dev-qa-db-ja.com

クエリパラメータとショートコードを含むページURLの書き換え規則の何が問題になっていますか?

私はWPプログラミングが初めてなので、他の環境では単純な問題になることに問題があります。

通常のWP管理UIを使用してページを作成しました(cdl-manual)。それから私はページの内容にショートコードを使うことができるようにtheme functions.phpファイルにいくつかの機能を追加しました。関数はURL上でクエリパラメータ(jp_stn)を探し、その情報を使ってデータベーステーブルからコンテンツを選択します。この場合、パラメータ値は米国の州の名前です。提供されるコンテンツはその状態に焦点を当てたページです。

これで私の開発者のWebサイトで作業しています。

http://blog.jobspetroleum.net/cdl-training/ には、各州のCDLマニュアルへのリンクが記載されています。これらのリンクは、前述のように次の形式です。

http://blog.jobspetroleum.net/cdl-manual/?jp_stn=arizona

今、私はその状態固有のクエリパラメータURLをユーザーフレンドリなURLに変換したいです。これが新しいパターンです。

http://blog.jobspetroleum.net/cdl-manual/arizona/

私にとって明らかな解決策は書き換えルールを追加することでした。かなりの煩わしさの後、私はカスタムの書き換えルールを直接.htaccessファイルに追加できるプラグインを見つけました。プラグインは "WP htaccess Control"であり、それは非常にうまく機能します。しかし、私の書き換えルールは期待通りに動作していません。書き換え規則を追加した結果の.htaccessファイルを次に示します。

# BEGIN WordPress

# WPhtc: Begin Custom htaccess
RewriteRule ^cdl-manual/([-a-z]+)/$ /cdl-manual/?jp_stn=$1 [L]
# WPhtc: End Custom htaccess

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress

新しいルールは、カスタムhtaccessセクションにあります。/cdl-manual/arizona /でテストすると404エラーが発生します。デバッグするために、フラグを[L]から[R、L]に変更しました。

それは http://blog.jobspetroleum.net/cdl-manual/?jp_stn=arizona へのリダイレクトを引き起こしました。ページはコンテンツを正しくロードしましたが、URLは書き直されませんでした。ルールは正しく一致していると私は結論します。しかし、Rフラグがないと、書き換えは正しく機能しません。規則は http://htaccess.madewithlove.be/ に従って正しく、書き換えられたURLはまさに私が欲しいものです。

誰もがここで何が悪いのか知っていますか?私のアプローチは完全にオフになっていますか?これを修正するためのより良い方法は何ですか?ありがとう。

編集10/1/2014 - もしそれがだれにでも役立つなら、 "CDL Manual"ページには "[bigleaf_jobspet_cdlmanualbystate]"という内容しか含まれていない。この関数と他の依存関係は私の子テーマのfunctions.phpファイルにあります。この特定の関数はGETでjp_stnクエリパラメータを探し、状態名を読み、そして私がデータベースに追加したテーブルから詳細なコンテンツを引き出します。その後、名前付きの状態のHTMLを返します。

編集10/2/2014 - WP Codexを詳しく調べるindex.phpのpagenameクエリ変数への参照が見つかりました。それで私はいくつかのバリエーションを試してみて、ほとんどうまくいくこのルールを思い付きました。

RewriteRule ^cdl-manual/([-a-z]+)/$ ?pagename=cdl-manual&jp_stn=$1 [L]

この規則はcdl-manualページをロードしますが、stateパラメータ値を無視します。奇妙なことに、意図した書き換えパターンをブラウザに入力した場合、指定された状態に適したページが正確に読み込まれます。

http://blog.jobspetroleum.net/?pagename=cdl-manual&jp_stn=arizona

1
Ray N. Franklin

404が返される理由は、書き換え規則がPHPの報告されたsin $_SERVER[REQUEST_URI]変数のようにリクエストURLを変更しないためです。そして、どのコンテンツがリクエストであるかを決定するときにwordpressがその変数を解析します。/404を表示します。

あなたが必要とする方法でURLを解析するためのワードプレスの書き換え規則が必要ですが、私はあなたが単純に行って各状態の50のサブページを作成することをお勧めします。それは少し面倒なことかもしれませんが、おそらく状態ごとのカスタマイズについてさらに言えばあなたが望むことをするのにコードを書いたりデバッグしたりするのと同じくらい速いでしょう。

0
Mark Kaplun

.htaccessにルールを追加するのではなく、WordPressの書き換えを使用してこれを行うことができます。

function cdl_rewrite_rule(){
    add_rewrite_rule(
        'cdl-manual/([-a-z]+)/?$',
        'index.php?pagename=cdl-manual&jp_stn=$matches[1]',
        'top'
    );
}
add_action( 'init', 'cdl_rewrite_rule' );

これは既にjp_stnを有効なクエリ変数のリストに追加していることを前提としています。

function cdl_query_vars( $query_vars {
    $query_vars[] = 'jp_stn';
    return $query_vars;
}
add_filter( 'query_vars', 'cdl_query_vars' );

ルールを有効にするために書き換えをフラッシュします。パーマリンク設定ページにアクセスしてこれを行うことができます。

2
Milo