我已经成功地为用户添加了一个自定义元键/值,并设法在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\');
}
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\']
]