我有这个(示例)插件:
<?php
/*
Plugin Name: My Great Plugin
*/
function hello() {
return 'Hello, world!';
}
function my_great_plugin_init() {
add_action( 'rest_api_init', function() {
register_rest_route( 'great-plugin/v1', '/hello', array(
'methods' => 'GET',
'callback' => 'hello',
) );
} );
}
register_activation_hook( __FILE__, 'my_great_plugin_init');
?>
当我激活此插件时,/wp-json/great-plugin/v1/hello
路由不存在。但是,如果我将add_action
调用移到顶层,就像这样:
<?php
/*
Plugin Name: My Great Plugin
*/
function hello() {
return 'Hello, world!';
}
add_action( 'rest_api_init', function() {
register_rest_route( 'great-plugin/v1', '/hello', array(
'methods' => 'GET',
'callback' => 'hello',
) );
} );
?>
然后存在/wp-json/great-plugin/v1/hello
路由,并用GET
响应"Hello, world!"
的请求。在激活挂钩期间进行注册时,为什么端点未注册?
答案 0 :(得分:2)
如果您检查WordPress Codex,您会发现register_activation_hook
仅在激活插件时运行
激活插件后,将调用操作“ activate_PLUGINNAME”挂钩。
在该钩子中使用register_rest_route
无效,因为WP REST API Doc中提到的register_rest_route
被调用时rest_api_init
我们通过称为register_rest_route的函数来执行此操作,应在rest_api_init的回调中调用该函数,以避免在未加载API时做额外的工作。
基本上,当您将rest_api_init
放在register_activation_hook
内时,激活插件后不会触发。
换句话说,rest_api_init
启动时它不会检测到您的钩子
动作是WordPress核心在执行期间或特定事件发生时在特定点启动的挂钩。插件可以使用Action API指定在这些位置执行其一个或多个PHP函数。
我希望这是有道理的。
如果您需要更多说明,请告诉我。