如何使用自定义元数据和/或电子邮件通过REST API检索用户

时间:2020-10-14 作者:gabtzi

我已经成功地为用户添加了一个自定义元键/值,并设法在rest API中显示它,但我不确定如何基于此键检索用户。

例如

$fields = [\'trdr\'];
foreach($fields as $field){
    register_rest_field(\'user\', $field, [
        \'get_callback\' => function($user, $field_name, $request) use ($field){
            return get_user_meta($user[\'id\'], $field_name, true);
        },
        \'update_callback\' => function($user, $meta_value) use ($field){
            update_user_meta($user[\'id\'], $field, $meta_value);
        },
        \'schema\' => [
            \'type\' => \'string\',
            \'description\' => \'the customer trdr in softone\',
            \'context\' => [\'view\', \'edit\']
        ]
    ]);
}
按ID检索时,该字段已在用户中成功检索,但我不确定如何使用此特定rest字段查询用户。

我正在使用composer软件包https://github.com/varsitynewsnetwork/wordpress-rest-api-client 简化与API对话的过程,例如,我可以

return $this->wpClient->getClient()->users()->get(null, [\'slug\' => $slug]);
通过弹头检索单个用户。然而,为电子邮件或字段(在我的情况下是trdr)这样做是行不通的。你知道需要采取哪些额外的步骤吗?

库的代码很容易创建请求,所以它似乎不是因为库的缘故。

    public function get($id = null, array $params = null)
    {
        $uri = $this->getEndpoint();
        $uri .= (is_null($id)?\'\': \'/\' . $id);
        $uri .= (is_null($params)?\'\': \'?\' . http_build_query($params));

        $request = new Request(\'GET\', $uri);
        $response = $this->client->send($request);

        if ($response->hasHeader(\'Content-Type\')
            && substr($response->getHeader(\'Content-Type\')[0], 0, 16) === \'application/json\') {
            return json_decode($response->getBody()->getContents(), true);
        }

        throw new RuntimeException(\'Unexpected response\');
    }

1 个回复
SO网友:gabtzi

我通过查看\\WP\\u REST\\u Users\\u Controller::get\\u items并注意到没有一种通过元项自动过滤的方法来解决我的问题。相反,您需要应用\\u过滤器来实际输入数组中的参数。

所以为了实现我的搜索,我必须做这些事情。

函数中的。php或插件

     foreach ($fields as $field) {
        //register meta field
        register_meta(\'user\', $field, [
            \'single\' => true,
            \'show_in_rest\' => true,
            \'type\' => \'string\',
        ]);
    
        //register search function in rest api
        add_filter(\'rest_user_query\', function ($args, $request) use ($field) {
            if (isset($request[$field]) && !empty($request[$field])) {
                $args[\'meta_query\'][] = [
                    \'relation\' => \'AND\',
                    [
                        \'key\' => $field,
                        \'value\' => $request[$field],
                        \'compare\' => \'=\'
                    ]
                ];
    
            }
            return $args;
        }, 10, 2);
    }
在rest请求中,只需添加参数
    [
        \'trdr\' => $trdr
    ]
可以像这样搜索电子邮件

        [
            \'search\' => $email,
            \'search_columns\' => [\'user_email\']
        ]

相关推荐

为什么GET_USERS()不在管理后端工作?

我不明白为什么get_users() 可在前端工作,但不能在管理后端工作。我相信这在某种程度上是可行的。我的代码:function add_new_user_menu_item() { remove_submenu_page(\'users.php\', \'user-new.php\'); $submenu_title = __( \'Add new\', \'myplugin\' ); add_submenu_page(