API de pulsação oEmbed

4

Por padrão, a execução de conteúdo por meio do filtro the_content verifica automaticamente o conteúdo do oEmbed. No entanto, ao retornar dados através de heartbeat_received , o filtro para oEmbed não parece funcionar.

Por exemplo -

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 );

Fazer exatamente o mesmo sem usar o Heartbeat parece funcionar. O filtro de conteúdo está sendo aplicado como a formatação existe, apenas sem oEmbed.

Alguma sugestão?

Obrigado!

    
por Elliott 23.04.2014 / 00:20

2 respostas

5

O problema:

A razão pela qual isso não está funcionando é parte do método WP_Embed::shortcode() :

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

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

    ... cut ...
 }

Ao tentar se agrupar automaticamente à API Heartbeat, o $post_ID é null , portanto wp_oembed_get() nunca é ativado.

Sem cache:

Quando você autoembena o link do Twitter no editor de postagem, para um determinado $post_ID , o HTML da oembed é armazenado em cache na meta-tabela de postagem em uma chave como esta: _oembed_7bc759c5dcea2e4b77c939fc109996fb e um valor como este:

<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>

Cada link obtido obtém sua própria linha na pós-meta-tabela, bem, se não fizer parte dos manipuladores padrão do oembed.

Esse mecanismo de armazenamento em cache é ignorado quando o $post_ID está ausente, portanto, convém considerar algum armazenamento em cache para sua configuração.

Possíveis soluções alternativas:

i) Você precisa pegar todas as correspondências de '|^\s*(https?://[^\s"]+)\s*$|im' , dentro de sua string, e executá-las através da função wp_oembed_get() e substituir os links da string original.

ii) Poderíamos associá-lo a uma determinada postagem, dentro do retorno de chamada test_heartbeat_received :

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

$content = $wp_embed->autoembed( $content );
$response['test_heartbeat'] = $content;

para contornar a parte $post_ID ausente e usar o cache padrão para essa postagem. Você só precisa lembrar que o cache oembed é limpo quando você atualiza esse post.

Se você tentar, por exemplo, dois links do Twitter, com o método acima:

$content = "
    <div>
        https://twitter.com/WordPress/status/456502643738030080
    </div>
    <div> 
        https://twitter.com/WordPress/status/459387231870799872 
    </div>
    ";

depois do processo de gravação automática, você obtém duas linhas na meta-tabela, atribuídas a post_id: 3147 :

    
por birgire 27.04.2014 / 18:38
0
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 );
  

você também pode tentar depois de adicionar isso (para conteúdo misto):

enlace

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');
    
por ravi patel 25.04.2014 / 08:47