奈良県でソフトウェア開発・Webサイトの運営をしているフリーランスのエンジニアです

ロジカルアーツ研究所

WordPress

WordPressでYouTubeの自動埋め込み機能を無効化する方法

投稿日:

クライアントさんから相談を受けて初めて知ったのですが、最近のWordPressにはYouTubeの動画URLを記事内に貼り付けただけで自動的にiframeの埋め込みタグに変換してくれる機能があるんですね。

一見便利なようではありますが、時としてこれが困ることもあります。たとえば記事内に大量の動画URLを貼り付けた場合、それがすべて動画ビューアーとして埋め込まれてしまってページがものすごく重くなってしまう可能性があります。

これを回避する方法はないものかと思ってWordPressの設定をすべて調べてみましたが、そのような項目は見つかりませんでした。どうもWordPressに初めから組み込まれていて普通の方法では回避できないようです。

でもネットで検索すると必ず解決方法が出てくるんですね(笑)。要するにこれはWordPressが記事をwebに展開する前にフィルターをかけているわけで、それを無効にしてやればいいわけです。

YouTubeの自動埋め込み機能を無効にするにはテーマファイル内にあるfunction.phpに次の1行を追加するだけです。必ず<?php~?>の間のどこかに入れて下さい。

remove_filter( 'the_content', array( $GLOBALS['wp_embed'], 'autoembed' ), 8 );

remove_filter()という関数はadd_filter()の逆の働きをするもので、'the_content'というフィルターフックに作用して'autoembed'というフィルターを取り除きます。function.phpはテーマに固有のものですから、他のテーマに変更した場合は改めて追加し直さなければならないことに注意して下さい。

カスタムフィールドに対しても適用する方法

通常の記事本文であれば上の方法で解決できたのですが、Advanced Custum Field(ACF)を利用してカスタムフィールドを設定している場合、その内容に対してはYouTubeの自動埋め込み機能がそのまま効いてしまいます。どうもカスタムフィールドの場合は上のremove_filter()が適用されるより前の段階で出力してしまうようです。

これを回避するのは不可能かと思っていったんあきらめかけましたが、やはりネット上にはどこかに情報が転がってるものですね(笑)。英語ですが、テンプレートのカスタムフィールドの内容を出力する部分(ACFの場合はget_field()やthe_field()という関数)を次のように書き換えればよいという情報が見つかりました。

$value = get_field('field_name', false, false);
echo apply_filters('the_content', $value);

'field_name'の部分は実際のフィールド名に置き換えて下さい。ここでやっていることは、get_field()の第3引数をfalseにすることにより、いったん整形なしでカスタムフィールドの内容を$valueという文字列に取り出します。さらにその文字列に対してapply_filters()で'the_content'フィルターを適用させることにより、通常の記事本文と同じように整形された文字列として出力されるわけです。そこではもちろん上で設定したremove_filter()も生きています。

ややトリッキーな方法ですが、これ以外に解決方法はないようです。この方法でも問題なく通常の記事本文として出力されていますので、悩んでいる方はお試し下さい。

-WordPress

Copyright© ロジカルアーツ研究所 , 2024 All Rights Reserved Powered by STINGER.