最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

ajax - rest_no_route custom route

programmeradmin3浏览0评论

I get a rest_no_route error if I try to use a custom endpoint I've created. Is there any solution? I'm creating my theme routes inside a plugin class, but I don't think this is a problem. I'm using axios to get the data on front-end.

class theme_Rest_Routes extends WP_REST_Controller{

  public static function init()
  {
    add_action( 'rest_api_init', array( __CLASS__, 'register_routes') );
  }

  public function register_routes()
  {
    register_rest_route( 'theme/v1', '/menu/', array(
      'methods' => 'GET',
      'callback' => array(__CLASS__, 'theme_rest_menu'))
    );

  }

  public function theme_rest_menu( $request )
  {
    return wp_get_nav_menu_items('menu');
  }

}
theme_Rest_Routes::init();

I get a rest_no_route error if I try to use a custom endpoint I've created. Is there any solution? I'm creating my theme routes inside a plugin class, but I don't think this is a problem. I'm using axios to get the data on front-end.

class theme_Rest_Routes extends WP_REST_Controller{

  public static function init()
  {
    add_action( 'rest_api_init', array( __CLASS__, 'register_routes') );
  }

  public function register_routes()
  {
    register_rest_route( 'theme/v1', '/menu/', array(
      'methods' => 'GET',
      'callback' => array(__CLASS__, 'theme_rest_menu'))
    );

  }

  public function theme_rest_menu( $request )
  {
    return wp_get_nav_menu_items('menu');
  }

}
theme_Rest_Routes::init();
Share Improve this question asked Apr 6, 2020 at 12:58 sialfasialfa 32910 silver badges29 bronze badges 1
  • You don't need to subclass WP_REST_Controller, in fact in this situation it is either dead weight, or, causing harm as you don't use any of the Rest controller class. In both your question, and the answer below, you can delete extends WP_REST_Controller and it will work the same – Tom J Nowell Commented Apr 6, 2020 at 15:03
Add a comment  | 

1 Answer 1

Reset to default 0

The problem is, you are calling a static method from inside of a non-static method. The following will work.

class theme_Rest_Routes extends WP_REST_Controller{

    public static function init() {
        $instance = new self();
        add_action( 'rest_api_init', array( $instance, 'register_routes' ) );
    }

    public function register_routes() {
        register_rest_route( 'theme/v1', '/menu/', array(
            'methods' => 'GET',
            'callback' => array( $this, 'theme_rest_menu' ) )
        );
    }

    public function theme_rest_menu( $request ) {
        return wp_get_nav_menu_items( 'menu' );
    }
}
theme_Rest_Routes::init();

Code Improvement

You should not hook into rest_api_init from within the controller class itself, rather call it from an external class/function. Also class name should use capitalized words. As like below:

function theme_register_rest_apis() {
    $controller = new Theme_Rest_Routes();
    $controller->register_routes();
}
add_action( 'rest_api_init', 'theme_register_rest_apis' );

class Theme_Rest_Routes extends WP_REST_Controller{

    public function register_routes() {
        register_rest_route( 'theme/v1', '/menu/', array(
            'methods' => 'GET',
            'callback' => array( $this, 'theme_rest_menu' ) )
        );
    }

    public function theme_rest_menu( $request ) {
        return wp_get_nav_menu_items( 'menu' );
    }
}

与本文相关的文章

发布评论

评论列表(0)

  1. 暂无评论