Cum să cauți nume de utilizatori WordPress după potrivire parțială?

3 iul. 2013, 13:17:26
Vizualizări: 38.9K
Voturi: 15

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ă?

0
Toate răspunsurile la întrebare 6
9
32

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 argumentul search.
  • user_login și ID dacă argumentul search este numeric
  • user_url dacă șirul search conține http:// sau https://
  • sau ... user_login și user_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();
3 iul. 2013 14:22:05
Comentarii

În ce fișier trebuie să adaug această interogare?

Naveen Naveen
27 ian. 2014 09:04:40

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

kaiser kaiser
27 ian. 2014 12:54:15

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

Naveen Naveen
27 ian. 2014 13:11:41

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

kaiser kaiser
27 ian. 2014 13:17:20

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?

henrywright henrywright
13 aug. 2017 12:08:03

@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 inrsaurabh
25 iun. 2018 15:12:04

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

kaiser kaiser
25 iun. 2018 15:34:10

@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 inrsaurabh
25 iun. 2018 15:40:22

@inrsaurabh Aruncă o privire aici.

kaiser kaiser
25 iun. 2018 16:17:58
Arată celelalte 4 comentarii
0

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.

4 aug. 2017 14:07:04
1

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!

26 aug. 2020 17:27:23
Comentarii

Cred că ar putea fi o idee bună pentru o colecție mică de utilizatori...

Sagive Sagive
6 nov. 2021 23:20:06
2

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.

Căutare robustă a utilizatorilor în WordPress

11 sept. 2020 09:51:27
Comentarii

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

Antti Koskinen Antti Koskinen
11 sept. 2020 16:23:38

@AnttiKoskinen Hei, e mai bine acum?

primegxy primegxy
12 sept. 2020 00:09:02
0

Dacă utilizați funcția mai simplă get_user(), puteți folosi următorul cod:

$users = get_users(array('search' => '*'.esc_attr( $search_string).'*'));
9 mai 2022 16:50:35
0
-1
$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
25 iun. 2021 17:52:17