否定自定义重写表达式中的某些单词?

时间:2010-06-27 16:02:14

标签: wordpress rewrite expression negate

我有一个名为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;
}

一切正常,但问题是,我添加的重写规则也是catch / book / feed /我不知道 想。所以我正在寻找一个表达式来否定来自'(book)/(。+)/(。+)$'和'(book)/(。+)$'

的提要

另外我想知道,如果假设提供的查询变量无效,我应该使用哪个过滤器来检查这个以及如何 我可以阻止WP继续,而是让它发送404错误并让它显示404页面吗?

1 个答案:

答案 0 :(得分:1)

您应该能够使用负面前瞻从您的路线中排除“Feed”,如下所示:(book)/(?!feed$)(.+)$

至于问题的第二部分,你可以挂钩request过滤器检查查询变量,然后在变量数组中添加一个'error'值,导致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;
}