Ustawianie wyróżnionego obrazu posta z osadzonego wideo YouTube

15

Jeśli utworzę post z osadzonym filmem na YouTube (więc wystarczy wkleić adres URL YouTube do postu i pozwolić, aby Wordpress automatycznie go osadził), czy istnieje sposób, aby ustawić miniaturę filmu jako polecany obraz posta?

Piku
źródło

Odpowiedzi:

17

Nie natywnie. Aby tak się stało, trzeba by napisać kod - jest ładna funkcja pastebin, która zapewnia kod niezbędny do tego.

Edytuj (19.12.2011):

Tak, oto jak możesz to zrobić programowo. Dodaj następujące dwie funkcje do pliku functions.php i powinieneś zacząć. Kod został skomentowany, aby wyjaśnić, co się dzieje, ale oto wysoki poziom tego, czego można się spodziewać:

Musisz...

  • Utwórz post
  • W treści dołącz adres URL YouTube

Kod będzie ...

  • Analizuj adresy URL poza zawartością
  • Pobiera pierwszy znaleziony adres URL i zakłada, że ​​jest to adres URL YouTube
  • Chwyć miniaturę ze zdalnego serwera i pobierz ją
  • Ustaw jako miniaturę bieżącego postu

Pamiętaj, że jeśli umieścisz wiele adresów URL we wpisie, musisz zmodyfikować kod, aby poprawnie znaleźć adres URL YouTube. Można to zrobić, iterując $attachmentskolekcję i wyszukując, jaki URL wygląda jak URL YouTube.

function set_youtube_as_featured_image($post_id) {  

    // only want to do this if the post has no thumbnail
    if(!has_post_thumbnail($post_id)) { 

        // find the youtube url
        $post_array = get_post($post_id, ARRAY_A);
        $content = $post_array['post_content'];
        $youtube_id = get_youtube_id($content);

        // build the thumbnail string
        $youtube_thumb_url = 'http://img.youtube.com/vi/' . $youtube_id . '/0.jpg';

        // next, download the URL of the youtube image
        media_sideload_image($youtube_thumb_url, $post_id, 'Sample youtube image.');

        // find the most recent attachment for the given post
        $attachments = get_posts(
            array(
                'post_type' => 'attachment',
                'numberposts' => 1,
                'order' => 'ASC',
                'post_parent' => $post_id
            )
        );
        $attachment = $attachments[0];

        // and set it as the post thumbnail
        set_post_thumbnail( $post_id, $attachment->ID );

    } // end if

} // set_youtube_as_featured_image
add_action('save_post', 'set_youtube_as_featured_image');

function get_youtube_id($content) {

    // find the youtube-based URL in the post
    $urls = array();
    preg_match_all('#\bhttps?://[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|/))#', $content, $urls);
    $youtube_url = $urls[0][0];

    // next, locate the youtube video id
    $youtube_id = '';
    if(strlen(trim($youtube_url)) > 0) {
        parse_str( parse_url( $youtube_url, PHP_URL_QUERY ) );
        $youtube_id = $v;
    } // end if

    return $youtube_id; 

} // end get_youtube_id

Należy zauważyć, że zakłada to, że twój post nie ma miniatury postu i nie będzie uruchamiany po ustawieniu miniatury postu.

Po drugie, jeśli usuniesz miniaturę postu, a następnie załączysz obraz do tego postu za pomocą programu do przesyłania multimediów, zostanie użyty najnowszy obraz.

Tomek
źródło
Świetny fragment, ale skoro kto wie, czy będzie dostępny za rok - spróbuj dołączyć przynajmniej podsumowanie (jeśli pełny kod to za dużo) tego, co robi w swojej odpowiedzi (np. „Użyj tego, aby uzyskać miniaturę, a następnie pobierz i załącz ”).
Rarst
1
Pamiętaj, że jetpack zawiera metodę o nazwie get_youtube_id, która spowoduje 500 błędów serwera w aplikacji, jeśli używasz jetpack z powyższym kodem. Jeśli zmienisz nazwę tej funkcji, zadziała w porządku
Mike Vormwald