Come cercare corrispondenze parziali nei nomi visualizzati degli utenti WordPress?
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?

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'argomentosearch
.user_login
eID
se l'argomentosearch
è numericouser_url
se la stringasearch
contienehttp://
ohttps://
- oppure ...
user_login
euser_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();

@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.

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

@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.

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?

@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 sono passati 5 anni da quella risposta. Non ho idea se e cosa sia cambiato da allora. :)

@kaiser penso che abbia ragione, dovremmo usare email
https://github.com/WordPress/WordPress/blob/master/wp-includes/class-wp-user-query.php#L162

@inrsaurabh Dai un'occhiata qui.

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
.

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!

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.

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

$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
