Как я могу отфильтровать список поставщиков WordPress oEmbed? Моя цель – разрешить только Twitter и Youtube.
EDIT: Могу ли я сделать что-то вроде этого?
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 ), ) );
Существует встроенная функция 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');
EDIT 2
Я заглянул в него, и я узнал, что вы можете использовать фильтр oembed_providers
точно так же, как он используется в конструкторе класса. Поэтому использование дополнительных функций wordpress, которые снова попытаются потребовать файл класса и создать экземпляр объекта singleton, бесполезно, когда вы можете сделать это в одной функции.
(Несмотря на то, что он работает, я до сих пор не использую этот фильтр: -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' );
Если предоставленный вами фильтр ( 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 Hanák, за предложение сохранить сообщение 😉
Этот сниппет теперь должен работать после обновления кэша oEmbed, сохраняя сообщение 😉
У меня была такая же потребность, как и instagram Oembeds в WordPress до 4.4. я понял, что фильтр для провайдеров запускается до того, как ваша тема инициализирована, поэтому, если вы хотите добавить этот фильтр, вы должны использовать плагин. Это то, что я использовал
<?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-fix в папке плагина
2) создать файл с именем instagram-oembed-fix.php
3) скопировать код php выше
4) активируйте свой плагин (сеть активируется в сети)
5) регенерировать кеш oEmbed, перейдя на любую запись и задавая «Сохранить»,