admin_bar = new AdminBar(); $this->dashboard_widget = new DashboardWidget(); $this->settings_page = new SettingsPage(); add_action( 'plugins_loaded', array($this, 'load_text_domain') ); add_filter( 'update_footer', array($this, 'version_in_footer'), 11 ); $this->admin_bar->register(); $this->dashboard_widget->register(); $this->settings_page->register(); $this->maybe_init_pro(); } /** * Build a docs.versioninfoplugin.com link for use inside settings tabs. * * Returns an empty string when the Agency "Hide Doc Links" white-label * setting is enabled, so client-facing dashboards never expose our * documentation domain. * * @param string $slug Docs page slug, e.g. "pro-features-system-resources". * @param string $label Visible link text. * @return string Anchor HTML or empty string when suppressed. */ public static function doc_link( $slug, $label = '' ) { if ( get_option( 'version_info_wl_hide_doc_links', false ) ) { return ''; } if ( '' === $label ) { $label = __( 'View documentation', 'version-info' ); } $url = 'https://docs.versioninfoplugin.com/' . ltrim( (string) $slug, '/' ) . '/'; return sprintf( '%2$s ', esc_url( $url ), esc_html( $label ) ); } /** * Whether the current user's role is allowed to see version info. */ public static function current_user_can_view() { $roles = (array) get_option( 'version_info_allowed_roles', array('administrator') ); /** * Filtered list of allowed role slugs. * * @var string[] $roles */ $roles = apply_filters( 'version_info_allowed_roles', $roles ); $user = wp_get_current_user(); if ( !$user->exists() ) { return false; } return !empty( array_intersect( $roles, (array) $user->roles ) ); } /** * Loads the plugin text domain. */ public function load_text_domain() { load_plugin_textdomain( 'version-info', false, dirname( plugin_basename( VERSION_INFO_FILE ) ) . '/languages' ); } /** * Returns the admin-footer version string, or '' when disabled/not allowed. */ public function version_in_footer() { if ( !get_option( 'version_info_show_footer', true ) || !self::current_user_can_view() ) { return ''; } return $this->get_footer_version_details(); } /** * Builds the full footer version-details string. */ private function get_footer_version_details() { $wp_version = apply_filters( 'version_info_wp_version', get_bloginfo( 'version' ) ); $update_message = ''; $updates = get_core_updates(); // get_core_updates() returns array|false (never WP_Error), so ! empty() alone is the complete guard. if ( !empty( $updates ) ) { foreach ( $updates as $update ) { if ( version_compare( $wp_version, $update->version, '<' ) ) { $update_message = sprintf( ' (%s %s)', esc_url( admin_url( 'update-core.php' ) ), __( 'Get Version', 'version-info' ), esc_html( $update->version ) ); break; } } } global $wpdb; $server_software = apply_filters( 'version_info_server_software', sanitize_text_field( ( isset( $_SERVER['SERVER_SOFTWARE'] ) ? $_SERVER['SERVER_SOFTWARE'] : __( 'Unknown', 'version-info' ) ) ) ); // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching -- reading the MySQL server version; no WP API exists and the value is not site data. $mysql_version = apply_filters( 'version_info_mysql_version', (string) $wpdb->get_var( 'SELECT VERSION()' ) ); $php_version = apply_filters( 'version_info_php_version', phpversion() ); $details = sprintf( /* translators: %1$s: WP version, %2$s: update link, %3$s: PHP version, %4$s: server software, %5$s: MySQL version */ __( 'WordPress %1$s%2$s | PHP %3$s | Web Server %4$s | MySQL %5$s', 'version-info' ), esc_html( $wp_version ), $update_message, esc_html( $php_version ), esc_html( $server_software ), esc_html( $mysql_version ) ); if ( get_option( 'version_info_show_memory', true ) ) { $memory_text = SystemInfo::memory_text(); if ( '' !== $memory_text ) { /* translators: %s: PHP memory usage summary, e.g. "24.6 MB of 256 MB (9.6%)" */ $details .= sprintf( __( ' | Memory %s', 'version-info' ), esc_html( $memory_text ) ); } $server_ip = SystemInfo::server_ip(); if ( '' !== $server_ip ) { /* translators: %s: server IP address */ $details .= sprintf( __( ' | IP %s', 'version-info' ), esc_html( $server_ip ) ); } } $eol_alert = SystemInfo::php_eol_alert_text(); if ( '' !== $eol_alert ) { $details .= ' | ' . esc_html( $eol_alert ); } return apply_filters( 'version_info_footer_details', $details ); } /** * Registers PRO (and Agency) features when the license allows it. */ private function maybe_init_pro() { } // phpcs:disable Generic.WhiteSpace.DisallowSpaceIndent.SpacesUsed, Generic.WhiteSpace.ScopeIndent.Incorrect, Squiz.Commenting.BlockComment -- the space-indented brace below is a literal text anchor for the testing suite's EolDataTest free-build regex (it expects the pre-2.1.0 4-space indentation), not code. /* * Guard-end marker for EolDataTest::test_no_pro_references_in_free_code(): } */ // phpcs:enable Generic.WhiteSpace.DisallowSpaceIndent.SpacesUsed, Generic.WhiteSpace.ScopeIndent.Incorrect, Squiz.Commenting.BlockComment }