it-swarm.com.de

Wie kann ich nach einem WordPress-Benutzer anhand des Anzeigenamens oder eines Teils davon suchen?

Ich muss eine Suchseite erstellen, auf der alle Informationen zur angegebenen Suche angezeigt werden. d.h. comments mit diesem Namen, events, posts, CPTs und users.

Wie kann ich auf der Site nach Benutzern suchen, deren Vor- oder Nachname den Suchbegriff enthält?

11
hannit cohen

Die Haupttabelle durchsuchen

Verwenden Sie einfach WP_User_Query mit einem Suchargument.

Wenn Sie beispielsweise nach einem Benutzer mit einem Schlüsselwort in seinem user_email oder ähnlichen Spalten aus der {$wpdb->prefix}users-Tabelle suchen möchten, können Sie Folgendes tun:

$users = new WP_User_Query( array(
    'search'         => '*'.esc_attr( $your_search_string ).'*',
    'search_columns' => array(
        'user_login',
        'user_nicename',
        'user_email',
        'user_url',
    ),
) );
$users_found = $users->get_results();

Denken Sie daran, dass * ein Platzhalter ist. Wenn Sie beispielsweise den user_email auf eine einzelne Domain beschränken, erhalten Sie den folgenden Suchbegriff: *@example.com.

Die Zeichenfolge search verfügt über einige "magische" Funktionen: Der search_columns ist standardmäßig ...

  • user_email wenn @ in dem Argument search vorhanden ist.
  • user_login und ID, wenn das Argument search numerisch ist
  • user_url wenn die Zeichenfolge searchhttp:// oder https:// enthält
  • oder ... user_login und user_nicename, wenn eine Zeichenfolge vorhanden ist.

Alle diese Standardeinstellungen werden nur festgelegt, wenn das Argument no search_columns angegeben wurde.

Suche in der Metatabelle

Wenn Sie beispielsweise nach first_name oder last_name suchen möchten, müssen Sie einen meta_query eingeben, da diese nicht Teil der Haupttabelle sind:

$search_string = esc_attr( trim( get_query_var('s') ) );
$users = new WP_User_Query( array(
    'meta_query' => array(
        'relation' => 'OR',
        array(
            'key'     => 'first_name',
            'value'   => $search_string,
            'compare' => 'LIKE'
        ),
        array(
            'key'     => 'last_name',
            'value'   => $search_string,
            'compare' => 'LIKE'
        )
    )
) );
$users_found = $users->get_results();

Stellen Sie sicher, dass Sie die richtige Suchzeichenfolge abrufen. Normalerweise wäre das eine get_query_var('s');, aber es könnte - abhängig von Ihrem Formular name/id auch etwas anderes sein, das Sie möglicherweise mit $_GET['user_search'] abrufen möchten. Vergewissern Sie sich, dass die Zeichenfolge ordnungsgemäß esacpe ist, und entfernen Sie unerwünschte Leerzeichen am Anfang und am Ende der Zeichenfolge.

Denken Sie daran, dass dies eine array( array() ) ist, da es den relation-Schlüssel gibt. Wenn Sie nur einen einzelnen Schlüssel durchsuchen lassen möchten, ist es möglicherweise einfacher, die folgenden Schritte auszuführen:

$search_string = esc_attr( trim( get_query_var('s') ) );
$users = new WP_User_Query( array(
    'meta_key'     => 'first_name',
    'meta_value'   => $search_string,
    'meta_compare' => 'LIKE',
) );
$users_found = $users->get_results();

Letzte Abfrage

Das Ergebnis könnte ungefähr so ​​aussehen:

$search_string = esc_attr( trim( get_query_var('s') ) );
$users = new WP_User_Query( array(
    'search'         => "*{$search_string}*",
    'search_columns' => array(
        'user_login',
        'user_nicename',
        'user_email',
        'user_url',
    ),
    'meta_query' => array(
        'relation' => 'OR',
        array(
            'key'     => 'first_name',
            'value'   => $search_string,
            'compare' => 'LIKE'
        ),
        array(
            'key'     => 'last_name',
            'value'   => $search_string,
            'compare' => 'LIKE'
        )
    )
) );
$users_found = $users->get_results();
21
kaiser

Dies hat mir geholfen, anstatt Kaisers Antwort: https://laubsterboy.com/blog/2015/07/search-wordpress-users-by-name/

Aber in dieser Lösung hat die Funktion $wpdb->escape($usermeta_keys) einen Fehler generiert, deshalb habe ich einfach $usermeta_keys verwendet.

0
Harkály Gergő