2015-09-22 89 views
1

我幾乎可以肯定地做一些愚蠢的事情 - 或者不是做一些我應該做的事情。我正在編寫一個插件來通過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或兩者兼而有之?

回答

0

您對add_action('rest_api_init', array('myPlugin_Class', 'init'));通話非常晚,該插件激活鉤

register_activation_hook(__FILE__, array('myPlugin_Class', 'on_activation'));

之前流汗調用。因此爲空。