wp_get_environment_type()WP 5.5.0

Получает текущий тип окружения: local, development, staging, production (по умолчанию).

Это функция стандартизирует применение разной логики кода для разной среды разработки. Так, например, можно выполнять один код на локалке, другой - при тестировании, и третий - в продакшене.

Эта функция подключается на самом раннем этапе загрузки и может быть исползована до любого хука и даже в среде SHORTINIT.

Установка типа окружения

Тип окружения может быть задан двумя способами: с помощью глобальной системной переменной WP_ENVIRONMENT_TYPE или константы с таким же именем.

putenv( 'WP_ENVIRONMENT_TYPE=development' );

// или
define( 'WP_ENVIRONMENT_TYPE', 'development' );

Возможные значения константы:

  • local — локалка. C версии 5.5.1
  • development — разработка.
  • staging — ветка, стадия, тестирование.
  • production — рабочий сайт (по умолчанию).

Значение константы имеет больший приоритет над значением системной переменной.

Если указано значение не из списка выше, то функция вернет тип production.

При установке типа окружения development включается дебаг режим - WP_DEBUG = true. Если константа WP_DEBUG не установлена. См. wp_initial_constants().

Читайте также описание функции putenv().

Кроме режима окружения, в Wodpress также можно задать режим разработки: wp_is_development_mode().

1 раз — 0.000001 сек (скорость света) | 50000 раз — 0.00 сек (скорость света)

Хуков нет.

Возвращает

Строку. Текущий тип окружения.

Использование

wp_get_environment_type();

Примеры

0

#1 Пример из Ядра - дефолтная установка константы WP_DEBUG

if ( ! defined( 'WP_DEBUG' ) ) {
	if ( 'development' === wp_get_environment_type() ) {
		define( 'WP_DEBUG', true );
	} else {
		define( 'WP_DEBUG', false );
	}
}
0

#2 Еще демонстрационный пример

switch ( wp_get_environment_type() ) {
	case 'local':
	case 'development':
		do_nothing();
		break;

	case 'staging':
		do_staging_thing();
		break;

	case 'production':
	default:
		do_production_thing();
		break;
}
0

#3 Закроем сайт от поисковиков, если это версия сайта для разработки

Как запретить индексацию сайта поисковиками, если это версия сайта для разработки (DEV копия сайта).

Очень часто у сайта есть две или три версии в сети ДЕВ и ПРОД (иногда еще и STAGE). ДЕВ версию всегда нужно закрывать от индексации, делается это по-разному. Не редко видел как её закрывают паролем через .htpasswd, однако это не всегда удобно. Гораздо удобнее использовать следующих код, чтобы закрыть сайт от индексации:

/**
 * Close from search engines indexing for dev, stage environment.
 *
 * @version 1.0
 */
final class WP_Kama_Disable_Dev_Env_Indexing {

	public static function init(): void {
		add_action( 'init', [ __CLASS__, 'disable_indexing' ] );
	}

	public static function disable_indexing(): void {

		if( ! self::is_blocking_on() ){
			return;
		}

		self::block_search_agents();

		add_filter( 'wp_headers', [ __CLASS__, '_HTTP_header' ] );
		add_filter( 'robots_txt', [ __CLASS__, '_robots_txt' ] );
		// Not recommended. In order to have the same behaviour as on prod
		# add_filter( 'wp_robots', [ __CLASS__, '_robots_meta_tag' ], 999 );
	}

	/**
	 * Checks whether we should disable indexing.
	 */
	private static function is_blocking_on(): bool {

		if( in_array( wp_get_environment_type(), [ 'production', 'local' ], true ) ){
			return false;
		}

		if( current_user_can( 'administrator' ) ){
			return false;
		}

		return true;
	}

	/**
	 * 403 response for search agents.
	 */
	private static function block_search_agents(): void {
		$robots = 'libwww|Wget|LWP|damnBot|BBBike|spider|crawl|google|bing|yandex|msnbot';
		$user_agent = ( $_SERVER['HTTP_USER_AGENT'] ?? '' );

		if( preg_match( "/$robots/i", $user_agent ) ) {
			http_response_code( 403 );

			die( 'Indexing of this site is Forbidden for robots.' );
		}
	}

	public static function _HTTP_header( array $headers ): array {
		$headers['X-Robots-Tag'] = 'noindex, nofollow';

		return $headers;
	}

	public static function _robots_txt(): string {
		return "User-agent: *\nDisallow: /";
	}

	/**
	 * Callback for hook `wp_robots`.
	 * Adds `<meta name='robots' content='noindex, follow' />` HTML meta tag.
	 */
	public static function _robots_meta_tag( array $robots ): array {
		$robots['noindex'] = true;
		$robots['nofollow'] = true;
		unset( $robots['follow'] );

		return $robots;
	}

}

Теперь просто вызываем эту функцию где угодно: в мю-плагине, плагине или в файле functions.php:

WP_Kama_Disable_Dev_Env_Indexing::init();

ВАЖНО! Для этого кода вам нужно указать константу WP_ENVIRONMENT_TYPE в wp-config.php. Значение константы должно быть разное на разных энвах.

Список изменений

С версии 5.5.0 Введена.
С версии 5.5.1 Added the 'local' type.
С версии 5.5.1 Removed the ability to alter the list of types.

Код wp_get_environment_type() WP 6.5.2

function wp_get_environment_type() {
	static $current_env = '';

	if ( ! defined( 'WP_RUN_CORE_TESTS' ) && $current_env ) {
		return $current_env;
	}

	$wp_environments = array(
		'local',
		'development',
		'staging',
		'production',
	);

	// Add a note about the deprecated WP_ENVIRONMENT_TYPES constant.
	if ( defined( 'WP_ENVIRONMENT_TYPES' ) && function_exists( '_deprecated_argument' ) ) {
		if ( function_exists( '__' ) ) {
			/* translators: %s: WP_ENVIRONMENT_TYPES */
			$message = sprintf( __( 'The %s constant is no longer supported.' ), 'WP_ENVIRONMENT_TYPES' );
		} else {
			$message = sprintf( 'The %s constant is no longer supported.', 'WP_ENVIRONMENT_TYPES' );
		}

		_deprecated_argument(
			'define()',
			'5.5.1',
			$message
		);
	}

	// Check if the environment variable has been set, if `getenv` is available on the system.
	if ( function_exists( 'getenv' ) ) {
		$has_env = getenv( 'WP_ENVIRONMENT_TYPE' );
		if ( false !== $has_env ) {
			$current_env = $has_env;
		}
	}

	// Fetch the environment from a constant, this overrides the global system variable.
	if ( defined( 'WP_ENVIRONMENT_TYPE' ) && WP_ENVIRONMENT_TYPE ) {
		$current_env = WP_ENVIRONMENT_TYPE;
	}

	// Make sure the environment is an allowed one, and not accidentally set to an invalid value.
	if ( ! in_array( $current_env, $wp_environments, true ) ) {
		$current_env = 'production';
	}

	return $current_env;
}