首页 > 解决方案 > 在 Wordpress 插件中,为什么在激活钩子中调用时 `register_rest_route()` 不起作用?

问题描述

我有这个(示例)插件:

<?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!"。为什么在激活挂钩期间发生注册时端点没有注册?

标签: phpwordpresswordpress-rest-api

解决方案


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

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

参考

在该钩子内部使用register_rest_route将不起作用,因为在WP REST API Doc s中提到 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 函数在这些点执行。

参考

我希望这是有道理的。

如果您需要更多解释,请告诉我。


推荐阅读