PHP foreach循环输出WordPress SQL结果仅返回首行问题排查
WordPress短代码循环仅输出首行问题修复
问题复现信息
- 存储情况:WordPress数据库内共存储500条加密货币数据,单条记录包含币种名称、币种符号两个字段
- 异常表现:通过foreach循环搭配自定义shortcode输出全量数据时,页面仅渲染BTC对应的第一行记录
- 异常效果截图:

- 原问题代码:
<?php add_shortcode('call_CMC_table', function() { global $wpdb; $all_coin_data = $wpdb->get_results( "SELECT * FROM {$wpdb->prefix}cmc_listing_data"); foreach ( $all_coin_data as $print_data ) { $db_name = $print_data->name; $db_symbol = $print_data->symbol; $output = '<div class="ht-container"> <figure class="ht-post__content table"> <table> <thead> <tr> <th>Coin Name</th> <th>Coin Symbol</th> </tr> </thead> <tbody> <tr> <td>'. $db_name .'</td> <td>'. $db_symbol .'</td> </tr> </tbody> </table> </figure> </div>'; return $output; } }); ?>
问题根因
- 直接原因:
return语句放置在foreach循环块内部。PHP函数执行到return时会立即终止运行并返回指定值,因此第一次循环跑完生成BTC对应的内容后,函数就直接退出,剩余499条数据不会进入循环处理。 - 逻辑缺陷:循环范围设置错误。当前写法每次循环都会生成一套完整的容器、表格、表头结构,最终会为每一条数据生成一个独立表格,不符合单表格承载所有数据行的需求,实际仅需要循环生成
<tbody>标签内的<tr>数据行即可。
修正后代码
<?php add_shortcode('call_CMC_table', function() { global $wpdb; $all_coin_data = $wpdb->get_results( "SELECT * FROM {$wpdb->prefix}cmc_listing_data"); // 先拼接固定的表格外层、表头结构 $output = '<div class="ht-container"> <figure class="ht-post__content table"> <table> <thead> <tr> <th>Coin Name</th> <th>Coin Symbol</th> </tr> </thead> <tbody>'; // 循环仅拼接数据行,使用.=累加内容而非覆盖 foreach ( $all_coin_data as $print_data ) { // 追加esc_html转义,符合WordPress开发规范,防范XSS、避免特殊字符破坏页面结构 $db_name = esc_html($print_data->name); $db_symbol = esc_html($print_data->symbol); $output .= '<tr> <td>'. $db_name .'</td> <td>'. $db_symbol .'</td> </tr>'; } // 循环完成后拼接表格闭合标签 $output .= '</tbody> </table> </figure> </div>'; // 所有内容拼接完成后统一返回 return $output; }); ?>
代码说明:修正后采用先初始化输出变量、循环内累加内容、循环结束后统一返回的逻辑,既解决了只输出首行的问题,也保证了最终只生成一个表格结构,符合需求。
内容的提问来源于stack exchange,提问作者Morty_Smith
相关产品推荐
相关产品推荐

