2012-04-17 16 views
1

我试图添加一些功能到WordPress站点,做以下...的WordPress赶上第一图像与YouTube

  • 检查张贴无论是第一图像或第一的YouTube嵌入
  • 如果找到一个像第一个,然后返回它
  • 如果它发现YouTube的嵌入第一则返回截图

我已经找到了几个对符合本条例草案,继承人线,但没有类似的例子WH在我使用至今...

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的funcitonality,我发现下面的代码片段在网上,但我我不知道如何在它添加到上面的功能..

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

好了,这一些指针来解决问题:

  1. 你做多次测试,一个是第一形象,一个用于YouTube视频。
  2. 两种测试都可以成功或者不成功。
  3. 先来一个测试(在位置)应该赢。

你所做的两个测试都基于正则表达式。你寻找一个模式,如果匹配,你挑选一场比赛。对于图像,图像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); 

我希望这简化了您的问题,给你一些想法如何这样的问题( s)可以解决。请注意,我使用preg_matchPREG_OFFSET_CAPTURE标志,该标志将返回与每个匹配匹配的位置。

+0

这真是太神奇了,它的确以一种简单的方式解释了我的头脑!我已经修改过它,并且应用了它,它工作正常。我已经更新了原始帖子,提供了另一个关于搜索YouTube视频的不同方式 – fightstarr20 2012-04-17 18:11:43

+0

@ fightstarr20:您可以尝试创建一个youtube正则表达式,或者只是向该数组添加更多内容。 'youtube2','youtube3'等。 – hakre 2012-04-17 18:55:00

+0

谢谢你,一切都按预期工作 – fightstarr20 2012-04-18 10:13:04

1

好吧,我完成这个代码filmyboss.com它可以搜索,如果该关键字的视频已经在分贝则显示搜索结果否则它在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; 
+0

是的,但我不介意使用哪一个 – fightstarr20 2012-04-17 14:13:41

+0

它的大小排序意味着0.jpg是最小的,3.jpg是最大的,所以你可以根据你想要的尺寸来决定 – 2012-04-17 14:19:39

+0

我明白你的意思,但是它似乎不涉及我的问题! – fightstarr20 2012-04-17 14:20:10