Не в одном запросе и не обязательно в самом гладком виде, но следующее произведет то, что вы хотите:
$data = $wpdb->get_results("SELECT * FROM $wpdb->users", ARRAY_A);
$i = 0;
foreach($data as $single) {
$meta = $wpdb->get_results(
"SELECT meta_value
FROM $wpdb->usermeta
WHERE user_id = $single[ID]
AND (meta_key = 'first_name' OR meta_key = 'last_name')
ORDER BY meta_key",
ARRAY_A
);
$data[$i]['first_name'] = $meta[0]['meta_value'];
$data[$i]['last_name'] = $meta[1]['meta_value'];
$i++;
}
РЕДАКТИРОВАТЬ: Вот это в одном запросе:
$data = $wpdb->get_results(
"SELECT $wpdb->users.*,
GROUP_CONCAT(
$wpdb->usermeta.meta_value
ORDER BY $wpdb->usermeta.meta_key
SEPARATOR ' '
) AS name
FROM $wpdb->users
LEFT JOIN $wpdb->usermeta
ON $wpdb->users.ID = $wpdb->usermeta.user_id
WHERE ($wpdb->usermeta.meta_key = 'first_name'
OR $wpdb->usermeta.meta_key = 'last_name')
GROUP BY $wpdb->users.ID",
ARRAY_A
);
Обратите внимание, что в отличие от первой версии, последняя не выдает $data[x]['first_name']
и $data[x]['last_name']
, но вместо нее $data[x]['name']
. Это связано с тем, что они либо хранятся в столбце meta_value. Невозможно выполнить вашу задачу в одном запросе и сохранить имя и фамилию в двух разных ключах массива одновременно.
Следовательно, если вы делаете это вторым способом, вам придется использовать функцию php explode()
позже для доступа к имени. Или исправьте его в цикле после выполнения запроса:
$i = 0;
foreach($data as $single) {
$name_parts = explode(' ', $single['name']);
$data[$i]['first_name'] = $name_parts[0];
$data[$i]['last_name'] = $name_parts[1];
$i++;
}