我幾乎可以肯定地做一些愚蠢的事情 - 或者不是做一些我應該做的事情。我正在編寫一個插件來通過http POST公開一個函數,以便我可以將JSON發送到我的wordpress應用程序並將其存儲在數據庫中。我使用的是WP REST API插件,並且已經按照這裏的「添加自定義端點」指南http://v2.wp-api.org/extending/adding/WordPress REST API插件開發 - 添加自定義端點
我的插件如下: -
# 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是,就在主插件位的封裝...它包含對擴展WP_REST_Controller的靜態類myController的引用。其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,我得到的錯誤: - 從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獲得創建
Fatal error: Call to a member function register_route() on null in .../wp-content/plugins/rest-api/plugin.php on line 92
功能register_route()(或在我的情況下沒有創建)?
即我忘記了什麼?
獎金的問題: -
我應該叫flush_rewrite_rules()在rest_api_init鉤,該register_activation_hook或兩者兼而有之?