Wordpress用youtube捕捉第一张图片

时间:2012-04-17 13:18:19

标签: php wordpress

我正在尝试向执行以下操作的wordpress网站添加一些功能......

  • 检查第一张图片或第一张youtube嵌入的帖子
  • 如果先找到图像,则将其返回
  • 如果它首先找到youtube嵌入,则返回屏幕截图

我在网上找到了几个相似的例子,但没有任何符合条件的内容,这是我到目前为止使用的内容......

function catch_that_image() {
  global $post, $posts;
  $first_img = '';
  ob_start();
  ob_end_clean();
  $output = preg_match_all('/<img.+src=[\'"]([^\'"]+)[\'"].*>/i', $post->post_content,     $matches);
  $first_img = $matches [1] [0];

  if(empty($first_img)){ //Defines a default image
    $first_img = "/images/default.jpg";
  }
  return $first_img;
}

这正常工作并正确返回帖子的第一张图片,我现在正在努力添加youtube功能,我在网上找到了以下代码片段,但我不知道如何将其添加到上面的函数中。

preg_match( '#https?://www\.youtube(?:\-nocookie)?\.com/embed/([A-Za-z0-9\-_]+)#', $markup, $matches );
    }

    // If we've found a YouTube video ID, create the thumbnail URL
    if ( isset( $matches[1] ) ) {
        $youtube_thumbnail = 'http://img.youtube.com/vi/' . $matches[1] . '/0.jpg';
    }

如果帖子中有两个视频,那么在图像上选择YouTube视频缩略图的逻辑可以稍后出现,因为现在我只有带有图像或youtube嵌入的帖子。任何人都可以帮助将两者结合起来吗?


*的 修改 *

使用hakres优秀的例子并回答我正在使用这个......

function catch_image($content, $defaultImage = '/images/default.jpg')
{
    $image = $defaultImage;
    $found = strlen($content);
    foreach (array(
                 'image'   => array(
                     'regex' => '/<img.+src=[\'"]([^\'"]+)[\'"].*>/i',
                     'mask'  => '%s'
                 ),
                 'youtube' => array(
                     'regex' => '#(?:https?(?:a|vh?)?://)?(?:www\.)?    youtube(?:\-nocookie)?\.com/watch\?.*v=([A-Za-z0-9\-_]+)#',
                     'mask'  => 'http://img.youtube.com/vi/%s/2.jpg'
                 ),
             ) as $search)
    {
        extract($search);
        if (preg_match($regex, $content, $matches, PREG_OFFSET_CAPTURE)
            && $matches[1][1] < $found
        ) {
            list($image, $found) = $matches[1];
            $image = sprintf($mask, $image);
        }
    }
    return $image;
}

我稍微修改了youtube正则表达式语句,并且还显示了用于显示图像的掩码,一切正常。

但是我现在需要尝试添加这些......

'regex' => '#<object[^>]+>.+?https?://www\.youtube(?:\-nocookie)?\.com/[ve]/([A-Za-z0-9\-_]+).+?</object>#s',
'regex' => '#https?://www\.youtube(?:\-nocookie)?\.com/[ve]/([A-Za-z0-9\-_]+)#',
'regex' => '#https?://www\.youtube(?:\-nocookie)?\.com/embed/([A-Za-z0-9\-_]+)#',
'regex' => '#(?:https?(?:a|vh?)?://)?(?:www\.)?youtube(?:\-nocookie)?\.com/watch\?.*v=([A-Za-z0-9\-_]+)#',
'regex' => '#(?:https?(?:a|vh?)?://)?youtu\.be/([A-Za-z0-9\-_]+)#',

这将涵盖youtube视频可嵌入的所有不同方式

2 个答案:

答案 0 :(得分:2)

好的,这里有一些解决问题的方法:

  1. 您会进行多项测试,一次针对第一张图片,另一张针对YouTube视频。
  2. 这两项测试都可以成功。
  3. 首先(在位)的一个测试应该获胜。
  4. 您所做的两项测试均基于正则表达式。你寻找一个模式,如果匹配,你挑选一个匹配。对于图像,图像src,对于YouTube视频,需要将视频ID放入字符串中。所以你进行匹配,如果正确的话选择一个匹配并将其集成到模式中。所以实际上两件事都是一样的,只有图案和面具有所不同。例如:

    array(
         'image'   => array(
             'regex' => '/<img.+src=[\'"]([^\'"]+)[\'"].*>/i',
             'mask'  => '%s'
         ),
         'youtube' => array(
             'regex' => '#https?://www\.youtube(?:\-nocookie)?\.com/embed/([A-Za-z0-9\-_]+)#',
             'mask'  => 'http://img.youtube.com/vi/%s0.jpg'
         ),
     );
    

    因此,如果您将查找结果初始化为字符串末尾的默认图像,然后查找任何进一步的搜索并检查它们是否与匹配的位置匹配。如果他们在最后一场比赛之前匹配,他们将获胜,比赛将更新:

    /**
     * Representa! - Pimp ur posts media
     *
     * @author   hakre <http://hakre.wordpress.com>
     *
     * @param string $content
     * @param string $defaultImage (optional)
     *
     * @return string
     */
    function representa_image($content, $defaultImage = '/images/default.jpg')
    {
        $image = $defaultImage;
        $found = strlen($content);
        foreach (array(
                     'image'   => array(
                         'regex' => '/<img.+src=[\'"]([^\'"]+)[\'"].*>/i',
                         'mask'  => '%s'
                     ),
                     'youtube' => array(
                         'regex' => '#https?://www\.youtube(?:\-nocookie)?\.com/embed/([A-Za-z0-9\-_]+)#',
                         'mask'  => 'http://img.youtube.com/vi/%s0.jpg'
                     ),
                 ) as $search)
        {
            extract($search);
            if (preg_match($regex, $content, $matches, PREG_OFFSET_CAPTURE)
                && $matches[1][1] < $found
            ) {
                list($image, $found) = $matches[1];
                $image = sprintf($mask, $image);
            }
        }
        return $image;
    }
    

    用法:

    $url = representa_image($post->post_content);
    

    我希望这简化了您的问题,并让您了解如何解决此类问题。请注意,我正在使用preg_matchPREG_OFFSET_CAPTURE标记,该标记将返回与每个匹配项匹配的位置。

答案 1 :(得分:1)

好吧我为filmyboss.com实现了这个代码,可以搜索该关键字的视频是否已经在db中然后显示搜索结果,否则它会在youtube中搜索该关键字并更新它我认为您可以根据需要轻松调试

 global $query_string;

                        if(have_posts()):
    //You already have it 
    else:
    $x = json_decode(file_get_contents("http://gdata.youtube.com/feeds/api/videos?q=some&format=5&max-results=1&v=2&duration=long&alt=jsonc"));
                        $y = $x->data;
                        $z = $y->items;
                        $d['_my_meta']['ytkey'] = $z['0']->id;
                        $t = $z['0']->title;
                        $post = array(
                        'post_status' => 'publish', 
                        'post_title' => $t, //The title of your post.
                        'post_type' => 'post');
                        echo $d; 
                        $key = "_my_meta";
                        $post_id = wp_insert_post( $post );
    endif;