WordPressは数クリックするだけ誰でも簡単に膨大な量のプラグインを使って自分好みのブログサイトを簡単に作れるとても便利なCMS。
しかし巷では「プラグインを入れると重くなる」というしっかりした確証も無い噂話が流れているのが実情。
とある解説サイトには「テーマで用意されている機能なら重くならないが、同じような機能のプラグインを入れると重くなる」という根も葉もないデマが平然と書かれていました。
これは明らかな嘘です。
そこで今日は実際に処理時間を計測し、「本当にプラグインを入れる事で処理速度が遅く、いわゆる重い状態になるのか」を検証して行きます。
WordPressはプラグインを入れると重いって本当?
「プラグインを入れれば入れただけ重くなる(処理速度が遅くなる)」は(ある意味)本当です。
1つプラグインを入れるだけでそのプラグインの中身が実行される、考えなくても遅くなるのは当然ですよね。
しかしプログラムはものすごい速さで実行されるので、「プラグインを入れれば重くなる」のは通常そこまで体感できないレベルな事がほとんどです。
ただし複雑な処理を行っていたり、外部のサービスと連携していたりする場合は重くなりがちです。
例えばGoogle AdSenseやGoogle Analyticsの読み込み、Google Mapで地図を表示する時にAPIを使ってデータのやり取りをするようなものはどうしても重くなりがち!
プラグインの処理内容によって異なる
誤解してほしくないのですが、常用されるレベルで人気のあるプラグインの多くは1秒以下のコンマ何秒という速さで実行されます。
適切にチューニングされていれば、例えばユーザーがログインしている場合のみ必要なプラグインは一般読者(未ログインユーザー)がアクセスする記事ページでは実行されません。
下記はWordPressのプログラムを書く場合、判定を行って無駄を防いでいるという一例です。
if ( is_user_logged_in() ) {
// is_user_logged_in()はログイン中のユーザーか否か判定する
// そのためログインしていない場合は一切処理が行われない
}
if ( is_admin() ) {
// is_admin()は管理画面か否かを判定する
// 管理画面ではなく記事ページや固定ページ等の場合は一切処理が行われない
}
このようにきちんと処理を分岐し、必要ない場面では余計なことをしない(=プログラムを実行しない)実装をすることで「プラグインを使ったら重くなる」という事態をなるべく避けるように作られています。
例えば管理画面のみで必要な機能だけを提供している場合、is_admin()
で管理画面か否かを判定してフロントページ(記事や固定ページ)の場合はプラグインの中身まるごと処理が行われないようにするというようなチューニングを行っています。
テーマもプラグインも作りは全く一緒
難しい話はともかく、テーマやプラグインは主にPHPというプログラミング言語で書かれています。
使っている言語が同じなのでテーマであろうがプラグインであろうがやってる事は全く一緒のはず。
なのにテーマ遅くならない、プラグインは遅くなるっておかしな話だと思いませんか?
そこで全く同じ処理をテーマとプラグインにそれぞれ実装して、本当に違いが出るかどうか試してみましょう。
ちなみにブロックエディター(Gutenberg)は主にJavaScriptというプログラミング言語のReactというライブラリで書かれているよ!
今回はとりあえずPHPに的を絞っています!
WordPressで10億回繰り返す重い処理をテーマとプラグインで実装
全く同じ処理を行った時、果たしてテーマとプラグインで差が出るのか?という検証を行います。
共通条件として以下の環境で実験しました。
サーバー | ConoHa WING |
WordPressのバージョン | 5.8 |
使用テーマ | THE SONIC |
使用プラグイン | 無し |
キャッシュ | 未使用 |
使用プラグインは無しとなっていますが、プラグインで実験する時のみ今回作成する実験用プラグインを使用します。
その他のカスタマイズ等は一切なし、素の状態のWordPress5.8とTHE SONIC環境下です。
なおConoHa WINGで用意されているキャッシュ機能は全て停止して計測しました。
今回使用するコードは以下のGitHubリポジトリで公開しています。
GitHub:braveryk7/wordpress-theme-vs-plugin
すぐに結果を見たい場合、「結果」から読み進めてください。
テーマ
テーマでの実装はfunctions.phpに以下のコードを追加して実験してみました。
functions.phpはテーマを構成するファイルの一つです。
function calcProcessTime() {
// ログインしているユーザーにのみ実行されるよう判定
if ( is_user_logged_in() ) {
// 開始時刻の取得
$start = microtime( true );
// 値が0の変数を用意
$num = 0;
// +1を10億回繰り返し
for ( $i = 0; $i < 1000000000; $i++ ){
$num++;
}
// 開始と現在の時間差(=処理にかかった時間)を求める
$time = ( microtime( true ) - $start );
// console.logに結果を出力
echo '<script>console.log(' . json_encode( round( $time, 3 ) ) . ');</script>';
}
}
add_action( 'init', 'calcProcessTime' );
10億回足し算をして、その処理の開始時間と終了時間を計測してconsoleに出力するという簡単なプログラムです。
小数点以下は3桁もあれば十分なので、小数点4桁目を四捨五入しています。
WordPressでも使いやすいようにconsole.logで出力しています!
プラグイン
テーマと全く同様の機能を持ったプラグインを作成しました。
<?php
/**
* Plugin Name: Calc Process Time
* Plugin URI: https://www.braveryk7.com/
* Description: 10億回足し算をして処理速度をconsoleに出力するプログラム
* Version: 1.0.0
* Author: Ken-chan
* Author URI: https://twitter.com/braveryk7
*/
function calcProcessTime() {
// ログインしているユーザーにのみ実行されるよう判定
if ( is_user_logged_in() ) {
// 開始時刻の取得
$start = microtime( true );
// 値が0の変数を用意
$num = 0;
// +1を10億回繰り返し
for ( $i = 0; $i < 1000000000; $i++ ){
$num++;
}
// 開始と現在の時間差(=処理にかかった時間)を求める
$time = ( microtime( true ) - $start );
// console.logに結果を出力
echo '<script>console.log(' . json_encode( round( $time, 3 ) ) . ');</script>';
}
}
add_action( 'init', 'calcProcessTime' );
プラグインとして認識されるためのお作法を追加していますが、コメントが書いてあるだけでプログラムの処理内容には全く差はありません。
プラグイン本体は以下からダウンロード可能です。
結果
それでは結果を見てみましょう。
今回は誤差を考慮してそれぞれ10回測定し、平均値を求めることにします。
回数 | テーマ | プラグイン |
---|---|---|
1回目 | 2.857秒 | 2.863秒 |
2回目 | 2.839秒 | 2.884秒 |
3回目 | 2.862秒 | 2.868秒 |
4回目 | 2.887秒 | 2.869秒 |
5回目 | 2.881秒 | 2.813秒 |
6回目 | 2.825秒 | 2.841秒 |
7回目 | 2.867秒 | 2.871秒 |
8回目 | 2.860秒 | 2.870秒 |
9回目 | 2.862秒 | 2.866秒 |
10回目 | 2.884秒 | 2.863秒 |
平均値 | 2.862秒 | 2.861秒 |
結果はテーマ実装が2.862秒、プラグイン実装が2.861秒で0.001秒差でプラグインが早い結果となりました。
どう見ても誤差!
WordPressのテーマとプラグイン、同じ機能なら重さの差はない
全く同一の機能ならテーマでもプラグインでも差は一切ないと分かりました。
そりゃそうですよね、全く同じことをしているのに大きな差が生まれる方がどうかしてます。
という事は巷でまことしやかに語られていた「テーマなら良いけどプラグインは遅い」説は嘘と証明できました。
条件によってはWordPressプラグインが重くなるケースがある
ここではっきりさせておきたいことが「条件次第ではプラグインがボトルネックになる」点です。
ただしこれはテーマ側にも言えることで、「プラグインだから重い」という理由にはなりません。
プラグインそのものが余計な処理をしているケース
テーマに用意されている機能に比べ、プラグインがプログラムの中で時間の掛かるような処理を実装していたケースです。
原因についてはPHPを読める人でないと解読できませんが、プログラムの内容によっては処理速度に影響が出てしまうことがあります。
例えば特定ページでしか使わないプラグインなのに、全ページで読み込まれていて表示速度に影響しているというような話はよく聞きますよね。
テーマとプラグインが重複して同様の処理をしているケース
テーマとプラグインで似たような機能を実装しており、全く同じ処理を両方でやってしまうケースです。
テーマ側でその機能を使わない、もしくは停止できれば機能が重複することも無いと思います。
逆に停止することができない場合、ボトルネックになってしまう可能性はあります。
最近のテーマはキャッシュ機能を内包していることが多く、テーマ側のキャッシュ機能とプラグインで入れたキャッシュ機能がバッティングしているなんてことも・・・。
WordPressで画像遅延表示(lazy-load)が実装された時もテーマとプラグインの同様の機能とバッティングして画像が表示されない!って声がよくありましたよね。
テーマの実装に依存した処理
テーマに依存した処理の場合、テーマ側で上手にチューニングされて処理速度が早くできているケースです。
とはいえWordPressで想定しうるプログラムがそこまでテーマ固有の実装に依存することは考えにくいので、相当に稀なケースであると思います。
WordPressプラグインは必要なものをちゃんと選ぼう
先述したように、プログラムの中身によってはテーマであれプラグインであれ重くなるケースはあります。
だから過度に「プラグイン=重いんだ!」という先入観から読者のユーザー体験向上のために必要な機能を諦めるというのは大いに間違いです。
本当に必要であれば100個プラグインが入っていても構わないです、100個入っているから100%重くなるとは限りません(もちろん個数が増えれば重くなる可能性はあります)。
当然重くなる原因になるプラグインも存在するので、きちんと吟味して利用することが重要です。
最新のWordPressに対応されているかもチェックする
長らく更新されていないプラグインは、セキュリティ面の不安もありますがそもそも古い書き方をしていて重くなる原因を作っている可能性があります。
プラグインが最新のWordPressに対応しているかどうか確認してからインストールするよう心がけましょう。
「WordPressはプラグインを入れると重い」の誤解を解く まとめ
今回の記事はなんとなく「プラグイン=重い!」の誤解を解きたいと思って執筆しました。
WordPressはプログラムやパソコンに詳しくない方でもポチポチ簡単に始められる一方、多機能さの裏側にある話はブラックボックスになってしまっています(もちろんプログラムが読めれば読み解けるんですが・・・笑)。
だからこそ過度にプラグインを使用することを怖がらないでほしいです。
探せば日本語に翻訳こそされていませんが海外製の便利なプラグインやまだまだマイナーですが良いプラグインがたくさん存在します。
「いややっぱりこのプラグインは重いな」と思ったらいつでも停止することができる点がプラグインのよい点。
プラグイン=悪だ!と決めつけずに、WordPressの素晴らしいプラグインシステムを使って頂けたら嬉しいです!
コメント