web-dev-qa-db-fra.com

API Heartbeat oEmbed

Par défaut, le contenu exécuté par le biais du filtre the_content recherche automatiquement le contenu oEmbed. Toutefois, 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 la mise en forme existe, sans oEmbed.

Aucune suggestion?

Merci!

4
Elliott

Le problème:

La raison pour laquelle cela ne fonctionne pas, est cette 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, le $post_ID est null, donc wp_oembed_get() n'est jamais activé.

Pas de cache:

Lorsque vous intégrez 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 de méta de publication sous une clé telle que: _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 étant ignoré lorsque le $post_ID est manquant, vous pouvez envisager une mise en cache pour votre configuration.

Solutions possibles:

i) Vous devez prendre toutes les correspondances de '|^\s*(https?://[^\s"]+)\s*$|im', dans votre chaîne, et l'exécuter via 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 rappel test_heartbeat_received:

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

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

pour contourner la partie $post_ID manquante 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, affectées à post_id: 3147:

oembed rows

5
birgire
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 aussi essayer après avoir ajouté ceci (pour un contenu mixte):

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');
0
ravi patel