エラーメッセージ日本語訳:WP 新人がまずつまずく 10 選
(意味 → 原因 → 対処・再発防止を各 3 行+補足解説)
目次
- 1) Headers already sent / Cannot modify header information
- 2) Call to undefined function ...
- 3) Undefined index / Undefined array key
- 4) Undefined variable
- 5) Call to a member function ... on null
- 6) Allowed memory size exhausted
- 7) Maximum execution time exceeded
- 8) Class '...' not found
- 9) Failed opening required '...'
- 10) The link you followed has expired.(リンクが期限切れです)
- すぐに使える最小チェックリスト
- 最後に
1) Headers already sent / Cannot modify header information
- 意味:ヘッダー送信(例:リダイレクト)より前に出力がありました。
-
原因:
?>
の後の空白や改行、BOM 付きファイル、早いフックでのecho
です。 -
対処:
functions.php
末尾の?>
は書かない/BOM なし保存/早いフックはerror_log()
に出します。
<?php
// 正:リダイレクトの直後は必ず終了します
wp_redirect(home_url('/'));
exit;
補足:ヘッダーは最初の出力前にしか送れません。空白 1 文字でもアウトです。
2) Call to undefined function ...
- 意味:呼び出した関数が読み込まれていません。
- 原因:ファイル未読込、プラグイン未有効化、呼び出しが早すぎることがあります。
-
対処:
require_once
のパス確認、plugins_loaded
以降で WP 関数を呼ぶなど、適切なフック順に直します。
<?php
// 例:初期化タイミングを後ろに寄せます
add_action('plugins_loaded', function () {
// ここなら多くのプラグイン・関数が利用可能です
});
3) Undefined index / Undefined array key
- 意味:配列のキーが存在しないのに読み取りました。
-
原因:
$_POST['foo']
などを存在確認なしで読んでいます。 -
対処:
isset()
や null 合体演算子(??) で存在を確認してから sanitize します。
<?php
$title = isset($_POST['title']) ? sanitize_text_field($_POST['title']) : '';
// または
$title = sanitize_text_field($_POST['title'] ?? '');
4) Undefined variable
- 意味:変数が初期化されていません。
- 原因:条件分岐のある経路で値が入らないことがあります。
-
対処:利用前に初期化しておきます(空文字や
null
で構いません)。
<?php
$val = '';
if (some_condition()) {
$val = 'ready';
}
5) Call to a member function ... on null
-
意味:
null
に対してメソッド呼び出しをしました。 -
原因:取得に失敗している/コンテキスト外(例:ループ外の
$post
)です。 - 対処:存在確認してから使う/**順序(ループ・クエリ)**を正します。
<?php
if ($obj instanceof stdClass) {
$obj->do_something();
}
補足(WP 特有):
the_post()
の外で$post
を使わないようにします。WP_Query
はhave_posts()
→the_post()
の順序を守ります。
6) Allowed memory size exhausted
- 意味:PHP のメモリ上限を超えました。
- 原因:巨大配列、無制限の DB 取得、再帰の暴走などです。
-
対処:根本を減らします(件数制限・ストリーム処理)。やむを得ない場合は
WP_MEMORY_LIMIT
を一時的に上げます。
<?php
// 暫定対処(根本は必ず別で直します)
define('WP_MEMORY_LIMIT', '256M');
7) Maximum execution time exceeded
- 意味:処理が時間制限を超えました。
- 原因:重いループや外部 API 待ちです。
-
対処:処理の分割(WP-Cron / バッチ)、キャッシュ導入、外部待ちの短縮を行います。安易な
set_time_limit()
連発は避けます。
実務では、管理画面からキック → 非同期処理(キュー) に流すのが安全です。
8) Class '...' not found
- 意味:クラス定義が読み込まれていません。
- 原因:Composer オートロード未読込、名前空間の不一致です。
-
対処:
vendor/autoload.php
を読み込み、namespace
とuse
を整えます。
<?php
require __DIR__ . '/vendor/autoload.php';
use App\Service\Mailer;
$mailer = new Mailer();
9) Failed opening required '...'
-
意味:
require
のパスが間違いです。 - 原因:相対パスの勘違い、テーマ/プラグインの場所違いです。
- 対処:絶対パスにします。WordPress のヘルパーを使うと安全です。
<?php
// テーマ(親テーマ)
require_once get_template_directory() . '/inc/setup.php';
// プラグイン
require_once plugin_dir_path(__FILE__) . 'includes/setup.php';
10) The link you followed has expired.(リンクが期限切れです)
- 意味:nonce の期限切れやアップロード制限超過で処理が無効化されました。
-
原因:ページを長時間放置してから送信、
upload_max_filesize
/post_max_size
が小さいなどです。 - 対処:ページの再読み込み後に実行/アップロード上限の見直し/nonce 検証の正しい実装です。
<?php
// 管理画面での保存時の例(失敗時は wp_die() で止まります)
check_admin_referer('my_action', 'my_nonce');
すぐに使える最小チェックリスト
- リダイレクトの後は
exit;
を書きます。 - 早いフックでは
echo
しません(error_log()
を使います)。 - 配列アクセスは
isset()
または??
で存在確認 → その後 sanitize します。 - ファイル読込は 絶対パス(
get_template_directory()
/plugin_dir_path()
)にします。 - 保存・削除などの状態変更には nonce 検証(
check_admin_referer()
/wp_verify_nonce()
)を入れます。
最後に
エラーメッセージは「病名」ではなく“症状”の表示にすぎません。
本記事の 意味 → 原因 → 対処・再発防止 の順に落ち着いて確認していけば、必ず道筋が見えてきます。ブックマークして、現場で見ながら直す用途でお使いください。
これだけ覚えると強い要点(再掲)
-
出力のタイミングはフロントなら
wp_head
/wp_footer
以降、管理はadmin_notices
以降が目安です。 -
保存・削除などの状態変更には nonce 検証+必要なら 権限チェック(
current_user_can()
)+PRG(wp_redirect(...); exit;
)をセットにします。 -
リダイレクトの後は
exit;
を必ず書きます。 -
配列アクセスは
isset()
や??
で存在確認 → 入力は sanitize、出力は escape(直前) が基本です。 -
ファイル読込は 絶対パス(
get_template_directory()
/plugin_dir_path()
など)で迷子を防ぎます。
あわせて読みたい