web-dev-qa-db-fra.com

Extrait la première URL oembed insérée sur le contenu d'un message

Je souhaite extraire la première URL oEmbed insérée dans le contenu d'un message afin d'insérer une balise méta dans l'en-tête, ou ailleurs, afin de donner un style différent du reste du contenu.

3
peroyomas

Je suppose que vous ne vous intéressez qu'à la première URL qui réussit réellement à découvrir des données Oembed réelles. Le système oembed traite tous les liens qu’il trouve, mais il est évident que tous les liens n’auront pas été utilisés.

Le filtre que vous souhaitez utiliser est embed_oembed_html. Il contient le code HTML mis en cache par oembed, l'URL, tous les attributs de l'incorporation et le post_ID, qui est important pour votre code.

add_filter('embed_oembed_html', 'my_function',10,4);
function my_function( $cache, $url, $attr, $post_ID ) {
  global $my_previous_post_id;
  if ($my_previous_post_id != $post_ID) {
    // post ID changed, so this is the first oembed for the post
    // do something with $url
    $my_previous_post_id = $post_ID;
  }
  return $cache; // it's important that you return the $cache value as-is
}

À présent, tout le système oembed s'exécute en même temps que les codes courts: lors de l'appel du filtre_content. Donc, si vous voulez récupérer des éléments pour l’en-tête, vous devrez commencer la boucle principale dans l’en-tête, exécuter le filtre_content sur la valeur get_the_content (), puis appeler rewind_posts () pour revenir à la requête au début de la recherche. Boucle principale plus tard dans la page.

Ce type de comportement cause des problèmes avec les plugins (comme la galerie Nextgen) qui font des bêtises lorsque vous exécutez une boucle dans l'en-tête. Il n'y a aucun travail autour de ça, mais le fait est que ces plugins sont fondamentalement cassés et que vous ne pouvez pas corriger leurs problèmes. Je reçois ce genre de rapport avec SFC-Share et SFC-Like tout le temps (car ils extraient également du contenu à mettre dans l'en-tête). Franchement, vous ne pouvez rien y faire.

5
Otto

J'ai essayé la réponse de @Rarst, mais en réalité ce n'est pas une solution très stable au problème. Si vous essayez de var_dump le $meta var ci-dessus, vous remarquerez qu'il existe au moins un autre champ méta _oembed_time_xxxxxxxxxxxx qui sert probablement à contourner le cache.

De plus, lorsque j'ai supprimé le lien oEmbed du contenu de la publication, les méta-chaînes eEmbed en cache n'ont pas été supprimées, ce qui n'est pas ce que je voulais.

J'ai donc creusé un peu plus profondément dans les codes WP natifs des wp-includes/class-oembed.php et wp-includes/class-wp-embed.php et j'ai trouvé une solution bien plus solide:

function get_first_oembed_from_content( $content ) {
    if ( preg_match( '|^\s*(https?://[^\s"]+)\s*$|im', $content, $matches ) ) {
        return wp_oembed_get( $matches[1] );
    }

    return false;
}

Le motif regex est copié à partir de la fonction native WP_Embed:autoembed(). Il est donc le plus fiable.

À partir de là, il est facile de modifier cette fonction et d'extraire également la première URL.

2
pcigler

Essaye ça:

function get_first_oembed($id) {

    $meta = get_post_custom($id);

    foreach ($meta as $key => $value)
        if (false !== strpos($key, 'oembed'))
            return $value[0];
}

les incorporations semblent être stockées sous forme de blocs HTML rendus, donc si vous voulez un lien seul, vous aurez également besoin de l'extraire.

2
Rarst