Bp_Search_Members

BuddyPress Global Search - 搜索会员类

描述

文件:bp-search /类/ class-bp-search-members.php

BP_Search_Members级别扩展BP_Search_type {私有$ type ='成员';/ ** *确保在任何一段时间内存中只有一个类实例存在。还可以防止需要到处定义全局变量。* * @since buddyboss 1.0.0 * * * * @return对象bp_search_members * / public static function instance(){//本地存储实例以避免私有静态复制静态$ instance = null;//如果(null === $ stuils){$ stance = new bp_search_members(),则仅运行这些方法add_action('bp_search_settings_item_members',array($ stance,'print_search_options')));} //始终返回实例返回$ instance;} / ** *虚拟构造函数,以防止此类加载不止一次。* * @since buddyboss 1.0.0 * / private函数_construct(){/ *在此处不做* /} / ** *为成员搜索生成SQL。* * @todo:如果mr.x将Xprofile字段“位置”数据设置为“私有”*,则不应选中MR.X的位置。 * * @since BuddyBoss 1.0.0 * @param string $search_term * @param boolean $only_totalrow_count * * @return string sql query */ public function sql( $search_term, $only_totalrow_count=false ){ global $wpdb, $bp; $bp_prefix = bp_core_get_table_prefix(); $query_placeholder = array(); $COLUMNS = " SELECT "; if( $only_totalrow_count ){ $COLUMNS .= " COUNT( DISTINCT u.id ) "; } else { $COLUMNS .= " DISTINCT u.id, 'members' as type, u.display_name LIKE %s AS relevance, a.date_recorded as entry_date "; $query_placeholder[] = '%'. $search_term .'%'; } $FROM = " {$wpdb->users} u LEFT JOIN {$bp->members->table_name_last_activity} a ON a.user_id=u.id AND a.component = 'members' AND a.type = 'last_activity'"; $WHERE = array(); $WHERE[] = "1=1"; $WHERE[] = "u.user_status = 0"; $where_fields = array(); /* ++++++++++++++++++++++++++++++++ * wp_users table fields +++++++++++++++++++++++++++++++ */ $user_fields = bp_get_search_user_fields(); if ( ! empty( $user_fields ) ) { $conditions_wp_user_table = array(); foreach ( $user_fields as $user_field => $field_label ) { if ( ! bp_is_search_user_field_enable( $user_field ) ) { continue; } if ( 'user_meta' === $user_field ) { //Search in user meta table for terms $conditions_wp_user_table[] = " ID IN ( SELECT user_id FROM {$wpdb->usermeta} WHERE {$bp_prefix}bp_strip_tags(meta_value) LIKE %s ) "; $query_placeholder[] = '%' . $search_term . '%'; } else { $conditions_wp_user_table[] = $user_field . " LIKE %s "; $query_placeholder[] = '%' . $search_term . '%'; } } if ( ! empty( $conditions_wp_user_table ) ) { $clause_wp_user_table = "u.id IN ( SELECT ID FROM {$wpdb->users} WHERE ( "; $clause_wp_user_table .= implode( ' OR ', $conditions_wp_user_table ); $clause_wp_user_table .= " ) ) "; $where_fields[] = $clause_wp_user_table; } } /* _____________________________ */ /* ++++++++++++++++++++++++++++++++ * xprofile fields +++++++++++++++++++++++++++++++ */ //get all selected xprofile fields if( function_exists( 'bp_is_active' ) && bp_is_active( 'xprofile' ) ){ $groups = bp_xprofile_get_groups( array( 'fetch_fields' => true ) ); if ( !empty( $groups ) ){ $selected_xprofile_fields = array( 'word_search' => array(0), //Search for whole word in field of type checkbox and radio 'char_search' => array(0), //Search for character in field of type textbox, textarea and etc ); $word_search_field_type = array( 'radio', 'checkbox' ); foreach ( $groups as $group ){ if ( !empty( $group->fields ) ){ foreach ( $group->fields as $field ) { if ( bp_is_search_xprofile_enable( $field->id ) ) { if( in_array( $field->type, $word_search_field_type ) ) { $selected_xprofile_fields['word_search'][] = $field->id; } else { $selected_xprofile_fields['char_search'][] = $field->id; } } } } } if( !empty( $selected_xprofile_fields ) ){ //u.id IN ( SELECT user_id FROM {$bp->profile->table_name_data} WHERE value LIKE %s ) $clause_xprofile_table = "u.id IN ( SELECT user_id FROM {$bp->profile->table_name_data} WHERE ( {$bp_prefix}bp_strip_tags(value) LIKE %s AND field_id IN ( "; $clause_xprofile_table .= implode( ',', $selected_xprofile_fields['char_search'] ); $clause_xprofile_table .= ") ) OR ( value REGEXP '[[:<:]]{$search_term}[[:>:]]' AND field_id IN ( "; $clause_xprofile_table .= implode( ',', $selected_xprofile_fields['word_search'] ); $clause_xprofile_table .= ") ) ) "; $where_fields[] = $clause_xprofile_table; $query_placeholder[] = '%'. $search_term .'%'; } } } /* _____________________________ */ /* ++++++++++++++++++++++++++++++++ * Search from search string +++++++++++++++++++++++++++++++ */ $split_search_term = explode(' ', $search_term); if (count($split_search_term) > 1 ) { $clause_search_string_table = "u.id IN ( SELECT user_id FROM {$wpdb->usermeta} WHERE meta_key = 'bbgs_search_string' AND ("; foreach ( $split_search_term as $k => $sterm ) { if ( $k == 0 ) { $clause_search_string_table .= " meta_value LIKE %s "; $query_placeholder[] = '%'. $sterm .'%'; } else { $clause_search_string_table .= " OR meta_value LIKE %s "; $query_placeholder[] = '%'. $sterm .'%'; } } $clause_search_string_table .= ") ) "; $where_fields[] = $clause_search_string_table; } /* _____________________________ */ if( !empty( $where_fields ) ) $WHERE[] = '(' . implode ( ' OR ', $where_fields ) . ')'; // other conditions // $WHERE[] = " a.component = 'members' "; // $WHERE[] = " a.type = 'last_activity' "; $sql = $COLUMNS . ' FROM ' . $FROM . ' WHERE ' . implode( ' AND ', $WHERE ); if( !$only_totalrow_count ){ $sql .= " GROUP BY u.id "; } $sql = $wpdb->prepare( $sql, $query_placeholder ); return apply_filters( 'Bp_Search_Members_sql', $sql, array( 'search_term' => $search_term, 'only_totalrow_count' => $only_totalrow_count, ) ); } protected function generate_html( $template_type='' ){ $group_ids = array(); foreach( $this->search_results['items'] as $item_id => $item ){ $group_ids[] = $item_id; } do_action( 'bp_before_search_members_html' ); //now we have all the posts //lets do a groups loop if ( bp_has_members( array( 'search_terms' => '', 'include' => $group_ids, 'per_page' => count( $group_ids ) ) ) ) { while ( bp_members() ) { bp_the_member(); $result_item = array( 'id' => bp_get_member_user_id(), 'type' => $this->type, 'title' => bp_get_member_name(), 'html' => bp_search_buffer_template_part( 'loop/member', $template_type, false ), ); $this->search_results['items'][ bp_get_member_user_id() ] = $result_item; } } do_action( 'bp_after_search_members_html' ); } /** * What fields members should be searched on? * Prints options to search through username, email, nicename/displayname. * Prints xprofile fields, if xprofile component is active. * * @since BuddyBoss 1.0.0 */ function print_search_options( $items_to_search ){ echo "
"; echo "

" . __('Account','buddyboss') . "

"; $fields = array( 'user_login' => __( 'Username/Login', 'buddyboss' ), 'display_name' => __( 'Display Name', 'buddyboss' ), 'user_email' => __( 'Email', 'buddyboss' ), 'user_meta' => __( 'User Meta', 'buddyboss' ) ); foreach( $fields as $field=>$label ){ $item = 'member_field_' . $field; $checked = !empty( $items_to_search ) && in_array( $item, $items_to_search ) ? ' checked' : ''; echo "
"; } echo "
"; if( !function_exists( 'bp_is_active' ) || !bp_is_active( 'xprofile' ) ) return; $groups = bp_xprofile_get_groups( array( 'fetch_fields' => true ) ); if ( !empty( $groups ) ){ echo "
"; foreach ( $groups as $group ){ echo "

" . $group->name . "

"; if ( !empty( $group->fields ) ){ foreach ( $group->fields as $field ) { //lets save these as xprofile_field_{field_id} $item = 'xprofile_field_' . $field->id; $checked = !empty( $items_to_search ) && in_array( $item, $items_to_search ) ? ' checked' : ''; echo "
"; } } } echo "
"; } } }

方法

  • __construct-一个伪构造函数,防止这个类被加载不止一次。
  • generate_html
  • 实例确保在任何时候只有一个类的实例存在于内存中。还可以防止需要到处定义全局变量。
  • print_search_options-应该搜索哪些字段的成员?打印选项搜索通过用户名,电子邮件,nicename/displayname。
  • sql-为成员搜索生成sql。

问题吗?

我们总是很乐意帮助您解决代码或其他问题!搜索我们的开发人员文档联络支持,或与我们联系销售团队