有两种类型的重写规则可以通过API和add_rewrite_rule
: internal 规则和external 规则。将外部规则插入到.htaccess
文件,并且必须采用Apache的mod_rewrite
. 内部规则被添加到WordPress内部重写规则数组中,并且必须采用API可以通过PHP解析的格式。
WordPress通过查看add_rewrite_rule
. 内部规则必须指向index.php
, 通过查询字符串附加查询变量。任何不指向index.php
假定为外部规则。
您的规则存在的问题是,您混合了内部和外部格式。我假设第一条规则有效,因为尾部的斜杠混淆了解析器,它被添加为外部规则。第二条规则不起作用,因为它被解释为内部规则,但使用$1
而不是$matches[1]
访问捕获的匹配项。
考虑到这些因素,此规则应作为内部规则:
add_action(\'init\', \'pins_add_rewrite_rule\', 11);
function pins_add_rewrite_rule() {
add_rewrite_rule(
\'^document/(.*)$\',
\'index.php?action=short_url&id=$matches[1]\',
\'top\'
);
}
至于拦截这些请求,您可以挂接在查询数据库之前运行的更早的操作,以便以更少的开销更快地完成这些请求。
add_action( \'parse_query\', \'pins_short_url_redirect\' );
function pins_short_url_redirect( $wp_query ) {
if( isset( $wp_query->query_vars[\'action\'] ) && \'short_url\' == $wp_query->query_vars[\'action\'] ){
// output file here
die();
}
}
其他一些位:
使用query_vars
筛选以添加查询变量,而不是访问$wp
对象直接位于init
.
action
已经是WordPress查询变量,我不知道重新注册它是否会有任何负面影响,最好是安全的,并使用一些您知道是唯一的,例如ghazanfar_action
. 你可能也应该这样做id
.
不要在每个请求上刷新重写规则。只有当您知道重写内容已更改时,才应刷新它们。您可以在插件激活时刷新,也可以通过访问admin中的Permalinks设置页面快速刷新以进行测试。看见flush_rewrite_rules
了解更多信息。