如何聚合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_name | country | position |
|---|---|---|
| Test3 Test34 | AF | Tester |
| Test Testnomsen | NO | Student |
| Brushan | NO | |
| Kristian | Student | |
| Andreas Noe | NO | |
| Georg Simone | NO |
方案二:在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
相关产品推荐
相关产品推荐

