从帖子中获取所有YouTube视频并将其嵌入到不同的页面

时间:2013-07-28 作者:Johan

这可能吗?我想让它检查我所有的帖子,看看是否有嵌入的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 个回复
SO网友:Pontus Abrahamsson

另一种方法可以是这样的,在当前帖子保存时查找youtube视频中的内容,如果找到则将其保存到瞬态\'videos\' 和post\\u id(用于以后的帖子链接)代替regex im使用parse_url()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
        }
    }
}
如果您的帖子有post\\u id和youtube\\u id,请保存它们。因此,在更新或发布时,使用parse\\u str和parse\\u 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();
在你想要的地方。你必须把帖子保存在有视频的地方,这样才能起作用。

SO网友:s_ha_dum

即使不运行这些代码,我也能看到一个相当严重的问题。您将目标描述为“检查我的所有帖子,看看是否有嵌入的YouTube视频”,但查询仅限于一篇帖子。

然后,无论如何,您只会尝试使用结果中的第一篇帖子(如果查询有效的话),因此无法从所有帖子中获取所有YouTube视频。如果幸运的话,它只能从一个帖子中获得视频。您需要做的第一件事是遍历所有帖子。未经测试,但类似于此:

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

结束

相关推荐

如何将POST中的oEmbeded URL替换为实际的嵌入的HTML

我想要的是将推特oEmbed系统的输出输入到我的实际帖子中。IMHO嵌入输出本身是高质量的语义HTML,我宁愿将其放在帖子中,也不要放在嵌入元数据中,以防js停止工作(在这种情况下,推特将显示为合理的blockquote)。因此,我需要的是劫持oEmbed系统,并在处理后,将帖子中的嵌入URL替换为来自Twitter的HTML。显然,该解决方案还应该能够处理其他类型的嵌入。更新:我只是想澄清一下,我知道oEmbed在默认情况下是如何工作的(即,当对帖子内容运行“the\\u content”过滤器时,UR