it-swarm.com.de

Ausgewähltes Bild des Videos von oembed

Für Wordpress möchte ich mit oembed automatisch ein Vorschaubild des Videos erstellen, das auf einer Seite eingebettet ist. Und speichern Sie es dann als vorgestellten Bild des Beitrags.

Irgendeine Idee, wie das geht?

5
Krunal

Ich brauchte nur dies für ein aktuelles Projekt, also hier ist mein Plugin! Der Code sollte selbsterklärend sein, aber wenn Sie Fragen haben, wenden Sie sich an uns.

<?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 );
    }
}

?>

Einschränkung: Dies funktioniert nur bei registrierten oEmbed-Anbietern und nur, wenn kein Embedded-Handler für den Anbieter registriert ist (andernfalls ruft WP niemals an sein oEmbed-Service).

Wenn ein Beitrag mehrere Einbettungen enthält, wird der erste erfolgreiche Thumbnails-Grab verwendet.

10
TheDeadMedic

Interessante Frage, aber mit Mike Schinkel als Antwort auf ein ähnliches Q :

Sie können die Aktion save_post einbinden, sie mit der Klasse WP_Http herunterladen und dann mit wp_insert_attachment und wp_update_attachment_metadata() als Anhang einfügen.Es ist nicht trivial, sollte aber nicht so schwer sein.

Mein Schwerpunkt.

In einem anderen Q haben Milo und Chris_O einige nützliche Informationen gepostet , um eine Bild-URL aus dem Inhalt zu extrahieren, sie an den Beitrag anzuhängen und als "Ausgewähltes Bild" festzulegen.

Was uns zu Kaisers Kommentar bringt: Was ist das für ein Bett?

Wenn es sich um YouTube handelt, ist dies die Miniaturansichts-URL in voller Größe:
http://i3.ytimg.com/vi/YOUTUBE-VIDEO-ID/0.jpg

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


Anstatt den Inhalt jedes Mal zu durchsuchen, wenn er aktualisiert/gespeichert wird, gehe ich folgendermaßen vor:

Erstellen Sie eine Metabox mit einem Eingabefeld für die Video-ID

Möglicherweise ein Eingabefeld pro Video-Hosting-Site. Und eine entsprechende Schaltfläche "Grab thumbnail".

Der Benutzer gibt also die YouTube/Vimeo-Video-ID ein, drückt den Knopf und wir führen die Funktionen zum Laden, Anhängen und Anzeigen von Seiten über Ajax aus.

In dieser Frage ( Bilder aus einem Beitrag entfernen ) habe ich ein Plugin geschrieben, das eine Metabox erstellt, in der eine Ajax-Funktion die Anhänge eines Beitrags bearbeitet.


Nun, das ist eine Roadmap, zögern Sie nicht, in den Arbeitscode zu expandieren :)

2
brasofilo