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

为何调用包裹短代码时,内部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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:21:12