问题描述
我试图在 WordPress 中创建一个自定义 API 端点,我需要将请求重定向到 WordPress 根目录中的一个虚拟页面到我的 plug-in 附带的实际页面。所以基本上,所有对一页的请求实际上被路由到另一个页面。
示例:http://mysite.com/my-api.php
=> http://mysite.com/wp-content/plugins/my-plugin/my-api.php
要点是使 API 端点的 URL 尽可能短 (类似于 http://mysite.com/xmlrpc.php
,而是使用 plug-in 发送实际的 API 端点文件,而不需要用户在其安装和/或 hack 内核中移动文件。
我的第一个刺就是添加自定义重写规则。但是,这有两个问题。
- 端点始终具有尾部斜杠。成为
http://mysite.com/my-api.php/
- 我的重写规则才被部分应用。它不会重定向到
wp-content/plugins...
,它将重定向到index.php&wp-content/plugins...
。这导致 WordPress 显示页面未找到错误或仅默认到主页。
想法?建议?
最佳解决方案
WordPress 中有两种类型的重写规则:内部规则 (存储在数据库中并由 WP::parse_request()解析) 和外部规则 (存储在.htaccess
中并由 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 );
}
内部规则:
内部规则需要更多的工作:首先我们添加一个添加查询 vars 的重写规则,然后我们使这个查询 var public,然后我们需要检查这个查询 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;
}
次佳解决方案
这对我有用我从来没有触摸过重写 API,但总是推动自己在新的方向。以下工作在我的测试服务器 3.0 位于 localhost 的子文件夹中。如果 WordPress 安装在网页中,我不会看到任何问题。
只需将该代码放在插件中,并直接在 plugin 文件夹中上传名为”taco-kittens.php” 的文件。您将需要为您的永久链接写一个硬冲洗。我认为他们说最好的时间是插件激活。
function taco_kitten_rewrite() {
$url = str_replace( trailingslashit( site_url() ), '', plugins_url( '/taco-kittens.php', __FILE__ ) );
add_rewrite_rule( 'taco-kittens.php$', $url, 'top' );
}
add_action( 'wp_loaded', 'taco_kitten_rewrite' );
最好的祝福,
第三种解决方案
有什么理由不这样做吗?
然后只需将你的插件挂接到’init’ 并检查该变量。如果它存在,做你的插件需要做的和死 ()
第四种方案
我可能不会完全理解你的问题,但是一个简单的短码可以解决你的问题吗?
脚步:
- 让客户创建一个页面,即 http://mysite.com/my-api
- 让客户端在该页面中添加一个短码,即 [my-api-shortcode]
新页面充当 API 终端,您的短代码将请求发送到 http://mysite.com/wp-content/plugins/my-plugin/my-api.php 中的插件代码
(当然这意味着 my-api.php 会定义短码)
您可以通过插件自动执行步骤 1 和 2 。
参考文献
注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。