web-dev-qa-db-fra.com

Image en vedette de la vidéo de oembed

Pour Wordpress, je souhaite générer automatiquement la vignette de la vidéo intégrée à une page à l’aide de oembed? Et puis enregistrez-le en tant qu’image sélectionnée de la publication.

Une idée comment faire ça?

5
Krunal

J'avais besoin de juste ceci pour un projet récent, alors voici mon plugin! Le code devrait être explicite, mais s'il y a des questions, demandez-les.

<?php

/**
 * Plugin Name: oEmbed Featured Image
 * Plugin URI: http://wordpress.stackexchange.com/q/70752/1685
 * Description: Automatically set the featured image if an oEmbed-compatible embed is found in the post content.
 * Version: 1.0
 * Author: TheDeadMedic
 * Author URI: http://wordpress.stackexchange.com/users/1685/thedeadmedic
 *
 * @package oEmbed_Featured_Image
 */

add_action( 'wp_insert_post', array( 'ofi', 'init' ) );

/**
 * @package oEmbed_Featured_Image
 */
class ofi
{
    /**
     * The post thumbnail ID
     *
     * @var int
     */
    private $_thumb_id;

    /**
     * The post ID
     *
     * @var int
     */
    private $_post_id;

    /**
     * Sets up an instance if called statically, and attempts to set the featured
     * image from an embed in the post content (if one has not already been set).
     *
     * @param  int $post_id
     * @return object|null
     */
    public function init( $post_id )
    {
        if ( ! isset( $this ) )
            return new ofi( $post_id );

        global $wp_embed;

        $this->_post_id = absint( $post_id );

        if ( ! $this->_thumb_id = get_post_meta( $this->_post_id, '_thumbnail_id', true ) ) {
            if ( $content = get_post_field( 'post_content', $this->_post_id, 'raw' ) ) {

                add_filter( 'oembed_dataparse', array( $this, 'oembed_dataparse' ), 10, 3 );
                $wp_embed->autoembed( $content );
                remove_filter( 'oembed_dataparse', array( $this, 'oembed_dataparse' ), 10, 3 );

            }
        }
    }

    /**
     * @see init()
     */
    public function __construct( $post_id )
    {
        $this->init( $post_id );
    }

    /**
     * Callback for the "oembed_dataparse" hook, which will fire on a successful
     * response from the oEmbed provider.
     *
     * @see WP_oEmbed::data2html()
     *
     * @param string $return The embed HTML
     * @param object $data   The oEmbed response
     * @param string $url    The oEmbed content URL
     */
    public function oembed_dataparse( $return, $data, $url )
    {
        if ( ! empty( $data->thumbnail_url ) && ! $this->_thumb_id ) {
            // if ( in_array( @ $data->type, array( 'video' ) ) ) // Only set for video embeds
                $this->set_thumb_by_url( $data->thumbnail_url, @ $data->title );
        }
    }

    /**
     * Attempt to download the image from the URL, add it to the media library,
     * and set as the featured image.
     *
     * @see media_sideload_image()
     *
     * @param string $url
     * @param string $title Optionally set attachment title
     */
    public function set_thumb_by_url( $url, $title = null )
    {
        /* Following assets will already be loaded if in admin */
        require_once ABSPATH . 'wp-admin/includes/file.php';
        require_once ABSPATH . 'wp-admin/includes/media.php';
        require_once ABSPATH . 'wp-admin/includes/image.php';

        $temp = download_url( $url );

        if ( ! is_wp_error( $temp ) && $info = @ getimagesize( $temp ) ) {
            if ( ! strlen( $title ) )
                $title = null;

            if ( ! $ext = image_type_to_extension( $info[2] ) )
                $ext = '.jpg';

            $data = array(
                'name'     => md5( $url ) . $ext,
                'tmp_name' => $temp,
            );

            $id = media_handle_sideload( $data, $this->_post_id, $title );
            if ( ! is_wp_error( $id ) )
                return update_post_meta( $this->_post_id, '_thumbnail_id', $this->_thumb_id = $id );
        }

        if ( ! is_wp_error( $temp ) )
            @ unlink( $temp );
    }
}

?>

Avertissement: Ceci ne fonctionnera que pour fournisseurs oEmbed enregistrés , et uniquement si aucun gestionnaire embed enregistré n'est enregistré pour le fournisseur (sinon WP n'appelle jamais son service oEmbed).

S'il y a plusieurs incorporations dans une publication, la première capture de vignette réussie est utilisée.

10
TheDeadMedic

Question intéressante, mais citant Mike Schinkel répondant à un similaire Q :

Vous pouvez accrocher l'action save_post, utiliser la classe WP_Http pour la télécharger, puis l'insérer en tant que pièce jointe à l'aide de wp_insert_attachment et de wp_update_attachment_metadata().Ce n'est pas anodin mais ça ne devrait pas être si difficile.

Mon emphase.

Dans un autre Q, Milo et Chris_O ont posté des informations utiles pour traiter l'extraction d'une URL d'image du contenu, la joindre au message et la définir en tant qu'image sélectionnée.

Ce qui nous amène au commentaire de Kaiser: de quoi s'agit-il?

S'il s'agit de YouTube, il s'agira de l'URL de la vignette en taille réelle:
http://i3.ytimg.com/vi/YOUTUBE-VIDEO-ID/0.jpg

Si Vimeo: https://stackoverflow.com/q/1361149/1287812


Au lieu de rechercher le contenu de la publication chaque fois qu'il est mis à jour/enregistré, j'aimerais suivre cette approche:

Créer une Metabox avec un champ de saisie pour l'identifiant vidéo

Peut-être un champ de saisie par site d’hébergement vidéo. Et un bouton correspondant "saisir la vignette".

Ainsi, l’utilisateur entre l’ID vidéo de YouTube/Vimeo, appuie sur le bouton et nous exécutons les fonctions de chargement, d’attachement et d’affichage latéral via Ajax.

Dans cette question ( Dissocier les images d'une publication ), j'ai écrit un plugin qui crée une métabox dans laquelle une fonction Ajax manipule les pièces jointes d'une publication.


Eh bien, ceci est une feuille de route, n'hésitez pas à développer le code de travail :)

2
brasofilo