WordPress で本番と作業環境を見分ける(wp_get_environment_type)と、管理者だけに出す判定

WordPress 6.4.3
広告WordPress・PHP を学べる本

Amazonのアソシエイトとして、WordPress functions.phpは適格販売により収入を得ています。

概要説明

WordPress で本番と作業環境(テスト環境)を見分けるには、wp-config.php の WP_ENVIRONMENT_TYPE と wp_get_environment_type() を使う。アクセス解析を本番だけに出すコード、管理者だけに情報を出す判定、IP で見分けるときの注意も。

本番と作業環境を見分ける(WP_ENVIRONMENT_TYPE)

作業環境(テスト環境)では、アクセス解析のタグや広告を出したくない、メールを送りたくない、ということがあります。WordPress 5.5 からは、環境の種類を wp-config.php で決めて、wp_get_environment_type() で見分けられます。

wp-config.php(作業環境)
// 作業環境の 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 には書かなくてかまいません。
functions.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 ではなく、管理者としてログインしているかで見分けるのが確実です。

functions.php
/*----------------------------------------------------
 サイトの管理者としてログインしているか
----------------------------------------------------*/
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 で見分けたいとき(ログインしない画面で、事務所からだけ出したいなど)は、次のようにします。

functions.php
/*----------------------------------------------------
 決まった 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)。

参考