Intereting Posts
Есть ли способ увеличить скорость этого запроса? Переписывание URL-адресов для дочернего сайта WordPress Network (Multisite) RSS-канал для пользовательского типа сообщений с настраиваемыми полями данных, не проверяющими Может ли wp_query возвращать сообщения мета в одном запросе? Скрыть имя пользователя из списка пользователей Страница будет отображать только первые 6 видеороликов Несколько Custom_Background, возможно ли это? Как удалить все сообщения, категории и теги из базы данных WordPress Запретить отображение страницы Как отобразить все категории, в которых находится сообщение Сочетание повторяющихся таксономических терминов Свернуть содержимое Метки не отображаются при создании сообщения Как вы управляете иерархиями больших меню в WP? Разрешить просмотр нескольких шаблонов на странице настроек галереи при использовании Visual Editor

Разработка плагина API-интерфейса WordPress – добавление пользовательской конечной точки

У меня есть этот вопрос о переполнении стека, но подумал, что здесь может быть лучше …

Я почти наверняка делаю что-то глупое – вернее, не делаю ничего очевидного, что я должен был сделать. Я пишу плагин, чтобы выставить функцию через http POST, чтобы я мог отправить JSON в мое приложение WordPress и сохранить его в db. Я использую плагин WP REST API и следую инструкциям «Добавление пользовательских конечных точек» здесь http://v2.wp-api.org/extending/adding/

Мой плагин выглядит следующим образом:

# Exit if accessed directly if ( ! defined( 'ABSPATH' ) ) { exit; } require_once(ABSPATH . 'wp-content/plugins/rest-api/plugin.php'); require_once(dirname(__FILE__) . '/classes/myPlugin.php'); require_once(dirname(__FILE__) . '/classes/myController.php'); // Action hook to initialize the plugin add_action('rest_api_init', array('myPlugin_Class', 'init' )); register_activation_hook(__FILE__, array('myPlugin_Class', 'on_activation')); register_deactivation_hook(__FILE__, array('myPlugin_Class', 'on_deactivation')); register_uninstall_hook(__FILE__, array('myPlugin_Class', 'on_uninstall')); 

MyPlugin_Class – это просто инкапсуляция основных битов плагина … Он содержит ссылку на статический класс myController, который расширяет WP_REST_Controller. Выделение класса плагина с его методом init и конструктором выглядит следующим образом:

 class MyPlugin_Class { private static $instance; private static $myController = null; public static function init() { if(self::$instance == null) { self::$instance = new MyPlugin_Class(); } return self::$instance; } private function __construct() { Static::$myController = MyController::init(); Static::$myController->register_routes(); flush_rewrite_rules(); } public static function on_activation() { Static::init(); if ( ! current_user_can( 'activate_plugins' ) ) return; $plugin = isset( $_REQUEST['plugin'] ) ? $_REQUEST['plugin'] : ''; check_admin_referer( "activate-plugin_{$plugin}" ); //Register routes and don't forget to flush $this->myController->register_routes(); flush_rewrite_rules(); } } 

Выделение класса контроллера выглядит следующим образом:

 class MyController extends WP_REST_Controller { private static $instance; private $namespace = 'api/vendor/v1'; private $base = 'default'; private function __construct(){ } public static function init() { if(self::$instance == null) { self::$instance = new MyController(); } return self::$instance; } /** * Register the routes for the objects of the controller. */ public function register_routes() { $base = $this->default-base; register_rest_route( $this->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, я получаю ошибку: –

 Fatal error: Call to a member function register_route() on null in .../wp-content/plugins/rest-api/plugin.php on line 92 

Функция register_route () из модуля REST API

 function register_rest_route( $namespace, $route, $args = array(), $override = false ) { /** @var WP_REST_Server $wp_rest_server */ global $wp_rest_server; if ( isset( $args['callback'] ) ) { // Upgrade a single set to multiple $args = array( $args ); } $defaults = array( 'methods' => 'GET', 'callback' => null, 'args' => array(), ); foreach ( $args as $key => &$arg_group ) { if ( ! is_numeric( $arg_group ) ) { // Route option, skip here continue; } $arg_group = array_merge( $defaults, $arg_group ); } if ( $namespace ) { $full_route = '/' . trim( $namespace, '/' ) . '/' . trim( $route, '/' ); } else { // Non-namespaced routes are not allowed, with the exception of the main // and namespace indexes. If you really need to register a // non-namespaced route, call `WP_REST_Server::register_route` directly. _doing_it_wrong( 'register_rest_route', 'Routes must be namespaced with plugin name and version', 'WPAPI-2.0' ); $full_route = '/' . trim( $route, '/' ); } $wp_rest_server->register_route( $namespace, $full_route, $args, $override ); } 

Где этот глобальный $ wp_rest_server создается (или в моем случае не создан)?

т.е. что я забыл сделать?

Бонусный вопрос: –

Должен ли я вызвать flush_rewrite_rules () в hook__ini_init, register_activation_hook или обоих?

Solutions Collecting From Web of "Разработка плагина API-интерфейса WordPress – добавление пользовательской конечной точки"

Добавьте к функции __construct :

 add_action( 'rest_api_init',[$this, 'register_routes'] ); 

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

$wp_rest_server после загрузки плагинов. Следовательно, это null, когда вы создаете экземпляр своего класса в плагине.