Come cercare corrispondenze parziali nei nomi visualizzati degli utenti WordPress?

3 lug 2013, 13:17:26
Visualizzazioni: 38.9K
Voti: 15

Ho bisogno di creare una pagina di ricerca che mostrerà qualsiasi contenuto correlato alla ricerca fornita. Ad esempio i comments che lo contengono, gli events, i posts, i CPT e gli users con quel nome.

Come posso cercare gli utenti nel sito il cui nome o cognome contiene la frase di ricerca?

0
Tutte le risposte alla domanda 6
9
32

Ricerca nella tabella principale

Basta usare WP_User_Query con un argomento di ricerca.

Quindi se vuoi cercare ad esempio un utente con una parola chiave nel suo user_email o colonne simili dalla tabella {$wpdb->prefix}users, puoi fare quanto segue:

$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();

Tieni presente che * è un carattere jolly. Quindi restringere ad esempio il user_email a un singolo dominio ti darebbe la seguente stringa di ricerca: *@example.com.

La stringa search ha alcune funzionalità "magiche": I search_columns di default sono...

  • user_email se è presente @ nell'argomento search.
  • user_login e ID se l'argomento search è numerico
  • user_url se la stringa search contiene http:// o https://
  • oppure ... user_login e user_nicename se è presente una stringa.

Tutti questi default vengono impostati solo se non è stato specificato alcun argomento search_columns.

Ricerca nella tabella meta

Se vuoi cercare ad esempio first_name o last_name, dovrai fare una meta_query poiché non fanno parte della tabella principale:

$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();

Assicurati di recuperare la stringa di ricerca corretta. Normalmente sarebbe get_query_var('s');, ma potrebbe - a seconda del tuo form name/id - essere qualcosa di diverso che potresti voler recuperare usando ad esempio $_GET['user_search']. Assicurati di eseguire l'escape corretto e rimuovere gli spazi bianchi indesiderati dall'inizio e dalla fine della stringa.

Ricorda che questo è un array( array() ) poiché c'è la chiave relation. Se vuoi cercare solo una singola chiave, potrebbe essere più semplice usare quanto segue:

$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();

Query finale

Il risultato potrebbe assomigliare a quanto segue:

$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();
3 lug 2013 14:22:05
Commenti

In quale file devo aggiungere questa query?

Naveen Naveen
27 gen 2014 09:04:40

@Naveen L'opzione migliore sarebbe aggiungerla nel file functions.php, nel tuo template o (soluzione migliore) incapsularla in un mini-plugin personalizzato per non perdere la funzionalità quando cambi tema.

kaiser kaiser
27 gen 2014 12:54:15

Kiaser grazie per la risposta. Per favore aiutami a capire come integrare questo codice nel functions.php

Naveen Naveen
27 gen 2014 13:11:41

@Naveen Questo va oltre lo scopo qui. Dovrai imparare un po' di codice o trovare uno sviluppatore che lo faccia per te. E leggi questa domanda/risposta.

kaiser kaiser
27 gen 2014 13:17:20

display_name è una colonna in wp_users. Due domande sorgono spontanee. 1: Si tratta di un cambiamento recente allo schema del database? 2: Può essere usato come valore in search_columns invece della meta query?

henrywright henrywright
13 ago 2017 12:08:03

@kaiser invece di user_email funziona email, come nel file core /var/www/html/rated_lettings/wp-includes/class-wp-user-query.php #163 $search_columns Array di nomi di colonne da cercare. Accetta 'ID', 'login','nicename', 'email', 'url'. Default array vuoto.

<br/> mi sto perdendo qualcosa

inrsaurabh inrsaurabh
25 giu 2018 15:12:04

@inrsaurabh sono passati 5 anni da quella risposta. Non ho idea se e cosa sia cambiato da allora. :)

kaiser kaiser
25 giu 2018 15:34:10

@kaiser penso che abbia ragione, dovremmo usare email

https://github.com/WordPress/WordPress/blob/master/wp-includes/class-wp-user-query.php#L162

inrsaurabh inrsaurabh
25 giu 2018 15:40:22

@inrsaurabh Dai un'occhiata qui.

kaiser kaiser
25 giu 2018 16:17:58
Mostra i restanti 4 commenti
0

Questo mi ha aiutato invece della risposta di Kaiser: https://laubsterboy.com/blog/2015/07/search-wordpress-users-by-name/

Ma in questa soluzione la funzione $wpdb->escape($usermeta_keys) generava un errore, quindi ho semplicemente usato $usermeta_keys.

4 ago 2017 14:07:04
1

Soluzione personalizzata

So che la mia risposta è in ritardo, ma stavo cercando la stessa cosa e l'ho realizzata con l'aiuto della risposta di @kaiser. Mostrerò solo il titolo, il link e l'estratto/email dell'utente, ma puoi espanderla come preferisci ovviamente.

Array personalizzato

Ho iniziato creando un array vuoto:

$search_results = array();

Ricerca utenti

Poi sono passato alla 'WP_User_Query' che utilizza l'input dell'utente ($search_results) per il filtraggio.

$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',
    ),
) );

Riempiamo il nostro array con i dati utente

Ora inseriamo questa query nel nostro array vuoto ($search_results).

if (!empty($users->results)) :
    foreach ($users->results as $user => $value) :
        $tmp_array = array();
        $data = $value->data;
        $user_id = $data->ID;
        $tmp_array['link'] = get_the_author_link($user_id); 
        $tmp_array['text'] = $data->user_url;
        $tmp_array['title'] = $data->display_name;
        $search_results[] = $tmp_array;
    endforeach;
endif;

Riempiamo il nostro array con i dati di post/pagine

Vogliamo anche che il normale modulo di ricerca che cerca pagine e post continui a funzionare, quindi dobbiamo eseguire il loop anche su questo. Mentre lo facciamo, riempiremo anche il nostro array ($search_results) con questi dati:

$query_string = esc_attr($query_string);
$search = new WP_Query($query_string);
if ( $search->have_posts() ) :
    while ( $search->have_posts() ) : $search->the_post();
        $tmp_array = array();
        $tmp_array['link'] = get_the_permalink();; 
        $tmp_array['title'] = get_the_title();
        $tmp_array['text'] = get_the_excerpt();
        $search_results[] = $tmp_array;
    endwhile;
endif;

Loop sul nostro array

Ora abbiamo un array che contiene informazioni sugli utenti e dettagli su post/pagine. L'ultima cosa da fare è eseguire il loop su di esso, in modo che l'utente veda i risultati che ha cercato:

<?php if(!empty($search_results)): ?>
    <?php foreach ($search_results as $result) : ?>
        <a class="search-item" href="<?php echo $result['link']; ?>">
            <h2 class="search-title"><?php echo $result['title']; ?></h2>
            <span class="search-text"><?php echo $result['text']; ?></span>
        </a>
    <?php endforeach; ?>
<?php else: ?>
<div class="nothing-found">
    <h3><?php echo 'Nessun risultato trovato.'; ?></h3>
</div>
<?php endif; ?>

Fatto!

26 ago 2020 17:27:23
Commenti

Penso che potrebbe essere una buona idea per una piccola raccolta di utenti...

Sagive Sagive
6 nov 2021 23:20:06
2

Recentemente, mentre lavoravo a un progetto su larga scala, i miei clienti riscontravano problemi nella ricerca degli utenti tramite nome, cognome, nome dell'azienda o ragione sociale.

Così ho pensato di creare un plugin e combinare le mie competenze front-end con PHP. Ho deciso di utilizzare VueJs e Axios per raggiungere il mio obiettivo.

https://wordpress.org/plugins/robust-user-search/

Questo plugin consente agli utenti di cercare per: Username, Nome, Cognome, Email o Nome Azienda.

Ricerca Utenti Robusta

11 set 2020 09:51:27
Commenti

Benvenuto su WPSE. Tieni presente che dovresti dichiarare la tua affiliazione quando promuovi qualcosa, https://wordpress.stackexchange.com/help/promotion

Antti Koskinen Antti Koskinen
11 set 2020 16:23:38

@AnttiKoskinen Ehi, va meglio così?

primegxy primegxy
12 set 2020 00:09:02
0

Se stai utilizzando la funzione più semplice get_user(), puoi usare il seguente codice:

$users = get_users(array('search' => '*'.esc_attr( $search_string).'*'));
9 mag 2022 16:50:35
0
-1
$search_string = esc_attr( trim( get_query_var('s') ) );
$users = new WP_User_Query( array(
    'search'         => "*{$search_string}*",  // Cerca la stringa con wildcards prima e dopo
    'search_columns' => array(  // Colonne della tabella users da cercare
        'user_login',    // Nome di accesso
        'user_nicename', // Slug/nome visualizzato
        'user_email',    // Email
        'user_url',      // URL del sito
    ),
    'meta_query' => array(  // Ricerca nei metadati utente
        'relation' => 'OR',  // Relazione OR tra le condizioni
        array(
            'key'     => 'first_name',  // Meta key nome
            'value'   => $search_string,  // Valore da cercare
            'compare' => 'LIKE'         // Confronto con LIKE
        ),
        array(
            'key'     => 'last_name',   // Meta key cognome
            'value'   => $search_string,  // Valore da cercare
            'compare' => 'LIKE'         // Confronto con LIKE
        )
    )
) );
$users_found = $users->get_results();  // Ottieni i risultati della query
25 giu 2021 17:52:17