【问题标题】:Negating certain words from a custom rewrite expression?从自定义重写表达式中否定某些单词?
【发布时间】:2011-03-08 20:38:03
【问题描述】:

我有一个名为 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 页面吗?

【问题讨论】:

  • 没有时间给出完整的答复 - 我会尽快尝试!同时,您正在刷新每个初始化的规则!这太密集了!摆脱它,当您更改代码时,只需在管理员中更新您的永久链接。 flush_rules() 也会在帖子更新时调用,因此您的规则仍将保持最新状态。

标签: wordpress rewrite expression negate


【解决方案1】:

您应该能够使用否定前瞻从您的路线中排除“提要”,例如:(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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-25
    • 1970-01-01
    • 2013-06-16
    • 2020-04-20
    • 2015-05-12
    • 1970-01-01
    相关资源
    最近更新 更多