WordPressサイト構築の注意点チェックリスト(随時更新)
Contact Form 7 を入れたら SMTP も入れる、から始まる WordPress 構築のチェックリスト。画像・パフォーマンス・セキュリティ・SEO・AIO最適化・本番移行・運用まで、毎回つまずくところを一箇所にまとめています。気づいた点を随時追記していきます。
WordPressでサイトを作るとき、毎回同じところでつまずく。手が覚えているつもりでも、案件が変わって半年空くと、確実にどれかを落とす。
このページは、そういう「毎回確認すべきこと」を一箇所に集めた作業メモです。気づいた点があればその都度ここに追記していきます。完成した記事というより、育てていくチェックリストとして扱ってください。
まず、Contact Form 7 を入れたら SMTP も入れる
これを最初に書くのは、一番よく起きて、一番気づきにくいからです。
フォームは設置した。テスト送信もした。管理画面には「ありがとうございます」と出る。なのにメールが届かない、あるいは数週間後に「問い合わせが1件も来ていない」と言われる。原因はたいていここです。
なぜ PHP の mail() では届かないのか
Contact Form 7 は、初期状態では PHP の mail() 関数で送信します。このとき送信元はサーバーになりますが、ドメインの SPF レコードにはそのサーバーが登録されていないことがほとんどです。
受信側から見ると「このドメインを名乗っているのに、送ってきたサーバーは許可リストにない」という状態になり、迷惑メールに落ちるか、そもそも受け取ってもらえません。Gmail や各キャリアのメールは特に厳しく、送信は成功しているのに届かないという一番やっかいな形で失敗します。
やること
- WP Mail SMTP などのプラグインを入れて、送信を実際のメールサーバー経由に切り替える
- 使うのは、そのドメインのメールアカウント(
info@example.comなど)か、SendGrid・Amazon SES などの送信サービス - ドメイン側に SPF / DKIM / DMARC を設定する。SMTPを入れてもここが未設定だと結局落ちる
- Flamingo を入れて、送信内容をデータベース側にも保存する。メールが届かなかったときの保険になる
Contact Form 7 側の落とし穴
プラグインを入れただけでは終わりません。メールタブの設定でよくやる事故があります。
- 送信元(From)に、問い合わせてきた人のメールアドレスを入れない。
[your-email]を From に入れる設定をよく見かけますが、これは他人のドメインを名乗る形になるため、SPF/DKIM に一致せず迷惑メール判定の直接の原因になります - From はサイトのドメインのアドレスに固定し、返信先(Reply-To)に
[your-email]を入れる。これで受信箱から普通に返信できます - 自動返信メール(メール2)を使う場合も同じ。宛先だけが変わります
- 添付ファイルを受け取る設定にしているなら、サーバーのメール送信サイズ上限も確認する
テストで確認すること
送信テストは1箇所では足りません。
- Gmail
- キャリアメール(docomo / au / SoftBank)
- クライアントが実際に使う受信先(Outlook、独自ドメインのWebメールなど)
それぞれで、迷惑メールフォルダも含めて届いているかを見ます。自動返信を設定しているなら、送信者側にも届いているかを確認します。
以下は、公開前に一通り見るチェックリストです。案件によって不要な項目もありますが、「見た上で不要と判断した」状態にしておくのが目的です。
画像
| チェック項目 | 対応 |
|---|---|
| WebP / AVIF で書き出す | 元画像のまま置かない。変換プラグインを使うか、書き出し時点で対応する |
alt 属性を入れる | 装飾目的の画像は alt="" にする。「画像」「写真」のような中身のない alt を書かない |
width / height を入れる | CLS(レイアウトのずれ)対策。テーマ側で出力バッファを使って一括付与する手もある |
| ファーストビュー外は遅延読み込み | loading="lazy" を付ける |
| LCP画像は lazy から除外する | ファーストビューの主役画像には fetchpriority="high" と decoding="async" を付け、lazy は付けない |
srcset / picture で出し分ける | 端末幅に対して大きすぎる画像を配らない |
loading="lazy" を全画像に一括で付けるプラグインは、ファーストビューの画像まで遅延させて LCP を悪化させることがあります。付けるなら除外設定を確認してください。
HTML品質
| チェック項目 | 対応 |
|---|---|
| DOCTYPE宣言 | <!DOCTYPE html> を先頭に |
| lang属性 | <html lang="ja"> |
| charset | <meta charset="UTF-8"> を head の先頭付近に |
| viewport | <meta name="viewport" content="width=device-width, initial-scale=1.0"> |
| 閉じタグの整合性 | 開始タグと閉じタグの対応を確認する |
| セマンティックHTML | main / nav / article / section / aside / header / footer を役割どおりに使う |
| id の重複なし | 同一ページ内で id が重複しないこと。ループ内での id 出力に注意 |
| W3Cバリデーション | Markup Validation Service でエラー0を目指す |
WordPressテーマ固有
| チェック項目 | 対応 |
|---|---|
wp_enqueue_script / wp_enqueue_style を使う | wp_enqueue_scripts フックで登録する |
wp_head() の呼び出し | header.php の </head> 直前 |
wp_footer() の呼び出し | footer.php の </body> 直前 |
add_theme_support | post-thumbnails / title-tag / html5 / custom-logo を登録 |
| エスケープ処理 | 出力時に esc_html / esc_attr / esc_url / wp_kses を使う |
| nonce検証 | 自前のフォーム処理には wp_nonce_field と wp_verify_nonce |
| テンプレート階層 | index.php / / / / の存在 |
wp_head() と wp_footer() が抜けていると、プラグインの多くが動きません。「プラグインを入れたのに効かない」ときは、まずここを疑ってください。
パフォーマンス
| チェック項目 | 対応 |
|---|---|
| JS / CSS の minify | ビルド時に圧縮する |
| ページキャッシュ | キャッシュ系プラグインを導入する。ただし後述の注意あり |
| Webフォントのサブセット化 | 日本語フォントは特に効く。unicode-range の指定も確認 |
| 不要なプラグイン・アセットの整理 | 使っていないプラグインは停止ではなく削除する |
| CLS が出ていない | 寸法未指定の要素、JS による後挿入が主因 |
| JS / CSS の読み込み位置 | CSS は head、JS は body 末尾か defer / async |
| render-blocking の排除 | head 内の script に async / defer / type="module" を付ける |
preconnect / dns-prefetch | 外部リソースのドメインに指定する |
| Critical CSS | ファーストビューに必要な CSS をインライン化する |
| 未使用 CSS / JS の除去 | 全ページで同じ巨大なバンドルを配らない |
| gzip / Brotli 圧縮 | サーバー側でテキストリソースの圧縮を有効化 |
font-display: swap | @font-face に指定する |
キャッシュプラグインは、フォームや会員機能と相性が悪いことがあります。問い合わせページや確認画面はキャッシュ対象から除外してください。nonce がキャッシュされると、フォーム送信が突然エラーになります。
セキュリティ
| チェック項目 | 対応 |
|---|---|
| ボット対策 | SiteGuard WP Plugin などでログインまわりを保護する |
| フォームに reCAPTCHA か Turnstile | 入れないとスパムが必ず来ます |
| SMTP送信 | 前述。プラグイン導入とテスト送信まで |
| HTTPS / mixed content の排除 | すべてのリソースを https:// で読み込む |
| Content-Security-Policy | CSP ヘッダーで XSS を緩和 |
| X-Content-Type-Options | nosniff を返す |
| WPバージョンの非表示 | remove_action('wp_head', 'wp_generator') |
| ディレクトリリスティング無効 | Options -Indexes |
wp-config.php へのアクセス防御 | .htaccess で直接アクセスを拒否 |
SiteGuard の「管理ページアクセス制限」は、設定を誤ると自分がログインできなくなります。有効化する前に、FTP か SSH で復旧できる状態を確保しておいてください。
reCAPTCHA v3 を Contact Form 7 に入れると、全ページでスクリプトが読み込まれ、右下にバッジが常駐します。フォームのあるページだけで読み込むよう制御するか、Turnstile を検討してください。
SEO
| チェック項目 | 対応 |
|---|---|
| title の設定 | ページごとに個別設定。目安32字前後。重複させない |
| meta description | ページごとに個別設定。目安80〜120字。空欄のまま放置しない |
| パンくずリスト | 表示と BreadcrumbList の構造化データをセットで |
| 構造化データ(JSON-LD) | Organization は全ページ共通。ページ種別に応じて Article / FAQPage / JobPosting などを追加 |
| OGP / Twitterカード | ページ別に og:image を指定(1200×630) |
| canonical | パラメータ付きURLや重複ページで意図どおり出ているか確認 |
| XMLサイトマップ / robots.txt | 生成して Search Console に送信する |
SEOプラグイン(All in One SEO / Yoast など)とテーマ側の自前実装で、構造化データが二重に出力されることがあります。Organization や BreadcrumbList はどちらか一方に寄せてください。両方出ていると、検索側がどちらを正とするか判断できません。
アクセシビリティ
| チェック項目 | 対応 |
|---|---|
| 見出し階層 | h1 はページに1つ。階層を飛ばさない |
| 色のコントラスト比 | WCAG 2.2 AA(通常テキスト4.5:1、大きいテキスト3:1) |
| キーボード操作 | Tab で全ての操作要素に到達でき、フォーカスが見えること |
outline: none でフォーカスリングを消したまま代替を用意していないサイトが本当に多いです。消すなら :focus-visible で自前のスタイルを当ててください。
表示確認・公開前
| チェック項目 | 対応 |
|---|---|
| スマホ表示の崩れ | 実機で確認する。デベロッパーツールだけでは拾えない崩れがある |
| 主要ブラウザ | Chrome / Safari / Edge。iOS Safari は特に別物として見る |
| リンク切れ・404 | 内部リンクは全数、外部リンクはクロールで確認 |
| favicon | favicon と apple-touch-icon の両方 |
| アクセス解析タグ | GA4 / GTM の設置と、実際に計測できているかの確認 |
| noindex の解除 | 公開時に最も事故が多い項目 |
noindex は3箇所を見てください。WordPressの「設定 → 表示設定 → 検索エンジンでの表示」、SEOプラグイン側の設定、そしてテーマやサーバーが出している robots.txt と meta タグです。1箇所だけ直して安心すると残ります。
AIO最適化(AI検索への対応)
検索エンジンだけでなく、AIの回答に引用されることを前提にした項目です。従来のSEOと重なる部分もありますが、力点が違います。
構造化データ
Organizationを全ページ共通で実装し、sameAsに SNS・地図・各種プロフィールを漏れなく列挙する- ページの性質に応じて
Article+Person、FAQPage、JobPostingなどを追加する JobPostingはdatePostedとvalidThroughの鮮度管理を運用に組み込む。放置すると無効になります- Rich Results Test / Schema Markup Validator で全typeを検証してエラー0にする
クロール制御
robots.txtで GPTBot / Google-Extended / OAI-SearchBot / PerplexityBot をブロックしない。明示的に Allow を書いておくと意図が伝わりますsitemap.xmlを Search Console に送信し、実際にインデックスされているか確認するsitemap.xmlのlastmodを正しく出力する- 主要コンテンツはサーバー側でHTMLに出力する。 JavaScriptで取得してから描画する構成だと、AIのクローラーが本文を読めないことがあります
- 1ページ1テーマ。見出し階層を崩さない
文体・構造
- 結論ファースト。 見出しを読者の問いの形にし、その直後の1〜2文で結論を言い切る
- 段落を自己完結させる。 「これ」「その」といった指示語に頼らず、その段落だけ切り出しても意味が通るように書く
- FAQを厚くする。実際に聞かれることを網羅する
- 数値と固有名詞で書く。 「豊富な実績」ではなく「2017年から◯件」と書く
- 重要な情報を画像・PDF・動画の中だけに閉じ込めない。HTMLテキストで併記する
E-E-A-T
- 著者の実在性を担保する。実名・顔写真・役職を出し、
Personの構造化データと一致させる - 運営者を明示する。 会社概要(社名・代表者名・所在地・連絡先)を独立ページで用意し、フッターから全ページから到達できるようにする
- 実績や数値には算出根拠と時点を添える。「定着率95%(2025年度・正社員)」のように書く
- 更新日を明示する。
dateModifiedと、ページ上に見える更新日の両方 - 一般論ではなく、自社固有のデータやエピソードの比率を上げる
エンティティ統合
- NAP(社名・住所・電話)を一字一句統一する。 自社サイト、Googleビジネスプロフィール、SNS、各種媒体で表記を揃える。法人格の位置や番地のハイフンまで含めて
sameAsで全プロフィールを接続し、同一の組織だと確定させる- Googleビジネスプロフィールを整備する(営業情報・所在地・口コミ)
- プレスリリースや業界メディアでの社名言及を増やす
チェックリストに入れていなかったが、毎回ひっかかるもの
上のリストは主に「作ったものの品質」を見るものです。実際の事故はその外側で起きることが多いので、こちらも足しておきます。
本番移行
- URL置換をシリアライズ対応のツールで行う。 データベースを単純な文字列置換で書き換えると、シリアライズされた配列の文字数が合わなくなってウィジェットやカスタムフィールドが壊れます。WP-CLI の
search-replaceを使ってください - パーマリンク設定を保存し直す。移行後にリンクが404になったらまずこれ
- ステージングのBasic認証・パスワード保護を解除する
- テスト用に入れた
noindexを外す(前述) - 旧サイトからのリダイレクトを用意する。URL構造が変わるなら301の対応表を作る
wp-config.phpのWP_DEBUGをfalseにする
お問い合わせまわり(SMTPの続き)
- 確認画面を挟むか決める。Contact Form 7 は標準で確認画面を持っていません
- 自動返信メールを設定する。送りっぱなしで何も返らないフォームは不安を与えます
- 送信完了後の遷移先を決める。同一ページ内の表示か、サンクスページか。コンバージョン計測をするならサンクスページのほうが楽です
- プライバシーポリシーへの同意チェックボックスを入れる
- 必須項目とバリデーションのメッセージを日本語で確認する
- 迷惑メール対策のハニーポットを併用する
運用・保守
- 子テーマで作業するか、テーマ自体を自作にする。親テーマを直接編集すると更新で消えます
- コア・テーマ・プラグインの更新方針を決める。自動更新にするか、手動で検証してからか
- バックアップを取る仕組みを入れる。復元テストまでやって初めてバックアップです
- リビジョンの保存数を制限する。
define('WP_POST_REVISIONS', 5);程度に - アクセスが多いサイトでは
wp-cronを無効化し、サーバーの cron から叩く - PHPのバージョンを確認する。サポート切れのまま動かさない
サーバー・ドメイン
- 常時SSL化と、http → https のリダイレクト
- www の有無を統一してリダイレクトする
- ドメインとSSL証明書の有効期限、自動更新の設定を確認する
- メールアカウントの作成と、クライアントへの受け渡し方法
アカウントと権限
- 管理者のユーザー名を
adminにしない - クライアント用アカウントは「編集者」で足りることが多い。全員を管理者にしない
- 制作会社側のアカウントを残すか、納品時に削除するかを決めておく
- ログイン情報の受け渡し方法を決める。メール本文に平文で書かない
計測
- GA4に自社IPを除外するフィルタを設定する
- Search Console にプロパティを登録し、サイトマップを送信する
- Cookieを使う解析ツールを入れるなら、プライバシーポリシーにその旨を記載する
- コンバージョンの定義を決める。フォーム送信、電話タップ、資料ダウンロードなど
このページの使い方
案件が終わるたびに、詰まった箇所をここに1行足してください。「なぜ必要か」を1文添えておくと、半年後の自分が判断できます。
チェックリストは長くなるほど読まれなくなるので、発生頻度が低く影響も小さい項目は思い切って削るのも更新のうちです。
更新履歴
- 2026-08-23 初版。Contact Form 7 と SMTP の項目、公開前チェックリスト、AIO最適化、運用まわりの追記
