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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 23:48:21