Consulta first_name e last_name de wp_usermeta ao mesmo tempo

3

Eu estou tentando buscar o first_name e last_name de todos os usuários ao mesmo tempo, usando o objeto wpdb e a tabela wp_usermeta. Eu não consigo descobrir como obter os dois na mesma consulta. Abaixo está o que eu tenho até agora.

global $wpdb;
    $ansatte = $wpdb->get_results("SELECT user_id, meta_value AS first_name FROM wp_usermeta WHERE meta_key='first_name'");

    foreach ($ansatte as $ansatte) {
        echo $ansatte->first_name;
    }

Usando o código acima, sou capaz de ecoar os primeiros nomes de todos os usuários, mas gostaria que o last_name estivesse disponível, assim;

foreach ($ansatte as $ansatte) {
        echo $ansatte->first_name . ' ' $ansatte->last_name;
    }

Alguma idéia?

    
por danjah 02.06.2015 / 20:28

2 respostas

5

Não consigo encontrar uma maneira nativa e limpa de extrair esses dados. Existem algumas maneiras em que posso pensar para fazer isso: Primeiro, algo como:

$sql = "
  SELECT user_id,meta_key,meta_value
  FROM {$wpdb->usermeta} 
  WHERE ({$wpdb->usermeta}.meta_key = 'first_name' OR {$wpdb->usermeta}.meta_key = 'last_name')";
$ansatte = $wpdb->get_results($sql);
var_dump($sql);
$users = array();
foreach ($ansatte as $a) {
  $users[$a->user_id][$a->meta_key] = $a->meta_value;
}
var_dump($users);

Você pode então fazer:

foreach ($users as $u) {
    echo $u['first_name'].' '.$u['last_name'];
}

... para echo dos seus nomes de usuário.

A segunda maneira, uma maneira SQL mais pura, é o que você estava tentando:

$sql = "
  SELECT {$wpdb->usermeta}.user_id,{$wpdb->usermeta}.meta_value as first_name,m2.meta_value as last_name
  FROM {$wpdb->usermeta} 
  INNER JOIN {$wpdb->usermeta} as m2 ON {$wpdb->usermeta}.user_id = m2.user_id
  WHERE ({$wpdb->usermeta}.meta_key = 'first_name' 
  AND m2.meta_key = 'last_name')";
$ansatte = $wpdb->get_results($sql);

foreach ($ansatte as $ansatte) {
  echo $ansatte->first_name . ' ' . $ansatte->last_name;
}

Você também pode usar get_users() ou WP_User_Query para atrair usuários, mas o meta_data que você deseja não está nos dados retornados e precisaria de mais trabalho para recuperá-lo.

    
por s_ha_dum 02.06.2015 / 20:39
3

Esta é uma resposta direta do MySQL para o phpMyAdmin assumindo que o prefixo da tabela Wordpress seja "wp _";

SELECT
  t1.id, t1.user_email,
  MAX(CASE WHEN t2.meta_key = 'first_name' THEN meta_value END) AS first_name,
  MAX(CASE WHEN t2.meta_key = 'last_name' THEN meta_value END) AS last_name 
FROM wp_users AS t1 
INNER JOIN wp_usermeta AS t2 ON t1.id = t2.user_id
GROUP BY t1.id, t1.user_email;
    
por Willy Richardson 07.03.2017 / 19:28

Tags