Selectare SQL a utilizatorilor după metadate

11 oct. 2011, 17:02:24
Vizualizări: 15.7K
Voturi: 5

Salut! Încerc să selectez doar utilizatorii cu un anumit rol, folosind următoarea declarație SQL...

SELECT DISTINCT ID, u.user_login, u.user_nicename, u.user_email
FROM wp_users u, wp_usermeta m
WHERE m.meta_key = 'wp_capabilities'
AND m.meta_value LIKE '%supplier%'
ORDER BY u.user_registered

Totuși, întoarce întregul tabel. Ce fac greșit?

PS: Trebuie să fie o interogare SQL deoarece fac asta în phpMyAdmin pentru a exporta datele în CSV.

Mulțumesc anticipat!

sql
2
Comentarii

Poate ai mai mult noroc pe site-ul Database Administrators de la Stack Exchange.

Chris_O Chris_O
11 oct. 2011 18:41:33

@Chris_O Nu sunt de acord. Deși este relevant pentru operațiuni generice de baze de date, acoperă și aspecte ale API-ului WordPress, așa cum arată răspunsul lui kaiser mai jos. Cred că ar trebui să rămână.

EAMann EAMann
12 oct. 2011 01:05:35
Toate răspunsurile la întrebare 2
3

Verifică din nou sintaxa SQL. Se pare că vrei să faci un JOIN ... Dar nu construiești corect interogarea.

Ar trebui să arate mai degrabă așa:

SELECT u.ID, u.user_login, u.user_nicename, u.user_email
FROM $wpdb->users u
INNER JOIN $wpdb->usermeta m ON m.user_id = u.ID
WHERE m.meta_key = 'wp_capabilities'
AND m.meta_value LIKE '%supplier%'
ORDER BY u.user_registered

Trebuie să specifici interogării cum relaționezi metadatele utilizatorului cu utilizatorul.

De asemenea, observă că folosesc $wpdb-> în loc de wp_. Acest lucru este important dacă intenționezi să folosești această interogare într-un plugin pe un site cu un prefix de bază de date diferit de "wp". Totuși, dacă rulezi direct în SQL, ar trebui să revii la prefixul obișnuit.

11 oct. 2011 18:43:24
Comentarii

Când am schimbat == cu = și am corectat ortografia cuvântului 'capabilities', a funcționat perfect. Mulțumesc EAMann! Deoarece folosesc acest cod în phpmyadmin, nu am nevoie de $wpdb-> pentru a specifica prefixul tabelei. Dar pentru cei care implementează acest cod în php, este cu siguranță soluția recomandată!

Gyro Gyro
11 oct. 2011 23:52:58

Scuze, am scris asta în grabă în timp ce depanam o serie de operații de egalitate în .Net ... == funcționează mai bine în acel mediu, așa că am introdus-o din greșeală. Totul a fost corectat mai sus.

EAMann EAMann
12 oct. 2011 01:04:23

Această soluție mi-a fost foarte utilă pentru a găsi utilizatorii care sunt clienți WooCommerce, deoarece această informație este stocată în câmpul wp_capabilities. Mulțumesc!

Denoteone Denoteone
19 aug. 2014 10:37:25
0
-1

Există o clasă (de interogare) integrată în nucleu:

new WP_User_Query;

// Exemplu
$all_subscribers = new WP_User_Query( array( 'role' => 'subscriber' ) );

Acest lucru permite apoi iterarea prin obiectele de utilizator:

// Exemplu
foreach ( $all_subscribers as $subscriber )
{
    echo $subscriber->display_name;

    // Verifică obiectul:
    var_dump( $subscriber );
}

Pentru mai multe exemple sau pentru interogarea utilizatorilor după alte câmpuri, consultă codex-ul.

11 oct. 2011 19:22:29