如何过滤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 ),
) );
答案 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缓存