BuddyPressのメニュータブをカスタマイズ(フィルターフックで)

先日手がけたBuddyPressの案件にて、依頼主より「プロフィール設定のメニュータブについて、一部を非表示にしてほしい」とのオーダーがありました。

この画像でいうところの「活動」とか「プロフィール」といった項目ですね。

で、ソースを読んでいったところ、フィルターフックでメニュー項目の非表示ができることが分かりましたのでここに紹介する次第です。いつもどおりの「ご利用は計画的に」な技術情報ですのでご留意ください。

今回のオーダーは

  • 「グループ」を非表示にしてほしい
  • 「設定」→「通知」を非表示にしてほしい

というもの。ぱっと思い浮かぶのは、「テンプレートファイルいじればオッケイなんじゃない?」との発想ですが、たとえば「グループ」の非表示に絡む wp-content/plugins/buddypress/bp-themes/bp-default/members/single/home.php というテンプレートファイルを見てみますと

<div id="item-nav">
<div id="object-nav" class="item-list-tabs no-ajax">
<ul>
	<?php bp_get_displayed_user_nav(); ?>
 
	<?php do_action( 'bp_member_options_nav' ); ?>
</ul>
</div>
</div><!-- #item-nav -->

というループでメニューが生成されており、テーマファイルのカスタマイズではどうしようもない状態でした。

それじゃあ、ということで対処法を。

「グループ」を非表示に

wp-content/plugins/buddypress/bp-core/bp-core-templatetags.php で定義されている bp_get_displayed_user_nav() 関数を見てみると、ありました apply_filters() 関数が。

echo apply_filters( 'bp_get_displayed_user_nav_' . $user_nav_item['css_id'], '<li id="' . $user_nav_item['css_id'] . '-personal-li" ' . $selected . '><a id="user-' . $user_nav_item['css_id'] . '" href="' . $link . '">' . $user_nav_item['name'] . '</a></li>', &$user_nav_item );
  1. メニュー項目を作るたびに apply_filters() 関数を実行
  2. <li> タグに
    $user_nav_item['css_id']

    をIDとして与える

ということをやっているので、

  1. 非表示にしたいメニュー項目(<li>タグ)のIDを調べる
  2. 調べたIDについて以下のような関数を functions.php に書く
function remove_displayed_user_nav( $content ) {
	if ( function_exists( 'bp_get_displayed_user_nav' ) ) {
		$content = '';
	}
	return $content;
}
add_filter( 'bp_get_displayed_user_nav_groups', 'remove_displayed_user_nav' );

functions.php に書く前

functions.php に書いた後

同様にして……

「設定」→「通知」を非表示に

サブメニューの方は wp-content/plugins/buddypress/bp-core/bp-core-templatetags.php の bp_get_options_nav() 関数で実装されているようなので

function remove_bp_get_options_nav( $content ) {
	if ( function_exists( 'bp_get_options_nav' ) ) {
		$content = '';
	}
	return $content;
}
add_filter( 'bp_get_options_nav_notifications', 'remove_bp_get_options_nav' );

このような感じで。

add_fliter() 関数の引数である bp_get_displayed_user_nav_hoge や bp_get_options_nav_hoge の文字列 hoge が<li>タグのIDに相当するので、削除したいメニュー項目のIDを調べて functions.php に add_filter でどんどこ追記していけばオッケイでしょう。

「BuddyPressのメニュータブをカスタマイズ(フィルターフックで)」への1件のフィードバック

  1. 貴重な情報ありがとうございます。大変参考になりました。

    こちらの記事ではメニュータブを”非表示”にする方法でしたが、タブの名前を変更することは可能でしょうか。

    たとえば、「フォーラム」というタブ名を「質問」というタブ名に変えたいと考えております。

    お手数おかけしますが、ご回答いただけますと幸いです。
    何卒よろしくお願い致します。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください