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 を使えない場合は、次の方法があります。

  1. 秘密情報を別の PHP ファイルに分ける:ドキュメントルートの外に secrets.php を置き、wp-config.php から require します。.env ではありませんが、目的(分離)は同じで、もっとも手軽です。
  2. サーバーの環境変数を使う: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 に入れず、誤ってコミットしたらパスワードとソルトを変更する

お気軽にご相談ください

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