将‘rest_api_init’包装在‘is_admin()’函数中

时间:2019-03-23 作者:20yco

我正在通过创建自定义管理页add_menu_page, 假设我的自定义页面有url

wp管理员/管理员。php?page=settings\\u页面

那我检查一下is_admin() 功能通过var_dump 在我的settings_page 它回来了true - 没关系,但当我裹好rest_api_init 中的操作if is_admin() 声明如下:

if(is_admin()){
  add_action(\'rest_api_init\',   [$this, \'myRegisterRoutesFunction\']);
}
它还给了我404 - No route was found matching the URL and request method. 但如果我删除if 声明,它运行良好。不明白为什么,谢谢你的建议!

2 个回复
SO网友:floodlitworld

本质上,您不应该将REST路由声明包装在is\\u admin()中,因为Wordpress不会加载它们(请参阅@DarkNueron注释)。

您可以将“permission\\u callback”函数传递给register_rest_route 作用如果函数返回true,则允许继续请求;如果为false,则返回错误。

因此,您可以:

register_rest_route(\'your-namespace/v1\', \'/options/\', [
   \'methods\'   => \'PATCH\',
   \'callback\'  => [__CLASS__, \'update_option\'],
   \'permission_callback\'   => function () {
        return current_user_can(\'manage_options\');
   }
]);

SO网友:DarkNeuron

这是由于WP初始化REST端点的方式。其工作原理如下:

某人POSTs到端点,f.ex/wp-json/my/custom/endpoint. Wordpress通过调用rest_api_init 钩子,并运行设置该路由的任何自定义代码。

现在查看的源is_admin:

function is_admin() {
    if ( isset( $GLOBALS[\'current_screen\'] ) ) {
        return $GLOBALS[\'current_screen\']->in_admin();
    } elseif ( defined( \'WP_ADMIN\' ) ) {
        return WP_ADMIN;
    }

    return false;
}
这里没有什么神奇之处,它只是检查您当前所在的屏幕。然而,当REST调用传入时,没有“屏幕”。所以is_admin 总是会返回false。

因此,当您将REST初始化逻辑包装为is_admin.

相关推荐

WordPress wp-admin css未加载

以前有SSL现在没有SSL我的word press管理仪表板css未加载,但主页和其他页面工作正常有人知道如何修复此问题吗?没有ssl,只是http已经有人问了同样的问题,但这些答案并不能解决我的问题Wordpress wp-admin suddenly lost its styleWordpress Admin Panel Completely Distorted, no css at all来自其他堆栈交换网络的相同问题Wordpress admin not loading css/jswordpre