Intereting Posts
выберите только один узел и перейдите на php wp_mail () в цикле, только отправка на последний адрес Почему, если я зарегистрировался на своем веб-сайте как зарегистрированный пользователь, я не могу получить доступ к другим страницам после установки правил сеанса? cakephp 3 Cron Job не работает в cpanel Новый пользовательский блок Magento PHP: Правильный способ объявить переменную перед использованием в цикле Корреляция URL-адресов PHP, сохраняющая недопустимые URL-адреса Как я могу заставить функцию php cos вернуть правильное значение? Безопасный запрос ajax GET / POST для сервера mysqli_connect (): php_network_getaddresses: getaddrinfo не удалось: имя или услуга неизвестны Переадресация PHP на основе IP и referrer PHP file_exists () для URL / robots.txt возвращает false Многомерный список каталогов с рекурсивным итератором Избегание ошибок при попытке загрузить недоступный файл Почему я получаю «неопределенную переменную» в представлении Laravel?

Фильтрация списка WordPress oEmbed

Как я могу отфильтровать список поставщиков 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, перейдя на любую запись и задавая «Сохранить»,