来自oemed的视频的特色图像

时间:2012-10-28 作者:Krunal

对于Wordpress,我想使用oembed自动生成嵌入在页面上的视频缩略图?然后将其另存为帖子的特色图片。

你知道怎么做吗?

2 个回复
最合适的回答,由SO网友:TheDeadMedic 整理而成

我最近的一个项目需要这个,所以这是我的插件!代码应该是不言自明的,但如果有任何问题,请提问。

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

?>
Caveat: 这只适用于registered oEmbed providers, 只有在没有的情况下embed handler 是为提供商注册的(否则WP不会调用其oEmbed服务)。

如果一篇文章中有多个嵌入,则使用第一个成功的缩略图抓取。

SO网友:brasofilo

有趣的问题,但引用迈克·辛克尔的回答similar Q:

你可以把save_post 操作,使用WP_Http 类下载它,然后使用将其作为附件插入wp_insert_attachmentwp_update_attachment_metadata(). It\'s not trivial but shouldn\'t be that hard.

我的重点

在另一个Q中,Milo和Chris\\u Oposted some useful info 从内容中提取图像URL,将其附加到帖子并将其设置为特色图像。

这让我们想到了凯撒的评论:这是什么?

如果是YouTube,这将是全尺寸缩略图URL:
http://i3.ytimg.com/vi/YOUTUBE-VIDEO-ID/0.jpg

如果Vimeo:https://stackoverflow.com/q/1361149/1287812

我不会每次更新/保存帖子内容时都搜索帖子内容,而是采用以下方法:

创建一个元盒,其中包含视频ID的输入字段,每个视频托管站点可能有一个输入字段。和相应的按钮“抓取缩略图”。

因此,用户输入YouTube/Vimeo视频ID,按下按钮,我们通过Ajax执行侧面加载、附加和特色功能。

在这个问题中(Unattaching images from a post ), 我编写了一个插件,它创建了一个元盒,其中Ajax函数可以处理帖子的附件。

这是一个路线图,可以随意扩展到工作代码:)

结束

相关推荐

Displaying oEmbed errors?

有时,通过oEmbed嵌入项目是不可能的,例如,当YouTube视频已禁用嵌入时。The oEmbed service will return a 401 Unauthorized, 并且不会转换代码。有没有办法通知用户这一点?当前的工作流是非直观的(至少对我来说),我更喜欢在WordPress页面上,或者更好的是,在编辑器中显示一条消息,说明对象无法嵌入。