2026年10月1日

2026年10月1日

WordPressの「Failed to open stream」エラーの原因別の解決策

「Failed to open stream」は、PHPがファイルやURLを開こうとして失敗したときに出るメッセージです。原因はメッセージの後半にそのまま書かれているので、まずそこを読めば、ファイルが無いのか、権限が無いのか、サーバーの設定で禁止されているのかが分かります。この記事では、エラーの読み方と、原因を可能性の高い順に確認して直す方法を説明します。

エラーメッセージを3つに分けて読む

典型的なメッセージは次のような形です(PHP 8系では Failed、PHP 7系以前では failed と小文字で表示されます)。

PHP Warning:  include(/home/user/public_html/wp-content/plugins/example/inc/functions.php): Failed to open stream: No such file or directory in /home/user/public_html/wp-content/plugins/example/example.php on line 12

これを3つに分けて読みます。

  1. 括弧の中のパス:開こうとしたファイル(またはURL)です。
  2. コロンの後ろの理由:No such file or directory(ファイルが無い)、Permission denied(権限が無い)などです。対処はここで決まります。
  3. in … on line …:その読み込みを書いているファイルと行です。どのプラグインやテーマが原因かはここで分かります。

include の場合は警告(Warning)で処理が続くこともありますが、require の場合はその直後に「Failed opening required」という致命的エラーが続き、画面が真っ白になったり「重大なエラー」の表示になったりします。

画面にメッセージが出ないときは、wp-config.php で WP_DEBUG と WP_DEBUG_LOG を true、WP_DEBUG_DISPLAY を false にして、wp-content/debug.log を確認します。サーバーのPHPエラーログに記録されている場合もあります。調査が終わったら WP_DEBUG は false に戻してください。

原因1:ファイルが無い(No such file or directory)

最も多いのがこの理由です。さらに、次のような状況に分かれます。

更新やアップロードが途中で止まった

プラグインやテーマの更新中にタイムアウトや容量不足が起きると、一部のファイルだけが欠けた状態になります。更新の直後にエラーが出始めたなら、これを疑います。

対処は、該当するプラグインやテーマを入れ直すことです。管理画面に入れない場合は、FTPで wp-content/plugins 内の該当フォルダ名を変えて無効化し、管理画面に入ってから入れ直します。WP-CLIが使える環境では、公式ディレクトリのプラグインならファイルが本来の状態か確かめられます。

# 公式ディレクトリのプラグインのファイルを検証
wp plugin verify-checksums example-plugin

# WordPress本体のファイルを検証
wp core verify-checksums

# プラグインを入れ直す(設定はデータベースに残る)
wp plugin install example-plugin --force

本体のファイル(wp-includes や wp-admin)が欠けている場合は、同じバージョンのWordPressを入れ直します。wp-content と wp-config.php は上書きしないように注意してください。

サーバー移転後に古いパスが残っている

サーバーを移転した後に、移転前のディレクトリ名(たとえば /home/olduser/…)を開こうとしてエラーになることがあります。パスがフルパスで設定ファイルに書き込まれているのが原因です。よくある場所は次のとおりです。

  • wp-config.php に手で追加した require や define
  • .htaccess、.user.ini、php.ini の auto_prepend_file(セキュリティ系プラグインのファイアウォールがこの方法を使うことがあります)
  • キャッシュ系プラグインが作る設定ファイル(wp-content 直下の advanced-cache.php など)

古いパスを検索して見つけます。

grep -rn "/home/olduser" wp-config.php .htaccess .user.ini wp-content/*.php 2>/dev/null

見つかったら、新しいパスに直すか、プラグインの設定画面から設定を作り直します。auto_prepend_file の記述を消す場合は、どのプラグインが書いたものかを確認してから行い、変更前のファイルを控えておきます。

大文字・小文字やパスの組み立てが違う

WindowsやmacOSのローカル環境では動いたのに、Linuxのサーバーでエラーになる場合は、ファイル名の大文字・小文字の違いが原因のことがあります。Linuxでは Functions.php と functions.php は別のファイルです。

自作のコードで相対パス('inc/functions.php' など)を使っていると、実行時のカレントディレクトリによって読み込み先が変わります。WordPressでは、ファイルの場所を基準にしたパスを使います。

// プラグイン内
require_once plugin_dir_path( __FILE__ ) . 'inc/functions.php';

// 子テーマ内
require_once get_stylesheet_directory() . '/inc/functions.php';

// 場所に依存しない書き方
require_once __DIR__ . '/inc/functions.php';

原因2:権限が無い(Permission denied)

ファイルはあるのに、PHPを実行しているユーザーに読み取り権限が無い状態です。サーバー上で次のように確認します。

ls -l /home/user/public_html/wp-content/plugins/example/inc/functions.php
# 途中のディレクトリも含めて権限を表示
namei -l /home/user/public_html/wp-content/plugins/example/inc/functions.php

一般的な目安は、ディレクトリが755、ファイルが644です(ホスティングによって推奨値が異なります)。所有者がWebサーバーやPHPの実行ユーザーと違う場合も読めないことがあります。777のように誰でも書き込める設定にすると、改ざんの危険が増すため避けてください。

権限を直したのに解決しない場合は、SELinuxなどのOS側の制限が働いていることがあります。VPSでは、OSの監査ログを確認します。

原因3:書き込み先に問題がある

ログやキャッシュ、アップロードの保存でファイルを書き込むときにも同じエラーが出ます。理由の欄が次のような場合です。

  • No space left on device:ディスクの空き容量が不足しています。df -h で確認し、古いバックアップやログを整理します。
  • Permission denied:wp-content/uploads やキャッシュ用ディレクトリに書き込み権限がありません。
  • Is a directory:ファイルとして開こうとした場所がディレクトリになっています。プラグインの設定で保存先を誤っている場合に起こります。

原因4:URLを開こうとしてサーバーの設定で拒否された

file_get_contents などでURLを開こうとして失敗すると、次のような理由が出ます。

  • HTTP wrapper is disabled in the server configuration by allow_url_fopen=0:サーバーの設定でURLを開く機能が無効です。
  • HTTP request failed! や Connection refused、SSL operation failed:接続先のエラー、ファイアウォール、証明書の問題です。

WordPressでは、外部への通信に wp_remote_get などのHTTP APIを使うのが推奨されています。allow_url_fopen に依存せず、タイムアウトやエラーを扱いやすくなります。自作のコードなら次のように書き換えます。

$response = wp_remote_get( 'https://api.example.com/data.json', array( 'timeout' => 10 ) );
if ( is_wp_error( $response ) || 200 !== wp_remote_retrieve_response_code( $response ) ) {
	return; // 失敗時の処理
}
$body = wp_remote_retrieve_body( $response );

プラグインの中でこのエラーが出ている場合は、プラグインを最新版に更新し、作者に報告します。プラグインのファイルを直接書き換えると、次の更新で元に戻ります。

原因5:open_basedir の制限

関連するメッセージとして「open_basedir restriction in effect」が出る場合は、PHPがアクセスしてよいディレクトリの範囲外を開こうとしています。サーバー移転後に一時ファイルの場所や公開ディレクトリが変わったときに起こりがちです。ホスティングのPHP設定で許可範囲を確認するか、サポートに問い合わせます。

作業前の注意

ファイルの入れ直しや権限の変更、設定ファイルの編集の前に、ファイルとデータベースのバックアップを取ってください。コードの修正は親テーマを直接編集せず、子テーマか mu-plugin で行います。本番で試す前にステージング環境で確認すると、ほかの機能への影響を避けられます。PHPのメッセージの細かい表記は、PHPのバージョンによって変わることがあります(2026年10月現在)。

まとめ

  • 「Failed to open stream」は、開こうとしたパス、失敗の理由、呼び出し元の3つに分けて読みます。対処は理由の欄で決まります。
  • No such file or directory なら、更新の失敗、移転後の古いパス、大文字・小文字や相対パスの問題を順に疑います。
  • Permission denied なら、権限と所有者を確認し、777のような設定は避けます。
  • URLを開く処理は wp_remote_get などのHTTP APIに置き換えると、サーバー設定に左右されにくくなります。
  • 作業前のバックアップとステージングでの確認を忘れずに行います。

お気軽にご相談ください

お見積りへ お問い合わせへ
▲