get_server_info(); // Build the title with server information. // Grouped logically: PHP info, Memory info, Server info, WordPress info. $title = sprintf( /* translators: 1: PHP version, 2: SAPI, 3: OS, 4: Max exec time, 5: Max upload, 6: Memory usage, 7: WP Memory limit, 8: Server software, 9: Database version, 10: Server IP, 11: WordPress version */ esc_html__( '* PHP %1$s | %2$s | %3$s | %4$s | Upload %5$s | Mem %6$s | WP Limit %7$s | %8$s | %9$s | %10$s | WP %11$s *', 'admin-bar-server-info' ), esc_html( $server_info['php_version'] ), esc_html( $server_info['sapi'] ), esc_html( $server_info['os'] ), esc_html( $server_info['max_execution_time'] ), esc_html( $server_info['max_upload_size'] ), esc_html( $server_info['memory_usage'] ), esc_html( $server_info['wp_memory_limit'] ), esc_html( $server_info['server_software'] ), esc_html( $server_info['db_version'] ), esc_html( $server_info['server_ip'] ), esc_html( $server_info['wp_version'] ) ); // Add menu item to admin bar (right side). // Using 'top-secondary' as parent ensures it appears on the right side. $wp_admin_bar->add_node( array( 'id' => 'abs_server_info', 'title' => $title, 'parent' => 'top-secondary', 'meta' => array( 'title' => '', 'class' => 'abs-server-info', ), ) ); } /** * Enqueue styles for admin bar. * * @since 1.0.3 */ public function enqueue_styles() { // Only enqueue styles for administrators. if ( ! current_user_can( 'manage_options' ) ) { return; } $css_file = plugin_dir_url( __FILE__ ) . 'assets/css/admin-bar-server-info.css'; wp_enqueue_style( 'admin-bar-server-info', $css_file, array(), self::VERSION ); } /** * Get server and environment information. * * @since 1.0.0 * @return array Array containing server information. */ private function get_server_info() { global $wpdb; $info = array(); // Get PHP version. $info['php_version'] = $this->get_php_version(); // Get database version. $info['db_version'] = $this->get_database_version( $wpdb ); // Get server software. $info['server_software'] = $this->get_server_software(); // Get WordPress version. $info['wp_version'] = get_bloginfo( 'version' ); // Get server IP address. $info['server_ip'] = $this->get_server_ip(); // Get memory usage. $info['memory_usage'] = $this->get_memory_usage(); // Get WordPress memory limit. $info['wp_memory_limit'] = $this->get_wp_memory_limit(); // Get operating system. $info['os'] = $this->get_operating_system(); // Get PHP SAPI. $info['sapi'] = $this->get_php_sapi(); // Get max execution time. $info['max_execution_time'] = $this->get_max_execution_time(); // Get max upload size. $info['max_upload_size'] = $this->get_max_upload_size(); return $info; } /** * Get PHP version. * * @since 1.0.0 * @return string PHP version with architecture info. */ private function get_php_version() { $php_version = PHP_VERSION; // Get architecture (32 or 64 bit). $php_bits = PHP_INT_SIZE * 8; // Format: "8.3.29 @64BitOS" (matching the original plugin format). return $php_version . ' @' . $php_bits . 'BitOS'; } /** * Get database version. * * @since 1.0.0 * @param wpdb $wpdb WordPress database object. * @return string Database version. */ private function get_database_version( $wpdb ) { // Get full database version using SQL query for better detection. $db_version_full = $wpdb->get_var( 'SELECT VERSION()' ); if ( empty( $db_version_full ) ) { // Fallback to WordPress db_version() method. $db_version_full = $wpdb->db_version(); } if ( empty( $db_version_full ) ) { return esc_html__( 'Unknown', 'admin-bar-server-info' ); } // Check if it's MariaDB (case-insensitive search). $is_mariadb = ( stripos( $db_version_full, 'mariadb' ) !== false ); // Extract version numbers (major.minor). // MariaDB version format: "10.11.2-MariaDB" or similar. // MySQL version format: "8.0.35" or similar. preg_match( '/(\d+)\.(\d+)/', $db_version_full, $matches ); if ( ! empty( $matches ) && count( $matches ) >= 3 ) { $major = $matches[1]; $minor = $matches[2]; $db_type = $is_mariadb ? 'MariaDB' : 'MySQL'; return $db_type . ' ' . $major . '.' . $minor; } // Fallback: return as-is with detected type. $db_type = $is_mariadb ? 'MariaDB' : 'MySQL'; return $db_type . ' ' . $db_version_full; } /** * Get server software name. * * @since 1.0.0 * @return string Server software name. */ private function get_server_software() { // Check if SERVER_SOFTWARE is available. if ( ! isset( $_SERVER['SERVER_SOFTWARE'] ) || empty( $_SERVER['SERVER_SOFTWARE'] ) ) { return esc_html__( 'Unknown', 'admin-bar-server-info' ); } $server_software = sanitize_text_field( wp_unslash( $_SERVER['SERVER_SOFTWARE'] ) ); // Detect common server software. if ( stripos( $server_software, 'apache' ) !== false ) { return 'Apache'; } elseif ( stripos( $server_software, 'nginx' ) !== false ) { return 'Nginx'; } elseif ( stripos( $server_software, 'litespeed' ) !== false ) { return 'LiteSpeed'; } elseif ( stripos( $server_software, 'iis' ) !== false ) { return 'IIS'; } elseif ( stripos( $server_software, 'caddy' ) !== false ) { return 'Caddy'; } // If no known server detected, return first part of SERVER_SOFTWARE. $parts = explode( '/', $server_software ); if ( ! empty( $parts[0] ) ) { return esc_html( trim( $parts[0] ) ); } return esc_html__( 'Unknown', 'admin-bar-server-info' ); } /** * Get server IP address with hostname. * * @since 1.0.3 * @return string Server IP address with hostname in parentheses. */ private function get_server_ip() { // Try SERVER_ADDR first (standard for most servers). $server_ip = ! empty( $_SERVER['SERVER_ADDR'] ) ? sanitize_text_field( wp_unslash( $_SERVER['SERVER_ADDR'] ) ) : ''; // Fallback to LOCAL_ADDR for IIS servers. if ( empty( $server_ip ) && ! empty( $_SERVER['LOCAL_ADDR'] ) ) { $server_ip = sanitize_text_field( wp_unslash( $_SERVER['LOCAL_ADDR'] ) ); } // If still empty, try to get from hostname. if ( empty( $server_ip ) && function_exists( 'gethostname' ) ) { $hostname = gethostname(); if ( $hostname ) { $ip = gethostbyname( $hostname ); if ( $ip !== $hostname ) { $server_ip = $ip; } } } // Get hostname for display (matching the original plugin format). $hostname = ''; if ( function_exists( 'gethostname' ) ) { $hostname = gethostname(); } // Format: "IP 172.23.0.3 (hostname)" or just "IP 172.23.0.3" if no hostname. if ( empty( $server_ip ) ) { return esc_html__( 'N/A', 'admin-bar-server-info' ); } $ip_display = esc_html( $server_ip ); if ( ! empty( $hostname ) ) { $ip_display .= ' (' . esc_html( $hostname ) . ')'; } return $ip_display; } /** * Get memory usage information. * * @since 1.0.3 * @return string Memory usage formatted string. */ private function get_memory_usage() { // Get memory limit (current PHP limit, which WordPress may have adjusted). $memory_limit = ini_get( 'memory_limit' ); // Convert memory limit to bytes using our own converter for maximum compatibility. $memory_limit_bytes = $this->convert_to_bytes( $memory_limit ); // Get peak memory usage. $memory_usage_bytes = function_exists( 'memory_get_peak_usage' ) ? memory_get_peak_usage( true ) : 0; // Handle unlimited memory (-1). if ( -1 === $memory_limit_bytes ) { // Unlimited memory - show usage only. if ( empty( $memory_usage_bytes ) ) { return esc_html__( 'N/A', 'admin-bar-server-info' ); } $memory_usage_mb = round( $memory_usage_bytes / 1024 / 1024, 2 ); return sprintf( '%s MB (%s)', number_format_i18n( $memory_usage_mb, 2 ), esc_html__( 'Unlimited', 'admin-bar-server-info' ) ); } // Handle invalid values. if ( empty( $memory_usage_bytes ) || empty( $memory_limit_bytes ) || $memory_limit_bytes <= 0 ) { return esc_html__( 'N/A', 'admin-bar-server-info' ); } // Convert to MB for display. $memory_usage_mb = round( $memory_usage_bytes / 1024 / 1024, 2 ); $memory_limit_mb = round( $memory_limit_bytes / 1024 / 1024, 2 ); // Calculate percentage. $memory_percent = round( ( $memory_usage_bytes / $memory_limit_bytes ) * 100, 0 ); // Format: "used/total MB (XX%)" - matching the original plugin format more closely. return sprintf( '%s/%s MB (%d%%)', number_format_i18n( $memory_usage_mb, 2 ), number_format_i18n( $memory_limit_mb, 2 ), $memory_percent ); } /** * Convert memory size string to bytes. * * @since 1.0.3 * @param string $size Memory size string (e.g., "128M", "256K", "-1" for unlimited). * @return int Size in bytes, or -1 for unlimited. */ private function convert_to_bytes( $size ) { $size = trim( $size ); // Handle empty or invalid values. if ( empty( $size ) ) { return 0; } // Handle unlimited memory (-1). if ( '-1' === $size ) { return -1; } // Get the last character to determine unit. $last = strtolower( substr( $size, -1 ) ); $value = (int) $size; // Convert based on unit (G, M, K). switch ( $last ) { case 'g': $value *= 1024; // Fall through. case 'm': $value *= 1024; // Fall through. case 'k': $value *= 1024; } return $value; } /** * Get WordPress memory limit. * * @since 1.0.3 * @return string WordPress memory limit formatted string. */ private function get_wp_memory_limit() { // Check if WP_MEMORY_LIMIT constant is defined. if ( ! defined( 'WP_MEMORY_LIMIT' ) ) { return esc_html__( 'N/A', 'admin-bar-server-info' ); } $wp_limit = WP_MEMORY_LIMIT; // Convert to bytes for formatting. $wp_limit_bytes = $this->convert_to_bytes( $wp_limit ); if ( empty( $wp_limit_bytes ) || $wp_limit_bytes <= 0 ) { return esc_html__( 'N/A', 'admin-bar-server-info' ); } // Use WordPress size_format function if available, otherwise format manually. if ( function_exists( 'size_format' ) ) { return size_format( $wp_limit_bytes ); } // Manual formatting if size_format is not available. $wp_limit_mb = round( $wp_limit_bytes / 1024 / 1024, 0 ); return number_format_i18n( $wp_limit_mb ) . ' MB'; } /** * Get operating system name. * * @since 1.0.3 * @return string Operating system name. */ private function get_operating_system() { // Try php_uname first (more detailed). if ( function_exists( 'php_uname' ) ) { $os = php_uname( 's' ); if ( ! empty( $os ) ) { return esc_html( $os ); } } // Fallback to PHP_OS constant. if ( defined( 'PHP_OS' ) ) { return esc_html( PHP_OS ); } return esc_html__( 'Unknown', 'admin-bar-server-info' ); } /** * Get PHP SAPI (Server API). * * @since 1.0.3 * @return string PHP SAPI name (shortened for common values). */ private function get_php_sapi() { if ( function_exists( 'php_sapi_name' ) ) { $sapi = php_sapi_name(); if ( ! empty( $sapi ) ) { // Shorten common SAPIs to avoid redundancy. switch ( $sapi ) { case 'apache2handler': return 'mod_php'; case 'fpm-fcgi': return 'fpm'; case 'cgi-fcgi': return 'cgi'; default: return esc_html( $sapi ); } } } return esc_html__( 'Unknown', 'admin-bar-server-info' ); } /** * Get max execution time. * * @since 1.0.3 * @return string Max execution time in seconds. */ private function get_max_execution_time() { $max_exec_time = ini_get( 'max_execution_time' ); // Handle unlimited (0 or -1). if ( empty( $max_exec_time ) || $max_exec_time < 0 ) { return esc_html__( 'Unlimited', 'admin-bar-server-info' ); } return esc_html( $max_exec_time ) . 's'; } /** * Get max upload size. * * @since 1.0.3 * @return string Max upload size formatted. */ private function get_max_upload_size() { $upload_max = ini_get( 'upload_max_filesize' ); if ( empty( $upload_max ) ) { return esc_html__( 'N/A', 'admin-bar-server-info' ); } // Return as-is (already formatted like "64M", "2M", etc.). return esc_html( $upload_max ); } } /** * Initialize the plugin. * * @since 1.0.0 */ function abs_init() { new Admin_Bar_Server_Info(); } add_action( 'init', 'abs_init' );