Heartbeat API oEmbed

时间:2014-04-22 作者:Elliott

默认情况下,通过运行内容the_content 过滤器会自动检查oEmbed内容。但是,当通过返回数据时heartbeat_received oEmbed的过滤器似乎不起作用。

例如-

function test_heartbeat_received( $response, $data ) {
    if( $data[\'test_heartbeat\'] == \'test\' ) {
        $content = "https://twitter.com/WordPress/status/456502643738030080";

        // Doesn\'t work
        global $wp_embed;
        $content = $wp_embed->autoembed( $content );
        $response[\'test_heartbeat\'] = $content;

        // Also doesn\'t work
        $response[\'test_heartbeat\'] = apply_filters( \'the_content\', $content );
    }
    return $response;
}
add_filter( \'heartbeat_received\', \'test_heartbeat_received\', 10, 2 );
add_filter( \'heartbeat_nopriv_received\', \'test_heartbeat_received\', 10, 2 );
在不使用心跳的情况下进行完全相同的操作似乎是可行的。正在应用内容筛选器,因为格式存在,只是没有oEmbed。

有什么建议吗?

谢谢

2 个回复
SO网友:birgire

问题:这不起作用的原因是WP_Embed::shortcode() 方法:

 if( $post_ID ) {
    .... cut ...

    // Use oEmbed to get the HTML
    $html = wp_oembed_get( $url, $attr );

    ... cut ...
 }
尝试使用心跳API自动嵌入时$post_IDnull, 所以wp_oembed_get() 从未激活。

无缓存:

当您在帖子编辑器中自动嵌入推特链接时,对于给定的$post_ID, oembed HTML缓存在post meta表中的一个键下,如下所示:_oembed_7bc759c5dcea2e4b77c939fc109996fb 还有这样一个值:

<blockquote class="twitter-tweet" width="550">
   <p>
      WordPress 3.9 “Smith” is now available with a smoother media editing experience, 
      live widget previews, and more: 
      <a href="http://t.co/mEbgUFdpyG">http://t.co/mEbgUFdpyG</a>
   </p>
   &mdash; WordPress (@WordPress) 
   <a href="https://twitter.com/WordPress/statuses/456502643738030080">April 16, 2014</a>  
</blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
每个oembed链接在post元表中都有自己的行,如果它不是默认oembed处理程序的一部分。

$post_ID 缺少,因此您可能需要考虑对设置进行一些缓存。

可能的解决方法:

i) 你需要把\'|^\\s*(https?://[^\\s"]+)\\s*$|im\', 在字符串中,并通过wp_oembed_get() 函数并替换原始字符串中的链接。

ii) 我们还可以在test_heartbeat_received 回调:

global $wp_embed, $post;
$post = get_post( 3147 ); // Post ID: 3147

$content = $wp_embed->autoembed( $content );
$response[\'test_heartbeat\'] = $content;
找到失踪的人$post_ID part并使用该帖子的默认缓存。您只需记住,当您更新帖子时,oembed缓存将被清除。

例如,如果使用上述方法尝试两个Twitter链接:

$content = "
    <div>
        https://twitter.com/WordPress/status/456502643738030080
    </div>
    <div> 
        https://twitter.com/WordPress/status/459387231870799872 
    </div>
    ";
然后在自动嵌入过程之后,在post元表中获得两行,分配给post_id: 3147:

oembed rows

SO网友:Ravi Patel

function test_heartbeat_received( $response, $data ) {
    if( $data[\'test_heartbeat\'] == \'test\' ) {
        $embed_code = wp_oembed_get(\'https://twitter.com/WordPress/status/456502643738030080\');
        $response[\'test_heartbeat\'] = apply_filters( \'the_content\', $embed_code );
    }
    return $response;
}
add_filter( \'heartbeat_received\', \'test_heartbeat_received\', 10, 2 );
add_filter( \'heartbeat_nopriv_received\', \'test_heartbeat_received\', 10, 2 );
您也可以在添加此内容后尝试(对于混合内容):

http://wpengineer.com/2487/disable-oembed-wordpress/

function div_wrapper($content) {
     // match any iframes
        $pattern = \'~<iframe.*</iframe>|<embed.*</embed>~\';
        preg_match_all($pattern, $content, $matches);

        foreach ($matches[0] as $match) {
            // wrap matched iframe with div
            $wrappedframe = apply_filters( \'the_content\', $match );    
            //replace original iframe with new in content
            $content = str_replace($match, $wrappedframe, $content);
        }

        return $content;    
    }
    add_filter(\'the_content\', \'div_wrapper\');

结束

相关推荐

OEMBED似乎已经停止工作

我已经从3.0升级到3.1,oembed工作正常。在将视频url直接粘贴到编辑器中时,我突然失去了嵌入功能。我的嵌入设置在“媒体”下选择。你知道会发生什么吗?我已经改变了主题,最终改为原生2010,但仍然没有任何功能。我曾尝试在管理中打开和关闭嵌入设置,但没有成功。