Cum să cauți nume de utilizatori WordPress după potrivire parțială?
Trebuie să creez o pagină de căutare care va afișa orice conținut legat de termenul căutat.
de exemplu comentarii
care îl conțin, evenimente
, articole
, CPT
-uri și utilizatori
cu acel nume.
Cum pot căuta utilizatorii din site al căror prenume sau nume de familie conține fraza căutată?

Căutarea în tabelul principal
Pur și simplu folosește WP_User_Query
cu un argument de căutare.
Deci, dacă dorești să cauți, de exemplu, un utilizator cu un cuvânt cheie în user_email
sau alte coloane similare din tabelul {$wpdb->prefix}users
, poți face următoarele:
$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();
Ține minte că *
este un wildcard. Deci, restricționând, de exemplu, user_email
la un singur domeniu, ai folosi următorul șir de căutare: *@example.com
.
Șirul search
are câteva funcționalități "magice": search_columns
are valorile implicite...
user_email
dacă@
este prezent în argumentulsearch
.user_login
șiID
dacă argumentulsearch
este numericuser_url
dacă șirulsearch
conținehttp://
sauhttps://
- sau ...
user_login
șiuser_nicename
dacă este prezent un șir de caractere.
Toate aceste valori implicite sunt setate doar dacă nu a fost specificat niciun argument search_columns
.
Căutarea în tabelul de meta
Dacă dorești să cauți după, de exemplu, first_name
sau last_name
, atunci va trebui să folosești o interogare meta_query
, deoarece acestea nu fac parte din tabelul principal:
$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();
Asigură-te că obții șirul de căutare corect. În mod normal, acesta ar fi get_query_var('s');
, dar - în funcție de name/id
din formular - ar putea fi și altceva, pe care îl poți obține folosind, de exemplu, $_GET['user_search']
. Asigură-te că îl escape-ui și elimini spațiile nedorite de la începutul și sfârșitul șirului.
Ține minte că acesta este un array( array() )
, deoarece există cheia relation
. Dacă dorești să cauți doar după o singură cheie, poate fi mai simplu să folosești următorul cod:
$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();
Interogarea finală
Rezultatul ar putea arăta similar cu următorul:
$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 Cea mai bună variantă ar fi să o adaugi fie în functions.php
, fie în template-ul tău sau (ceea ce ar fi optim) să o încapsulezi într-un mini-plugin personalizat pentru a nu pierde funcționalitatea la schimbarea temei.

Kiaser mulțumesc pentru răspuns. Te rog ajută-mă să integrez acest cod în functions.php

@Naveen Asta depășește domeniul de aplicare aici. Va trebui să înveți puțin despre cod sau să găsești un dezvoltator care să facă asta pentru tine. Și citește acel Q/A.

display_name
este o coloană în wp_users
. Două întrebări îmi vin în minte. 1: Este aceasta o modificare recentă a schemei bazei de date? 2: Poate fi folosită ca valoare în search_columns
în locul interogării meta?

@kaiser în loc de user_email
funcționează email
, așa cum este în fișierul core /var/www/html/rated_lettings/wp-includes/class-wp-user-query.php #163 $search_columns Matrice de nume de coloane care trebuie căutate. Acceptă 'ID', 'login','nicename', 'email', 'url'. Implicit matrice goală.
<br/> omiteam ceva

@inrsaurabh au trecut 5 ani de la acel răspuns. Nu știu dacă și ce s-a schimbat acolo. :)

@kaiser cred că am dreptate, ar trebui să folosim email
https://github.com/WordPress/WordPress/blob/master/wp-includes/class-wp-user-query.php#L162

@inrsaurabh Aruncă o privire aici.

Aceasta m-a ajutat în loc de răspunsul lui Kaiser: https://laubsterboy.com/blog/2015/07/search-wordpress-users-by-name/
Dar în această soluție funcția $wpdb->escape($usermeta_keys)
a generat o eroare, așa că am folosit pur și simplu $usermeta_keys
.

Soluție personalizată
Știu că răspunsul meu este tardiv, dar căutam același lucru și l-am construit cu ajutorul răspunsului lui @kaiser. Voi afișa doar titlul, linkul și fragmentul/emailul utilizatorului, dar poți extinde acest lucru în modul dorit, desigur.
Matrice personalizată
Am început prin a crea o matrice goală:
$search_results = array();
Căutare utilizatori
Apoi am continuat cu 'WP_User_Query' care folosește intrarea utilizatorului ($search_results) pentru filtrare.
$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',
),
) );
Umplem matricea cu datele utilizatorilor
Acum vom completa această interogare în matricea noastră goală ($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;
Umplem matricea cu datele postărilor/paginilor
De asemenea, dorim ca formularul de căutare "normal" care caută pagini și postări să continue să funcționeze, așa că trebuie să parcurgem și acest lucru. În timp ce facem asta, vom umple și matricea noastră ($search_results) cu aceste date:
$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;
Parcurgem matricea
Acum avem o matrice care conține informații despre utilizatori și detalii despre postări/pagini. Ultimul lucru pe care trebuie să-l facem acum este să o parcurgem, astfel încât utilizatorul să vadă rezultatele căutate:
<?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 'Nu s-au găsit rezultate.'; ?></h3>
</div>
<?php endif; ?>
Gata!

Recent, când lucram la un proiect la scară mare, clienții mei întâmpinau probleme în căutarea utilizatorilor după prenume, nume, numele afacerii/companiei.
Așa că m-am gândit să creez un plugin și să combin abilitățile mele de front-end cu PHP. Am decis să folosesc VueJs și Axios pentru a-mi îndeplini misiunea.
https://wordpress.org/plugins/robust-user-search/
Acest plugin permite utilizatorilor să caute după: Nume de utilizator, Prenume, Nume, Email sau Numele Afacerii.

Bine ați venit pe WPSE. Vă rugăm să rețineți că ar trebui să vă declarați afilierea atunci când promovați anumite lucruri, https://wordpress.stackexchange.com/help/promotion

$search_string = esc_attr( trim( get_query_var('s') ) ); // Obține și curăță șirul de căutare din variabila de interogare
$users = new WP_User_Query( array(
'search' => "*{$search_string}*", // Caută șirul în diferite coloane
'search_columns' => array(
'user_login', // Numele de utilizator
'user_nicename', // Numele frumos al utilizatorului
'user_email', // Adresa de email
'user_url', // URL-ul utilizatorului
),
'meta_query' => array(
'relation' => 'OR', // Relația între condițiile meta_query
array(
'key' => 'first_name', // Cheia meta pentru prenume
'value' => $search_string, // Valoarea de căutare
'compare' => 'LIKE' // Operatorul de comparație
),
array(
'key' => 'last_name', // Cheia meta pentru nume de familie
'value' => $search_string, // Valoarea de căutare
'compare' => 'LIKE' // Operatorul de comparație
)
)
) );
$users_found = $users->get_results(); // Obține rezultatele căutării
