WordPress中短代码返回空时如何使用PHP条件判断语句
解决方案
你之前用的have_posts()是针对WordPress主查询的,而[display-posts]短码内部会创建独立的查询实例,两者状态不关联,所以判断无效。要实现仅当短码查询到文章时才加载区块,有两种可靠方法:
方法1:手动执行匹配短码的查询(推荐)
先复制短码的查询参数执行查询,判断是否有结果后再输出区块和短码:
<?php // 完全匹配短码的查询参数,若短码有其他参数(如post_type、category)需一并添加 $display_post_args = array( 'posts_per_page' => 10, 'post_status' => 'publish' // 确保只查已发布文章,和短码默认行为一致 ); $display_post_query = new WP_Query($display_post_args); if ($display_post_query->have_posts()) : ?> <section id="client-posts"> <div class="wrapper"> <?php echo do_shortcode('[display-posts posts_per_page="10"]'); ?> </div> </section> <?php // 重置查询,避免干扰后续主循环 wp_reset_postdata(); endif; ?>
方法2:捕获短码输出并判断内容
如果不想手动写查询,可以先获取短码的输出,判断是否包含实际文章内容(避免短码输出空容器导致误判):
<?php $shortcode_content = do_shortcode('[display-posts posts_per_page="10"]'); // 检查输出是否非空,且包含文章相关标签(比如<article>,需根据短码实际输出调整) if (!empty(trim($shortcode_content)) && strpos($shortcode_content, '<article') !== false) : ?> <section id="client-posts"> <div class="wrapper"> <?php echo $shortcode_content; ?> </div> </section> <?php endif; ?>
原代码无效的原因
have_posts()仅反映当前页面主查询的状态(比如当前文章页的主查询是单篇文章),和[display-posts]短码内部的独立查询完全无关。哪怕短码要查询的文章为空,主查询仍可能有结果,导致区块被错误加载。
内容的提问来源于stack exchange,提问作者Alex Harris
相关产品推荐
相关产品推荐

