如何在REST_ROUTE()中使用CURRENT_USER_CAN()?

时间:2018-11-28 作者:Lucas Bustamante

我试图断言current_user_can()permission_callback a的方法register_rest_route 作用但是,它总是返回false。

经过进一步调试,我发现wp_get_current_user() 函数返回ID零,这可能意味着$current_user 全局在执行时不可用。

这意味着this example 从文档中可以看出:

<?php
add_action( \'rest_api_init\', function () {
    register_rest_route( \'myplugin/v1\', \'/author/(?P<id>\\d+)\', array(
        \'methods\' => \'GET\',
        \'callback\' => \'my_awesome_func\',
        \'args\' => array(
            \'id\' => array(
                \'validate_callback\' => \'is_numeric\'
            ),
        ),
        \'permission_callback\' => function () {
            return current_user_can( \'edit_others_posts\' );
        }
    ) );
} );
事实上,事实并非如此。

进一步调试:

<?php
// muplugins/test.php
add_action(\'rest_api_init\', function() {

    // Works. Returns current WP_User.
    wp_get_current_user();

    // Works. Returns current WP_User.
    global $current_user;

    register_rest_route(\'test\', \'user\', [
       \'methods\' => \'GET\',

        // In a closure. Does not work. Returns zero.
       \'callback\' => function() {
           var_dump(wp_get_current_user());exit;
       },

        // In a class. Does not work. Returns zero.
        \'callback\' => [new Something, \'test_wp_get_current_user_in_a_class\'], 

        // In a function. Does not work. Returns zero.
        \'callback\' => \'test_wp_get_current_user\',

        \'permission_callback\' => function() {
            // Does not work. Returns zero.
            wp_get_current_user();

            // Does not work. Returns zero.
            global $current_user;
            $current_user->ID;
        }
    ]);
});

function test_wp_get_current_user()
{
    var_dump(wp_get_current_user());exit;
}

class Something
{
    public function test_wp_get_current_user_in_a_class()
    {
        var_dump(wp_get_current_user());exit;
    }
}
如何使用current_user_can() 在…内register_rest_route()? 或者,我应该吗?

1 个回复
SO网友:Lucas Bustamante

你需要通过wp_rest 使用发送给REST的JavaScript请求暂停。

这个nonce是将关于哪个用户发出请求的信息从PHP传递到JavaScript的。

示例:

<form>
    <input type="text" name="rest_auth_nonce" value="<?= esc_attr( wp_create_nonce( \'wp_rest\' ) ) ?>">
</form>

<script>
    jQuery.ajax({
        beforeSend: function (xhr) {
            xhr.setRequestHeader(\'X-WP-Nonce\', jQuery(\'form\').find(\'input[name="rest_auth_nonce"]\').val());
        }
    });
</script>

结束

相关推荐

Php致命错误:无法将WP_REST_RESPONSE类型的对象用作wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php中

我向WordPress添加了一个自定义端点,如下所示: add_action( \'rest_api_init\', function () { register_rest_route( \'menc/v1\', \'/crosscat/(?P[\\w-]+)/(?P[\\w-]+)\', array( \'methods\' => \'GET\', \'callback\' => \'dept_cat_api\',&#x