2020.03.17

WordPressでEmbed機能(ブログカード)を無効化しても効かない時の対処法

こんにちは、webエンジニアのゾノ( @ozonosho )です。

今回のブログではWordPressでEmbed機能(ブログカード)を無効化しても効かない時の対処法を紹介したいと思います。

Embed機能は、記事本文にURLを書くだけでリンク先の記事が自動でブログカードになる機能です。WordPressのバージョン4.4から搭載されました。

基本的には便利な機能なのですが、スタッフやユーザーが投稿できるようなサイトだとURLがなんでもかんでもブログカード化されて困ることもあるんですよね。しかも、強制搭載なので管理画面から機能をOFFにすることもできないという…。

そんなわけでEmbed機能を無効化するための方法を調べたのですが、出てきた記事ほぼすべてに掲載されていたのが下記のコード。

//Embed機能を無効化
add_filter('embed_oembed_discover', '__return_false');
remove_action('parse_query', 'wp_oembed_parse_query');
remove_action('wp_head', 'wp_oembed_remove_discovery_links');
remove_action('wp_head', 'wp_oembed_remove_host_js');

おそらくみんなこのコードで解決すると思うのですが、なぜか僕は解決しませんでした。カスタム投稿タイプを利用していたことが原因かもしれません。

何をしても無効化されなかったので、、、発想を変えて、本文内にベタ打ちのURLを見つけたら強制的にリンク化する(=aタグにする)ことで解決しようと思いました。

そのために作成した関数が下記になります。

//渡されたテキスト内のURLを強制的にaタグ化する
function url_to_link($body, $link_title = null){
    $pattern = '/(href="|src=")?https?:\/\/[-_.!~*\'()a-zA-Z0-9;\/?:@&=+$,%#]+/';
    $body = preg_replace_callback($pattern, function($matches) use ($link_title) {
        if (isset($matches[1])) return $matches[0];
        $link_title = $link_title ?: $matches[0];
        return "<a href=\"{$matches[0]}\">$link_title</a>";
    }, $body);
    return $body;
}

この関数を本文出力時の処理に加えてあげれば見事解決できました。

Embedの無効化が効かない際の解決には意外と苦戦したので、同じような症状で困っている方の参考になれば幸いです^^

当サイトではWordPressのカスタマイズ依頼を請け負っています。実現したい機能・要望がある方はぜひ下記ページよりご相談ください。

あなたのサイトに理想の機能を実装!WordPressカスタマイズサービス

本サービスはあなたのWordPressサイトに理想の機能を実装するサービスとなります。 どのような機能・要望でも実現可能です! Wo......

→この記事を読む