php - 在 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!"
。为什么在激活挂钩期间发生注册时端点没有注册?
解决方案
如果您检查 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 函数在这些点执行。
我希望这是有道理的。
如果您需要更多解释,请告诉我。
推荐阅读
- angular - 如何在离子网格上对齐固定离子段
- php - 从moodle unittest创建讨论时,grade_items表categoryid字段不会更新
- c++ - 寻找两个之间的最大数量,选择哪个实现
- kotlin - 协程块中的方法如何在 Kotlin 中工作?
- elasticsearch - Kibana DSL,在字段具有多个值的字段上聚合
- python - 在 python 中处理来自不同文件的变量时遇到问题。UnboundLocalError
- mysql - 如何从 mysql 数据库中删除所有记录?
- angular - 错误类型错误:无法在 xxxxxxx.push../src/app/xxxx-area/xxxx/xxxx.component.ts.xxxx.toggleVideo 处读取未定义 > 的属性“nativeElement”
- php - 如何在没有在 PHP 中打开 PayPal 页面的情况下完成 PayPal 结帐订单
- java - Spring @Transactional 用于创建线程安全逻辑