从wordpress帖子中检索嵌入的YouTube视频

时间:2015-11-14 17:46:23

标签: php wordpress

tl; dr:我想从某个类别的帖子中提取嵌入的Youtube视频链接

我目前正在开发一个博客/文章网站。请考虑以下内容:我有一个索引页面,其中包含2个精选视频的部分。假设我有一个查询和一个从一个类别中检索2个最新帖子的循环。此类别中的帖子始终以使用bootstrap嵌入的精选视频开头:

<div class="embed-responsive embed-responsive-16by9">
  <iframe class="embed-responsive-item" src="..."></iframe>
</div>
<!-- some text content follows -->

目前我正在使用以下功能从帖子内容中检索文字摘录:

function get_excerpt_by_id($post_id){
 $the_post = get_post($post_id); //Gets post ID
 $the_excerpt = $the_post->post_content; //Gets post_content to be used as a basis for the excerpt
 $excerpt_length = 30; //Sets excerpt length by word count
 $the_excerpt = strip_tags(strip_shortcodes($the_excerpt)); //Strips tags and images
 $the_excerpt = html_entity_decode($the_excerpt, ENT_QUOTES, 'UTF-8');
 $words = explode(' ', $the_excerpt, $excerpt_length + 1);

 if(count($words) > $excerpt_length) :
    array_pop($words);
    array_push($words, '…');
    $the_excerpt = implode(' ', $words);
 endif;
 return $the_excerpt;
}

该函数从帖子中获取内容并提取前30个单词,同时去除所有html标签和图像。 我怎么能这样做呢?以某种方式检索嵌入的YouTube视频并摆脱其余部分?我有两个想法:

  1. 我可以拿出前X个字符,找到嵌入的结尾然后去掉其余部分。

  2. 我可以在帖子中添加一个特殊元素并将其中的每个元素都包含在其中。类似的东西:

    <span class="vid">...</span> 
    
  3. 理论上我只能使用视频本身创建帖子,只需使用the_content(),但我想避免使用此解决方案,因为只是分享视频而对网站用户没有任何附加价值的网站有时会受到惩罚谷歌搜索排名。

  4. 我可以直接从embed div中提取src元素。

  5. 哪种方法最好,还是有更好的方法?如果是这样,你能指出我正确的方向吗?

    感谢您的任何建议。

3 个答案:

答案 0 :(得分:1)

我可以给你完成代码,但是尝试自己做,你将来可能会需要它。

你应该使用DOM,你可以用正则表达式提取视频ID。 例如:

https://www.youtube.com/watch?v=EuQLMXyGQOE

ID为EuQLMXyGQOE

http://php.net/manual/en/book.dom.php

http://php.net/manual/en/function.preg-match.php

编辑:如果你遇到困难,这里是完成的代码 http://pastebin.com/FhV5yQTV

答案 1 :(得分:1)

使用第一个答案的资源以及更多的研究我做了这个功能:

 <?php
        $args = array(
            'category_name'  => 'featured-video',
          'posts_per_page' => '2'
        );
        query_posts($args);      
        if (have_posts()) : while (have_posts()) : the_post(); 

        $content = $post->post_content;
        $doc = new DOMDocument();
        @$doc->loadHTML($content);
        $iframes = $doc->getElementsByTagName('iframe');
        foreach ($iframes as $frame) {
               echo '<div class="embed-responsive embed-responsive-16by9">        
                      <iframe class="embed-responsive-item" src="'.$frame->getAttribute('src').'" frameborder="0" allowfullscreen></iframe>
                    </div><br>';
        }

      endwhile; endif;    
        wp_reset_query();
      ?>   

答案 2 :(得分:0)

从3.6.0版开始,WordPress引入了get_media_embedded_in_content()函数来轻松嵌入内容。

$media = get_media_embedded_in_content(
    apply_filters( 'the_content', get_the_content() ), 'video'
);

print_r($media);

// results
[
    0 => '<iframe>content</iframe>,
]

支持的音频类型:“音频”,“视频”,“对象”,“嵌入”或“ iframe”。

更多信息,请点击https://developer.wordpress.org/reference/functions/get_media_embedded_in_content/