get_server_info(); // Build the title with server information. $title = sprintf( /* translators: 1: PHP version, 2: Database version, 3: Server software, 4: WordPress version */ esc_html__( '* PHP %1$s | %2$s | %3$s | WP %4$s *', 'admin-bar-server-info' ), esc_html( $server_info['php_version'] ), esc_html( $server_info['db_version'] ), esc_html( $server_info['server_software'] ), 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', ), ) ); } /** * 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' ); return $info; } /** * Get PHP version. * * @since 1.0.0 * @return string PHP version. */ private function get_php_version() { $php_version = PHP_VERSION; // Extract major and minor version (e.g., "8.2" from "8.2.15"). $version_parts = explode( '.', $php_version ); if ( count( $version_parts ) >= 2 ) { return $version_parts[0] . '.' . $version_parts[1]; } return $php_version; } /** * 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' ); } } /** * Initialize the plugin. * * @since 1.0.0 */ function abs_init() { new Admin_Bar_Server_Info(); } add_action( 'init', 'abs_init' );