自定义重写规则以匹配WordPress尚未匹配的任何内容

时间:2018-04-21 作者:sceilig

我的网站上有这些鼻涕虫

http://www.domain.com/about (standard WP page)
http://www.domain.com/custom-slug (not a WP page, post or custom post type)
我正在尝试开发一个重写规则来匹配后一种场景,将它们重定向到我的自定义插件,以便我可以为它们呈现内容。我的重写规则如下所示

add_rewrite_rule(\'^(.*)/?\', \'index.php?pagename=special-page&id=$matches[1]\', \'bottom\');
通过将其设置为\'bottom\' 它在所有其他WordPress重写规则后生效,因此不会得到处理-WordPress将发送请求/custom-slug 到404页。

如果我将重写规则设置为\'top\' 然后WordPress上的每一页都将匹配。如果我的重写规则执行了,并在自定义数据库表中检查/custom-slug 在我的自定义系统中是有效的slug。如果确实如此,则为其呈现内容。如果没有让WordPress继续尝试匹配它(重定向/about 到网站上的实际“关于”页面)

通常情况下,重写规则更简单,在URL中匹配一个特定关键字,然后再匹配一个字符串,但这对我不起作用-所有的slug看起来都一样。

关于如何最好地实现这一点,有什么想法吗?

1 个回复
最合适的回答,由SO网友:Milo 整理而成

使用重写规则无法做到这一点,常规页面规则已经匹配,但您可以在从该规则提取的数据转换为查询之前拦截这些数据。

我们通过勾住parse_request 操作,我们可以在其中检查自定义slug,并直接修改请求对象。我推荐你var_dump($query) 并查看不同类型请求的整个对象。请参见代码中的注释。

add_action( \'parse_request\', \'wpd_check_for_my_custom_slug\' );
function wpd_check_for_my_custom_slug( $query ) {
    if( isset( $query->query_vars[\'pagename\'] ) ){
        // check if the slug matches some custom content
        // replace this with your query code
        if( \'my-custom-slug\' == $query->query_vars[\'pagename\'] ){
            // the request is for a custom slug
            // store the originally requested slug
            $query->query_vars[\'my_special_var\'] = $query->query_vars[\'pagename\'];
            // and load a placeholder page
            $query->query_vars[\'pagename\'] = \'placeholder-page\';
        }
    }
}
请注意,如果您的permalink结构%postname%, 子弹会进的name, 不pagename. 然后你还必须unset name 之后

如果计划在此过程结束时加载主题文件,我建议使用page 这些请求的post类型。WordPress希望存在某种post对象,以便模板成功呈现。您可以筛选和覆盖所有标题、内容等。。

如果您计划输出完全自定义的内容,可以加载该内容exit 在这里

结束

相关推荐