【WordPress】投稿埋め込み(embed)のキャッシュタイミングと無効化する方法
更新日:2023/03/09
WordPressの投稿埋め込み機能は、取得したデータをキャッシュします。
テーマやプラグインでこの機能をカスタマイズしていると、キャッシュが効いていることで表示が変わらないなどの問題に直面します。
そこで、投稿埋め込みのキャッシュについてと、キャッシュの無効化についてお伝えします。
embedのキャッシュタイミング
WordPressはWebページの生成時に、投稿内容から投稿埋め込みの対象となるURLを抽出します。
その後、抽出したURLにアクセスして投稿埋め込み情報をダウンロードします。
しかし一般的には、同じURLに複数回アクセスすると同じ内容が返ってきます。
そんな状況で、Webページの表示のたびに同じURLにアクセスするのは非効率です。
そこで、最初の一回だけ情報をダウンロードして、その内容をキャッシュ(保存)しておきます。
二回目からは、保存した内容を使用します。
ただし内容が変化している可能性を考慮して一定時間が経過したら、もう一度アクセスして情報をダウンロードして、その内容をキャッシュします。
なお、内部URLと外部URLの区別なくキャッシュされます。
embedのキャッシュの内容
投稿埋め込みを行うとWebページにブログカードが表示されます。
しかし、キャッシュされるのはブログカードではありません。
対象のサイトがWordPressの場合、次のようなhtmlデータがダウンロードされされます。
<blockquote class="wp-embedded-content" data-secret="YpMtqNvivc">
<p>
<a href="https://ドメイン名/?p=1">ページタイトル</a>
</p>
</blockquote>
<p>
<iframe class="wp-embedded-content" sandbox="allow-scripts" security="restricted" style="position: absolute; clip: rect(1px, 1px, 1px, 1px);" title="ページタイトル" src="https://ドメイン名/xxxx/embed/#?secret=hZji9OrrtW#?secret=YpMtqNvivc" data-secret="YpMtqNvivc" width="600" height="338" frameborder="0" marginwidth="0" marginheight="0" scrolling="no">
</iframe><br />https://ドメイン名/?p=1
</p>
ダウンロードされたデータはキャッシュ後に、Webページに出力されます。
見るとわかりますが、これはブログカードを構成するものではありません。
実際に表示されるブログカードは、ブラウザ上でiframeにより呼び出されます。
投稿埋め込み機能の仕組みついては、次のページを読んでください。
embedのキャッシュ時間
投稿埋め込み情報のキャッシュ後、情報を再読み込みするまでの時間をTime To Live(TTL)と呼びます。
日本語にすると有効期間です。
TTLの有効化
有効期限が規定で決まっていますが、実際は一度キャッシュすると以降はそのデータのみを使用し続ける設定になっています。
TTLを有効にするには、次のコードを記述します。
add_filter( 'init' , function( ){
global $wp_embed;
$wp_embed->usecache = false; // キャッシュ強制の無効化
});
WordPressは有効期間が切れていても$wp_embed->usecacheがtrueなら、キャッシュを返すようになっています。
そこで、$wp_embed->usecacheをfalseにすることで、有効期限だけを判定基準にできます。
既定のTTL
embedキャッシュ有効期間は、規定値で1日です。
WordPress内部では、DAY_IN_SECONDSという定数が使用されます。
この定数の値は86400で、一日の秒数に相当します。
TTLの変更
TLの変更は、oembed_ttlフィルターでおこないます。
add_filter( 'oembed_ttl' , function( $ttl, $url, $attr, $post_ID ){
return 60 * 60; // 一時間の秒数
},10,4);
このコードはTTLの有効化を行っていることが前提です。
embedキャッシュの無効化
キャッシュの無効化は、oembed_ttlフィルターで0を返します。
コード例
add_filter( 'oembed_ttl' , function( $ttl, $url, $attr, $post_ID ){
return 0; // TTLを0にセット
},10,4);
このコードはTTLの有効化を行っていることが前提です。
内部URLのみキャッシュ無効
応用編です。
外部URLは既定の動作をおこない、内部URLのみキャッシュ無効にしてみます。
add_filter( 'oembed_ttl' , function( $ttl, $url, $attr, $post_ID ){
global $wp_embed;
$home_url = get_home_url(); // 自サイトのホームURLを得る
// 対象URLと自サイトのホームURLを先頭から比較
if ( 0 !== strncmp($url, $home_url , strlen( $home_url)) ){
// 一致しない → 外部URLである
$wp_embed->usecache = true; // 強制キャッシュを規定値に
return $ttl; // TTLは変更しない
}
$wp_embed->usecache = false; // 強制キャッシュオフ
return 0; // TTLを0にセット
},10,4);
このコードはキャッシュ機能のオンオフを行っているので、TTLの有効化のコードは必要ありません。
embedキャッシュのデータベース仕様
テーマやプラグインの動作テストを行う時は、キャッシュを無効にするよりもデータベース上のキャッシュデータを削除した方が手っ取り早いです。
embedキャッシュはpostmetaテーブルに登録されていて、URL毎に二つのレコードが使用されます。
対象のレコードは meta_keyフィールドの値が次の文字列で始まります。
'_oembed_time_' : キャッシュした時刻(秒数)
このキーは後に、URLといくつかのアトリビュートから得たハッシュ値が続きます。
データ削除は、これらをキーとして行うといいでしょう。
更新日:2023/03/09
関連記事
スポンサーリンク
記事の内容について
こんにちはけーちゃんです。
説明するのって難しいですね。
「なんか言ってることおかしくない?」
たぶん、こんなご意見あると思います。
裏付けを取りながら記事を作成していますが、僕の勘違いだったり、そもそも情報源の内容が間違えていたりで、正確でないことが多いと思います。
そんなときは、ご意見もらえたら嬉しいです。
掲載コードについては事前に動作確認をしていますが、貼り付け後に体裁を整えるなどをした結果動作しないものになっていることがあります。
生暖かい視線でスルーするか、ご指摘ください。
ご意見、ご指摘はこちら。
https://note.affi-sapo-sv.com/info.php
このサイトは、リンクフリーです。大歓迎です。