WordPress REST API Plugin Entwicklung – Fügen Sie einen benutzerdefinierten Endpunkt hinzu

Ich habe diese Frage zu Stack Overflow, aber ich denke, hier könnte ein besserer Ort dafür sein …

Ich mache fast sicher etwas Dummes – oder eher nicht etwas Offensichtliches, das ich hätte tun sollen. Ich schreibe ein Plugin, um eine function über HTTP-POST verfügbar zu machen, damit ich JSON an meine WordPress-App senden und in der database speichern kann. Ich verwende das WP-REST-API-Plugin und habe den Leitfaden “Hinzufügen benutzerdefinierter Endpunkte” hier http://v2.wp-api.org/extending/adding/

Mein Plugin ist wie folgt:

# 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')); 

Die myPlugin_Class ist nur eine Kapselung der Haupt-Plugin-Bits … Sie enthält einen Verweis auf eine statische class myController, die WP_REST_Controller erweitert. Der Plugin-classnausschnitt mit seiner init-Methode und seinem Konstruktor lautet wie folgt:

 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(); } } 

Der Auszug der Controller-class lautet wie folgt:

 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 ), ), ) ); } } 

Ich kann die Routen nicht registrieren. Nach der Aktivierung, im Aufruf von register_rest_route, bekomme ich den Fehler: –

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

Die function register_route () aus dem REST API Plugin

 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 ); } 

Wo wird dieser globale $ wp_rest_server erstellt (oder in meinem Fall nicht erstellt)?

Was habe ich vergessen zu tun?

Bonus-Frage:-

Soll ich die flush_rewrite_rules () im rest_api_init Hook, den register_activation_hook oder beide aufrufen?

Solutions Collecting From Web of "WordPress REST API Plugin Entwicklung – Fügen Sie einen benutzerdefinierten Endpunkt hinzu"

Fügen Sie Ihrer __construct function hinzu:

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

Und der Rest wird es von dort nehmen. Sie müssen keine Routen in Ihren Aktivierungsfunktionen verarbeiten und müssen die Regeln nicht löschen.

Der $wp_rest_server wird erstellt, nachdem die Plugins geladen wurden. Daher ist es null, wenn Sie Ihre class im Plugin instanziieren.