web-dev-qa-db-ja.com

書き換えルールでクエリ文字列パラメータが失われる

カスタム投稿タイプの追加に成功しました。パーマリンク構造はとてもうまくいきます。それで、例えば、私はカスタム投稿タイプbooksを持っています、そして本へのパーマリンクは/books/the-dictionaryです。

私のsingle-book.phpページテンプレートは、ページに表示されるコンテンツをカスタマイズするためにletterパラメータを受け入れます。 /book/the-dictionary/qのようにこれにリンクできるようにしたいです。

私は私のテーマのfunctions.phpファイルに以下を追加しました:

function my_init() {
    add_books_rewrite();

function add_books_rewrite() {
    add_rewrite_rule("books/([^/]+)/([^/])/?$", 'index.php?pagename=$matches[1]&letter=$matches[2]', "top");
    global $wp_rewrite;
    $wp_rewrite->flush_rules();
}
function add_books_query_vars($query_vars) {
    $query_vars[] = "letter";
    return $query_vars;
}
add_filter("init", "my_init");
add_filter("query_vars", "add_books_query_vars");

上記のフラッシュコードを使って手動でパーマリンク設定ページに行き保存すること、そして正規表現の中の愚かなエラーを修正することを何度か試しましたが、結局私は Jan Fabry's 素晴らしい アナライザプラグインを書き換えます

confirmed in rewrite analyzer

だから、ここから私はそれが滑らかな航海だと思いますね。ええ...正確には違います。

自分のサイトをロードしてbooks/the-dictionary/qに移動すると、the-dictionaryのコンテンツは正しくロードされますが、パラメータが失われます。私が面白いと思うことは、index.php?pagename=the-dictionary&letter=qをロードすれば、すべてうまくいくことです。

パラメータを取得するには、次のコードがあります。

global $letter;
echo $letter. " - global";
echo "<br>";
$current_letter = (isset($wp_query->query_vars["letter"]) ? $wp_query->query_vars["letter"] : "all");
echo $current_letter . " - query_vars";
echo "<br><br>";

私は$_SERVER["QUERY_STRING"]も見ています。これらはindex.php?pagename...&letter...を使用したときに入力されますが、/books/pagename/letterを使用したときには入力されません。

だから、ここでいくつかのことが起こっているようです。適切なクエリ文字列変数を使ってindex.phpを指定すればうまくいくので、WordPressは完全にパラメータを削除するわけではありません。これは書き換えルールが正しく機能していないことを示しているようです。しかし、Rewrite Analyzerプラグインは、私がやろうとしていることのために物事が適切に設定されていると言っているようです。

私は切断を解決するために私がここで見るべきであることに少し混乱しています。明らかなものが足りない場合は申し訳ありません。 ):

5

問題はフロントエンドのコードでしょう。

これを試して:

<?php
if( $letter = get_query_var( 'letter' ) ) 
{
        echo 'Current Letter: ' . $letter;
}
else
{
        echo 'Current Letter: All';
}
1
chrisguitarguy