独自のWordPressメニューを作成する



何をするか
我々は3つの残りのAPIのエンドポイントを作成するつもりです、私たちはいくつかの異なる方法で私たちのメニューを取得できるように設計.
  • そのIDで一つのメニューを取得する
  • その名前で単一のメニューを取得する
  • そのテーマの場所で1つのメニューを取得
  • 私たちは一つのクラスを作ります.NavMenu , を扱う.
    私は、このビルドが1つの制限があることに言及しなければなりません
    親.私は私のサイトの私の個人的なビルドでsubmenusを使用しなかったので、私はこの機能を追加する気にしなかった.子供たち
    メニュー項目はこのビルドで表示されますが、JavaScriptのarray.filter()あるいは、余分な引数やそのようなものを通して直接エンドポイントにビルドします.私は確かだ
    親がXである結果を得るために実行することができるより良いデータベースクエリ
    このレッスン.

    NavMenuクラスのビルド
    私の経験では、まず最初に機能を処理するクラスを作成し、後でAPIコールバックとして使用される静的メソッドを構築するのが一般的です.新しいファイルを作成するNavMenu.php そしてプラグインにドロップします.必ずコアプラグインファイルに入れてください!
    <?php
    /**
     * Gets a nav menu
     * @author: Alex Standiford
     * @date : 1/13/18
     */
    
    namespace asmenus\lib\app;
    
    class NavMenu{
    
     public function __construct($menu_name_or_id{
        $this->menus = wp_get_nav_menu_items($menu_name_or_id);
     }
    
    }
    ?>
    
    我々は簡単に起動し、メニュー項目のリストを使用してつかむwp_get_nav_menu_items() 幸運にも、この関数は
    メニュー名、またはメニューIDは、我々のコンストラクタを今すぐ簡単になります.
    また、名前空間を使用していることにも注意してくださいasmenus\lib\app . これは名前衝突の確率を減らすのを助けます
    私たちのコードと他のプラグインで、そして、私がクラスASNavMenu .
    たった今、我々が動くならばvar_dump(new asmenus\lib\app\NavMenu($menu_name_or_id)); 交換先$menu_name_or_id有効なメニュー名またはidで、それはそのメニューの項目に関連した関連情報のすべてをダンプします.

    その場所でメニューを取得する方法を作成する
    メニューIDとメニューのスラッグでメニューを得る方法があるので、メニューでメニューを取得する方法を作成する必要があります
    ロケーション.少し掘りながら、メニューの場所とそれらの相関メニューIDが
    テーマmodとしてのデータベース.これにアクセスするには、クラスにメソッドを追加する必要があります.
    <?php
    /**
     * Gets a nav menu
     * @author: Alex Standiford
     * @date : 1/13/18
     */
    
    namespace asmenus\lib\app;
    
    class NavMenu{
    
     public function __construct($menu_name_or_id){
        $this->menus = wp_get_nav_menu_items($menu_name_or_id);
     }
    
     /**
     * Gets the menu ID from the specified location
     *
     * @param $location
     *
     * @return mixed
     */
     public function getMenuIdFromLocation($location){
        $locations = get_theme_mod('nav_menu_locations');
    
        return $locations[$location];
     }
    
    }
    ?>
    
    ここでは、新しい方法を追加しました.getMenuIdFromLocation . このメソッドはget_theme_mod 連想配列を返します.
    メニューの場所によってキーを付けられたメニューID.だから、ちょっと過ぎて$location パラメータパラメータは、希望するメニューIDを取得できます.
    さて、コンストラクタでこの関数を使う必要があります.
    <?php
    /**
     * Gets a nav menu
     * @author: Alex Standiford
     * @date : 1/13/18
     */
    
    namespace asmenus\lib\app;
    
    class NavMenu{
    
     public function __construct($menu_name_or_id, $type = 'menu'){
        if($type == 'location') $menu_name_or_id = $this->getMenuIdFromLocation($menu_name_or_id);
    
        $this->menus = wp_get_nav_menu_items($menu_name_or_id);
     }
    
     /**
     * Gets the menu ID from the specified location
     *
     * @param $location
     *
     * @return mixed
     */
     public function getMenuIdFromLocation($location){
        $locations = get_theme_mod('nav_menu_locations');
    
        return $locations[$location];
     }
    
    }
    ?>
    
    コンストラクタでは、オプションの2番目の引数を追加します.$type , を返します.'location' , 我々
    コンストラクタはgetMenuIdFromLocation 正しいメニューIDを取得するには
    引数$menu_name_or_id .
    たった今、我々が動くならばvar_dump(new asmenus\lib\app\NavMenu($menu_location,'location')); 交換先$menu_location 有効なメニューの場所で、それは関連する情報のすべてをダンプする
    あのメニュー.

    残りのAPIコールバック関数を作成する
    我々のクラスが我々のメニュー詳細を得ることができる今、我々の残りによって使われる我々の機能をつくりましょう
    エンドポイントが訪問されるとき、エンドポイント.
    <?php
    /**
     * Gets a nav menu
     * @author: Alex Standiford
     * @date : 1/13/18
     */
    
    namespace asmenus\lib\app;
    
    class NavMenu{
    
     public function __construct($menu_name_or_id, $type = 'menu'){
        if($type == 'location') $menu_name_or_id = $this->getMenuIdFromLocation($menu_name_or_id);
    
        $this->menus = wp_get_nav_menu_items($menu_name_or_id);
     }
    
     /**
     * Gets the menu ID from the specified location
     *
     * @param $location
     *
     * @return mixed
     */
     public function getMenuIdFromLocation($location){
        $locations = get_theme_mod('nav_menu_locations');
    
        return $locations[$location];
     }
    
    
     /**
     * Callback function to get the menu by name/id via the REST API
     *
     * @param \WP_REST_Request $request
     *
     * @return array|\WP_Error
     */
     public static function getMenuFromApi(\WP_REST_Request $request){
        $name_or_id = $request->get_param('name') ? $request->get_param('name') : (int) $request->get_param('id');
        $self = new self($name_or_id);
    
        return $self->menus;
     }
    
    }
    ?>
    
    私たちは最初のメソッドで始めます.そして、それが名前またはIDであるならば、メニューを得るのを扱います
    参照してください、これは静的メソッドです(言い換えれば、我々は最初に我々のクラスをインスタンス化することなく、それにアクセスすることができます)、そして、最初
    パラメータtype-hinted とともに\WP_REST_Request . あなたならば
    名前空間を使用して、\ 事前に、それ以外の場合は動作しません.$name_or_id は三項演算子で設定されています.これは、名前または
    あなたは つの別々の方法としてこれを構築したが、私はこれがクリーナーであると感じました.

    完成クラス
    今、私たちはちょうど位置によってメニューを得る第2の静的メソッドでこのプロセスを繰り返す必要があります.
    <?php
    /**
     * Gets a nav menu
     * @author: Alex Standiford
     * @date : 1/13/18
     */
    
    namespace asmenus\lib\app;
    
    class NavMenu{
    
     public function __construct($menu_name_or_id, $type = 'menu'){
        if($type == 'location') $menu_name_or_id = $this->getMenuIdFromLocation($menu_name_or_id);
    
        $this->menus = wp_get_nav_menu_items($menu_name_or_id);
     }
    
     /**
     * Gets the menu ID from the specified location
     *
     * @param $location
     *
     * @return mixed
     */
     public function getMenuIdFromLocation($location){
        $locations = get_theme_mod('nav_menu_locations');
    
        return $locations[$location];
     }
    
    
     /**
     * Callback function to get the menu by slug/id via the REST API
     *
     * @param \WP_REST_Request $request
     *
     * @return array|\WP_Error
     */
     public static function getMenuFromApi(\WP_REST_Request $request){
        $name_or_id = $request->get_param('name') ? $request->get_param('name') : (int) $request->get_param('id');
        $self = new self($name_or_id);
    
        return $self->menus;
     }
    
    
     /**
     * Callback function to get the menu by location via the REST API
     *
     * @param \WP_REST_Request $request
     *
     * @return array|\WP_Error
     */
     public static function getMenuByLocationFromApi(\WP_REST_Request $request){
        $location = $request->get_param('location');
        $self = new self($location, "location");
    
        return $self->menus;
     }
    
    }
    ?>
    
    ここでの唯一の違いは、クラスをインスタンス化するとき、2番目のパラメータを'location' . これは
    提供される場所に基づいてIDを検索するコンストラクタ

    終点登録
    今我々のクラスが組み込まれている、我々はちょうど私たちのエンドポイントを登録する必要があります.これはNavMenu.php ,
    代わりに、これはどちらかのコアプラグインファイルに配置する必要がありますまたは別のファイルの後に含まれます.に
    以下に例を示します.
    <?php
    /**
    Plugin Name: WordPress Menu REST API Endpoints
    Description: Creates RESTful endpoints for WordPress menus
    Version: 1.0
    Author: Alex Standiford
    Author URI: http://www.alexstandiford.com
    **/
    
    if(!defined('ABSPATH')) exit;
    
    require_once(plugin_dir_path(__FILE__).'NavMenu.php');
    
    
    /**
     * Registers our api endpoints
     */
    add_action('rest_api_init', function(){
     /**
     * Gets a single menu by ID
     */
     register_rest_route('asmenus/v1', '/menu/(?P<id>[\d]+)', [
        'methods' => ['GET'],
        'callback' => 'asmenus\lib\app\NavMenu::getMenuFromApi',
     ]);
    
     /**
     * Gets a single menu by slug
     */
     register_rest_route('asmenus/v1', '/menu/(?P<name>[\w-_]+)', [
        'methods' => ['GET'],
        'callback' => 'asmenus\lib\app\NavMenu::getMenuFromApi',
     ]);
    
     /**
     * Gets a single menu by its theme location
     */
     register_rest_route('asmenus/v1', '/menu/location/(?P<location>[\w-_]+)', [
        'methods' => ['GET'],
        'callback' => 'asmenus\lib\app\NavMenu::getMenuByLocationFromApi',
     ]);
    });
    
    ?>
    
    我々の終点を登録するために'rest_api_init' , を使ってコールバックに登録するregister_rest_route . 私たちのコールバックが名前空間を持っていることに注意してください
    これらのエンドポイントのメソッドGET .
    Voila!エンドポイントのいずれかを訪問するときは、すべての情報を含むオブジェクトの配列を取得する必要があります
    各メニュー項目について.ここから、ループを介していくつかの反応/角度のコンポーネントを構築し、メニューを構築することができます.

    より多くのWordPressリソースを探すこと?
    結合WP Dev Academy’s Discord server , そして、WordPress開発者の成長しているコミュニティの一部になります.