[解決済み] WordPress で wp_get_nav_menu_items を使用してカスタムメニュー/サブメニューシステムを生成するにはどうすればよいですか?
質問
のカスタマイズが必要なhtml構造を持っています。
wp_nav_menu
のコードになります。
これは私が生成する必要があるhtmlです。
<ul class="main-nav">
<li class="item">
<a href="http://example.com/?p=123" class="title">Title</a>
<a href="http://example.com/?p=123" class="desc">Description</a>
<ul class="sub-menu">
<li class="item">
<a href="http://example.com/?p=123" class="title">Title</a>
<a href="http://example.com/?p=123" class="desc">Description</a>
</li>
</ul>
</li>
<li class="item">
<a href="http://example.com/?p=123" class="title">Title</a>
<a href="http://example.com/?p=123" class="desc">Description</a>
</li>
</ul>
現在、私は
wp_get_nav_menu_items
を使用して、メニューからすべての項目を配列として取得します。
今現在、私は上記のようなhtmlを生成することができます。 サブメニューなし を以下のコードで実行します。
<?php
$menu_name = 'main-nav';
$locations = get_nav_menu_locations()
$menu = wp_get_nav_menu_object( $locations[ $menu_name ] );
$menuitems = wp_get_nav_menu_items( $menu->term_id, array( 'order' => 'DESC' ) );
foreach ( $menuitems as $item ):
$id = get_post_meta( $item->ID, '_menu_item_object_id', true );
$page = get_page( $id );
$link = get_page_link( $id ); ?>
<li class="item">
<a href="<?php echo $link; ?>" class="title">
<?php echo $page->post_title; ?>
</a>
<a href="<?php echo $link; ?>" class="desc">
<?php echo $page->post_excerpt; ?>
</a>
</li>
<?php endforeach; ?>
を使ってメニューを生成していたはずです。
wp_nav_menu
関数を使用して表示される説明文が必要です。
$page->post_excerpt
.
という各項目のプロパティがあることがわかりました。
$item->menu_item_parent
これは、親メニュー項目のIDを与えるものです。
のサブメニューはどのように生成するのでしょうか?
foreach
ループを使用することはできますか?
それとも
wp_nav_menu
Googleが言及し忘れたのでしょうか?
解決方法は?
同じようなことに取り組んでいる人のために、私の解決策を紹介します。
gistにある簡単なコード例
以下はそのコードです。 を github の gist にアップロードしましたので、コピーペーストの作業に参加したい方はご覧ください。
TL;DR
TL;DR リストをループし、サブメニューがあればドリルダウンし、サブメニューとメニューの最後に到達すれば閉じる。
完全なコード説明
まず、メニュー項目をフラットな配列として取得します。
<?php
$menu_name = 'main_nav';
$locations = get_nav_menu_locations();
$menu = wp_get_nav_menu_object( $locations[ $menu_name ] );
$menuitems = wp_get_nav_menu_items( $menu->term_id, array( 'order' => 'DESC' ) );
?>
次に、メニュー項目の配列に対して反復処理を行います。
<nav>
<ul class="main-nav">
<?php
$count = 0;
$submenu = false;
foreach( $menuitems as $item ):
// set up title and url
$title = $item->title;
$link = $item->url;
// item does not have a parent so menu_item_parent equals 0 (false)
if ( !$item->menu_item_parent ):
// save this id for later comparison with sub-menu items
$parent_id = $item->ID;
?>
最初の親項目を書き込む
<li>
:
<li class="item">
<a href="<?php echo $link; ?>" class="title">
<?php echo $title; ?>
</a>
<?php endif; ?>
このアイテムの親IDが保存された親IDと一致するかどうかをチェックします。
<?php if ( $parent_id == $item->menu_item_parent ): ?>
サブメニューの開始
<ul>
を設定し
$submenu
フラグを true に設定することで、後で参照することができます。
<?php if ( !$submenu ): $submenu = true; ?>
<ul class="sub-menu">
<?php endif; ?>
サブメニューの項目を書きます。
<li class="item">
<a href="<?php echo $link; ?>" class="title"><?php echo $title; ?></a>
</li>
次の項目が同じ親IDを持たず、サブメニューが宣言されている場合、サブメニューを閉じます。
<ul>
<?php if ( $menuitems[ $count + 1 ]->menu_item_parent != $parent_id && $submenu ): ?>
</ul>
<?php $submenu = false; endif; ?>
<?php endif; ?>
この場合も、配列の次の項目が同じ親 ID を持っていない場合は
<li>
<?php if ( $menuitems[ $count + 1 ]->menu_item_parent != $parent_id ): ?>
</li>
<?php $submenu = false; endif; ?>
<?php $count++; endforeach; ?>
</ul>
</nav>
関連
-
[解決済み] [Solved] Fatal error: メンバ関数bind_param()のbooleanに対する呼び出し [重複] [重複
-
[解決済み】 PHP 未定義関数の呼び出し
-
[解決済み】foreach()に与えられた引数が無効です。)
-
[解決済み】Phpのincludeが機能しない? 関数がincludeされない
-
[解決済み】PHP フェイタルエラー。未定義の関数mssql_connect()をコールしています。
-
thinkphp5 timestamp 非整形の数値に遭遇した。
-
[解決済み】書き込みコンテキストでメソッドの戻り値を使用することができない
-
[解決済み】MySQLのカラム数が1行目の値数と一致しない【非公開
-
[解決済み] mysql_field_nameを新しいmysqliに変更します。
-
[解決済み] Bootstrapのドロップダウンサブメニューが表示されない
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】PHP - 構文エラー、予期しないT_CONSTANT_ECAPSED_STRING [閉店].
-
[解決済み】 PHP 未定義関数の呼び出し
-
[解決済み】php, mysql - データベースへの接続数が多すぎるエラー
-
[解決済み] php5パッケージのインストール候補がない (Ubuntu 16.04)
-
[解決済み】Phpのincludeが機能しない? 関数がincludeされない
-
[解決済み】PHP フェイタルエラー。未定義の関数mssql_connect()をコールしています。
-
[解決済み】PHPの予期しないT_VARIABLEとは何ですか?
-
[解決済み】file_get_contents( )が動作しない。
-
[解決済み] PHP と mod_fcgid: handle_request_ipc 関数で ap_pass_brigade が失敗する。
-
[解決済み】phpのシンタックスエラー、予期しないT_IFエラーを修正する方法は?[クローズド]。