本番と作業環境を見分ける(WP_ENVIRONMENT_TYPE)
作業環境(テスト環境)では、アクセス解析のタグや広告を出したくない、メールを送りたくない、ということがあります。WordPress 5.5 からは、環境の種類を wp-config.php で決めて、wp_get_environment_type() で見分けられます。
// 作業環境の wp-config.php に書く(「That's all, stop editing!」の行より上) define( 'WP_ENVIRONMENT_TYPE', 'local' ); // local・development・staging・production のどれか
- 決められる値は local・development・staging・production の 4 つです。
- 何も書かないと production(本番)になります。本番の wp-config.php には書かなくてかまいません。
/*----------------------------------------------------
本番かどうか(wp-config.php の WP_ENVIRONMENT_TYPE で見分ける)
----------------------------------------------------*/
if ( ! function_exists( 'fs_is_production' ) ) {
function fs_is_production() {
return 'production' === wp_get_environment_type();
}
}
// 例:本番で、ログインしていない人にだけアクセス解析のタグを出す
if ( ! function_exists( 'fs_analytics_tag' ) ) {
function fs_analytics_tag() {
if ( ! fs_is_production() || is_user_logged_in() ) {
return;
}
echo "<!-- ここにアクセス解析のタグ -->\n";
}
add_action( 'wp_head', 'fs_analytics_tag' );
}
前に載せていたコードの問題
以前は、ホスト名($_SERVER['HTTP_HOST'])に dev が入っているかで見分けるコードを載せていました。作業環境で試すと、次の問題がありました。
- WP-CLI や cron など、ホスト名がない所から動くと、Warning(Undefined array key “HTTP_HOST”)と Deprecated が出る。
- ドメインにたまたま dev が入っていると(例:www.devices-shop.com)、本番なのに本番ではないと判定される。
WP_ENVIRONMENT_TYPE なら、ホスト名に頼らず、どこから動いても同じ結果になります。
管理者だけに出す(ログインで見分ける)
本番でも、自分にだけ調べ物の情報を出したいときは、IP ではなく、管理者としてログインしているかで見分けるのが確実です。
/*----------------------------------------------------
サイトの管理者としてログインしているか
----------------------------------------------------*/
if ( ! function_exists( 'fs_is_site_admin' ) ) {
function fs_is_site_admin() {
return is_user_logged_in() && current_user_can( 'manage_options' );
}
}
// 例:本番でも、管理者にだけ調べ物の情報を出す
if ( ! function_exists( 'fs_debug_footer' ) ) {
function fs_debug_footer() {
if ( fs_is_site_admin() ) {
echo '<!-- queries: ' . (int) get_num_queries() . ' / time: ' . esc_html( timer_stop() ) . 's -->' . "\n";
}
}
add_action( 'wp_footer', 'fs_debug_footer', 999 );
}
IP で見分けたいとき(ログインしない画面で、事務所からだけ出したいなど)は、次のようにします。
/*----------------------------------------------------
決まった IP からのアクセスか(固定 IP の事務所など)
----------------------------------------------------*/
if ( ! function_exists( 'fs_is_office_ip' ) ) {
function fs_is_office_ip() {
$allowed = array( '203.0.113.10' ); // 事務所の固定 IP(例)
$ip = isset( $_SERVER['REMOTE_ADDR'] ) ? $_SERVER['REMOTE_ADDR'] : '';
return in_array( $ip, $allowed, true );
}
}
CDN(Cloudflare など)や、前に別のサーバーがある構成では、REMOTE_ADDR が利用者ではなく中継のサーバーの IP になります。家や外出先など、IP が変わる所からは判定できません。できるだけログインで見分けてください。
確認した結果
作業環境(WordPress 7.1・WP_ENVIRONMENT_TYPE は local)で確認しました。
- wp_get_environment_type() は local、fs_is_production() は false で、アクセス解析のタグは出ない。
- ログインしていないときは fs_is_site_admin() が false で、調べ物の情報は出ない。
- 前のコードは、ホスト名がないと Warning と Deprecated が出て、www.devices-shop.com を本番ではないと判定した(PHP 8.3)。

