在Wordpress插件中,为什么在激活钩中调用`register_rest_route()`不起作用?

时间:2018-08-22 03:30:53

标签: php wordpress wordpress-rest-api

我有这个(示例)插件:

<?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!"的请求。在激活挂钩期间进行注册时,为什么端点未注册?

1 个答案:

答案 0 :(得分:2)

如果您检查WordPress Codex,您会发现register_activation_hook仅在激活插件时运行

  

激活插件后,将调用操作“ activate_PLUGINNAME”挂钩。

Reference

在该钩子中使用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函数。

Reference

我希望这是有道理的。

如果您需要更多说明,请告诉我。