WordPress 6.3.x FSE下Query Loop的No Results块显示异常求助
问题描述
我使用启用了全站点编辑(Full Site Editing,FSE)的WordPress 6.3.x版本,Query Loop块中包含No Results块,但存在一个问题:当查询仅返回1篇文章时,该文章和No Results块会同时显示。
我在Gutenberg仓库找到了对应的问题及修复方案,但由于该块没有可用钩子,不知道如何将修复应用到代码中。请问有没有不修改核心文件的正确修复方法?是否有遗漏的可用钩子?或者该如何应用补丁?注:我未安装Gutenberg插件,使用的是WordPress 6版本起集成的原生FSE功能。
解决方案
方法1:通过render_block钩子修正渲染逻辑
可以利用WordPress的render_block钩子拦截Query Loop块的输出,手动控制No Results块的显示:
add_filter( 'render_block', function( $block_content, $block ) { // 仅处理核心Query Loop块 if ( 'core/query' !== $block['blockName'] ) { return $block_content; } // 获取当前查询的文章数量 $query_args = isset( $block['context']['query'] ) ? $block['context']['query'] : []; $posts = get_posts( $query_args ); $post_count = count( $posts ); // 若查询有结果,移除No Results块的HTML if ( $post_count > 0 ) { // 正则匹配No Results块的结构(可根据实际输出调整) $block_content = preg_replace( '/<div class="wp-block-no-results[^>]*>.*?<\/div>/s', '', $block_content ); } return $block_content; }, 10, 2 );
将这段代码添加到主题的functions.php文件,或使用自定义代码插件(如Code Snippets)即可生效。注意:如果你的No Results块HTML结构与示例不同,需要调整正则表达式以匹配实际输出。
方法2:修改主题的块模板文件
如果熟悉FSE模板编辑,可以直接在主题的自定义模板中添加判断逻辑:
- 找到主题
templates或parts目录下包含Query Loop的模板文件(如archive.html、自定义查询模板)。 - 在No Results块的位置添加条件判断,仅当查询无结果时才渲染该块:
<!-- wp:query --> <div class="wp-block-query"> <!-- wp:query-loop --> <div class="wp-block-query-loop"> <!-- wp:post-template --> <!-- 你的文章模板内容 --> <!-- /wp:post-template --> <!-- wp:no-results --> <?php if ( $GLOBALS['wp_query']->post_count === 0 ) : ?> <div class="wp-block-no-results"> <!-- No Results块的内容 --> <p>没有找到相关内容</p> </div> <?php endif; ?> <!-- /wp:no-results --> </div> <!-- /wp:query-loop --> </div> <!-- /wp:query -->
修改后保存模板文件,确保符合FSE的语法规范即可。
方法3:等待官方版本更新
该问题已在Gutenberg的修复PR中解决,后续WordPress正式版本(如6.4及以上)会集成此修复。若能接受等待,保持WordPress版本更新即可自动解决问题。
内容的提问来源于stack exchange,提问作者Kyrylo Romantsov
相关产品推荐
相关产品推荐

