<?php
/**
* Plugin environment handling.
*
* @package System
* @author Pierre Lannoy <https://pierre.lannoy.fr/>.
* @since 1.0.0
*/
namespace Vibes\System;
use Exception;
/**
* The class responsible to manage and detect plugin environment.
*
* @package System
* @author Pierre Lannoy <https://pierre.lannoy.fr/>.
* @since 1.0.0
*/
class Environment {
/**
* Initializes the class and set its properties.
*
* @since 1.0.0
*/
public function __construct() {
}
/**
* Defines all needed globals.
*
* @since 1.0.0
*/
public static function init() {
$plugin_path = str_replace( VIBES_SLUG . '/includes/system/', VIBES_SLUG . '/', plugin_dir_path( __FILE__ ) );
$plugin_path = str_replace( VIBES_SLUG . '\includes\system/', VIBES_SLUG . '/', $plugin_path );
$plugin_url = str_replace( VIBES_SLUG . '/includes/system/', VIBES_SLUG . '/', plugin_dir_url( __FILE__ ) );
$plugin_relative_url = str_replace( get_site_url() . '/', '', $plugin_url );
define( 'VIBES_PLUGIN_DIR', $plugin_path );
define( 'VIBES_PLUGIN_URL', $plugin_url );
define( 'VIBES_PLUGIN_RELATIVE_URL', $plugin_relative_url );
define( 'VIBES_ADMIN_DIR', VIBES_PLUGIN_DIR . 'admin/' );
define( 'VIBES_ADMIN_URL', VIBES_PLUGIN_URL . 'admin/' );
define( 'VIBES_ASSETS_DIR', VIBES_PLUGIN_DIR . 'assets/' );
define( 'VIBES_PUBLIC_DIR', VIBES_PLUGIN_DIR . 'public/' );
define( 'VIBES_PUBLIC_URL', VIBES_PLUGIN_URL . 'public/' );
define( 'VIBES_INCLUDES_DIR', VIBES_PLUGIN_DIR . 'includes/' );
define( 'VIBES_VENDOR_DIR', VIBES_PLUGIN_DIR . 'includes/libraries/' );
define( 'VIBES_LANGUAGES_DIR', VIBES_PLUGIN_DIR . 'languages/' );
define( 'VIBES_ADMIN_RELATIVE_URL', self::admin_relative_url() );
define( 'VIBES_AJAX_RELATIVE_URL', self::ajax_relative_url() );
define( 'VIBES_PLUGIN_SIGNATURE', VIBES_PRODUCT_NAME . ' v' . VIBES_VERSION );
define( 'VIBES_PLUGIN_AGENT', VIBES_PRODUCT_NAME . ' (' . self::wordpress_version_id() . '; ' . self::plugin_version_id() . '; +' . VIBES_PRODUCT_URL . ')' );
define( 'VIBES_ASSETS_ID', VIBES_PRODUCT_ABBREVIATION . '-assets' );
define( 'VIBES_ANALYTICS_ID', VIBES_PRODUCT_ABBREVIATION . '-engine' );
define( 'VIBES_LIVELOG_ID', VIBES_PRODUCT_ABBREVIATION . '-console' );
define( 'VIBES_REST_NAMESPACE', VIBES_SLUG . '/v' . VIBES_API_VERSION );
}
/**
* Get the current execution mode.
*
* @return integer The current execution mode.
* @since 1.0.0
*/
public static function exec_mode() {
$req_uri = filter_input( INPUT_SERVER, 'REQUEST_URI' );
if ( defined( 'WP_CLI' ) && WP_CLI ) {
$id = 1;
} elseif ( wp_doing_cron() ) {
$id = 2;
} elseif ( wp_doing_ajax() ) {
$id = 3;
} elseif ( defined( 'XMLRPC_REQUEST' ) && XMLRPC_REQUEST ) {
$id = 4;
} elseif ( defined( 'REST_REQUEST ' ) && REST_REQUEST ) {
$id = 5;
} elseif ( $req_uri ? 0 === strpos( strtolower( $req_uri ), '/wp-json/' ) : false ) {
$id = 5;
} elseif ( $req_uri ? 0 === strpos( strtolower( $req_uri ), '/feed/' ) : false ) {
$id = 6;
} elseif ( is_admin() ) {
$id = 7;
} else {
$id = 8;
}
return $id;
}
/**
* Get the current execution mode.
*
* @return boolean True if metrics are available.
* @since 1.0.0
*/
public static function exec_mode_for_metrics() {
return in_array( self::exec_mode(), [ 1, 2, 4, 5, 6, 7 ], true );
}
/**
* Get the major version number.
*
* @param string $version Optional. The full version string.
* @return string The major version number.
* @since 1.0.0
*/
public static function major_version( $version = VIBES_VERSION ) {
try {
$result = substr( $version, 0, strpos( $version, '.' ) );
} catch ( Exception $ex ) {
$result = 'x';
}
return $result;
}
/**
* Get the major version number.
*
* @param string $version Optional. The full version string.
* @return string The major version number.
* @since 1.0.0
*/
public static function minor_version( $version = VIBES_VERSION ) {
try {
$result = substr( $version, strpos( $version, '.' ) + 1, 1000 );
$result = substr( $result, 0, strpos( $result, '.' ) );
} catch ( Exception $ex ) {
$result = 'x';
}
return $result;
}
/**
* Get the major version number.
*
* @param string $version Optional. The full version string.
* @return string The major version number.
* @since 1.0.0
*/
public static function patch_version( $version = VIBES_VERSION ) {
try {
$result = substr( $version, strpos( $version, '.' ) + 1, 1000 );
$result = substr( $result, strpos( $result, '.' ) + 1, 1000 );
if ( strpos( $result, '-' ) > 0 ) {
$result = substr( $result, 0, strpos( $result, '-' ) );
}
} catch ( Exception $ex ) {
$result = 'x';
}
return $result;
}
/**
* Get the environment type.
*
* @return string The environment type.
* @since 1.0.0
*/
public static function stage() {
if ( function_exists( 'wp_get_environment_type' ) ) {
return wp_get_environment_type();
}
return 'unknown';
}
/**
* Verification of WP MU.
*
* @return boolean True if MU, false otherwise.
* @since 1.0.0
*/
public static function is_wordpress_multisite() {
return is_multisite();
}
/**
* Get the WordPress version ID.
*
* @return string The WordPress version ID.
* @since 1.0.0
*/
public static function wordpress_version_id() {
global $wp_version;
return 'WordPress/' . $wp_version;
}
/**
* Get the WordPress version Text.
*
* @return string The WordPress version in human-readable text.
* @since 1.0.0
*/
public static function wordpress_version_text() {
global $wp_version;
$s = '';
if ( is_multisite() ) {
$s = 'MU ';
}
return 'WordPress ' . $s . $wp_version;
}
/**
* Get the WordPress debug status.
*
* @return string The WordPress debug status in human-readable text.
* @since 1.0.0
*/
public static function wordpress_debug_text() {
$debug = false;
$opt = [];
$s = '';
if ( defined( 'WP_DEBUG' ) ) {
if ( WP_DEBUG ) {
$debug = true;
if ( defined( 'WP_DEBUG_LOG' ) ) {
if ( WP_DEBUG_LOG ) {
$opt[] = esc_html__( 'log', 'vibes' );
}
}
if ( defined( 'WP_DEBUG_DISPLAY' ) ) {
if ( WP_DEBUG_DISPLAY ) {
$opt[] = esc_html__( 'display', 'vibes' );
}
}
$s = implode( ', ', $opt );
}
}
return ( $debug ? esc_html__( 'Debug enabled', 'vibes' ) . ( '' !== $s ? ' (' . $s . ')' : '' ) : esc_html__( 'Debug disabled', 'vibes' ) );
}
/**
* Get the plugin version ID.
*
* @return string The plugin version ID.
* @since 1.0.0
*/
public static function plugin_version_id() {
return VIBES_PRODUCT_SHORTNAME . '/' . VIBES_VERSION;
}
/**
* Get the plugin version text.
*
* @return string The plugin version in human-readable text.
* @since 1.0.0
*/
public static function plugin_version_text() {
$s = VIBES_PRODUCT_NAME . ' ' . VIBES_VERSION;
if ( defined( 'VIBES_CODENAME' ) ) {
if ( VIBES_CODENAME !== '"-"' ) {
$s .= ' ' . VIBES_CODENAME;
}
}
return $s;
}
/**
* Is the plugin a development preview?
*
* @return boolean True if it's a development preview, false otherwise.
* @since 1.0.0
*/
public static function is_plugin_in_dev_mode() {
return ( strpos( VIBES_VERSION, 'dev' ) > 0 );
}
/**
* Is the plugin a release candidate?
*
* @return boolean True if it's a release candidate, false otherwise.
* @since 1.0.0
*/
public static function is_plugin_in_rc_mode() {
return ( strpos( VIBES_VERSION, 'rc' ) > 0 );
}
/**
* Is the plugin production ready?
*
* @return boolean True if it's production ready, false otherwise.
* @since 1.0.0
*/
public static function is_plugin_in_production_mode() {
return ( ! self::is_plugin_in_dev_mode() && ! self::is_plugin_in_rc_mode() );
}
/**
* Get the PHP version.
*
* @return string The PHP version.
* @since 1.0.0
*/
public static function php_version() {
$s = phpversion();
if ( strpos( $s, '-' ) > 0 ) {
$s = substr( $s, 0, strpos( $s, '-' ) );
}
return $s;
}
/**
* Get the PHP full version.
*
* @return string The PHP full version.
* @since 1.0.0
*/
public static function php_full_version() {
return phpversion();
}
/**
* Get the PHP version text.
*
* @return string The PHP version in human-readable text.
* @since 1.0.0
*/
public static function php_version_text() {
return 'PHP ' . self::php_version();
}
/**
* Get the PHP full version text.
*
* @return string The PHP full version in human-readable text.
* @since 1.0.0
*/
public static function php_full_version_text() {
return 'PHP ' . self::php_full_version();
}
/**
* Get the MYSQL version.
*
* @return string The MYSQL full version.
* @since 1.0.0
*/
public static function mysql_version() {
global $wpdb;
return $wpdb->db_version();
}
/**
* Get the MYSQL version text.
*
* @return string The MYSQL version in human-readable text.
* @since 1.0.0
*/
public static function mysql_version_text() {
return 'MySQL ' . self::mysql_version();
}
/**
* Get the database name and host.
*
* @return string The database name and host in human-readable text.
* @since 1.0.0
*/
public static function mysql_name_text() {
return DB_NAME . '@' . DB_HOST;
}
/**
* Get the database charset.
*
* @return string The charset text.
* @since 1.0.0
*/
public static function mysql_charset_text() {
return DB_CHARSET;
}
/**
* Get the database user.
*
* @return string The user text.
* @since 1.0.0
*/
public static function mysql_user_text() {
return DB_USER;
}
/**
* The detection of this url allows the plugin to make ajax calls when
* the site has not a standard /wp-admin/ path.
*
* @return string The relative url for ajax calls.
* @since 1.0.0
*/
private static function ajax_relative_url() {
$url = preg_replace( '/(http[s]?:\/\/.*\/)/iU', '', get_admin_url(), 1 );
return ( substr( $url, 0 ) === '/' ? '' : '/' ) . $url . ( substr( $url, -1 ) === '/' ? '' : '/' ) . 'admin-ajax.php';
}
/**
* The detection of this url allows the plugin to be called from
* WP dashboard when the site has not a standard /wp-admin/ path.
*
* @return string The relative url for WP admin.
* @since 1.0.0
*/
private static function admin_relative_url() {
$url = preg_replace( '/(http[s]?:\/\/.*\/)/iU', '', get_admin_url(), 1 );
return ( substr( $url, 0 ) === '/' ? '' : '/' ) . $url . ( substr( $url, -1 ) === '/' ? '' : '/' ) . 'admin.php';
}
}
Environment::init();