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

使用CPT与ACF编写循环时出现Headers already sent错误如何解决

问题原因
  • 短代码直接输出内容而非返回字符串:WordPress 要求所有短代码的处理函数必须把要展示的内容作为字符串返回,不能直接调用echo输出。你在保存CPT文章时,后台会提前发送HTTP响应头,此时如果短代码被触发执行echo输出,就会在头信息之后输出内容,直接触发Headers already sent错误。
  • 循环逻辑缺失:你调用get_posts拿到自定义文章数组后,没有遍历循环逻辑,直接调用the_title()、the_field()这两个依赖全局$post对象的函数,既无法正确输出你查询到的event文章内容,也会在全局$post未初始化的场景下产生额外输出或者报错。
  • 条件判断语法错误:你的if( $posts )判断没有加大括号包裹执行块,仅能控制第一个echo语句的执行,后续的the_title()、the_field()等代码无论是否查询到文章都会执行,进一步提升了异常输出的概率。
修复后的代码
add_shortcode("custom_acf", "event_loop_shortcode");
function event_loop_shortcode() {
    // 初始化返回字符串
    $output = '';
    $posts = get_posts(array(
        'posts_per_page' => -1,
        'post_type'      => 'event'
    ));
    if( $posts ) {
        // 遍历查询到的文章
        foreach( $posts as $post ) {
            // 初始化当前文章的全局$post对象,让the_title、the_field正常工作
            setup_postdata( $post );
            // 拼接内容到输出字符串
            $output .= '<div class="event"><div class="event_title"><h3>';
            $output .= get_the_title();
            $output .= '</h3></div><div class="event_date">';
            // 用get_field返回字符串而不是the_field直接输出
            $output .= get_field("dato");
            $output .= '</div></div>';
        }
        // 重置全局post数据,避免影响主查询
        wp_reset_postdata();
    }
    // 返回最终内容给WordPress处理输出时机
    return $output;
}
修复说明
  • 所有输出内容都拼接为字符串最后返回,完全避免短代码提前输出的问题
  • 增加foreach循环遍历查询到的所有event文章,配合setup_postdata初始化文章上下文,保证字段读取正确
  • 把直接输出的the_title()换成返回字符串的get_the_title(),the_field()换成返回字符串的get_field(),所有内容都写入$output变量最后返回
  • 增加wp_reset_postdata()重置主查询,避免污染全局文章对象
  • 给if判断加上大括号包裹执行块,逻辑更严谨

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 17:45:08