Filtering WordPress oEmbed provider list

2019-10-18 18:57发布

我将如何筛选的WordPress透过oEmbed提供者名单? 我的目的是让刚Twitter和YouTube。

编辑:我可以做这样的事情?

function filter_oembed_provider_list( $array ) {
    $array = array( 'http://youtu.be/*' => array( 'http://www.youtube.com/oembed',                     false ) );
    return $array;
}
add_filter( 'oembed_providers', 'filter_oembed_provider_list' );

但是,这似乎并没有工作。

请参阅类oembed.php相关的代码:

apply_filters( 'oembed_providers', array(
        '#https?://(www\.)?youtube\.com/watch.*#i'           => array( 'http://www.youtube.com/oembed',                     true  ),
        'http://youtu.be/*'                                  => array( 'http://www.youtube.com/oembed',                     false ),
        'http://blip.tv/*'                                   => array( 'http://blip.tv/oembed/',                            false ),
        '#https?://(www\.)?vimeo\.com/.*#i'                  => array( 'http://vimeo.com/api/oembed.{format}',              true  ),
        '#https?://(www\.)?dailymotion\.com/.*#i'            => array( 'http://www.dailymotion.com/services/oembed',        true  ),
        'http://dai.ly/*'                                    => array( 'http://www.dailymotion.com/services/oembed',        false ),
        '#https?://(www\.)?flickr\.com/.*#i'                 => array( 'http://www.flickr.com/services/oembed/',            true  ),
        'http://flic.kr/*'                                   => array( 'http://www.flickr.com/services/oembed/',            false ),
        '#https?://(.+\.)?smugmug\.com/.*#i'                 => array( 'http://api.smugmug.com/services/oembed/',           true  ),
        '#https?://(www\.)?hulu\.com/watch/.*#i'             => array( 'http://www.hulu.com/api/oembed.{format}',           true  ),
        '#https?://(www\.)?viddler\.com/.*#i'                => array( 'http://lab.viddler.com/services/oembed/',           true  ),
        'http://qik.com/*'                                   => array( 'http://qik.com/api/oembed.{format}',                false ),
        'http://revision3.com/*'                             => array( 'http://revision3.com/api/oembed/',                  false ),
        'http://i*.photobucket.com/albums/*'                 => array( 'http://photobucket.com/oembed',                     false ),
        'http://gi*.photobucket.com/groups/*'                => array( 'http://photobucket.com/oembed',                     false ),
        '#https?://(www\.)?scribd\.com/.*#i'                 => array( 'http://www.scribd.com/services/oembed',             true  ),
        'http://wordpress.tv/*'                              => array( 'http://wordpress.tv/oembed/',                       false ),
        '#https?://(.+\.)?polldaddy\.com/.*#i'               => array( 'http://polldaddy.com/oembed/',                      true  ),
        '#https?://(www\.)?funnyordie\.com/videos/.*#i'      => array( 'http://www.funnyordie.com/oembed',                  true  ),
        '#https?://(www\.)?twitter\.com/.+?/status(es)?/.*#i'=> array( 'http://api.twitter.com/1/statuses/oembed.{format}', true  ),
        '#https?://(www\.)?soundcloud\.com/.*#i'             => array( 'http://soundcloud.com/oembed',                      true  ),
        '#https?://(www\.)?slideshare\.net/*#'               => array( 'http://www.slideshare.net/api/oembed/2',            true  ),
        '#http://instagr(\.am|am\.com)/p/.*#i'               => array( 'http://api.instagram.com/oembed',                   true  ),
        '#https?://(www\.)?rdio\.com/.*#i'                   => array( 'http://www.rdio.com/api/oembed/',                   true  ),
        '#https?://rd\.io/x/.*#i'                            => array( 'http://www.rdio.com/api/oembed/',                   true  ),
        '#https?://(open|play)\.spotify\.com/.*#i'           => array( 'https://embed.spotify.com/oembed/',                 true  ),
    ) );

Answer 1:

有一个内置的功能wp_oembed_remove_provider ,分别wp_oembed_add_provider

编辑

添加到functions.php文件

function customize_oembed() {

    //load oembed class
    require_once ABSPATH . DIRECTORY_SEPARATOR . 'wp-includes' . DIRECTORY_SEPARATOR . 'class-oembed.php';

    //get a singleton object
    $oembed = _wp_oembed_get_object();

    /**
     * Forget about those lines
     *
       //empty the providers list
       $oembed->providers = array();

       //add what you want
       wp_oembed_add_provider( 'http://site.com/watchvideo/*', 'http://site.com/oembedprovider' );  
    */

    //use applying a filter
    $providers = array(
        'youtube' => array( 'http://www.youtube.com/oembed', false), 
        'twitter'=> array( 'http://api.twitter.com/1/statuses/oembed.{format}', true  )
    );
    $oembed->providers = apply_filters('oembed_providers', $providers);
}
add_action('init', 'customize_oembed');

编辑2

我看着它,我发现,你可以使用过滤器oembed_providers正是以同样的方式,因为它是在类的构造函数中使用。 因此,使用额外的WordPress的功能,这将再次尝试,要求类文件和实例化一个单独的对象,是没有用的,当你可以在一个功能做到这一点。

(尽管事实上,它的作品,我仍然没有得到这个过滤器:-D的使用)

编辑3

最后,我得到了它的工作。

这实在是类似的代码到你的,虽然在功能上的说法是根本没用。 它只是给你原始提供,你要重写,所以你不使用它,你可以直接返回一个数组。

也许最重要的事情要记住的是,编辑列表之后,您需要更新自己的帖子,因为WordPress是一些数据保存到表*_postmeta下键_oembed_…

function filter_oembed_provider_list( ) {
    return array( 'http://youtu.be/*' => array( 'http://www.youtube.com/oembed', false ) );
}
add_filter( 'oembed_providers', 'filter_oembed_provider_list' );


Answer 2:

如果您所提供的过滤器( oembed_providers )是为你工作,那么你可以尝试这样的事:

/**
 * Filter the oembed providers through a whitelist
 *
 * @param array $providers
 * @return array $providers
 */
function filter_oembed_provider_list( $providers )
{
    // edit the whitelist to your needs
    $whitelist = array( 'youtu', 'twitter' );

    $output = array();

    foreach( $providers as $key => $provider )
    {
        foreach( $whitelist as $allowed )
        {
            if( stristr( $key, $allowed ) )
                $output[$key] = $provider;

        }
    }
    return $output; 
}

add_filter( 'oembed_providers' , 'filter_oembed_provider_list', 99 );

在那里你必须编辑$whitelist您的需求。

更新:

由于@Ivan哈纳克,提出了这个职位节省部分;-)

这段代码现在应该工作,你更新透过oEmbed缓存后,通过保存后;-)



Answer 3:

我有同样的需要,因为Instagram的Oembeds在WordPress的4.4之前破坏。 我意识到的是,你的主题之前运行提供过滤器被初始化,所以如果你想添加这个过滤器,你必须使用一个plugin.This是我用什么

<?php
/**
 * Plugin Name: Fix Instagram oEmbed
 * Plugin URI: https://10up.com
 * Description: Fix Instagram oEmbed.
 * Author: 10up
 * Version: 1.0.0
 * Author URI: https://10up.com
 * License: GPL2
 */

namespace TenUp\Plugin\InstagramFix;
add_filter( 'oembed_providers', __NAMESPACE__ . '\\oembed_providers' );


function oembed_providers( $providers ) {
    if ( ! isset( $providers['#https?://(www\.)?instagr(\.am|am\.com)/p/.*#i'] ) ) {
        $providers['#https?://(www\.)?instagr(\.am|am\.com)/p/.*#i'] = array(
            'https://api.instagram.com/oembed',
            true
        );
    }
    return $providers;
}

所以你必须

1)创建像在插件文件夹中的Instagram-透过oEmbed修复的文件夹
2)创建一个文件名为Instagram的 - 透过oEmbed,fix.php
3)在PHP代码复制上述
4)激活你的插件(网络激活的网络中)
5)将任何职务和presing再生透过oEmbed缓存“保存”



文章来源: Filtering WordPress oEmbed provider list