API WP REST возвращает только частичный список пользователей


Впервые начал работать с API WP REST. Наша конечная цель - динамически загружать элементы пользовательского интерфейса, основываясь на том, какой пользователь в данный момент вошел в систему. Однако мои попытки получить список всех пользователей наталкиваются на стену - я могу вернуть только двух пользователей из пяти при выполнении базового http-запроса:

http://portal.alliedbuildings.com/wp-json/wp/v2/users

Я попытался включить другие параметры, такие как search, но это будет работать только в том случае, если пользователь, которого я ищу, является одним из двух в ответе Я уже получаю; он не возвращает никаких данных для остальных трех пользователей вообще. Если посмотреть на профили пользователей, то нет никаких уникальных точек данных или ролей, которые отличали бы возвращаемых двух пользователей от трех других. Двое возвращаемых являются администраторами, но также и один из трех отсутствующих.

Что, черт возьми, я упускаю??

Author: MakeCodeNotWar, 2018-04-17

3 answers

Для всех, кто все еще может столкнуться с этой проблемой, вот контрольный список:

  1. Убедитесь, что вы аутентифицированы И у вашего пользователя есть возможность list_users.

Пример: При добавлении пользовательской роли я обязательно добавляю возможность list_users. Пользователь также должен быть зарегистрирован в системе (что означает аутентификация) при отправке запроса.

  1. По умолчанию запрос возвращает только тех пользователей, которые опубликовали публикации. Отключить таким образом, вы можете удалить has_published_posts из аргументов запроса, например:

Добавлять обычно

add_filter('rest_user_query', 'remove_has_published_posts_from_api_user_query', 10, 2);
function remove_has_published_posts_from_api_user_query($prepared_args, $request)
{
    unset($prepared_args['has_published_posts']);

    return $prepared_args;
}

Или в пределах пространства имен

add_filter('rest_user_query', __NAMESPACE__ . '\remove_has_published_posts_from_api_user_query', 10, 2);
function remove_has_published_posts_from_api_user_query($prepared_args, $request)
{
    unset($prepared_args['has_published_posts']);

    return $prepared_args;
}
 5
Author: Abe Caymo, 2020-02-06 03:44:01

Я думаю, что это зависит от специфики того, что вы ищете, вы можете получить максимальный контроль, сделав свой собственный маршрут жестким, маршрут пользователей больше предназначен для перечисления пользователей, а не для их поиска, так как есть довольно сумасшедшее количество вещей, которые вы могли бы хотеть искать на основе, и выполнение этого по всем параметрам может быть затруднено.

Я не говорю, что это невозможно сделать, я просто лично обнаружил, что вместо того, чтобы бороться за маршрут, чтобы следовать вашему варианту использования, создание пользовательских маршрутов проще.

Вот пример:

// namespace is like app/v1 rather then wp/v2
register_rest_route($namespace, '/users', array(
    'methods'             => WP_REST_Server::READABLE,
    'callback'            => 'get_user_list',
    'show_in_rest' => true
));

Затем для функции get_user_list

function get_user_list($request) {
   //below you can change to a WQ_Query and customized it to ensure the list is exactly what you need
   $results = get_users();

   //Using the default controller to ensure the response follows the same structure as the default route
   $users = array();
   $controller = new WP_REST_Users_Controller();
   foreach ( $results as $user ) {
        $data    = $controller->prepare_item_for_response( $user, $request );
        $users[] = $controller->prepare_response_for_collection( $data );
    }

   return rest_ensure_response( $users );
}

Конечно, есть и другие (например, разбивка на страницы).

Https://github.com/WordPress/WordPress/blob/master/wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php покажет вам, как он строит стандартный маршрут с помощью функции get_items. В зависимости от того, что вы хотите запросить, он также может указать вам параметры, которые вам нужно запросить (если используя маршрут по умолчанию).

Единственная причина, по которой я даю такой сложный ответ, поскольку он может помочь вам узнать все подробности о том, как он работает и какое приложение REST API может удовлетворить ваши потребности.

 4
Author: Jordan Ramstad, 2018-04-17 18:26:36

После долгого чтения я нашел причину, по которой все пользователи не возвращаются с прямым HTTP-запросом для WP REST API:

Это запрос без аутентификации , поэтому в запросе GET публикуются только общедоступные данные пользователей.

*** Важно отметить, что если некоторые необходимые вам данные недоступны, вам, вероятно, потребуется добавить эти поля в ответы, используя register_api_fields ( см. Документы для примера использования), для ваших конечных точек пользователя как ну что ж.

Лучший ресурс, который я нашел, который дал мне этот ответ, был частью подробного и удобного для чтения руководства по API WP REST от Torque (см. страницы 35-38). Кто-то должен купить этому человеку много-много пива за то, что он написал такое замечательное руководство!!

 2
Author: MakeCodeNotWar, 2018-04-18 22:17:42