Wordpress список результатов от wp_users и wp_usermeta - PullRequest
0 голосов
/ 14 ноября 2011

Я пишу плагин, который получает массив данных из базы данных Wordpress, используя ...

$data = $wpdb->get_results("SELECT * FROM $wpdb->users", ARRAY_A);      

Это отлично работает, и я могу отображать всю информацию из таблицы пользователей, проблема в том, что мне нужно также извлечь Имя и Фамилию из таблицы wp_usermeta.

Есть ли способ изменить оператор, чтобы также извлекать эти детали из другой таблицы?

1 Ответ

2 голосов
/ 14 ноября 2011

Не в одном запросе и не обязательно в самом гладком виде, но следующее произведет то, что вы хотите:

$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++;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...