wp_cronを利用してサイト表示速度を上げるアイデア
こんにちは、webエンジニアのゾノ( @ozonosho )です。
今回の記事ではWordPressでwp_cronを利用してサイト表示速度を上げるアイデアを紹介したいと思います。
近年、サイト表示速度はますます重要性を増しています。
そのためGoogleの「PageSpeed Insights」を利用して速度改善をおこなっている方も多いと思います。
しかし、どんなに画像を軽量化しても、どんなにJSをページ表示後に読み込ませても、ページ表示に必要なデータを読み込む処理が遅ければ改善されない点もあるんですよね。
1つ例を挙げてみます。
サイドバーに人気ランキングを表示しているサイトの場合
WordPressはデータベースの構造上、記事のテーブル(wp_posts)に独自の情報を持たせることが難しいです。
その都合、閲覧数による人気ランキングを作りたいと思った場合、その元となる「閲覧数」のデータはカスタムフィールド(wp_postmeta)に持たせることになります。
そうなると人気ランキングを取得・表示するためにはカスタムフィールドの値でソートする必要が生じるわけですが、、、カスタムフィールドの値でソートするのは速度が遅くなる原因になります。
これはDBの構造上、限界がある感じです。
もしサイドバーに人気ランキングを掲載しているサイトの場合、サイト内の全ページがその影響を受けることになるので改善できるならするに越したことはないですよね。
そんなわけで紹介するのが下記の考え方です。
リアルタイムに集計する必要がないデータは定期処理で集計・保存する
先ほどの人気ランキングを例にあげると、(閲覧数の細かい数字まで見せていなければ)今この瞬間の正確な閲覧数を元に1-10位の記事が表示されていなくても問題ない気がしませんか?
たとえば15分おきにアクセス数が集計されて15分おきに正しい人気ランキングに更新されていれば問題ない、と僕は感じます。
その考え方を良しとするなら下記の表示方法を選ぶことができます。
- 提案したい表示方法
-
- ランキングはwp_cronを利用して15分おきに集計する
- 集計結果はランキングのみを扱うテーブルを用意してそこに保存する
- サイトに人気ランキングを表示する際にはランキングのみを扱うテーブルからデータを取得して表示する
この方法を取れば、読み込むデータを大幅に減らすことができ(ランキング結果のテーブルとwp_postsの結合のみ!)、仮に1秒かかっていた処理でも一瞬でデータを取得・表示できるようになります。
この方法は複数のカスタムフィールドを条件にしてデータを取得する場合にも有効です。
カスタムフィールドは条件の数だけテーブルを結合させないとデータを取得できないケースが多く、その方法だと時間がかかるため、定期処理で代用できればサイト表示速度は劇的に早くなります。
おわりに
以上、今回の記事でwp_cronを利用してサイト表示速度を上げるアイデアを紹介させていただきました。
当サイトではWordPressのカスタマイズ依頼を請け負っています。実現したい機能・要望がある方はぜひ下記ページよりご相談ください。