BuddyPressのmembersページで独自のフィルターでユーザーを絞り込む方法
BuddyPressのmembersページで独自のフィルターでユーザーを絞り込む方法
以前街のポータルサイトをBuddyPressで作ろう的な内容でワークショップ行いましたが、私自身実際に自分の住む街のポータルをBuddyPressで作るべく動いております。で、今回はそれにあたってmembersページを任意でデータを絞り込めないかと思って調べていたらできました、というご報告。
指定したパラメータにマッチしたメンバーを表示するためにはSQLの知識のそこそこ必要なのですが、説明が長くなりそうなので割愛して、フィルタリングの方法だけ紹介します。BuddyPressで指定したカスタムプロフィールで、メンバーをフィルタリングして表示するプラグインは現在作成中なのでその際にでも紹介させて下さい。
指定したユーザーのIDでフィルターする
今回は上記URLを参考にやってみました。上記URLでは指定したメンバーをmembersページから除外していますね。
この記述はfunctions.phpまたは、bp-custom.phpに記載します。
- //add_actionでbp_ajax_querystringにフック。
- add_action('bp_ajax_querystring','bpdev_exclude_users',20,2);
- function bpdev_exclude_users($qs=false,$object=false){
- //list of users to exclude
- $excluded_user='1,2,3';//comma separated ids of users whom you want to exclude
- if($object!='members')//hide for members only
- return $qs;
- $args=wp_parse_args($qs);
- //check if we are listing friends?, do not exclude in this case
- if(!emptyempty($args['user_id']))
- return $qs;
- if(!emptyempty($args['exclude']))
- $args['exclude']=$args['exclude'].','.$excluded_user;
- else
- $args['exclude']=$excluded_user;
- $qs=build_query($args);
- return $qs;
- }
もっと簡単に出来ないものかと試行錯誤したら、user_idよりデータを除外したり、検索するならたったの4行でいけました。
これで、ユーザーID 5、6、7以外のメンバーに絞り込めます
- add_action('bp_ajax_querystring','bpdev_exclude_users',20,1);
- function bpdev_exclude_users($qs=false){
- $qs='exclude=5,6,7';
- return $qs;
- }
add_action関数でbp_ajax_querystringというフックにフィルターかけるだけなので、実際自分で書くところはこれだけ。
$qs=’exclude=5,6,7′;
return $qs;
当然、除外が出来れば指定したuser_idだけを表示出来るだろうと思っていて、excludeの反対はincludeだと思い、
これでuser_idが5,6,7のユーザーの取得に成功します
- add_action('bp_ajax_querystring','bpdev_include_users',20,1);
- function bpdev_exclude_users($qs=false){
- $qs='exclude=5,6,7';
- return $qs;
- }
後は特定のカスタムしたプロフィールの項目にチェックが入っているかはSQLを使う必要があり、だいたいSQLはこんな感じになります。
wp_bp_xprofile_dataテーブルにどのuser_idが何の拡張プロフィールのデータを入れているか(field_id)が格納されています。
あとは、取得したuser_idのデータを配列からカンマ区切りの文字列にすればOK.
拡張プロフィールのユーザの取得について、もう少し楽だったらな〜というのが正直なところ。
- global $wpdb;
- $user_id = $wpdb->get_results( "SELECT *
- FROM `wp_bp_xprofile_data`
- WHERE `field_id` ={$_GET['category_id']}
- AND `value` LIKE '%{$_GET['category_name']}%'" );
- $include_user = "";
- foreach ($user_id as $user_id) {
- $include_user .= $user_id->user_id.',';