Intereting Posts
Эхо-JavaScript безопасно Есть ли способ отправить HTML-форматированные письма с помощью функции wp_mail WordPress? Как найти галереи WordPress Nextgen, которые не используются в сообщениях WordPress? Вставка PHP внутри do_shortcode Как перечислить ВСЕ страницы в панели управления? Существует фильтр или действие, которые меняют ссылку «Добавить новую почту»? Сделать короткий код в файле шаблона Создайте цикл контуров содержимого и выдержки с пейджингом и параметры для # сообщений Текущий блог возвращает идентификатор 1 вместо идентификатора блога пользователей? WordPress Post по электронной почте пишет случайную строку для тела сообщения Запрещено загружать файлы Модификация того, как данные контролируются / отображаются и сохраняются Где разместить архив- {post-type} .php Пользовательская переписывание с помощью Query vars Параметры API WordPress Settings не сохраняются для некоторых пользователей

Использование javascript-клиента REST API (v2) на закрытом маршруте имен

Я использую последнюю версию плагина REST API в проекте, и я добавил свои маршруты в отдельное пространство имен (как рекомендовано в документации ). Клиент javascript, включенный в API, автоматически создает модели и коллекции на основе общедоступных маршрутов в пространстве имен wp/v2 .

Кто-нибудь знает, возможно ли расширить встроенный клиент для использования пользовательского пространства имен и автоматически проанализировать корневую конечную точку для генерации моделей и коллекций для моего частного API?

Solutions Collecting From Web of "Использование javascript-клиента REST API (v2) на закрытом маршруте имен"

Чтобы изменить оставшийся префикс url, вы можете фильтровать rest_url_prefix . Но это просто изменяет префикс /wp-json/ prefix, который использует каждое пространство имен.

Попытка изменить wp/v2 означает модификацию плагина и пространство имен жестко закодировано в нескольких местах; WP_REST_Post_Statuses_Controller .

Чтобы добавить свои собственные конечные точки , register_rest_route в основном делает это.

 <?php add_action( 'rest_api_init', function () { register_rest_route( 'your-namespace-here/v1', '/author/(?P<id>\d+)', array( 'methods' => 'GET', 'callback' => 'my_awesome_func', ) ); } ); 

Вам нужно будет больше взглянуть на процесс обнаружения, чтобы узнать, что автоматически создается для вашего API.

Пример шаблона контроллера для WP REST API Plugin должен дать вам хорошее представление о том, что может пойти в WP REST Controller.

 add_action( 'rest_api_init', function () { /* * /wp-json/vendor/v1 */ $routes = new Slug_Custom_Route(); $routes->register_routes(); }); class Slug_Custom_Route extends WP_REST_Controller { /** * Register the routes for the objects of the controller. */ public function register_routes() { $version = '1'; $namespace = 'vendor/v' . $version; $base = 'route'; register_rest_route( $namespace, '/' . $base, array( array( 'methods' => WP_REST_Server::READABLE, 'callback' => array( $this, 'get_items' ), 'permission_callback' => array( $this, 'get_items_permissions_check' ), 'args' => array( ), ), array( 'methods' => WP_REST_Server::CREATABLE, 'callback' => array( $this, 'create_item' ), 'permission_callback' => array( $this, 'create_item_permissions_check' ), 'args' => $this->get_endpoint_args_for_item_schema( true ), ), ) ); register_rest_route( $namespace, '/' . $base . '/(?P<id>[\d]+)', array( array( 'methods' => WP_REST_Server::READABLE, 'callback' => array( $this, 'get_item' ), 'permission_callback' => array( $this, 'get_item_permissions_check' ), 'args' => array( 'context' => array( 'default' => 'view', ), ), ), array( 'methods' => WP_REST_Server::EDITABLE, 'callback' => array( $this, 'update_item' ), 'permission_callback' => array( $this, 'update_item_permissions_check' ), 'args' => $this->get_endpoint_args_for_item_schema( false ), ), array( 'methods' => WP_REST_Server::DELETABLE, 'callback' => array( $this, 'delete_item' ), 'permission_callback' => array( $this, 'delete_item_permissions_check' ), 'args' => array( 'force' => array( 'default' => false, ), ), ), ) ); register_rest_route( $namespace, '/' . $base . '/schema', array( 'methods' => WP_REST_Server::READABLE, 'callback' => array( $this, 'get_public_item_schema' ), ) ); } /** * Get a collection of items * * @param WP_REST_Request $request Full data about the request. * @return WP_Error|WP_REST_Response */ public function get_items( $request ) { $items = array(); //do a query, call another class, etc $data = array(); foreach( $items as $item ) { $itemdata = $this->prepare_item_for_response( $item, $request ); $data[] = $this->prepare_response_for_collection( $itemdata ); } return new WP_REST_Response( $data, 200 ); } /** * Get one item from the collection * * @param WP_REST_Request $request Full data about the request. * @return WP_Error|WP_REST_Response */ public function get_item( $request ) { //get parameters from request $params = $request->get_params(); $item = array();//do a query, call another class, etc $data = $this->prepare_item_for_response( $item, $request ); //return a response or error based on some conditional if ( 1 == 1 ) { return new WP_REST_Response( $data, 200 ); }else{ return new WP_Error( 'code', __( 'message', 'text-domain' ) ); } } /** * Create one item from the collection * * @param WP_REST_Request $request Full data about the request. * @return WP_Error|WP_REST_Request */ public function create_item( $request ) { $item = $this->prepare_item_for_database( $request ); if ( function_exists( 'slug_some_function_to_create_item') ) { $data = slug_some_function_to_create_item( $item ); if ( is_array( $data ) ) { return new WP_REST_Response( $data, 200 ); } } return new WP_Error( 'cant-create', __( 'message', 'text-domain'), array( 'status' => 500 ) ); } /** * Update one item from the collection * * @param WP_REST_Request $request Full data about the request. * @return WP_Error|WP_REST_Request */ public function update_item( $request ) { $item = $this->prepare_item_for_database( $request ); if ( function_exists( 'slug_some_function_to_update_item') ) { $data = slug_some_function_to_update_item( $item ); if ( is_array( $data ) ) { return new WP_REST_Response( $data, 200 ); } } return new WP_Error( 'cant-update', __( 'message', 'text-domain'), array( 'status' => 500 ) ); } /** * Delete one item from the collection * * @param WP_REST_Request $request Full data about the request. * @return WP_Error|WP_REST_Request */ public function delete_item( $request ) { $item = $this->prepare_item_for_database( $request ); if ( function_exists( 'slug_some_function_to_delete_item') ) { $deleted = slug_some_function_to_delete_item( $item ); if ( $deleted ) { return new WP_REST_Response( true, 200 ); } } return new WP_Error( 'cant-delete', __( 'message', 'text-domain'), array( 'status' => 500 ) ); } /** * Check if a given request has access to get items * * @param WP_REST_Request $request Full data about the request. * @return WP_Error|bool */ public function get_items_permissions_check( $request ) { //return true; <--use to make readable by all return current_user_can( 'edit_something' ); } /** * Check if a given request has access to get a specific item * * @param WP_REST_Request $request Full data about the request. * @return WP_Error|bool */ public function get_item_permissions_check( $request ) { return $this->get_items_permissions_check( $request ); } /** * Check if a given request has access to create items * * @param WP_REST_Request $request Full data about the request. * @return WP_Error|bool */ public function create_item_permissions_check( $request ) { return current_user_can( 'edit_something' ); } /** * Check if a given request has access to update a specific item * * @param WP_REST_Request $request Full data about the request. * @return WP_Error|bool */ public function update_item_permissions_check( $request ) { return $this->create_item_permissions_check( $request ); } /** * Check if a given request has access to delete a specific item * * @param WP_REST_Request $request Full data about the request. * @return WP_Error|bool */ public function delete_item_permissions_check( $request ) { return $this->create_item_permissions_check( $request ); } /** * Prepare the item for create or update operation * * @param WP_REST_Request $request Request object * @return WP_Error|object $prepared_item */ protected function prepare_item_for_database( $request ) { return array(); } /** * Prepare the item for the REST response * * @param mixed $item WordPress representation of the item. * @param WP_REST_Request $request Request object. * @return mixed */ public function prepare_item_for_response( $item, $request ) { return array(); } /** * Get the query params for collections * * @return array */ public function get_collection_params() { return array( 'page' => array( 'description' => 'Current page of the collection.', 'type' => 'integer', 'default' => 1, 'sanitize_callback' => 'absint', ), 'per_page' => array( 'description' => 'Maximum number of items to be returned in result set.', 'type' => 'integer', 'default' => 10, 'sanitize_callback' => 'absint', ), 'search' => array( 'description' => 'Limit results to those matching a string.', 'type' => 'string', 'sanitize_callback' => 'sanitize_text_field', ), ); } } 

И когда вы переходите непосредственно к конечной точке пространства имен /wp-json/vendor/v1 вы должны увидеть:

 { "namespace": "vendor\/v1", "routes": { "\/vendor\/v1": { "namespace": "vendor\/v1", "methods": ["GET"], "endpoints": [{ "methods": ["GET"], "args": { "namespace": { "required": false, "default": "vendor\/v1" }, "context": { "required": false, "default": "view" } } }], "_links": { "self": "http:\/\/example.com\/wp-json\/vendor\/v1" } }, "\/vendor\/v1\/route": { "namespace": "vendor\/v1", "methods": ["GET", "POST", "GET", "POST"], "endpoints": [{ "methods": ["GET"], "args": [] }, { "methods": ["POST"], "args": [] }, { "methods": ["GET"], "args": [] }, { "methods": ["POST"], "args": [] }], "_links": { "self": "http:\/\/example.com\/wp-json\/vendor\/v1\/route" } }, "\/vendor\/v1\/route\/(?P<id>[\\d]+)": { "namespace": "vendor\/v1", "methods": ["GET", "POST", "PUT", "PATCH", "DELETE", "GET", "POST", "PUT", "PATCH", "DELETE"], "endpoints": [{ "methods": ["GET"], "args": { "context": { "required": false, "default": "view" } } }, { "methods": ["POST", "PUT", "PATCH"], "args": [] }, { "methods": ["DELETE"], "args": { "force": { "required": false, "default": false } } }, { "methods": ["GET"], "args": { "context": { "required": false, "default": "view" } } }, { "methods": ["POST", "PUT", "PATCH"], "args": [] }, { "methods": ["DELETE"], "args": { "force": { "required": false, "default": false } } }] }, "\/vendor\/v1\/route\/schema": { "namespace": "vendor\/v1", "methods": ["GET", "GET"], "endpoints": [{ "methods": ["GET"], "args": [] }, { "methods": ["GET"], "args": [] }], "_links": { "self": "http:\/\/example.com\/wp-json\/vendor\/v1\/route\/schema" } } }, "_links": { "up": [{ "href": "http:\/\/example.com\/wp-json\/" }] } } 

Две главные вещи, которые торчат:

 'args' => $this->get_endpoint_args_for_item_schema( WP_REST_Server::EDITABLE ) 

а также

 'args' => array ( 'force' => array ( 'default' => false, ), ), 

Другой пример передачи $args в register_rest_route который будет отображаться в корне имени пространства имен:

 register_rest_route( "{$root}/{$version}", '/products', array( array( 'methods' => \WP_REST_Server::READABLE, 'callback' => array( $cb_class, 'get_items' ), 'args' => array( 'per_page' => array( 'default' => 10, 'sanitize_callback' => 'absint', ), 'page' => array( 'default' => 1, 'sanitize_callback' => 'absint', ), 'soon' => array( 'default' => 0, 'sanitize_callback' => 'absint', ), 'slug' => array( 'default' => false, 'sanitize_callback' => 'sanitize_title', ) ), 'permission_callback' => array( $this, 'permissions_check' ) ), ) ); 

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


Таким образом, все вместе и переопределяя автоматические конечные точки:

 function my_awesome_func( WP_REST_Request $request) { return "awesome! " . $request->get_param( 'id' ); } add_action( 'rest_api_init', function() { register_rest_route( 'my-thing/v1', '/awesome/(?P<id>\d+)', array ( 'methods' => 'GET', 'callback' => 'my_awesome_func', ) ); } ); add_filter( 'rest_endpoints_description', function( $data ) { if ( $data[ 'namespace' ] === 'my-thing/v1' ) { $data[ 'endpoints' ] = array ( 'foo' => 'bar', 'my' => 'custom-api', 'awesome' => 'it really is', ); } return $data; } ); /* { "namespace": "my-thing\/v1", "routes": { "\/my-thing\/v1": { "namespace": "my-thing\/v1", "methods": ["GET"], "endpoints": { "foo": "bar", "my": "custom-api", "awesome": "it really is" }, "_links": { "self": "http:\/\/example.com\/wp-json\/my-thing\/v1" } }, "\/my-thing\/v1\/awesome\/(?P<id>\\d+)": { "namespace": "my-thing\/v1", "methods": ["GET"], "endpoints": { "foo": "bar", "my": "custom-api", "awesome": "it really is" } } }, "_links": { "up": [{ "href": "http:\/\/example.com\/wp-json\/" }] } } */