【问题标题】:Wordpress list results from wp_users and wp_usermeta来自 wp_users 和 wp_usermeta 的 Wordpress 列表结果
【发布时间】:2011-12-28 05:37:58
【问题描述】:

我正在编写一个插件,它使用...从 wordpress 数据库中获取一组数据。

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

这很好,我可以显示用户表中的所有信息,我遇到的问题是我还需要提取 wp_usermeta 表中的名字和姓氏。

有没有办法修改语句以从另一个表中提取这些详细信息?

【问题讨论】:

  • 这可能是可能的,但查询会非常复杂,因为您实际上是在尝试为每个用户提取两个单独的元键并将它们组合在一起。此外,通常不设置名字和姓氏字段...默认情况下,WordPress 使用 wp_users 表中的 display_name 字段(用户配置文件需要设置,而名字和姓氏则没有)。这不适合您的插件吗?

标签: mysql wordpress join


【解决方案1】:

不是在一个查询中,也不一定是最巧妙的,但以下将产生您想要的:

$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++;
}

【讨论】:

  • 这很完美,正是我想要实现的。 JOIN 函数真的让我感到困惑,但现在我已经看到它为我的示例布局,这一切都很有意义!有没有办法将返回的结果限制为仅限订阅者,还是需要单独完成?
  • @fightstarr20 这也不是微不足道的,尤其是在一个查询中,因为能力信息再次存储在 wp_usermeta 表的 meta_value 列中.如果我今晚有时间,我会相应地更新答案。
  • 嗨,Johannes,感谢您查看此内容。我已设法在数组结果中包含 wp_user_level 字段,因此我现在可以区分用户级别。我想我只需要知道如何只包含数组中 wp_user_level=>0 的结果
  • 我还没有做到这一点,你有没有机会看看添加用户级别?
猜你喜欢
  • 2017-04-30
  • 1970-01-01
  • 2017-06-20
  • 2018-08-23
  • 1970-01-01
  • 2017-12-22
  • 1970-01-01
  • 2021-10-04
  • 2022-01-14
相关资源
最近更新 更多