API Heartbeat oEmbed

4

Par défaut, le contenu exécuté via the_content filter recherche automatiquement le contenu oEmbed. Cependant, lors du renvoi de données via heartbeat_received , le filtre pour oEmbed ne semble pas fonctionner.

Par exemple -

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

Faire exactement la même chose sans utiliser Heartbeat semble fonctionner. Le filtre de contenu est appliqué car le formatage existe, sans oEmbed.

Des suggestions?

Merci!

    
posée Elliott 23.04.2014 - 00:20

2 réponses

5

Le problème:

La raison pour laquelle cela ne fonctionne pas, est-ce une partie de la méthode WP_Embed::shortcode() :

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

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

    ... cut ...
 }

Lors de la tentative d'intégration automatique avec l'API Heartbeat, $post_ID correspond à null . Par conséquent, wp_oembed_get() n'est jamais activé.

Pas de mise en cache:

Lorsque vous insérez automatiquement le lien Twitter dans l'éditeur de publication, pour un $post_ID donné, le code HTML incorporé est mis en cache dans la table meta sous une clé telle que celle-ci: _oembed_7bc759c5dcea2e4b77c939fc109996fb et une valeur telle que:

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

Chaque lien oembed obtient sa propre ligne dans la table meta, bien s’il ne fait pas partie des gestionnaires oembed par défaut.

Ce mécanisme de mise en cache est ignoré lorsque $post_ID est manquant. Vous pouvez donc envisager une mise en cache pour votre configuration.

Solutions de contournement possibles:

i) Vous devez prendre toutes les correspondances de '|^\s*(https?://[^\s"]+)\s*$|im' , dans votre chaîne, les exécuter à travers la fonction wp_oembed_get() et remplacer les liens de la chaîne d'origine.

ii) Nous pourrions également l'associer à un message donné, dans le test_heartbeat_received callback:

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

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

pour contourner la partie manquante $post_ID et utiliser la mise en cache par défaut pour cette publication. N'oubliez pas que le cache oembed s'efface lorsque vous mettez à jour ce message.

Si vous essayez par exemple deux liens Twitter, avec la méthode ci-dessus:

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

puis après le processus autoembed, vous obtenez deux lignes dans la table meta méta, affectées à post_id: 3147 :

    
réponse donnée 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 );
  

vous pouvez essayer aussi après avoir ajouté ceci (pour un contenu mixte):

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');
    
réponse donnée ravi patel 25.04.2014 - 08:47

Lire d'autres questions sur les étiquettes