独自のWordPressメニューを作成する
何をするか
我々は3つの残りのAPIのエンドポイントを作成するつもりです、私たちはいくつかの異なる方法で私たちのメニューを取得できるように設計.
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開発者の成長しているコミュニティの一部になります.
Reference
この問題について(独自のWordPressメニューを作成する), 我々は、より多くの情報をここで見つけました https://dev.to/alexstandiford/create-your-own-wordpress-menu-api-4198テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol