😔

【WordPress】月間280万PVサイト運営時の問題と対応

2024/03/19に公開

本記事の執筆背景

過去に個人でWebサイトを運営時に発生した問題について、反省も兼ねて記事にしました。

サイトの概要

利用技術:WordPress
記事ページ数:10000ページ程度
平均月間PV:約280万PV程度(振れ幅的には250万~300万弱くらい)


GAデータ

上記GAキャプチャは、問題が発生した次月です。
トレンド的な突発的なアクセスというよりは、日次平均10万PV弱くらいあるサイトです。
利用サーバは、サーバ会社さんに迷惑になる可能性があるので名前は伏せますが、月1000円くらいのプランです。

困ったこと①:サイト表示が遅くなった

記事コンテンツやアクセスが増えていくにつれて、サイトの描画速度が遅くなりました。
ブラウザから表示速度を計測した結果、平均8~10秒程度かかっていました。(酷い時は15秒以上)
個人的にサイト表示に5秒以上かかるサイトは、ユーザービリティが最悪だと考えています。
入力したURLのページ速度を測定しサイト評価ができる「Google PageSpeed Insights」で計測した際も評価が不合格となり、大幅にスコアが低いことが見てわかりました。

サイトの速度問題は、基本的にサーバの性能を上げれば解決しますが、収益目的のサイトではなかったためサーバ代をこれ以上かけたくありませんでした。
また、エンジニアの端くれにも関わらず、システム構成を調査することなくお金で解決するのはよくないと考え、原因を調査しサイトを見直しました。

結果が下記となります。

プラグインの選定ミス

本サイトでは、20個のプラグインを使っていました。
その中でも「WordPress Popular Posts」が本サイトの運用に合いませんでした。

WordPress Popular Postsとは


引用 https://wordpress.org/plugins/wordpress-popular-posts/
人気記事を表示するためのプラグインです。
PV数やコメント数で記事の人気度を測定し、その情報を元にリストを生成できます。

「WordPress Popular Posts」は、投稿を人気順にするためにDBクエリを実行しています。
サイト上に多くの投稿やページがある場合、DBに大きな負荷をかけ、パフォーマンスを低下させます。
プラグインに搭載されているキャッシュ機能を利用してみたのですが、多少描画速度が速くなるものの結局表示に5秒以上かかかるため、利用を止めました。

結果的に人気記事の表示を止める結果となりましたが、サイトの表示速度が格段に速くなったので、ユーザー離脱率が下がりサイト内の回遊率が高まりました。
仮に人気記事ランキングがどうしても必要な場合、下記のような外部システムを用いたアクセス解析を行うと良いでしょう。

  • Simple GA Ranking
  • Jetpack(追加サイドバーウィジェット)

画像の最適化をしていなかった

特に表示が遅いページの共通点を調査した結果、1記事に数十枚以上画像を掲載していたページの表示が遅いことが判明しました。
画像の表示でサーバーへ負荷がかかっているのだと考え、画像圧縮や最適化ができるプラグインを探し、結果的に「EWWW Image Optimizer」を採用しました。

EWWW Image Optimizerとは


引用 https://ja.wordpress.org/plugins/ewww-image-optimizer/
画像を自動的に最適化し、ファイルサイズを減らすプラグインです。

画像の最適化でファイルのサイズが小さくなると、サーバーからクライアント(ユーザーのブラウザ)へのデータ転送量が減少します。これにより、一度に多くのユーザーがアクセスしても、サーバーにかかる負荷が軽減されます。
また、訪問者がページをロードする際に必要なデータ量を減少させることもできますので、通信速度が遅い(モバイルデータなど)を使用しているユーザーに対しての利便性も向上します。

また、多くの画像がPNG形式となっておりました。
同じ画像内容であれば、JPEG (またはJPG) 形式の方が一般的にファイルサイズが小さくなるため、ページの表示スピードが速くなる可能性が高いです。
そのようなこともあり、できる範囲で画像の置き換えも実施しました。

結果的に画像の最適化を行うことで、1~2秒程度表示が早くなりました。

困ったこと②:大量のスパムが発生した

記事コメント欄に大量のスパムが発生しました。
WordPressのスパム対策には、「Akismet Anti-Spam」を使うのが一般的かと思います。

Akismet Anti-Spamとは


引用 https://ja.wordpress.org/plugins/akismet/
Automattic社によって開発されたブログのスパムコメントやトラックバックを自動的にフィルタリングするプラグインです。
Automattic社はWordPress.comの企業です。

Akismet Anti-Spamは、個人利用であれば無料で使えるプラグインなのですが、サポートページに以下の記載があります。

If your site has advertising or affiliate links, sells products or services, solicits donations or sponsorships, or is in any way related to a for‑profit business or educational organization — your site is considered commercial.
引用 https://akismet.com/support/getting-started/free-or-paid/

翻訳すると「サイトに広告やアフィリエイトリンクが含まれている場合、製品やサービスを販売している場合、寄付やスポンサーシップを募っている場合、または何らかの形で営利ビジネスや教育組織に関連している場合、あなたのサイトは商用とみなされます。」とあります。

本サイトでは上記に該当する機能があったため、無料では使えませんでした。
とはいえ有料版を使うまででもないかと思いましたので、個人で対応しました。

コメントに対する対応

WordPressのスパムコメント対応は、「設定」→「ディスカッション」から可能です。
基本的には下記に特定のワードを入れ込めば、スパム対応できます。
また、httpを指定することで怪しいサイトURLのコメントを制限することも可能です。
WordPressのコメントは基本的にIPアドレスを含みますので、IPアドレスを指定すると特定ユーザーのコメントも制限できます。

ディスカッションの画面表示

稀に標準のコメント制限で防げないコメントがあります。
例えば、IPが特定できないかつ、コメントに区切り文字を入れて回避してくるパターンです。
そのようなコメントの一部を防ぐ方法として、下記のように正規表現で文字列をブロックします。

function.php
function block_comment($comment_data) {
  // コメントを制限する正規表現
  $pattern = '/制限したいキーワード/';

  // パターンにマッチするかチェック
  if (preg_match($pattern, $comment_data['comment_content'])) {
    // マッチした場合はエラーメッセージを設定
    wp_die('制限キーワードなのでコメントできません');
  }
  return $comment_data;
}
// コメントが投稿前に関数をフック
add_filter('preprocess_comment', 'block_comment');

上記をfunction.phpに追加することで、使用することができます。

まとめ

上記が困ったこととその対策になります。
自分的には「しっかり頭を使って簡単にお金で解決しない」を目標としていたので、徹底できてよかったです。

思い出したことで追記できることがあれば、本記事に追記をしていこうと思います。

Discussion