过滤WordPress oEmbed提供者列表

时间:2013-10-19 13:10:35

标签: php wordpress oembed

如何过滤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' );

但这似乎不起作用。

请参阅class-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  ),
    ) );

3 个答案:

答案 0 :(得分:4)

内置函数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' );

答案 1 :(得分:1)

如果您提供的过滤器(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

更新

感谢@IvanHanák建议保存部分; - )

通过保存帖子更新oEmbed缓存后,此代码段现在可以正常工作; - )

答案 2 :(得分:0)

我有同样的需求,因为Instagram Oembeds在4.4之前在Wordpress中被破坏了。 我意识到提供者的过滤器在主题初始化之前运行,所以如果你想添加这个过滤器,你必须使用插件。这就是我用过的东西

Function3.c' doesn't match the target pattern
Makefile:45: target

所以你必须

1)在插件文件夹中创建一个像instagram-oembed-fix的文件夹 2)创建一个名为instagram-oembed-fix.php的文件 3)复制上面的php代码
4)激活你的插件(在网络中激活网络)
5)通过转到任何帖子并预设“保存”来重新生成oEmbed缓存