Как использовать WP REST API с пользовательской конечной точкой с помощью библиотеки Javascript?

У меня есть пользовательская конечная точка, которая ничего не делает, кроме как возвращает тестовую строку. Я могу достичь этой конечной точки, перейдя к mydomain.com/wp-json/mytools/v1/method/get_user_data, и она правильно возвращает мою тестовую строку, но я хочу иметь возможность достичь этой конечной точки с помощью Javascript, и я читал, что wp-api обрабатывает аутентификацию автоматически, поэтому я должен иметь возможность получить текущий вошедший в систему пользователь с этим методом.

Мне нужно иметь возможность использовать что-то вроде wp.api.mytools.method.get_current_user и получить информацию для текущего пользователя, вошедшего в систему. Это вообще возможно?

Вот как я создал конечную точку:

    register_rest_route( 'mytools/v1', '/method/(?P<method>[\w]+)', array(
        'methods' => 'GET',
        'callback' => 'invoke_method',
    ));

А это функция invoke_method:

function invoke_method( WP_REST_Request $request ) {
    return wp_get_current_user();
}

person andrux    schedule 07.02.2018    source источник


Ответы (2)


Эта функция уже реализована WordPress в конечной точке WP_REST '.../wp-json/wp/v2/users/me. В дополнение к файлу cookie для входа в систему, для аутентификации WP REST требуется одноразовый номер, указанный в аргументе запроса «_wpnonce». Значение этого одноразового номера генерируется вызовом wp_create_nonce('wp_rest'). Обычная страница интерфейса WordPress будет содержать скрипт .../wp-includes/js/api-request.js. Этот сценарий определит глобальный wpApiSettings.nonce, который будет содержать этот одноразовый номер, чтобы вы могли использовать запрос '.../wp-json/wp/v2/users/me?_wpnonce=' + wpApiSettings.nonce. Итак, вы можете использовать jQuery.get().

jQuery.get(
    '.../wp-json/wp/v2/users/me?_wpnonce=' + wpApiSettings.nonce,
    function( response ) {
        var userData = JSON.parse( response );
    ) }
);

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

person Community    schedule 08.02.2018
comment
Часть wp_get_current_user() была просто заполнителем, я пытаюсь сделать с ней несколько разных вещей, но добавление параметра _wpnonce было тем, что мне было нужно, спасибо!! - person andrux; 08.02.2018
comment
Последний вопрос... как я могу сделать то же самое, но без использования ajax-запроса? например, вместо того, чтобы отправить запрос на '/wp-json/mytools/v1/method?_wpnonce=' + wpApiSettings.nonce, сделать что-то вроде {whatever}.mytools.method - person andrux; 08.02.2018
comment
Я не понимаю вашего вопроса. Если вы напрямую используете REST API WordPress, вы должны отправить HTTP-запрос, и, поскольку ответ на этот запрос представляет собой JSON, а не HTML, он должен обрабатываться JavaScript. Итак, я думаю, что AJAX необходим. Поскольку для аутентификации WordPress требуется одноразовый номер, единственный способ избежать отправки одноразового номера — это заменить аутентификацию WordPress своей собственной, но тогда аутентификация является вашей ответственностью, а не WordPress. - person ; 09.02.2018
comment
Я имею в виду, что вместо того, чтобы писать $.get( '/wp-json/mytools/do_this', {}, function(){}) запрос, я могу написать его как wp.api.mytools.do_this - person andrux; 10.02.2018
comment
Я не понимаю. Является ли «wp.api.mytools.do_this» JavaScript, PHP или частью URL-адреса? - person ; 10.02.2018
comment
Если вы используете клиент Backbone.js, вызов AJAX будет выполняться, когда вы это сделаете: var user = new wp.api.models.User({id: 1}); пользователь.fetch(); - person ; 10.02.2018
comment
Вы пытаетесь вызвать общие функции на сервере WordPress? WP REST API и Backbone.js для этого не предназначены. Это решение для передачи репрезентативного состояния (REST). Он синхронизирует коллекции и модели на сервере с соответствующими коллекциями и моделями на клиенте. Он не поддерживает вызов функции напрямую, а поддерживает семантику CRUD (создание, чтение, обновление и удаление) для объектов. - person ; 10.02.2018
comment
понял, это то, что я пытался сделать, я соглашусь с вызовом ajax, как вы предложили в своем ответе .. спасибо - person andrux; 12.02.2018

В целом да, это возможно.

В частности, если wp-api вы имеете в виду JS-библиотеку node-wpapi, то да, он обрабатывает аутентификацию. В противном случае вам нужно будет реализовать аутентификацию самостоятельно, используя Cookie, Nonce, Basic-Auth или JWT.

Во второй части определенно можно использовать что-то вроде wp.api.mytools.method.get_current_user для получения информации. Что вам нужно, так это клиентская библиотека (node-wpapi) и расширить ее, включив в нее ваши классы и функции, такие как mytools и method.

Надеюсь, это поможет прояснить

person Jack Song    schedule 07.02.2018
comment
На самом деле я имею в виду включенную библиотеку Backbone. - person andrux; 07.02.2018