[加筆あり]BuddyPressのメニュータブをカスタマイズ(フィルターフックで)

※初出(2011年5月27日)の記事に加筆・修正を施しました。

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

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

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

今回のオーダーは

  • 「グループ」を非表示にしてほしい
  • 「設定」→「プロフィール公開状態」を非表示にしてほしい

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

	<div id="item-nav">
		<div class="item-list-tabs no-ajax" id="object-nav" aria-label="<?php esc_attr_e( 'Member primary navigation', 'buddypress' ); ?>" role="navigation">
			<ul>

				<?php bp_get_displayed_user_nav(); ?>

				<?php

				/**
				 * Fires after the display of member options navigation.
				 *
				 * @since 1.2.4
				 */
				do_action( 'bp_member_options_nav' ); ?>

			</ul>
		</div>
	</div><!-- #item-nav -->

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

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

「グループ」を非表示に

/wp-content/plugins/buddypress/bp-members/bp-members-template.php で定義されている bp_get_displayed_user_nav() 関数を見てみると、ありました apply_filters_ref_array() 関数( フィルターにフックする関数に対して、配列で引数を渡す apply_filters() の一種)が。

echo apply_filters_ref_array( 'bp_get_displayed_user_nav_' . $user_nav_item-&amp;gt;css_id, array( '&amp;lt;li id="' . $user_nav_item-&amp;gt;css_id . '-personal-li" ' . $selected . '&amp;gt;&amp;lt;a id="user-' . $user_nav_item-&amp;gt;css_id . '" href="' . $link . '"&amp;gt;' . $user_nav_item-&amp;gt;name . '&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;', &amp;amp;$user_nav_item ) );
  1. メニュー項目を作るたびに apply_filters_ref_array() 関数を実行
  2. <li> タグに $user_nav_item->css_id をIDとして与える(ID の値として生成される文字列は bp_get_displayed_user_nav_{$user_nav_item->css_id}-personal-li )

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

  1. 非表示にしたいメニュー項目の ID(= $user_nav_item->css_id の文字列)を調べる
  2. 調べたIDについて以下のような関数を functions.php に書く
add_filter( 'bp_get_displayed_user_nav_groups', function ( $array ) {
	if ( function_exists( 'bp_get_displayed_user_nav') ) {
		unset( $array );
	}
	return $array;
} );

functions.php に書く前

functions.php に書いた後

同様にして……

「設定」→「プロフィール公開状態」を非表示に

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

add_filter( 'bp_get_options_nav_profile', function ( $array ) {
	if ( function_exists( 'bp_get_options_nav') ) {
		unset( $array );
	}
	return $array;
} );

このような感じで。

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

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

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

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

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

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

コメントを残す

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

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