web-dev-qa-db-ja.com

URLの解析方法に関する混乱

以下のようなカスタムコンテンツにつながるパーマリンクがあります。

http://mysite.com/extra-deal/91103/

ファイルによって処理されるページに移動します。

category-extra-deals.php

そのページで、URLの最後の部分(上記の例では91103)を取得し、それを使用して必要な情報のカスタムデータベース要求を行います。

ID番号(91103)の使用をやめてタイトルの使用を開始したいのですが。

しかしそれを次のように変更します。

http://mysite.com/extra-deal/title-of-that-entry/

404の結果とテンプレートcategory-extra-deals.phpは決して触れられません。

少なくとも、そのタイトルが見つからない場合でも、テンプレートがヒットする可能性があると考えましたが、そうではありません。

もう一つの例...私が訪れた場合:

http://mysite.com/extra-deal/9/

私はcategory-extra-deals.phpテンプレートを入手しますが、9が存在しないので内容はありません。

しかし使用:

http://mysite.com/extra-deal/a/

404ページになります。

URLに数字が付いているときに目的のテンプレートが表示され、URLの同じ部分にテキストが含まれているときに404が表示されるのはなぜですか。


解決策

私は新しいURL構造に対応するために私自身の書き換え規則を追加する必要がありました。

だから次のURL:

http://mysite.com/extra-deal/the-title-of-the-posting

次の規則で処理されます。

function add_rewrite_rules($aRules) {
$aNewRules = array('extra-deal/([^/]+)/?$' => 'index.php?pagename=extra-deal&extradeal_title=$matches[1]');
$aRules = $aNewRules + $aRules;
return $aRules;
}

add_filter('rewrite_rules_array', 'add_rewrite_rules');

もう1つ、お気づきのとおり、URLには「extra deal_title」という名前のパラメータが必要です。それも同様に追加する必要があります。

function add_query_vars($aVars) {
$aVars[] = "extradeal_title";
return $aVars;
}
1
gaoshan88

WordPressはURLを解析するために一連の正規表現を使用します(いわゆる書き換え規則)。それはそれらをある順序で照合し、最初に一致する規則が見つかると停止します。

あなたのケースでどのルールが一致しているかを言うのは少し難しいです。私たちはあなたのパーマリンクの設定が何か、そして書き換え規則に他のどのような変更が加えられているのかわかりません。

これらすべての規則を見るには、この関数を追加してから呼び出してください(footer.phpは呼び出しに適した場所です)

function my_debug_rewrite_rules() {
    global $wp_rewrite;
    echo '<div>';
    if ( !empty( $wp_rewrite->rules ) ) {
        echo '<table><thead><tr><th>Rule</th><th>Rewrite</th></tr></thead><tbody>';
        foreach ( $wp_rewrite->rules as $name=>$value ) {
            echo '<tr><td>'. esc_html($name) .'</td><td>'. esc_html($value) .'</td></tr>';
        }
        echo '</tbody></table>';
    }
    echo '</div>';
}

あなたがチェックすることができるもう一つのことは、これらのルールのどれが一致したかということです:

function debug_page_request() {
    global $wp, $template;
    echo '<p>Request: '. esc_html($wp->request) .'</p>';
    echo '<p>Matched Rewrite Rules: '. esc_html($wp->matched_rule) .'</p>';
    echo '<p>Loaded Template: '. esc_html(basename($template)) .'</p>';
}

(繰り返しますが、footer.phpで呼び出します)。

3