You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何聚合WordPress多表请愿人数据,实现单条记录展示

解决方案:合并请愿人数据并生成HTML表格

看起来你需要把分散在多行的用户元数据合并成单条记录,然后展示成HTML表格对吧?这里有两种可行的方案,你可以根据自己的情况选择:

方案一:修改SQL查询,直接在数据库层面聚合数据

你可以用CASE语句结合GROUP BY来把同一个用户的国家和职位数据合并到一行,这样查询结果直接就是你需要的结构:

SELECT 
    u.display_name,
    MAX(CASE WHEN um.meta_key = 'petition_user_country' THEN um.meta_value END) AS country,
    MAX(CASE WHEN um.meta_key = 'petition_user_state' THEN um.meta_value END) AS position
FROM wp_users u
JOIN wp_usermeta um ON u.ID = um.user_id
WHERE um.meta_key IN ('petition_user_country', 'petition_user_state') 
  AND um.meta_value != ''
GROUP BY u.ID, u.display_name
ORDER BY u.ID DESC;

原理说明:

  • CASE语句会根据meta_key的值,把对应的meta_value分配到country或position列
  • MAX()函数确保每个用户只取到对应的元数据值(因为每个用户每个元键最多只有一条有效记录)
  • GROUP BY u.ID是关键,因为不同用户可能有相同的display_name,用用户ID分组能避免混淆

用这个查询,你得到的结果会是这样的结构(对应你的测试数据):

display_namecountryposition
Test3 Test34AFTester
Test TestnomsenNOStudent
BrushanNO
KristianStudent
Andreas NoeNO
Georg SimoneNO

方案二:在PHP中处理查询结果,生成表格

如果不想修改SQL,你可以先获取原始的多行数据,然后用PHP数组聚合后再生成HTML表格。下面是基于WordPress$wpdb的示例代码:

global $wpdb;

// 执行原始查询
$query = "SELECT display_name, meta_value, meta_key FROM wp_users JOIN wp_usermeta ON wp_users.ID = wp_usermeta.user_id WHERE meta_key IN ('petition_user_country', 'petition_user_state') AND meta_value !='' ORDER BY ID DESC;";
$rawResults = $wpdb->get_results($query, ARRAY_A);

// 聚合数据:将同一用户的信息合并到一个数组中
$petitioners = [];
foreach ($rawResults as $row) {
    // 通过姓名获取用户ID,避免重名用户冲突
    $userId = $wpdb->get_var($wpdb->prepare("SELECT ID FROM wp_users WHERE display_name = %s", $row['display_name']));
    
    if (!isset($petitioners[$userId])) {
        $petitioners[$userId] = [
            'name' => $row['display_name'],
            'country' => '',
            'position' => ''
        ];
    }

    // 分配对应的数据
    if ($row['meta_key'] === 'petition_user_country') {
        $petitioners[$userId]['country'] = $row['meta_value'];
    } elseif ($row['meta_key'] === 'petition_user_state') {
        $petitioners[$userId]['position'] = $row['meta_value'];
    }
}

// 生成HTML表格
echo '<table style="border-collapse: collapse; width: 100%;">';
// 表头
echo '<thead>';
echo '<tr>';
echo '<th style="border: 1px solid #ddd; padding: 8px;">姓名</th>';
echo '<th style="border: 1px solid #ddd; padding: 8px;">国家</th>';
echo '<th style="border: 1px solid #ddd; padding: 8px;">职位</th>';
echo '</tr>';
echo '</thead>';
// 表体
echo '<tbody>';
foreach ($petitioners as $p) {
    echo '<tr>';
    echo '<td style="border: 1px solid #ddd; padding: 8px;">' . esc_html($p['name']) . '</td>';
    echo '<td style="border: 1px solid #ddd; padding: 8px;">' . esc_html($p['country']) . '</td>';
    echo '<td style="border: 1px solid #ddd; padding: 8px;">' . esc_html($p['position']) . '</td>';
    echo '</tr>';
}
echo '</tbody>';
echo '</table>';

注意点:

  • 用esc_html()处理输出内容,防止XSS攻击,这在WordPress开发中是必须遵循的最佳实践
  • 用用户ID作为聚合数组的键,避免了重名用户的信息被覆盖的问题
  • 表格加了基础的CSS样式,你可以根据主题的现有样式调整或移除

内容的提问来源于stack exchange,提问作者Kristian Munter

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:52:32