2026年10月2日
2026年10月2日
WordPressの.envファイルで環境変数を管理する方法|wp-config.phpから秘密情報を分離する
WordPress で .env を使うには、Composer で vlucas/phpdotenv を入れ、wp-config.php の冒頭で .env を読み込み、define() の値を環境変数から取る形に書き換えます。この記事では、.env をドキュメントルートの外に置く構成、wp-config.php の書き方、Web からのアクセス遮断、Git に入れない運用、Composer を使えない環境での代替策までを説明します。
.env で管理すると何がよいのか
通常の WordPress では、データベースのパスワードや認証用キー(ソルト)が wp-config.php に直接書かれています。これを .env に分けると、次のような利点があります。
wp-config.phpを Git で管理しても、秘密情報がリポジトリに入らない- 本番・ステージング・ローカルで同じ
wp-config.phpを使い、違いは .env だけにできる - パスワードを変えるときに触るファイルが1つで済む
一方で、.env は「秘密情報をまとめて置いたファイル」なので、置き場所と権限を誤ると wp-config.php 以上に危険です。以下の手順では、この点を優先して構成を決めます。
ディレクトリ構成:.env はドキュメントルートの外に置く
最初に決めるべきは置き場所です。Web サーバーが公開しているディレクトリ(ドキュメントルート)の外に .env と vendor/ を置きます。
/home/example/
├── .env ← 秘密情報(Web から見えない場所)
├── .env.example ← ダミー値の見本(Git に入れてよい)
├── composer.json
├── vendor/
└── public_html/ ← ドキュメントルート
├── wp-config.php
├── wp-settings.php
└── wp-content/
レンタルサーバーによっては、ドキュメントルートの1つ上の階層にファイルを置けないことがあります。その場合は後述する Web アクセスの遮断を併用してください。なお、Roots の Bedrock はこの「.env をルートの外に置き、wp-config.php で読み込む」構成を最初から採用しているので、新規構築なら Bedrock を使うのも選択肢です。
phpdotenv を導入する
作業前に、既存の wp-config.php とデータベースのバックアップを取ってください。設定を誤ると、サイト全体がデータベース接続エラーになります。ステージング環境で試してから本番に適用するのが安全です。
ドキュメントルートの1つ上で Composer を実行します。
cd /home/example
composer require vlucas/phpdotenv
続いて .env を作ります。値はすべてダミーです。実際の値に置き換えてください。
DB_NAME='example_db'
DB_USER='example_user'
DB_PASSWORD='your-db-password'
DB_HOST='localhost'
WP_ENVIRONMENT_TYPE='production'
WP_DEBUG='false'
AUTH_KEY='your-random-string-1'
SECURE_AUTH_KEY='your-random-string-2'
LOGGED_IN_KEY='your-random-string-3'
NONCE_KEY='your-random-string-4'
AUTH_SALT='your-random-string-5'
SECURE_AUTH_SALT='your-random-string-6'
LOGGED_IN_SALT='your-random-string-7'
NONCE_SALT='your-random-string-8'
値はシングルクォートで囲むのが無難です。phpdotenv ではダブルクォートの中の ${...} が別の変数として展開されるため、記号を多く含むソルトやパスワードで思わぬ値になることがあります。ソルト用のランダム文字列は openssl rand -base64 48 などで生成できます。
作成後、ファイルの権限を所有者だけが読める状態にします(PHP の実行ユーザーが読めることは必要です)。
chmod 600 /home/example/.env
PHP を別ユーザーで動かしているサーバーでは 600 だと読めないことがあります。その場合は 640 にしてグループで読めるようにするなど、サーバーの構成に合わせてください。
wp-config.php を書き換える
wp-config.php の秘密情報の部分を、次のように環境変数から取る形にします。require_once ABSPATH . 'wp-settings.php'; などの末尾の行は元のまま残します。
<?php
// ドキュメントルートの1つ上にある vendor/ と .env を読み込む
require_once dirname( __DIR__ ) . '/vendor/autoload.php';
$dotenv = Dotenv\Dotenv::createImmutable( dirname( __DIR__ ) );
$dotenv->load();
// 必須の値が欠けていたら、ここで止める
$dotenv->required( array( 'DB_NAME', 'DB_USER', 'DB_PASSWORD', 'DB_HOST' ) )->notEmpty();
define( 'DB_NAME', $_ENV['DB_NAME'] );
define( 'DB_USER', $_ENV['DB_USER'] );
define( 'DB_PASSWORD', $_ENV['DB_PASSWORD'] );
define( 'DB_HOST', $_ENV['DB_HOST'] );
define( 'DB_CHARSET', 'utf8mb4' );
define( 'DB_COLLATE', '' );
foreach ( array( 'AUTH_KEY', 'SECURE_AUTH_KEY', 'LOGGED_IN_KEY', 'NONCE_KEY',
'AUTH_SALT', 'SECURE_AUTH_SALT', 'LOGGED_IN_SALT', 'NONCE_SALT' ) as $key ) {
define( $key, $_ENV[ $key ] ?? '' );
}
define( 'WP_ENVIRONMENT_TYPE', $_ENV['WP_ENVIRONMENT_TYPE'] ?? 'production' );
define( 'WP_DEBUG', 'true' === ( $_ENV['WP_DEBUG'] ?? 'false' ) );
$table_prefix = 'wp_';
/* 以下は元の wp-config.php と同じ */
if ( ! defined( 'ABSPATH' ) ) {
define( 'ABSPATH', __DIR__ . '/' );
}
require_once ABSPATH . 'wp-settings.php';
つまずきやすい点を補足します。
- 値は文字列で入る:.env の
falseは文字列'false'です。WP_DEBUGのような真偽値は、上の例のように比較して変換します。 - **
getenv()では取れないことがある**:phpdotenv の現行版である v5 系(2026年10月現在)のcreateImmutable()は、既定では$_ENVと$_SERVERに値を入れ、getenv()には入れません。プラグインなどがgetenv()で読む必要がある場合は、ドキュメントでcreateUnsafeImmutable()の説明を確認してから使ってください。 - **
$table_prefixは変数**:これはdefine()ではないので、残し忘れないようにします。
WP_ENVIRONMENT_TYPE に local・development・staging・production のいずれかを入れておくと、wp_get_environment_type() で環境を判定でき、ステージングでだけ検索エンジン向けの設定を変える、といった分岐がしやすくなります。
Web から .env が見えないようにする
ドキュメントルートの外に置けた場合でも、念のため次の設定を入れておくと安心です。中に置かざるを得ない場合は必須です。
Apache 2.4(.htaccess またはバーチャルホスト設定):
<Files ".env">
Require all denied
</Files>
Nginx(server ブロック内):
location ~ /\.(?!well-known) {
deny all;
}
Nginx の例は、.well-known(SSL 証明書の発行などで使う)を除く、ドットで始まるファイルとディレクトリをまとめて拒否します。設定後は次のコマンドで確認し、403 か 404 が返ることを確かめてください。
curl -sI https://example.com/.env
Git に入れない運用
.env を作ったら、すぐに .gitignore に追加します。
.env
vendor/
代わりに、キー名だけを並べてダミー値を入れた .env.example をリポジトリに入れておくと、新しい環境を作る人がどの値を用意すべきか分かります。
もし .env を一度でもコミットしてしまった場合は、履歴から消すだけでは不十分です。リポジトリを複製した人やサービスに残っている可能性があるため、データベースのパスワードとソルトを変更してください。ソルトを変えると全ユーザーがログアウトされる点も、事前に周知しておきます。
見落としやすい漏えい経路
- phpinfo():
phpinfo()を出力するファイルは環境変数を表示します。確認用に作ったファイルは使い終わったら削除します。 - デバッグ出力:
var_dump( $_ENV )のようなコードやログ出力を本番に残さないでください。 - バックアップ:.env をドキュメントルートの外に置くと、WordPress のバックアッププラグインの対象外になることがあります。復元に必要なファイルなので、別の安全な場所に保管する手順を決めておきます。
Composer を使えない場合の代替策
共有サーバーなどで Composer を使えない場合は、次の方法があります。
- 秘密情報を別の PHP ファイルに分ける:ドキュメントルートの外に
secrets.phpを置き、wp-config.phpからrequireします。.env ではありませんが、目的(分離)は同じで、もっとも手軽です。 - サーバーの環境変数を使う:PHP-FPM のプール設定の
env[DB_PASSWORD] = ...や、Apache のバーチャルホストのSetEnvで値を渡し、wp-config.phpではgetenv()で読みます。サーバー設定を変更できる VPS 向けです。
自作の .env パーサーを書く方法もありますが、クォートや改行の扱いで不具合が起きやすいため、実績のあるライブラリを使うことをおすすめします。
まとめ
- .env と
vendor/はドキュメントルートの外に置き、権限を絞る wp-config.phpで phpdotenv を読み込み、required()->notEmpty()で必須値の欠落を早めに検知する- 値は文字列で入るので、真偽値は変換する。
getenv()で読めない場合があることに注意する - Web からの .env アクセスを遮断し、
curl -Iで 403/404 を確認する - .env は Git に入れず、誤ってコミットしたらパスワードとソルトを変更する