Buddypress Mitglieder-Suche im Profil und extended Profilfeldern

Berücksichtigung der globalen und individuellen Sichtbarkeits-Einstellungen

WordPress Plugin Buddypress

Was kann das Plugin Buddypress

Buddypress ist ein WordPress Plugin, um ein soziales Netzwerk mit Aktivitätsverlauf auf der eigenen WordPress-Webseite zu erstellen. Die Community-Mitglieder können untereinander Kontakt aufnehmen, Nachrichten senden, Freundschaften anfragen und Gruppen bilden. Buddypress, das kostenlose Plugin von Automattic, den Herausgebern von WordPress, hat mehr als 100.000 aktive Installationen. Zu dem Plugin gibt es zahlreiche, hilfreiche Ergänzungen wie die Forensoftware bbpress mit mehr als 200.000 aktiven Installationen.

Buddypress Einstellungsmöglichkeiten im erweiterten Profil

Visibility extended Profile Fields

Buddypress bietet die Möglichkeit individuelle Felder für die Registrierung und das Userprofil zu erstellen (Extended Profile). Bei jedem Feld kann der Administrator über die Sichtbarkeit der Profilfelder entscheiden und ob der User die Einstellungen für sein eigenes Profil überschreiben und verändern darf. Mögliche Einstellungsmöglichkeiten für die Sichtbarkeit der Profilfelder sind:

Sichtbar für

  • jeden,
  • nur mich,
  • angemeldete Community-Mitglieder,
  • für Freunde oder
  • individuell von jedem Mitglied einstellbar, für wen das Feld sichtbar sein soll.
Buddypress Mitgliedersuche in Extended profile fields

Problem Mitgliedersuche mit eingeschränkt sichtbaren Feldern

Enforce field visibility

Die globalen und individuellen Einstellungen für die Sichtbarkeit der einzelnen Profilfelder funktionieren beim Aufruf eines Mitgliederprofils wunderbar, unabhängig davon, ob das Profil von einem eingeloggten Mitglied, Crawler, Bot oder „normalen“ Webseitenbesucher angeschaut wird.

Bei der Buddypress-Suche in den Mitgliederdaten werden die globalen und individuellen Einstellungen jedoch vom WordPress Plugin nicht berücksichtigt, unabhängig davon, ob ein eingeloggter oder nicht eingeloggter Webseitenbesucher in den Mitgliedern sucht.

In unserer Buddypress Installation mit mehr als 10.000 Mitgliedern sind Felder wie Nachname und E-Mail-Adresse vom Administrator gobal als „nicht sichtbar“ definiert. D.h. das Mitglied kann diese Einstellung nicht überschreiben oder ändern.

Felder wie Vorname oder Geburtsdatum sind vom Administrator als „individuell“ definiert, so dass jedes Mitglied die Wahl hat, ob das Feld für jeden, nur Mitglieder, nur Freunde oder niemanden sichtbar sein sollen.

Buddypress Mitgliedersuche - Extended Profilfields

Problem: Buddypress-Suche ohne Prüfung der Sichtbarkeitseinstellungen

Bei einer Suche in den Buddypress Mitgliedern zum Beispiel auf den Namen „Meier“ werden alle Mitglieder angezeigt, bei denen in irgendeinem Feld „meier“ vorkommt, ohne Prüfung der Sichtbarkeitseinstellungen, unabhängig davon, ob die Suche von einem eingeloggten Mitglied oder ohne Anmeldung durchgeführt wird und obwohl das Feld “Name” als nicht sichtbar definiert ist.

Anpassung der Buddypress Mitgliedersuche

In der Buddypress Funktion bp_xprofile_bp_user_query_search.php (/wp-content/plugins/buddypress/bp-xprofile/bp-xprofile-functions.php) wird in den WordPress-Usern ohne Berücksichtigung der Sichtbarkeitseinstellungen gesucht.

Mit meiner Erweiterung wird die Standard-Buddypress Suche (bp_xprofile_bp_user_query_search.php) entfernt (remove_action) und mit meiner Funktion unter Berücksichtigung der Sichtbarkeitseinstellungen (z.B. „Nur für Mitglieder“) durchgeführt.

Meine Anpassungen können als Plugin installiert und aktiviert werden, ohne das Anpassungen an Buddypress nötig sind.

<?php
/*
Plugin Name: BT BP Member search
Description: Anpassung der Default Buddypress Mitgliedersuche unter Berücksichtigung der Sichtbarkeitseinstellungen in den erweiterten Profilfeldern
Author: Benedicta Thölke
Version: 1.0.0
Author URI: https://www.bt-webdesign.de/
*/
 
if ( ! defined( 'ABSPATH' ) ) exit;
 
/*
 * Mitgliedersuche in Buddypress in Extra-Profilfeldern anpassen:
 *
 * if ( Sichtbarkeit == "Feld-Sichtbarkeit erzwingen" [ allow_custom_visibility == disabled ] )
 *      Feld-Sichtbarkeit mit default_visibility prüfen
 * else
 *      Feld-SichtbarkeitVisibility mit user_visibility prüfen [ tab usermeta -> user_id == User && meta_key == bp_xprofile_visibility_levels ]
 *
 * if ( Feld nicht public )
 *      prüfen ob Webseiten-Besucher eingeloggt (Mitglied) ist und Feld-Sichtbarkeit == loggedin
 *
 * Original-Funktion add_action in: /buddypress/bp-xprofile/bp-xprofile-functions.php
 */
function bt_bp_member_search( $sql, BP_User_Query $query ){
global $wpdb;
 
// remove Original-Funktion
remove_action( 'bp_user_query_uid_clauses', 'bp_xprofile_bp_user_query_search', 10, 2 );
 
// keine Suchbegriffe
if ( empty( $query->query_vars['search_terms'] ) || empty( $sql['where']['search'] ) ) {
return $sql;
	}
 
$bp = buddypress();
 
$search_terms_clean = bp_esc_like( wp_kses_normalize_entities( $query->query_vars['search_terms'] ) );
 
if ( $query->query_vars['search_wildcard'] === 'left' ) {
	$search_terms_nospace = '%' . $search_terms_clean;
	$search_terms_space   = '%' . $search_terms_clean . ' %';
} elseif ( $query->query_vars['search_wildcard'] === 'right' ) {
	$search_terms_nospace =        $search_terms_clean . '%';
	$search_terms_space   = '% ' . $search_terms_clean . '%';
} else {
	$search_terms_nospace = '%' . $search_terms_clean . '%';
	$search_terms_space   = '%' . $search_terms_clean . '%';
}

// Combine the core search (against wp_users) into a single OR clause
// with the xprofile_data search.

// table bp_xprofile_data
$matched_user_field_ids = $wpdb->get_results( $wpdb->prepare(
	"SELECT user_id, field_id FROM {$bp->profile->table_name_data} WHERE value LIKE %s OR value LIKE %s",
	$search_terms_nospace,
	$search_terms_space
) );

// table bp_xprofile_meta - object_id = field_id, wenn object_type = 'field'
$default_visibility = $wpdb->get_results(
	"SELECT object_id, meta_value FROM " . $wpdb->prefix . "bp_xprofile_meta WHERE object_type = 'field' AND meta_key = 'default_visibility' AND object_id  IN (
         SELECT object_id FROM " . $wpdb->prefix . "bp_xprofile_meta WHERE object_type = 'field' AND meta_key = 'allow_custom_visibility' AND meta_value = 'disabled'
         )"
 );

$user_ids = array_column($matched_user_field_ids, 'user_id');
// table WP usermeta
$select = "SELECT user_id, meta_value FROM " . $wpdb->prefix . "usermeta WHERE meta_key = 'bp_xprofile_visibility_levels' and user_id  IN";
if ( count($user_ids) == 0 )
    $select .= "(NULL)";
else
    $select .= "(" . implode(',', $user_ids) . ")";
$usermeta_visibility = $wpdb->get_results( $select );

$arr_default_visibility = array();
for ( $i=0; $i<count($default_visibility); $i++ ){ $arr_default_visibility[$default_visibility[$i]->object_id] = $default_visibility[$i]->meta_value;
}
$arr_usermeta_visibility = array();
for ( $i=0; $i<count($usermeta_visibility); $i++ ){ $arr_visibility = unserialize($usermeta_visibility[$i]->meta_value);
      $arr_usermeta_visibility[$usermeta_visibility[$i]->user_id] = $arr_visibility;
}

$matched_user_ids = array();
foreach ($matched_user_field_ids as $arr_user_field) {
 if ( isset($arr_default_visibility[$arr_user_field->field_id]) ){
      if ( $arr_default_visibility[$arr_user_field->field_id] == 'public' )
           $matched_user_ids[] = $arr_user_field->user_id;
      else
      if ( $arr_default_visibility[$arr_user_field->field_id] == 'loggedin' && is_user_logged_in() )
           $matched_user_ids[] = $arr_user_field->user_id;
    }
 else
 if ( isset($arr_usermeta_visibility[$arr_user_field->user_id][$arr_user_field->field_id]) ){
      if ( $arr_usermeta_visibility[$arr_user_field->user_id][$arr_user_field->field_id] == 'public' )
           $matched_user_ids[] = $arr_user_field->user_id;
      else
      if ( $arr_usermeta_visibility[$arr_user_field->user_id][$arr_user_field->field_id] == 'loggedin' && is_user_logged_in() )
           $matched_user_ids[] = $arr_user_field->user_id;
    }
 }

if ( ! empty( $matched_user_ids ) ) {
	$search_core     = $sql['where']['search'];
	$search_combined = " ( u.{$query->uid_name} IN (" . implode(',', $matched_user_ids) . ") OR {$search_core} )";
	$sql['where']['search'] = $search_combined;
}

return $sql;
}

add_action( 'bp_user_query_uid_clauses', 'bt_bp_member_search', 9, 2 );

Hilfreiche und interessante Links

https://de.wordpress.org/plugins/buddypress/
https://buddypress.org/

Bildquelle: Pixabay

Fragen, Wünsche und Anregungen zu der Erweiterung der Buddypress Mitgliedersuche?

Senden Sie mir eine Nachricht an info@bt-webdesign.de

Kontakt
05254 / 67673
info@bt-webdesign.de
Kontaktformular