Obtenha todos os vídeos do Youtube de posts e incorpore-os em uma página diferente

2

Isso é possível? Eu quero deixar verificar todas as minhas postagens para ver se há um vídeo do Youtube incorporado. Se assim for, quero mostrar isso em uma página diferente, incorporada e vinculada a essa postagem específica ...

Eu tentei o seguinte snippet, mas isso não funcionou para mim. Não incorpora um vídeo ...

function aihato_latest_video() {
  $query_args = array(
    's' => 'youtube.com/watch?v=',
    'posts_per_page' => 1
  );

  $posts = get_posts( $query_args );
  $post1 = $posts[0];

  $matches = array();

  preg_match('|http://www.youtube.com/watch\?v=([a-zA-Z0-9]+)|', $post1->post_content, $matches);
  $v = $matches[1];
?>
<object width="415" height="250">
  <param name="movie" value="http://www.youtube.com/v/<?phpecho$v?>&hl=en_US&fs=1&"></param>
  <param name="allowFullScreen" value="true"></param>
  <param name="allowscriptaccess" value="always"></param>
  <embed src="http://www.youtube.com/v/<?phpecho$v?>&hl=en_US&fs=1&" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="415" height="250"></embed>
</object>
<?php
}

Editar: isso não está funcionando nem:

function aihato_latest_video() {
  $query_args = array(
    's' => 'youtube.com/watch?v=',
    'posts_per_page' => 1
  );

$posts = get_posts( $query_args );
foreach ($posts as $p) {
  $matches = array();
  preg_match('|http://www.youtube.com/watch\?v=([a-zA-Z0-9]+)|', $p->post_content, $matches);
?>

 <?php if (!empty($matches[1])) { ?>
    <object width="415" height="250">
      <param name="movie" value="http://www.youtube.com/v/<?phpecho$matches[1]?>&hl=en_US&fs=1&"></param>
      <param name="allowFullScreen" value="true"></param>
      <param name="allowscriptaccess" value="always"></param>
      <embed src="http://www.youtube.com/v/<?phpecho$matches[1]?>&hl=en_US&fs=1&" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="415" height="250"></embed>
    </object><?php
  }
}

?>
    
por Johan 28.07.2013 / 21:35

2 respostas

4

Outro método pode ser assim, Na postagem atual quando você salva procurar pelo vídeo do youtube no conteúdo, se encontrado, salve-o no transiente 'videos' e no post_id (para o link para a postagem depois) insted de regex im usando parse_url () e parse_str ()

add_action( 'save_post', 'save_youtube_videos' );
function save_youtube_videos( $post_id ) 
{
    $saved   = get_transient( 'videos' ); // If we have videos before
    $videos  = !empty( $saved ) ? $saved : array();
    $content = isset( $_POST['post_content'] ) ? $_POST['post_content'] : null;

    if( $content )
    {
        parse_str( parse_url( $content, PHP_URL_QUERY ), $video );
        if( !in_array( $video['v'], $videos ) )
        {
            $videos[ $post_id ] = $video['v']; // Push post_id and the vide_id
            set_transient( 'videos', $videos );  // Save all videos as array
        }
    }
}

Salve seu post_id e youtube_id se sua postagem tiver um. Portanto, ao atualizar ou publicar, procure um vídeo usando parse_str e parse_url, se encontrarmos um, adicione-o ao cache temporário, para que não seja preciso encontrar todos os posts novamente.

function get_youtube_archive( $width = '415', $height = '250' )
{
    $videos = get_transient( 'videos' );

    if( !empty( $videos ) && count( $videos ) > 0 )
    {
        $output = '';

        foreach( $videos as $key => $value ) 
        {
            $output .= '<object width="'. $width .'" height="'. $height .'">';
                $output .= '<param name="movie" value="http://www.youtube.com/v/'. $value .'/&hl=en_US&fs=1&"></param>';
                $output .= '<param name="allowFullScreen" value="true"></param>';
                $output .= '<param name="allowscriptaccess" value="always"></param>';
                $output .= '<embed src="http://www.youtube.com/v/'.$value.'&hl=en_US&fs=1&" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="'. $width .'" height="'. $height .'"></embed>';
            $output .= '</object>';

            $output .= '<a href="'. get_permalink( $key ) .'" alt="Go to post">Go to post</a>';
        }

        return $output;
    }
}

E uma função de listagem para que você possa obter os vídeos apenas adicionando:

echo get_youtube_archive();

Onde você quiser. Você precisa salvar as postagens em que você tem vídeos para que isso funcione.

    
por Pontus Abrahamsson 28.07.2013 / 22:30
3

Sem sequer executar esse código, vejo um problema bastante significativo. Você descreve a meta de "verificar todas as minhas postagens para ver se há um vídeo do YouTube incorporado", mas a consulta é restrita a apenas uma postagem.

E então, você está apenas tentando usar a primeira postagem nos resultados (se a consulta funcionar de qualquer maneira), de modo que não há maneira de obter todos os vídeos do YouTube de todas as postagens. Se tiver sorte, receberá os vídeos apenas de um post. A primeira coisa que você precisa fazer é percorrer todos os posts. Não testado, mas algo assim:

$posts = get_posts( $query_args );
foreach ($posts as $p) {
  $matches = array();
  preg_match('|http://www.youtube.com/watch\?v=([a-zA-Z0-9]+)|', $p->post_content, $matches);
  if (!empty($matches[1])) { ?>
    <object width="415" height="250">
      <param name="movie" value="http://www.youtube.com/v/<?phpecho$matches[1]?>&hl=en_US&fs=1&"></param>
      <param name="allowFullScreen" value="true"></param>
      <param name="allowscriptaccess" value="always"></param>
      <embed src="http://www.youtube.com/v/<?phpecho$matches[1]?>&hl=en_US&fs=1&" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="415" height="250"></embed>
    </object><?php
  }
}

Seu regex também está errado. IDs de vídeos do YouTube têm sublinhados.

Coloque tudo de uma vez:

function aihato_latest_video() {
  $query_args = array(
    's' => 'youtube.com/watch?v=',
  );

  $posts = get_posts( $query_args );
  foreach ($posts as $p) {
    $matches = array();
    preg_match('|http://www.youtube.com/watch\?v=([a-zA-Z0-9_]+)|', $p->post_content, $matches);
    if (!empty($matches[1])) { ?>
      <object width="415" height="250">
        <param name="movie" value="http://www.youtube.com/v/<?phpecho$matches[1]?>&hl=en_US&fs=1&"></param>
        <param name="allowFullScreen" value="true"></param>
        <param name="allowscriptaccess" value="always"></param>
        <embed src="http://www.youtube.com/v/<?phpecho$matches[1]?>&hl=en_US&fs=1&" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="415" height="250"></embed>
      </object><?php
    }
  }
}
    
por s_ha_dum 28.07.2013 / 22:16