他の興味のある人のために、私は簡単な解決策を得るためにemagdnimと協力してきました。
見つかった最良のものは、header.phpファイルで出力バッファリングを使用することでした。このように、wp_nav_menu()を使用して複数のメニューをレンダリングできますが、出力バッファリングを使用して、メニューを細かく分割し、それらを移動することができます。
以下は、bottom-menu.phpの重要なコード(つまり、更新された部分)です。
........
<?php /* Our navigation menu. */ ?>
<?php
if(wp_emember_is_member_logged_in()){
wp_nav_menu( array( 'menu' => 'normal-menu', 'menu_class' => 'sf-menu' ) );
/** CUSTOM CODE ADDITION **/
//connect to database
$link = mysql_connect("localhost", "[USERNAME]", "[PASSWORD]") or die("Oops! Please wait a few seconds and try again");
//connect to table
mysql_select_db("[TABLE NAME]") or die(mysql_error());
//search table
$result = mysql_query("SELECT * FROM `wp_wp_eMember_membership_tbl` ORDER BY `alias` ASC");
$array = array();
//while there are still rows in the table we haven't been to...
while ($row = mysql_fetch_array($result)){
//clean up the "alias" so it becomes the name of the menu
$alias = strtolower(str_replace(' ','-',$row['alias']));
//now this can be accessed as "$array[X]" to get the name of the menu.
if ($alias == 'admin'){
$alias = 'admin-menu';
}
$array[$row['id']] = $alias;
}
//done is a way to check if anything is found, if not a default menu is loaded
echo '{BREAK}';
$done = 0;
$ids = array_keys($array);
$info2 = wp_eMember_get_user_details("more_membership_levels");
if (strstr($info2,',')){
$moreMemberLevels = explode(',',$info2);
}elseif ($info2 != ''){
$moreMemberLevels[0] = $info2;
}
//go through each ID/menu possibility
for ($i = 0; $i < count($ids); $i++){
if ((wp_emember_is_member_logged_in($ids[$i])) || ((is_array($moreMemberLevels)) && ((in_array($ids[$i],$moreMemberLevels))))){
$done++;
//add the mneu to wp
/** UNCOMMENT THIS TO IMPLEMENT LOOKUP VERIFICATION BEFORE ADDING A MENU **/
/*
echo 'Searching for '.$array[$ids[$i]].'...';
$res = mysql_query("SELECT * FROM `wp_posts` WHERE `post_type`='nav_menu_item' AND `post_name`='{$array[$ids[$i]]}' LIMIT 1");
if (mysql_num_rows($res) == 1){*/
if ($array[$ids[$i]] != 'free'){
/** UNCOMMENT THIS TO DEBUG **/
//echo 'Adding '.$array[$ids[$i]].' to menu...<br />';
wp_nav_menu(array('menu'=>$array[$ids[$i]], 'menu_class'=>'sf-menu'));
}
}
}
echo ' {BREAK}';
/** END CUSTOM CODE ADDITION **/
}else{
wp_nav_menu( array( 'menu' => 'normal-visitor-menu', 'menu_class' => 'sf-menu' ) );
}
およびheader.phpの更新されたコード(bottom-menu.phpをロードします)
....
<div id="page" class="hfeed">
<?php /* ======== BOTTOM MENU ======== */
ob_start();
get_template_part('bottom','menu');
$bm = ob_get_clean();
$bm_array = explode('{BREAK}',$bm);
$bm_Top = $bm_array[0];
$bm_Move = strip_tags($bm_array[1],'<li><br /><br><font><b><i><u><em><strong><a>');
$bm_End = $bm_array[2];
$bottomMenu = str_replace('My Menu Item</a></li>', 'My New Menu Item</a>
<ul class="sub-menu">'.$bm_Move.'</ul>
</li>',$bm_Top).$bm_End;
ob_end_clean();
echo $bottomMenu;
//echo '*****'.$bm_Move.'*****';
?>
<div id="main">
追加情報/テクニックの要約
このメソッドは、2つの一般的なメニューのいずれかを取り、各メンバーシップスタイルにロードする必要があるものに基づいて要素を追加します。「要素」はwp_nav_manu()によって作成された完全なメニューですが、1つの項目のみです。メニューの名前もメンバーシップレベルの名前ですが、スペースの代わりにハイフンが使用され、すべて小文字になっています。これを行うことにより、一見任意のメンバーシップレベルIDをメニューの名前にリンクする別のテーブルは必要ありません。このシステムに基づいてメニュー/メンバーシップに名前を付けるだけで、何を探すべきかがわかります。
さらに、追加された各「メニュー」は、実際には、タグが削除された単一のメニュー項目のみを含むメニューであり、目的の親要素の下の<ul></ul>
サブメニューにネストされます。<ul>
すべてのことを言い終えたら、wpメニューシステムを使用して、メンバーシップレベルと追加のメンバーシップレベルに基づいて、サブメニュー項目の無限の可能性を動的に表示することができました。