web-dev-qa-db-ja.com

すべてのYoutubeビデオを投稿から取得して別のページに埋め込む

これは可能ですか?すべての投稿をチェックして、埋め込みのYoutubeビデオがあるかどうかを確認します。もしそうなら、私はそれを別のページに表示したいのですが、埋め込んでその特定の投稿にリンクしています...

私は次のスニペットを試しましたが、それは私のために働きませんでした。ビデオは埋め込まれていません...

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/<?php echo $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/<?php echo $v ?>&hl=en_US&fs=1&" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="415" height="250"></embed>
</object>
<?php
}

編集:これはどちらも働いていない:

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/<?php echo $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/<?php echo $matches[1] ?>&hl=en_US&fs=1&" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="415" height="250"></embed>
    </object><?php
  }
}

?>
2
Johan

別の方法は、このようにすることができます、あなたがコンテンツ内のYouTubeビデオを探すときに保存するとき、一時的な'videos'とpost_idに保存します。 parse_url() および parse_str() を使用した正規表現imのinsted

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

あなたの投稿がある場合はあなたのpost_idとyoutube_idを保存してください。そのため、更新時または公開時にparse_strおよびparse_urlを使用して動画を検索します。一時動画に追加した場合は、すべての投稿をもう一度検索する必要はありません。

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

あなたはちょうど追加することによってあなたがビデオを得ることができるようにそしてリスト機能。

echo get_youtube_archive();

あなたがそれらを欲しいところ。これを機能させるには、動画のある投稿を保存する必要があります。

4

そのコードを実行しなくても、かなり重大な問題が発生する可能性があります。 「埋め込みYouTubeビデオがあるかどうかを確認するために自分の投稿をすべてチェックする」という目標を説明しましたが、クエリは1つの投稿のみに制限されています。

そして、あなたはとにかく結果の一番最初の投稿のみを使用しようとしているので(クエリがまったく機能している場合)、すべての投稿からすべてのYouTube動画を取得する方法はありません。運がよければ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);
  if (!empty($matches[1])) { ?>
    <object width="415" height="250">
      <param name="movie" value="http://www.youtube.com/v/<?php echo $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/<?php echo $matches[1] ?>&hl=en_US&fs=1&" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="415" height="250"></embed>
    </object><?php
  }
}

あなたのregexも間違っています。 YouTubeの動画IDには下線が付きます。

まとめると:

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/<?php echo $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/<?php echo $matches[1] ?>&hl=en_US&fs=1&" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="415" height="250"></embed>
      </object><?php
    }
  }
}
3
s_ha_dum