WordPress中有两种重写规则:内部规则(存储在数据库中并由WP :: parse_request()解析)和外部规则(存储在.htaccess
Apache中并由Apache解析)。您可以选择任何一种方式,具体取决于所调用文件中需要多少WordPress。
外部规则:
外部规则是最容易设置和遵循的。它将my-api.php
在您的插件目录中执行,而无需从WordPress加载任何内容。
add_action( 'init', 'wpse9870_init_external' );
function wpse9870_init_external()
{
global $wp_rewrite;
$plugin_url = plugins_url( 'my-api.php', __FILE__ );
$plugin_url = substr( $plugin_url, strlen( home_url() ) + 1 );
// The pattern is prefixed with '^'
// The substitution is prefixed with the "home root", at least a '/'
// This is equivalent to appending it to `non_wp_rules`
$wp_rewrite->add_external_rule( 'my-api.php$', $plugin_url );
}
内部规则:
内部规则需要做更多的工作:首先添加一个重写规则,该规则添加一个查询var,然后将该查询var公开,然后我们需要检查该查询var是否存在以将该控件传递给我们的插件文件。到我们这样做时,通常的WordPress初始化就已经发生了(我们在常规的后期查询之前就中断了)。
add_action( 'init', 'wpse9870_init_internal' );
function wpse9870_init_internal()
{
add_rewrite_rule( 'my-api.php$', 'index.php?wpse9870_api=1', 'top' );
}
add_filter( 'query_vars', 'wpse9870_query_vars' );
function wpse9870_query_vars( $query_vars )
{
$query_vars[] = 'wpse9870_api';
return $query_vars;
}
add_action( 'parse_request', 'wpse9870_parse_request' );
function wpse9870_parse_request( &$wp )
{
if ( array_key_exists( 'wpse9870_api', $wp->query_vars ) ) {
include 'my-api.php';
exit();
}
return;
}