1

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  ),
    ) );
4

3 に答える 3

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必要があります。

アップデート:

投稿の保存部分を提案してくれた@Ivan Hanákに感謝します;-)

このスニペットは、投稿を保存することにより、oEmbed キャッシュを更新した後に機能するはずです ;-)

于 2013-10-19T15:26:49.853 に答える
0

InstagramのOembedは4.4より前のWordpressで壊れているため、同じ必要がありました。私が気付いたのは、テーマが初期化される前にプロバイダーのフィルターが実行されるため、このフィルターを追加する場合は、プラグインを使用する必要があるということです。これが私が使用したものです

<?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 キャッシュを再生成します。

于 2015-11-28T14:44:03.987 に答える