2010-06-27 58 views
1

我有一个名为Book(/ book /)的WP页面,它以各种语言显示一本书。语言和章节变量 作为查询变量传递。因此,URL结构如下:否定自定义重写表达式中的某些单词?

/书/英语/(这个用英语显示章节列表) /书/英语/前言/(这显示了本英语书的前言)

这里就是我想出了:

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; 
} 

一切工作,但问题是,我已经添加了重写规则也赶上/电子书/饲料/我不希望 。所以我正在寻找一个表达式,否定来自'(书)/(。+)/(。+)$'和'(书)/(。+)$''

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

+1

没有足够的时间给出完整的回复 - 会尽快尝试!与此同时,你正在冲洗每个初始化的规则!这太密集了!摆脱它,只要更改代码时更新管理员的永久链接。 'flush_rules()'也被称为任何时候一个职位更新,所以你的规则将保持新鲜。 – TheDeadMedic 2010-06-27 17:12:46

回答

1

您应该能够使用负向预测排除您的路线中的'feed',如下所示:(book)/(?!feed$)(.+)$

至于你的问题的第二部分,你可以挂钩到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; 
} 
相关问题