为何调用包裹短代码时,内部wp_video_shortcode会直接输出?
为什么自定义短代码里的wp_video_shortcode会直接输出?
这问题我太熟了——罪魁祸首就是wp_video_shortcode本身是直接echo输出内容,而自定义短代码要求返回字符串,两者的执行逻辑不匹配导致的。
WordPress里的很多内置短代码函数(包括wp_video_shortcode)都是设计成直接把HTML输出到页面的,而你的自定义短代码是要把所有内容攒到$html变量里最后一起返回。当你在自定义函数里直接调用wp_video_shortcode时,它会跳过你的$html拼接逻辑,直接把视频HTML输出到页面,自然就出现了内容提前/直接输出的问题。
解决办法:用输出缓冲捕获输出
最简单的处理方式是用PHP的输出缓冲函数,把wp_video_shortcode的输出“抓”下来,转成字符串再拼到你的$html里。修改你的代码片段如下:
public function get_video_grid($the_query) { $html = ''; if ( $the_query->have_posts() ) { $count = 0; while ( $the_query->have_posts()) : $the_query->the_post(); $attachment = get_attached_media( 'video' ); $post_ID = get_the_ID(); global $wpdb; $video_url = wp_get_attachment_url($post_ID); $video_attr = array( 'src' => $video_url ); // 关键:用输出缓冲捕获wp_video_shortcode的输出 ob_start(); // 开启输出缓冲 wp_video_shortcode($video_attr); // 这里的echo会被缓冲捕获 $video_html = ob_get_clean(); // 取出缓冲内容并关闭缓冲 // 把视频HTML拼到你的总HTML里 $html .= $video_html; // 你的其他逻辑... endwhile; wp_reset_postdata(); // 别忘了重置查询,避免后续全局变量混乱 } return $html; // 最后返回完整HTML }
额外提醒
- 一定要记得调用
wp_reset_postdata(),避免你的自定义查询污染全局的$post变量,导致后续模板逻辑出错。 - 检查
$video_url是否正确获取到了视频地址,如果地址为空,wp_video_shortcode可能输出错误内容,这时候可以加个判断:if ($video_url) { ... }再处理视频部分。
内容的提问来源于stack exchange,提问作者Jaakko Karhu
相关产品推荐
相关产品推荐

