以下のようなカスタムコンテンツにつながるパーマリンクがあります。
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;
}
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
で呼び出します)。