4

Wordpress から構築されたメンバーシップ サイトがあり、「あなたのサブスクリプション」という 1 つのタブを除いて、すべてのユーザーに同じナビゲーション メニューを作成したいと考えています。そのタブには、ユーザーが持っているサブスクリプションを示すドロップダウン メニューがあります。 、ユーザーごとに異なります。

これは私が今持っているものの小さなサンプルです:

if ( wp_emember_is_member_logged_in('19') ) {
    wp_nav_menu( array( 'menu' => 'example1', 'menu_class' => 'sf-menu' ) );

これは、メンバーが特定のメンバーシップ レベルを持っているかどうかを確認し、そのメンバーシップ レベルに固有のメニューを入力します。唯一の問題は、20 個の elseif ステートメントと 20 個のメニューがあり、まったく効率的ではないことです。

基本的に、たくさんの異なるメニューを作成するのではなく、1 つのメニューに 1 つのタブを追加したいと考えています。私はそれを行う方法がわかりません。ありがとう!

質問のために編集しました。

4

5 に答える 5

1

こんにちは、私はそれがあなたの後に何であるかについて少し混乱しています、あなたは基本的にあなたがすべてのユーザーのためのメニューを持ちたいと言っていますか、そして特定のアクセスレベルに応じてメニューの1つの要素を変更しますか?

この場合、適切なアクセスレベルにあるかどうかを判断し、それに応じてメニューをカスタマイズするには、「if」ステートメントが必要であるように見えます。基本的に、メニューを作成するには2つの異なる配列が必要なようです。

if ( wp_emember_is_member_logged_in('19') )
{//this will be show for users with an access level of 19
    $menu = array( 'menu' => 'example1', 'menu_class' => 'sf-menu' )
}
else
{//this will be show for all users except with an access level of 19
    $menu = array( 'menu' => 'example2', 'menu_class' => 'sf-menu-2' );
}

wp_nav_menu($menu);

WPのこの部分でメニュー自体を構成/設定する必要があります。

http://YOUR-DOMAIN/wp-admin/nav-menus.php

編集

より良いコードを書きたいようで、20の異なるif/elseステートメントを持たない可能性があります。

ユーザーのグループレベルと名前を共有する個別のPHPファイルとして、すべてのカスタムメニューを含むフォルダーを作成します。

custommenus/19.php
custommenus/20.php
custommenus/21.php
custommenus/22.php

次に、次のようなアクセスレベルの正しいメニューをロードします。

//there must be a way for you to grab the user access level
//for now I will hard code it
$current_user_access_level = 19;

$custom_menu_path = 'custommenus/'.$current_user_access_level.'.php';
$default_menu_path = 'custommenus/default.php';

//check to see if the custom menu file exists first
if(file_exists($custom_menu_path))
{
    include $custom_menu_path;
}
else
{//then the file exists, load some sort of default file
    include $default_menu_path;
}

次に、新しいアクセスレベルを作成するときはいつでも、アクセスレベルと同じ名前の新しいファイルを「custommenus」フォルダに追加するだけです。ファイルがまだ作成されていない場合は、デフォルトのメニューが読み込まれます。

これがお役に立てば幸いです:)[PSこれはテストされていません]

于 2012-09-12T11:51:16.780 に答える
0

他の興味のある人のために、私は簡単な解決策を得るために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メニューシステムを使用して、メンバーシップレベルと追加のメンバーシップレベルに基づいて、サブメニュー項目の無限の可能性を動的に表示することができました。

于 2012-09-14T18:08:17.353 に答える
0

wp_nav_menu_objectsフィルターを使用して、あるメニューのアイテムを別のメニューにマージできます。

マージしたいメニューの ID と、マージした項目を子にしたいメニュー項目の ID を知る必要があります。次に、メニュー項目を取得し、その親メニュー項目を設定して、それらを親メニューとマージするだけです。例えば

add_filter('wp_nav_menu_objects', 'my_wp_nav_menu_objects_filter', 10, 2);

function my_wp_nav_menu_objects_filter($menu_items, $args) {
  $sub_menu_id = 123;
  $sub_menu_parent_item_id = 456;

  $sub_menu_items = wp_get_nav_menu_items($sub_menu_id);

  foreach ($sub_menu_items as $item) {
    if (!$item->menu_item_parent) {
      $item->menu_item_parent = $sub_menu_parent_item_id;
    }
  }

  return array_merge($menu_items, $sub_menu_items);
}
于 2012-09-12T14:18:15.477 に答える
0

わかりました、あなたにとって最善の解決策は、カスタムメニューを使用することです。これがあなたのニーズに合っていることを願っています...
このような2つのメニューを作成できます

あなたの functions.php で:

add_action( 'init', 'my_custom_menus' );
function my_custom_menus() {
    register_nav_menus(
        array(
            'loggedin-menu' => __( 'logged in users' ),
            'newmembers-menu' => __( 'new members' )
        )
    );
}

次に...現在のメニューがある場所-これを置き換えます:

if ( wp_emember_is_member_logged_in('19') ) {
    wp_nav_menu( array( 'menu' => 'example1', 'menu_class' => 'sf-menu' ) );

これとともに:

// check if user is logged in
if ( is_user_logged_in() ) {
    // Logged in.
    wp_nav_menu( array( 'theme_location' => 'loggedin-menu' ) );
} else {
    // Not logged in.
    wp_nav_menu( array( 'theme_location' => 'newmembers-menu' ) );
}

それができたら、メニューを作成して、ログインしているユーザーとログインしていないユーザーに別のメニューを用意できます。

ここに画像の説明を入力

于 2012-09-12T12:00:46.960 に答える
0

追加する必要があるのがリストの最後にある 1 つのメニュー項目だけである場合は、ここで説明されているようにフィルター (wp_nav_menu_items) に接続できます。次に、サブスクリプション ドロップダウンにメニュー項目を追加できます。if ステートメントを使用する代わりに、単純にレベルを出力できます。

この方法を使用すると、メニュー項目の内容をより細かく制御でき、異なるレベルのメンバーシップが類似している場合. また、switchステートメントは、エンドレス (if else) ステートメントよりも優先されます。

-それが役立つことを願っています

于 2012-09-18T15:43:21.903 に答える