ACF复选框循环未显示全部文章及输出位置异常技术求助
排查WordPress短代码的两个问题:仅显示一篇文章&内容错位
让我们逐个拆解你遇到的两个问题:
问题1:最初代码仅显示一篇文章的原因
你的初始代码里犯了一个典型的字符串赋值错误:在循环内部,你用$output = '<p>' . get_the_title() . '</p>';直接赋值而不是追加内容。这意味着每循环一篇文章,$output就会被新的标题覆盖,循环结束后自然只保留最后一篇文章的内容。另外代码里还多了个无意义的echo '</ul>'(前面没有对应的<ul>标签),这也是需要清理的冗余代码。
问题2:修改后内容显示在页面容器顶部的原因
你修改后的代码里,这一行是罪魁祸首:
echo '<p>' . the_field('product_price_exc_vat') . '</p>';
ACF的the_field()函数是直接输出内容的,它不会返回字符串供你拼接。当短代码执行到这一行时,价格内容会立刻被输出到页面,而不是追加到$output变量里。因为短代码的返回值会在页面渲染的合适位置插入,提前echo的内容就会跑到页面最前面。
修复后的完整代码
下面是修正了两个问题的最终版本,我还做了一些代码规范优化:
function featured_products() { $args = array( 'posts_per_page' => -1, // 显示所有符合条件的产品,你也可以改成10 'post_type' => 'products', 'meta_query' => array( array( 'key' => 'home_featured', 'value' => '1', 'compare' => 'LIKE' ), ), ); // 初始化输出变量,避免未定义的警告 $output = '<div class="products">'; $the_query = new WP_Query( $args ); if ( $the_query->have_posts() ) { while ( $the_query->have_posts() ) { $the_query->the_post(); // 用.=追加内容,而不是=覆盖 $output .= '<div class="col-eq-height col-md-6" style="margin-bottom:30px;">'; $output .= '<div class="product">'; $output .= '<div id="thumbnail"><a href="' . get_the_permalink() . '">' . get_the_post_thumbnail() . '</a></div>'; $output .= '<div id="content">'; $output .= '<p id="title"><a href="' . get_the_permalink() . '">' . get_the_title() . '</a></p>'; // 使用get_field()替代the_field(),它会返回值而不是直接输出 $output .= '<p>' . get_field('product_price_exc_vat') . '</p>'; $output .= '</div>'; $output .= '</div>'; $output .= '</div>'; } wp_reset_postdata(); } else { $output .= "<p>There aren't any products to display.</p>"; } $output .= '</div>'; return $output; } add_shortcode('featured_products', 'featured_products');
关键修改点说明:
- 把循环内的
$output =改成$output .=,确保每篇文章的内容都追加到输出变量里 - 替换
the_field()为get_field(),这样价格内容会被拼接进$output,而不是提前输出 - 初始化
$output变量,避免PHP未定义变量警告 - 移除了初始代码里无意义的
echo '</ul>'
内容的提问来源于stack exchange,提问作者Jake Punton
相关产品推荐
相关产品推荐

