Définition de l'image sélectionnée d'une publication à partir d'une vidéo YouTube intégrée

15

Si je crée une publication contenant une vidéo YouTube intégrée (je ne fais donc que coller l'URL YouTube dans la publication et laisser Wordpress l'intégrer automatiquement pour moi), existe-t-il un moyen de définir l'image miniature de la vidéo comme l'image en vedette du message?

Piku
la source

Réponses:

17

Pas nativement. Il faudrait écrire du code pour y arriver - il y a une belle fonction pastebin qui fournit le code nécessaire pour le faire.

Modifier (19/12/2011):

Oui, voici comment procéder par programmation. Ajoutez les deux fonctions suivantes à votre fichier functions.php et vous devriez être prêt à partir. Le code a été commenté pour expliquer ce qui se passe, mais voici un niveau élevé à quoi s'attendre:

Vous devez...

  • Créer une publication
  • Dans le contenu, incluez une URL YouTube

Le code va ...

  • Analyser l'URL du contenu
  • Récupérera la première URL trouvée et supposera qu'il s'agit d'une URL YouTube
  • Prenez la vignette du serveur distant et téléchargez-la
  • Définissez-le comme miniature de l'article actuel

Notez que si vous incluez plusieurs URL dans votre message, vous devrez modifier le code pour trouver correctement l'URL YouTube. Pour ce faire, parcourez la $attachmentscollection et reniflez l'apparence d'une URL comme une 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

Une chose à noter est que cela suppose que votre publication n'a pas de miniature de publication et ne se déclenchera pas une fois la miniature de publication définie.

Deuxièmement, si vous supprimez la vignette du message, puis joignez une image à ce message à l'aide du programme de téléchargement de médias, l'image la plus récente sera utilisée.

À M
la source
Excellent extrait, mais comme qui sait s'il sera là dans un an - essayez d'inclure au moins un résumé (si le code complet est trop) de ce qu'il fait dans votre réponse (comme "utilisez ceci pour obtenir la vignette, puis cela pour télécharger et joindre ").
Rarst
1
Notez que jetpack contient une méthode nommée de get_youtube_idsorte que 500 erreurs de serveur sur votre application si vous utilisez jetpack avec le code ci-dessus. Si vous renommez cette fonction, cela fonctionnera a-ok
Mike Vormwald