Creazy!

WEBエンジニア・ヤガーのテック・ガジェットブログ

Wordpress 小技集

WordPressでstyle.cssを更新したらwp_enqueue_styleでキャッシュクリアする

投稿日:2022年1月28日 更新日:


どうも、ヤガーです。

しばらくWEB技術ネタを投稿していませんが、頻繁に使うテクニックについてはちゃんとブログに残していこうと思います。

企業HPなどを制作する時に、長い間Wordpressが使われていると思いますが私ヤガーも基本的にはWPを使って構築します。案件によって最適なテーマを選択したり、プラグインなどを開発したりしますが多かれ少なかれデザインを調整するのにstyle.cssを編集することになります。モダンなブラウザでは表示速度の高速化のために、一度アクセスしたファイルを一時的に保管し二回目以降は保管されたファイル(キャッシュ)から表示するため表示が早くなるという仕組みがあります。しかし、開発中の場合は頻繁にCSSを編集するためこのキャッシュが邪魔になることが多いため、CSSが編集されたら適宜キャッシュがクリアされるようにします。

確認環境

WordPress 5.9

完成コード

まずは最終的なコードを確認していただきましょう。

function theme_enqueue_styles() {
    wp_enqueue_style( 'style', get_stylesheet_directory_uri() . '/style.css', array(), date("ymdHis", filemtime( get_stylesheet_directory().'/style.css')) );
}
add_action( 'wp_enqueue_scripts', 'theme_enqueue_styles' );

このコードをご利用テーマのfunctions.phpに追記します。
続けて解説をしていきます。

wp_enqueue_style

説明
WordPress が生成したページに CSS スタイルファイルを安全に (キューへ) 追加します。wp_register_style() で予め登録されていれば、そのハンドルを使って追加できます。

via: 関数リファレンス/wp enqueue style – WordPress Codex 日本語版

WPの作法としてスタイルシートをheadに記述する時にwp_register_styleを使うことになっており、それを変更・追加する場合はwp_enqueue_styleを利用します。

使い方

<?php wp_enqueue_style( $handle, $src, $deps, $ver, $media ); ?>

パラメータ

$handle
(文字列) (必須) スタイルシートのハンドルとして使われる名称。特別なケースとして、文字列に ‘?’ という記号が含まれている場合、それより前の部分は登録されたハンドルとして参照され、それより後の部分はクエリストリングとして URL に追加される。
初期値: なし
$src
(文字列|真偽値) (オプション) スタイルシートの URL。例: http://example.com/css/mystyle.css。このパラメータは WordPress がこのスタイルを認識していない場合のみに必要。ローカルのスタイルには URL を直接書き込むべきではない。代わりに plugins_url (プラグイン向け) と get_template_directory_uri (テーマ向け) を使って適切な URL を取得する。リモートのアセットはプロトコルに影響されない URL で指定できる。例: //otherdomain.com/css/theirstyle.css
初期値: 空文字列
$deps
(array) (オプション) このスタイルシートが依存する他のスタイルシートのハンドル配列、つまり、このスタイルシートより前に読み込まれる必要があるスタイルシート。依存関係がない場合は空の配列を指定。
初期値: array()
$ver
(文字列|真偽値) (オプション) スタイルシートのバージョン番号を指定する文字列 (存在する場合) 。このパラメータはキャッシングに関わらず正しいバージョンがクライアントに送信されるようにするために使う。したがって、バージョン番号があってそれがスタイルシートに意味を持つ場合は含めるべきである。
初期値: false
$media
(文字列|真偽値) (オプション) スタイルシートが定義されているメディアを指定する文字列。例: ‘all’、’screen’、’handheld’、’print’。有効な CSS-media-types の全容についてはこちらの一覧を参照。
初期値: ‘all’

解説

まずは、対策前の状態でHTMLソースをみてみましょう。
wp_register_styleで追加されたcssは下記のようなHTMLになっていると思います

<link rel='stylesheet' id='style-css'  href='https://creazy.net/wp/wp-content/themes/creazy/style.css?ver=5.9' type='text/css' media='all' />

これは恐らくテーマの方で、WPのバージョンを自動でCSSのURLにパラメータとして追加し、キャッシュクリアを狙ったものと思います。
こんな感じで定義されているのではないでしょうか。

function theme_enqueue_styles() {
    global $wp_version;
    wp_enqueue_style( 'style', get_stylesheet_directory_uri() . '/style.css', array(), $wp_version );
}
add_action( 'wp_enqueue_scripts', 'theme_enqueue_styles' );

wp_enqueue_styleの第4引数がパラメータになるので、そこにWPバージョンが指定されているのではないかと思います。
しかし、これはWP単位のバージョンなので、テーマのCSSを更新してもバージョンは上がらないため用途にはあいません。

そこで、テーマのバージョンをパラメータに使おうと下記のような例がでてくると思います。

function theme_enqueue_styles() {
    $my_theme = wp_get_theme();
    wp_enqueue_style( 'style', get_stylesheet_directory_uri() . '/style.css', array(), $my_theme->get( 'Version' ) );
}
add_action( 'wp_enqueue_scripts', 'theme_enqueue_styles' );

こうすると、style.cssの冒頭にコメントで定義するテーマバージョンを元にキャッシュクリアしますので、良さそうに思えます。
しかし、堕落したエンジニアの自分からするとテーマバージョンの書き換えを忘れそうだなと思ってしまいます。あとは、テーマのバージョン管理の方針として(特に開発中などは)軽微なCSS修正くらいではバージョン番号を上げたくないことも多いんです。

そこで、style.cssの最終更新日時をみて自動的にキャッシュクリアされるようにします。

function theme_enqueue_styles() {
    wp_enqueue_style( 'style', get_stylesheet_directory_uri() . '/style.css', array(), date("ymdHis", filemtime( get_stylesheet_directory().'/style.css')) );
}
add_action( 'wp_enqueue_scripts', 'theme_enqueue_styles' );

キャッシュクリア用の第4引数が date("ymdHis", filemtime( get_stylesheet_directory().'/style.css')) となっておりstyle.cssの物理パスを引数に filemtime 関数で更新日時を取得しています。これによってバージョン書き換えなどをしなくてもCSSの更新都度キャッシュがクリアされます。

<link rel='stylesheet' id='style-css'  href='https://creazy.net/wp/wp-content/themes/creazy/style.css?ver=220127093026' type='text/css' media='all' />

こういう感じで出力されます。

よくある間違い

function theme_enqueue_styles() {
    wp_enqueue_style( 'style', get_stylesheet_directory_uri() . '/style.css', date("ymdHis", filemtime( get_stylesheet_directory().'/style.css')) );
}
add_action( 'wp_enqueue_scripts', 'theme_enqueue_styles' );

↑第4引数にパラメータを指定したいのに、第3引数に何をいれたら良いかわからず無視してしまっている例。$depsを指定したくない場合は空の array() を入れる必要があります。

function theme_enqueue_styles() {
    wp_enqueue_style( 'style', get_stylesheet_directory_uri() . '/style.css?ver=20220128' );
}
add_action( 'wp_enqueue_scripts', 'theme_enqueue_styles' );

↑第4引数でパラメータを指定できるのに、URLに直接パラメータを追加している例。しかもベタ書き。
これをやってしまうと、CSSを更新するたびにfunctions.phpも更新しなければいけなくなるためよくありません。

function theme_enqueue_styles() {
    wp_enqueue_style( 'style', get_stylesheet_directory_uri() . '/style.css', array(), date("ymdHis") );
}
add_action( 'wp_enqueue_scripts', 'theme_enqueue_styles' );

↑第4引数でアクセスした日時をパラメータに渡し、完全にキャッシュクリアしている例。
この場合、キャッシュが完全にきかなくなってしまうので「開発中のみ指定して本番では変更してください」なんて書いている記事がありましたが、そんなの絶対忘れますからね。

§

というわけで、関数は正しく理解して使いましょう。

-Wordpress, 小技集

執筆者:


comment

メールアドレスが公開されることはありません。

関連記事

MovableTypeにFacebookのOpen Graph protocol(OGP)を対応させる方法

【2012/12/02:追記】 記事本文の最初にでてくる画像URLを抜き出すという目的では、元の正規表現では少々問題があったため修正しました。詳細はMTタグの解説部分のコメントをご確認ください。 ども …

新しいFacebookページにStatic iframe形式でタブを追加する方法

【2011/02/21:追記】 iframe形式を使おうと思っている方は、こちらの記事も参考にしてください。 Facebookページのiframe形式タブに切り替える場合は、バグに注意! 少し前にfa …

Skypeチャットの隠しコマンド /htmlhistory とBookmarkletで簡単レポート作成術

プライベートと仕事の両方で Skype はかなり前から使っていますが、チャットの内容をどうにか別のファイルにエクスポートしたいと思いました。 Skypeチャットは設定で過去の履歴も保存・表示できるので …

no image

nslookupをPHPで実装する簡単なサンプル

唐突な思い付きネタですw nslookupはDNSにドメイン情報を問い合わせるためのコマンドで、IPアドレスからホスト名を取得したり、ホスト名からIPアドレスを取得したりできる仕組みです。 すでに、W …

4マイク+5ヘッドフォンの音声収録機材

完全に自分用の備忘録ですが・・・(汗) Ustreamなどインターネットを使った動画生配信を何度か実施していて、地方からリアルタイムコンテンツを発信する良い媒体だと思っているので、少しずつでもできるこ …

スポンサードリンク

スポンサードリンク