我的网站上有这些鼻涕虫
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看起来都一样。
关于如何最好地实现这一点,有什么想法吗?
最合适的回答,由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
在这里