1

次のことを行うワードプレスサイトにいくつかの機能を追加しようとしています...

  • 最初の画像または最初の 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 ビデオのサムを選択するロジックは、後で来る可能性があります。2つを組み合わせるのを手伝ってくれる人はいますか?


*編集*

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 ビデオを埋め込むさまざまな方法がすべてカバーされます。

4

2 に答える 2

2

さて、ここであなたの問題を解決するためのいくつかの指針:

  1. 複数のテストを行います。1 つは最初の画像用、もう 1 つは YouTube ビデオ用です。
  2. 両方のテストが成功することも失敗することもあります。
  3. 最初に(配置された)テストが勝つはずです。

あなたが行う両方のテストは、正規表現に基づいています。パターンを探し、一致する場合は一致を選択します。画像の場合は画像 src、YouTube ビデオの場合は video-id を文字列に入れる必要があります。したがって、マッチングを行い、一致するものを 1 つ選び、それをパターンに統合します。つまり、実際には両方とも同じで、パターンとマスクが異なるだけです。例:

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_matchしていることとPREG_OFFSET_CAPTURE、各試合で一致した位置を返すフラグに注意してください。

于 2012-04-17T16:37:13.830 に答える
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;
于 2012-04-17T13:24:30.583 に答える