Extrai o primeiro url oembed inserido no conteúdo de um post

3

Eu quero extrair o primeiro url do oEmbed inserido no conteúdo de um post, a fim de colocar uma metatag do cabeçalho, ou em outro lugar, como uma forma de estilizá-lo de forma diferente do resto do conteúdo.

    
por peroyomas 27.01.2011 / 20:29

3 respostas

5

Suponho que você esteja interessado apenas no primeiro URL que realmente consegue descobrir dados reais. O sistema integrado processa todos os links que encontra, mas nem todos os links terão acesso a ele, obviamente.

O filtro que você deseja usar é embed_oembed_html e obtém o HTML em cache pelo oembed, a url, qualquer atributo na incorporação e o post_ID, que é importante para o seu código.

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
}

Agora, todo o sistema do oembed está sendo executado ao mesmo tempo que os códigos de acesso: durante a chamada do filtro the_content. Então, se você quiser pegar coisas para o cabeçalho, você terá que iniciar o Loop principal no cabeçalho, executar o filtro the_content sobre o valor get_the_content (), então chamar rewind_posts () para voltar a consulta de volta para o início para o real Loop principal mais tarde na página.

Esse tipo de comportamento causa problemas com plugins (como a galeria Nextgen) que fazem coisas estúpidas quando você executa um loop no cabeçalho. Não há como trabalhar com isso, mas o fato é que esses plugins estão fundamentalmente quebrados e você não pode corrigir seus problemas. Eu recebo este tipo de relatório com SFC-Share e SFC-Like o tempo todo (porque eles puxam o conteúdo para colocar no cabeçalho também). Nada que você possa fazer sobre isso, francamente.

    
por Otto 15.04.2011 / 21:04
2

Tente isto:

function get_first_oembed($id) {

    $meta = get_post_custom($id);

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

as incorporações parecem ser armazenadas como blocos renderizados de HTML, portanto, se você quiser um link sozinho, também precisará extraí-lo.

    
por Rarst 27.01.2011 / 21:16
2

Eu tentei a resposta do @Rarst, mas na verdade não é uma solução muito estável para o problema. Se você tentar var_dump o $meta var acima, você notará que há pelo menos um outro meta-campo _oembed_time_xxxxxxxxxxxx , que provavelmente é para impedimento de cache.

E também, quando removi o link oEmbed do conteúdo do post, as meta strings do eEmbed não foram removidas, o que não é o que eu queria.

Então, eu aprofundei um pouco mais os códigos WP nativos do wp-includes/class-oembed.php e wp-includes/class-wp-embed.php e encontrei uma solução muito mais sólida:

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

O padrão regex é copiado da função WP_Embed:autoembed() nativa, por isso é o mais confiável.

É fácil modificar aqui esta função e extrair apenas o primeiro URL também.

    
por pcigler 23.09.2014 / 14:46

Tags