1

さまざまな言語で本を表示する Book (/book/) という名前の WP ページがあります。言語変数と章変数はクエリ変数として渡されます。したがって、URL 構造は次のようになります。

/book/english/ (これは英語の章のリストを表示します) /book/english/foreword/ (これは英語の本の序文を表示します)

これが私が思いついたものです:

add_action('init', 'book_init');
add_filter('rewrite_rules_array', 'book_rewrite_rules_array');
add_filter('query_vars', 'book_query_vars');

function book_init() {
 global $wp_rewrite;
 $wp_rewrite->flush_rules();
}
function book_rewrite_rules_array($rewrite_rules) {
 global $wp_rewrite;
 $custom['(book)/(.+)/(.+)$'] = 'index.php?pagename=$matches[1]&book_language=$matches[2]&book_chapter=$matches[3]';
 $custom['(book)/(.+)$'] = 'index.php?pagename=$matches[1]&book_language=$matches[2]';
 return $custom + $rewrite_rules;
}
function book_query_vars($query) {
 array_push($query, 'book_language', 'book_chapter');
 return $query;
}

すべてが機能していますが、問題は、追加した書き換えルールが不要な /book/feed/ をキャッチしていることです。だから私は '(book)/(.+)/(.+)$' と '(book)/(.+)$' からのフィードを否定する式を探しています

また、提供されたクエリ変数が無効であると仮定した場合、これをチェックインするためにどのフィルターを使用する必要があるか、WP の続行を停止し、代わりに 404 エラーを送信して 404 ページを表示させる方法を知りたいですか?

4

1 に答える 1

1

次のような否定的な先読みを使用して、ルートから「フィード」を除外できるはずです(book)/(?!feed$)(.+)$

質問の 2 番目の部分については、フィルターにフックしてrequestクエリ変数を調べ、変数配列に「エラー」値を追加して、Wordpress に 404 エラーをスローさせることができます。

add_filter('request', 'book_request');
function book_request($vars) {
     if (!in_array($vars['book_language'], array('english', 'spanish'))) {
         $vars['error'] = '404';
     }
     return $vars;
}
于 2010-06-27T21:10:44.197 に答える