'.PLUGINMEMORYUSAGE_VERSION.'', 'pmusage_display_memory_usage_dashboard' ); } // Hook to add the widget to the dashboard add_action('wp_dashboard_setup', 'pmusage_memory_usage_widget', 1); // Get supported PHP versions with caching function pmusage_get_supported_php_versions() { $supported_versions = get_transient('pmusage_supported_php_versions'); if (false === $supported_versions) { $response = wp_remote_get('https://www.php.net/supported-versions.php', array( 'sslverify' => false, 'timeout' => 5 )); if (!is_wp_error($response) && 200 === wp_remote_retrieve_response_code($response)) { $html = wp_remote_retrieve_body($response); $supported_versions = pmusage_parse_supported_versions($html); set_transient('pmusage_supported_php_versions', $supported_versions, WEEK_IN_SECONDS); } } return is_array($supported_versions) ? $supported_versions : []; } // Parse HTML response from PHP.net function pmusage_parse_supported_versions($html) { $versions = []; $dom = new DOMDocument(); @$dom->loadHTML($html); $tables = $dom->getElementsByTagName('table'); foreach ($tables as $table) { $rows = $table->getElementsByTagName('tr'); foreach ($rows as $row) { $cells = $row->getElementsByTagName('td'); if ($cells->length >= 5) { $version = trim($cells->item(0)->textContent); $eol_date = DateTime::createFromFormat('d M Y', trim($cells->item(3)->textContent)); if ($eol_date) { $versions[$version] = [ 'eol' => $eol_date->format('Y-m-d'), 'status' => (new DateTime() < $eol_date) ? 'supported' : 'eol' ]; } } } } return $versions; } function pmusage_get_php_status($current_version) { $supported_versions = pmusage_get_supported_php_versions(); $current_branch = preg_replace('/^(\d+\.\d+).*$/', '$1', $current_version); if ( isset($supported_versions[$current_branch]) && $supported_versions[$current_branch]['status'] === 'supported' ) { return 'supported'; } return 'eol'; } /** * Get latest WordPress version from WordPress.org API with extensive debugging */ function pmusage_get_latest_wp_version() { // Try to get from cache first $latest_version = get_transient('pmusage_latest_wp_version'); if (false !== $latest_version) { return $latest_version; } // Use version 1.7 which returns JSON format $url = 'https://api.wordpress.org/core/version-check/1.7/'; $response = wp_remote_get($url, array( 'timeout' => 10, 'sslverify' => true, 'user-agent' => 'WordPress/' . get_bloginfo('version') . '; ' . get_bloginfo('url') )); // Check for errors if (is_wp_error($response)) { return 'Unknown'; } $response_code = wp_remote_retrieve_response_code($response); if (200 !== $response_code) { return 'Unknown'; } $body = wp_remote_retrieve_body($response); if (empty($body)) { return 'Unknown'; } $data = json_decode($body, true); if (json_last_error() !== JSON_ERROR_NONE) { return 'Unknown'; } if (isset($data['offers']) && is_array($data['offers']) && !empty($data['offers'])) { // Get the first offer which is the latest stable version $latest_version = $data['offers'][0]['version'] ?? 'Unknown'; } else { return 'Unknown'; } // Only cache if we got a valid version if ($latest_version !== 'Unknown' && preg_match('/^\d+\.\d+/', $latest_version)) { set_transient('pmusage_latest_wp_version', $latest_version, 12 * HOUR_IN_SECONDS); } return $latest_version; } function pmusage_get_cpu_usage() { if ( ! function_exists('sys_getloadavg') ) { return null; } $load = sys_getloadavg(); $cores = 1; if ( is_readable('/proc/cpuinfo') ) { $cpuinfo = file_get_contents('/proc/cpuinfo'); preg_match_all('/^processor/m', $cpuinfo, $matches); $cores = max(1, count($matches[0])); } return round(($load[0] / $cores) * 100, 1); } function pmusage_get_disk_usage() { $path = defined('ABSPATH') ? ABSPATH : '/'; $total = @disk_total_space($path); $free = @disk_free_space($path); if ( ! $total || ! $free ) { return null; } $used = $total - $free; $percent = round(($used / $total) * 100, 1); return [ 'used' => $used, 'total' => $total, 'free' => $free, 'percent' => $percent, ]; } // to be shown in several places function pmusage_render_system_info() { global $wpdb; // Get PHP version and status $php_version = phpversion(); $php_status = pmusage_get_php_status($php_version); // Dashicons for PHP version status $icons = [ 'supported' => '', 'eol' => '' ]; // Fetch latest PHP version with error handling $latest_php_version = get_transient('pmusage_latest_php_version'); if (false === $latest_php_version) { $response = wp_remote_get('https://www.php.net/releases/?json', array( 'sslverify' => false, 'timeout' => 5 )); if (!is_wp_error($response) && 200 === wp_remote_retrieve_response_code($response)) { $data = json_decode(wp_remote_retrieve_body($response), true); if (is_array($data) && !empty($data)) { // Extract versions $versions = array(); foreach ($data as $major_version => $release_info) { if (isset($release_info['version'])) { $versions[] = $release_info['version']; } } usort($versions, 'version_compare'); $latest_php_version = end($versions); set_transient('pmusage_latest_php_version', $latest_php_version, 12 * HOUR_IN_SECONDS); } } } // Validation if (empty($latest_php_version) || !preg_match('/^\d+\.\d+(\.\d+)?$/', $latest_php_version)) { $latest_php_version = 'Unknown'; } $is_latest = ($latest_php_version !== 'Unknown') ? version_compare($php_version, $latest_php_version, '>=') : false; // Get MySQL version and status $mysql_version = wp_cache_get('pmusage_mysql_version'); if (false === $mysql_version) { // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery -- Getting MySQL version requires direct query, no WordPress alternative available $mysql_version = $wpdb->get_var("SELECT VERSION()"); wp_cache_set('pmusage_mysql_version', $mysql_version, '', 12 * HOUR_IN_SECONDS); } $mysql_status = pmusage_get_mysql_status($mysql_version); $latest_mysql_version = pmusage_get_mysql_latest_version($mysql_version); // Enhanced icons for MySQL status with tooltips $mysql_icons = [ 'supported' => '', 'eol' => '', 'innovation' => '', ' unknown' => '' ]; // Check if current version is latest $current_version_number = ''; preg_match('/(\d+\.\d+\.\d+)/', $mysql_version, $matches); if (!empty($matches[1])) { $current_version_number = $matches[1]; } $is_latest_mysql = ($latest_mysql_version !== 'Unknown' && !empty($current_version_number)) ? version_compare($current_version_number, $latest_mysql_version, '>=') : false; // Get max upload size $max_upload = ini_get('upload_max_filesize'); $max_post = ini_get('post_max_size'); $memory_limit = ini_get('memory_limit'); $upload_mb = min( wp_convert_hr_to_bytes($max_upload), wp_convert_hr_to_bytes($max_post), wp_convert_hr_to_bytes($memory_limit) ); // Get WP and PHP memory limits $wp_memory_limit = wp_convert_hr_to_bytes(WP_MEMORY_LIMIT); $php_memory_limit = ini_get('memory_limit'); // Get current and latest WordPress version $wp_version = get_bloginfo('version'); $latest_wp_version = pmusage_get_latest_wp_version(); // Check if current version is latest $is_wp_latest = ($latest_wp_version !== 'Unknown') ? version_compare($wp_version, $latest_wp_version, '>=') : null; // Display WordPress version with status echo '

WordPress Version: ' . esc_html($wp_version); // Add badge if version is up to date if ($is_wp_latest === true) { echo ' '; } elseif ($is_wp_latest === false) { echo ' '; } // Show latest version info if ('Unknown' !== $latest_wp_version) { $label = $is_wp_latest ? 'Latest' : 'Latest: ' . esc_html($latest_wp_version); $class = $is_wp_latest ? 'pluginmemoryusage_version-latest' : 'pluginmemoryusage_version-outdated'; echo ' ' . esc_html($label) . ''; } else { echo ' Version check failed'; } echo '

'; echo '

PHP Version: ' . esc_html($php_version); echo wp_kses_post($icons[$php_status]); if ('Unknown' !== $latest_php_version) { $label = $is_latest ? 'Latest' : 'Latest: ' . esc_html($latest_php_version); $class = $is_latest ? 'pluginmemoryusage_version-latest' : 'pluginmemoryusage_version-outdated'; echo ' ' . esc_html($label) . ''; } else { echo ' (Version check failed)'; } echo '

'; // Display MySQL version with status echo 'MySQL Version: ' . esc_html($mysql_version) . ' '; echo wp_kses_post($mysql_icons[$mysql_status]); // Show latest version info (similar to PHP version display) if ('Unknown' !== $latest_mysql_version) { $label = $is_latest_mysql ? 'Latest' : 'Latest: ' . esc_html($latest_mysql_version); $class = $is_latest_mysql ? 'pluginmemoryusage_version-latest' : 'pluginmemoryusage_version-outdated'; echo ' ' . esc_html($label) . ''; } else { echo ' (Version check failed)'; } echo '

'; echo '

Max Upload Size: ' . esc_html(size_format($upload_mb)) . '

'; echo '

WordPress Memory Limit: ' . esc_html(size_format($wp_memory_limit)) . '

'; echo '

PHP Memory Limit: ' . esc_html($php_memory_limit) . '

'; // CPU Usage $cpu_usage = pmusage_get_cpu_usage(); if ( $cpu_usage !== null ) { if ( $cpu_usage >= 90 ) $cpu_class = 'pmusage-bar-critical'; elseif ( $cpu_usage >= 75 ) $cpu_class = 'pmusage-bar-warning'; elseif ( $cpu_usage >= 50 ) $cpu_class = 'pmusage-bar-moderate'; else $cpu_class = 'pmusage-bar-good'; echo '

CPU Load (1 min avg): ' . esc_html($cpu_usage) . '%

'; echo '
'; } else { echo '

CPU Load: Unavailable

'; } // Disk Usage $disk = pmusage_get_disk_usage(); if ( $disk !== null ) { if ( $disk['percent'] >= 90 ) $disk_class = 'pmusage-bar-critical'; elseif ( $disk['percent'] >= 75 ) $disk_class = 'pmusage-bar-warning'; elseif ( $disk['percent'] >= 50 ) $disk_class = 'pmusage-bar-moderate'; else $disk_class = 'pmusage-bar-good'; echo '

Disk Usage: ' . esc_html(size_format($disk['used'])) . ' of ' . esc_html(size_format($disk['total'])) . ' (' . esc_html($disk['percent']) . '%)

'; echo '
'; } else { echo '

Disk Usage: Unavailable

'; } } // Function to display content in the dashboard widget function pmusage_display_memory_usage_dashboard() { global $wpdb; // Get WordPress memory limit $wp_memory_limit = wp_convert_hr_to_bytes(WP_MEMORY_LIMIT); // Get current memory usage $current_memory_usage = memory_get_usage(true); // Calculate percentage used $percentage_used = ($current_memory_usage / $wp_memory_limit) * 100; // Display the data - In seperate function for reusability pmusage_render_system_info(); // Display memory usage echo '

Current Memory Usage: '; echo esc_html(size_format($current_memory_usage)) . ' of ' . esc_html(size_format($wp_memory_limit)) . '

'; echo '
' . esc_html(round($percentage_used, 1)) . '%
'; // Message to increase memory limit if usage is high if ($current_memory_usage > $wp_memory_limit * 0.8) { echo 'You are using more than 80% of allocated memory. Please go to Memory Control Panel to try to increase memory limit '; echo '

'; } // Add button to Plugin Memory Control Panel echo '

Plugin Memory Control Panel

'; } function pmusage_memory_usage_admin_page() { ?>

Plugin Memory Usage - Control Panel

System Information

Current Memory Usage

Using of

%



Memory fluctuate. Please press button once after entering panel. $wp_memory_limit * 0.8) { echo '

You are using more than 80% of allocated memory. Please click button below to try to increase memory limit.

'; echo '

'; echo '

'; } ?>

Memory Usage History


    This plugin measures changes in WordPress memory usage as you activate and deactivate plugins. Here's how it works:

    1. It records the current memory usage of WordPress.
    2. When you activate or deactivate a plugin, it measures the memory usage again.
    3. The difference between these measurements gives an estimate of the plugin's memory impact.
    4. This process is repeated each time you toggle a plugin.

    Note: These measurements are estimates and may vary. Factors like caching, other active plugins, and WordPress itself can influence memory usage. For the most accurate results, consider testing in a controlled environment.

    To begin, try activating or deactivating plugins using the buttons provided. The memory usage history will appear here.

    |

Plugins

'; foreach ($all_plugins as $plugin_path => $plugin_data) { $is_active = in_array($plugin_path, $active_plugins); $plugin_id = sanitize_title($plugin_data['Name']); $is_memory_usage_plugin = (strpos($plugin_path, 'plugin-memory-usage') !== false); $li_class = $is_active ? 'plugin-active' : 'plugin-inactive'; if ($is_memory_usage_plugin) { $li_class .= ' memory-usage-plugin'; } $avg_memory = pmusage_get_average_memory_usage($plugin_path); echo '
  • '; echo '
    '; echo '' . esc_html($plugin_data['Name']) . ' (' . esc_html($avg_memory) . ' MB)'; echo '
    '; echo '
    '; echo '
    '; if ($is_memory_usage_plugin) { echo ''; } else { echo ''; } echo '
    '; echo '
  • '; } echo ''; ?>
    get_error_message()); } else { wp_send_json_success(); } } add_action('wp_ajax_pmusage_toggle_plugin', 'pmusage_toggle_plugin'); function pmusage_table_exists($table_name) { global $wpdb; $full_table_name = $wpdb->prefix . $table_name; // Create a unique cache key $cache_key = 'pmusage_table_exists_' . md5($full_table_name); // Try to get the result from cache $table_exists = wp_cache_get($cache_key); if (false === $table_exists) { // Cache miss, perform the database query // There isn't a reliable way to check if a table exists in WordPress without making a direct database call $result = $wpdb->get_var( // phpcs:ignore WordPress.DB.DirectDatabaseQuery $wpdb->prepare( "SHOW TABLES LIKE %s", $full_table_name ) ); $table_exists = ($result === $full_table_name); // Cache the result for future use (cache for 1 hour) wp_cache_set($cache_key, $table_exists, '', 3600); } return $table_exists; } function pmusage_refresh_memory_usage() { check_ajax_referer('wp_memory_usage_nonce', 'nonce'); global $wpdb; $table_name = $wpdb->prefix . 'wpmem_plugin_history'; // Check if the table exists if (!pmusage_table_exists('wpmem_plugin_history')) { pmusage_create_history_table(); } $current_memory = memory_get_usage(true); $formatted_memory = size_format($current_memory, 2); $percentage = round(($current_memory / wp_convert_hr_to_bytes(WP_MEMORY_LIMIT)) * 100, 2); // Save the measurement if a plugin was toggled if (isset($_POST['plugin']) && isset($_POST['toggle_action'])) { $plugin = sanitize_text_field(wp_unslash($_POST['plugin'])); $previous_memory = isset($_POST['previous_memory']) ? intval($_POST['previous_memory']) : 0; $memory_change = $current_memory - $previous_memory; pmusage_save_plugin_measurement($plugin, $memory_change); } wp_send_json_success(array( 'current_memory' => $formatted_memory, 'current_memory_bytes' => $current_memory, 'percentage' => $percentage, )); } add_action('wp_ajax_pmusage_refresh_memory_usage', 'pmusage_refresh_memory_usage'); add_action('admin_enqueue_scripts', 'pmusage_enqueue_styles'); function pmusage_enqueue_styles($hook) { // Load on all admin pages where the dashboard widget appears wp_enqueue_style('pmusage-styles', plugins_url('plugin-memory-usage.css', __FILE__), array(), filemtime(plugin_dir_path(__FILE__) . 'plugin-memory-usage.css') ); } function pmusage_enqueue_scripts($hook) { if ($hook != 'toplevel_page_wp_plugin_memory_usage') { return; } wp_enqueue_script('pmusage-script', plugins_url('plugin-memory-usage.js', __FILE__), array(), '1.0', true); $nonce = wp_create_nonce('wp_memory_usage_nonce'); wp_localize_script('pmusage-script', 'pmusageData', array( 'pmusage_ajaxurl' => admin_url('admin-ajax.php'), 'nonce' => $nonce, 'initialMemoryUsage' => memory_get_usage(true), 'pluginHistory' => pmusage_get_all_plugin_history() )); } add_action('admin_enqueue_scripts', 'pmusage_enqueue_scripts'); function pmusage_create_history_table() { global $wpdb; $table_name = $wpdb->prefix . 'wpmem_plugin_history'; $charset_collate = $wpdb->get_charset_collate(); $sql = "CREATE TABLE $table_name ( id mediumint(9) NOT NULL AUTO_INCREMENT, plugin_path varchar(255) NOT NULL, memory_change bigint(20) NOT NULL, zero_count int(11) NOT NULL DEFAULT 0, timestamp datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, PRIMARY KEY (id) ) $charset_collate;"; require_once(ABSPATH . 'wp-admin/includes/upgrade.php'); $result = dbDelta($sql); if (!empty($wpdb->last_error)) { return false; } return true; } register_activation_hook(__FILE__, 'pmusage_create_history_table'); function pmusage_save_plugin_measurement($plugin_path, $memory_change) { global $wpdb; $table_name = $wpdb->prefix . 'wpmem_plugin_history'; // Convert memory_change to its absolute value $memory_change = abs($memory_change); if ($memory_change == 0) { // Increment zero count for the most recent entry $wpdb->query( // phpcs:ignore WordPress.DB.DirectDatabaseQuery $wpdb->prepare( "UPDATE `" . esc_sql($table_name) . "` SET zero_count = zero_count + 1 WHERE plugin_path = %s ORDER BY timestamp DESC LIMIT 1", $plugin_path ) ); } else { // Insert new non-zero measurement $wpdb->insert( // phpcs:ignore WordPress.DB.DirectDatabaseQuery $table_name, array( 'plugin_path' => $plugin_path, 'memory_change' => $memory_change, 'zero_count' => 0, ) ); } // Clear caches pmusage_clear_plugin_history_cache($plugin_path); pmusage_clear_all_plugin_history_cache(); pmusage_clear_average_memory_cache($plugin_path); } function pmusage_get_plugin_history($plugin_path) { global $wpdb; $table_name = $wpdb->prefix . 'wpmem_plugin_history'; // Create a unique cache key for this query $cache_key = 'wpmem_plugin_history_' . md5($plugin_path); // Try to get the results from cache $results = wp_cache_get($cache_key); // If the results are not in cache, query the database if (false === $results) { $results = $wpdb->get_results( // phpcs:ignore WordPress.DB.DirectDatabaseQuery $wpdb->prepare( "SELECT memory_change, timestamp FROM `" . esc_sql($table_name) . "` WHERE plugin_path = %s ORDER BY timestamp DESC LIMIT 5", $plugin_path ) ); // Cache the results for future use wp_cache_set($cache_key, $results, '', 3600); // Cache for 1 hour } return $results; } function pmusage_clear_plugin_history_cache($plugin_path) { $cache_key = 'wpmem_plugin_history_' . md5($plugin_path); wp_cache_delete($cache_key); } add_action('wp_ajax_pmusage_get_plugin_history', 'pmusage_get_plugin_history_ajax'); function pmusage_get_plugin_history_ajax() { check_ajax_referer('wp_memory_usage_nonce', 'nonce'); if (!isset($_POST['plugin'])) { wp_send_json_error('Plugin not specified'); } $plugin = sanitize_text_field(wp_unslash($_POST['plugin'])); $history = pmusage_get_plugin_history($plugin); wp_send_json_success($history); } function pmusage_get_all_plugin_history() { global $wpdb; $table_name = $wpdb->prefix . 'wpmem_plugin_history'; // Create a unique cache key for this query $cache_key = 'pmusage_all_plugin_history'; // Try to get the results from cache $results = wp_cache_get($cache_key); // If the results are not in cache, query the database if (false === $results) { $results = $wpdb->get_results( // phpcs:ignore WordPress.DB.DirectDatabaseQuery $wpdb->prepare( "SELECT plugin_path, memory_change, timestamp FROM `" . esc_sql($table_name) . "` WHERE plugin_path IN (SELECT DISTINCT plugin_path FROM `" . esc_sql($table_name) . "`) ORDER BY timestamp DESC -- %d", 1 ) ); // Cache the results for future use wp_cache_set($cache_key, $results, '', 3600); // Cache for 1 hour } // Process results... $history = array(); foreach ($results as $row) { if (!isset($history[$row->plugin_path])) { $history[$row->plugin_path] = array(); } if (count($history[$row->plugin_path]) < 5) { $history[$row->plugin_path][] = array( 'memory_change' => $row->memory_change, 'timestamp' => $row->timestamp ); } } return $history; } function pmusage_clear_all_plugin_history_cache() { wp_cache_delete('pmusage_all_plugin_history'); } function pmusage_clear_table_exists_cache() { global $wpdb; $table_name = $wpdb->prefix . 'wpmem_plugin_history'; $cache_key = 'pmusage_table_exists_' . $table_name; wp_cache_delete($cache_key); } // Reset table verification cache when changing plugin state register_activation_hook(__FILE__, 'pmusage_clear_table_exists_cache'); // Pre-activation check register_deactivation_hook(__FILE__, 'pmusage_clear_table_exists_cache'); // Post-deactivation cleanup function pmusage_get_average_memory_usage($plugin_path) { global $wpdb; $table_name = $wpdb->prefix . 'wpmem_plugin_history'; // Create a unique cache key $cache_key = 'pmusage_avg_memory_' . md5($plugin_path); // Try to get the result from cache $avg_memory = wp_cache_get($cache_key); if (false === $avg_memory) { // Cache miss, perform the database query $result = $wpdb->get_row( // phpcs:ignore WordPress.DB.DirectDatabaseQuery $wpdb->prepare( "SELECT SUM(memory_change) as total_change, COUNT(*) as non_zero_count, SUM(zero_count) as zero_count FROM `" . esc_sql($table_name) . "` WHERE plugin_path = %s", $plugin_path ) ); if ($result) { $total_count = $result->non_zero_count + $result->zero_count; $avg_memory = $total_count > 0 ? ($result->total_change / $total_count) / (1024 * 1024) : 0; $avg_memory = round($avg_memory, 2); // Round to 2 decimal places } else { $avg_memory = 0; } // Cache the result for future use (cache for 5 minutes) wp_cache_set($cache_key, $avg_memory, '', 300); } return $avg_memory; } function pmusage_clear_average_memory_cache($plugin_path) { $cache_key = 'pmusage_avg_memory_' . md5($plugin_path); wp_cache_delete($cache_key); } add_action('wp_ajax_pmusage_update_average_memory', 'pmusage_update_average_memory'); add_action('wp_ajax_nopriv_update_average_memory', 'pmusage_update_average_memory'); function pmusage_update_average_memory() { // Check nonce for security if (!isset($_POST['nonce'])) { wp_send_json_error('Security token not provided'); } $nonce = sanitize_text_field(wp_unslash($_POST['nonce'])); if (!wp_verify_nonce($nonce, 'wp_memory_usage_nonce')) { wp_send_json_error('Invalid security token'); } if (!isset($_POST['plugin_path'])) { wp_send_json_error('Plugin path not provided'); } $plugin_path = sanitize_text_field(wp_unslash($_POST['plugin_path'])); $avg_memory = pmusage_get_average_memory_usage($plugin_path); wp_send_json_success(array('avg_memory' => $avg_memory)); } function pmusage_add_increase_memory_button($content) { $wp_memory_limit = wp_convert_hr_to_bytes(WP_MEMORY_LIMIT); $current_memory_usage = memory_get_usage(true); if ($current_memory_usage > $wp_memory_limit) { $content .= ''; $content .= ''; } return $content; } add_filter('pmusage_memory_usage_content', 'pmusage_add_increase_memory_button'); function pmusage_increase_memory_limit() { check_ajax_referer('wp_memory_usage_nonce', 'nonce'); if (!current_user_can('manage_options')) { wp_send_json_error(array('message' => 'Insufficient permissions')); } $current_limit = wp_convert_hr_to_bytes(WP_MEMORY_LIMIT); // If current limit is 160MB or less, double it. Otherwise, increase by 25%. if ($current_limit < 160 * 1024 * 1024) { // 160 MB in bytes $new_limit = $current_limit * 2; } else { $new_limit = (int)($current_limit * 1.25); // Increase by 25% } // Optional: Cap the maximum limit to avoid runaway values (e.g., 512MB) $max_limit = 512 * 1024 * 1024; // 512 MB in bytes if ($new_limit > $max_limit) { $new_limit = $max_limit; } // Attempt to increase the limit if (pmusage_set_memory_limit($new_limit)) { wp_send_json_success(array('new_limit' => size_format($new_limit))); } else { wp_send_json_error(array('message' => 'Unable to increase memory limit. You may need to contact your hosting provider.')); } } add_action('wp_ajax_pmusage_increase_memory_limit', 'pmusage_increase_memory_limit'); function pmusage_set_memory_limit($new_limit) { global $wp_filesystem; // Initialize the WP filesystem if (empty($wp_filesystem)) { require_once (ABSPATH . '/wp-admin/includes/file.php'); WP_Filesystem(); } $wp_config_file = ABSPATH . 'wp-config.php'; $config_content = $wp_filesystem->get_contents($wp_config_file); if ($config_content === false) { return false; } $new_limit_formatted = size_format($new_limit); if (preg_match("/define\(\s*'WP_MEMORY_LIMIT',\s*'.*?'\s*\);/", $config_content)) { // WP_MEMORY_LIMIT is already defined, so update it $new_content = preg_replace( "/define\(\s*'WP_MEMORY_LIMIT',\s*'.*?'\s*\);/", "define('WP_MEMORY_LIMIT', '$new_limit_formatted');", $config_content ); } else { // WP_MEMORY_LIMIT is not defined, so add it $new_content = preg_replace( "/<\?php/", "put_contents($wp_config_file, $new_content) === false) { return false; } return true; } function pmusage_add_settings_link($links) { $settings_link = 'Settings'; array_unshift($links, $settings_link); return $links; } $plugin = plugin_basename(__FILE__); add_filter("plugin_action_links_$plugin", 'pmusage_add_settings_link'); function pmusage_add_memory_to_admin_bar($wp_admin_bar) { $wp_memory_limit = wp_convert_hr_to_bytes(WP_MEMORY_LIMIT); $current_memory_usage = memory_get_usage(true); $percentage_used = round(($current_memory_usage / $wp_memory_limit) * 100, 1); // Determine color class based on memory usage if ($percentage_used >= 90) { $color_class = 'wpmem-critical'; // Red } elseif ($percentage_used >= 75) { $color_class = 'wpmem-warning'; // Orange } elseif ($percentage_used >= 50) { $color_class = 'wpmem-moderate'; // Yellow } else { $color_class = 'wpmem-good'; // Green } $wp_admin_bar->add_node(array( 'id' => 'pmusage_memory_usage', 'title' => 'MEM: ' . $percentage_used . '%', 'href' => admin_url('admin.php?page=wp_plugin_memory_usage'), 'meta' => array( 'title' => 'Current memory usage: ' . size_format($current_memory_usage) . ' of ' . size_format($wp_memory_limit), ), )); } add_action('admin_bar_menu', 'pmusage_add_memory_to_admin_bar', 100); function pmusage_get_mysql_versions_from_api() { $mysql_versions = get_transient('pmusage_mysql_eol_data'); if (false === $mysql_versions) { // Get MySQL data $mysql_response = wp_remote_get('https://endoflife.date/api/mysql.json', array( 'sslverify' => false, 'timeout' => 5 )); // Get MariaDB data $mariadb_response = wp_remote_get('https://endoflife.date/api/mariadb.json', array( 'sslverify' => false, 'timeout' => 5 )); $versions_data = ['mysql' => [], 'mariadb' => []]; if (!is_wp_error($mysql_response) && 200 === wp_remote_retrieve_response_code($mysql_response)) { $mysql_data = json_decode(wp_remote_retrieve_body($mysql_response), true); if (is_array($mysql_data)) { foreach ($mysql_data as $version_info) { $cycle = $version_info['cycle']; $eol_date = $version_info['eol'] ?? null; if ($eol_date && $eol_date !== false) { $versions_data['mysql'][$cycle] = [ 'eol_date' => $eol_date, 'latest' => $version_info['latest'] ?? '', 'support_end' => $version_info['support'] ?? $eol_date ]; } } } } if (!is_wp_error($mariadb_response) && 200 === wp_remote_retrieve_response_code($mariadb_response)) { $mariadb_data = json_decode(wp_remote_retrieve_body($mariadb_response), true); if (is_array($mariadb_data)) { foreach ($mariadb_data as $version_info) { $cycle = $version_info['cycle']; $eol_date = $version_info['eol'] ?? null; if ($eol_date && $eol_date !== false) { $versions_data['mariadb'][$cycle] = [ 'eol_date' => $eol_date, 'latest' => $version_info['latest'] ?? '', // This is the key addition 'lts' => $version_info['lts'] ?? false ]; } } } } // Cache for one week set_transient('pmusage_mysql_eol_data', $versions_data, WEEK_IN_SECONDS); $mysql_versions = $versions_data; } return $mysql_versions; } function pmusage_get_mysql_latest_version($current_version) { $version_data = pmusage_get_mysql_versions_from_api(); $is_mariadb = stripos($current_version, 'mariadb') !== false; // Extract version number preg_match('/(\d+\.\d+)/', $current_version, $matches); $version_number = $matches[1] ?? ''; if (empty($version_number)) { return 'Unknown'; } $database_type = $is_mariadb ? 'mariadb' : 'mysql'; $versions = $version_data[$database_type] ?? []; if (isset($versions[$version_number]) && !empty($versions[$version_number]['latest'])) { return $versions[$version_number]['latest']; } return 'Unknown'; } function pmusage_get_mysql_status($current_version) { $version_data = pmusage_get_mysql_versions_from_api(); $is_mariadb = stripos($current_version, 'mariadb') !== false; // Extract version number preg_match('/(\d+\.\d+)/', $current_version, $matches); $version_number = $matches[1] ?? ''; if (empty($version_number)) { return 'unknown'; } $database_type = $is_mariadb ? 'mariadb' : 'mysql'; $versions = $version_data[$database_type] ?? []; if (isset($versions[$version_number])) { $version_info = $versions[$version_number]; $eol_date_str = $version_info['eol_date']; // Handle different date formats from API if ($eol_date_str === true || $eol_date_str === false) { return $eol_date_str === false ? 'supported' : 'eol'; } try { $eol_date = new DateTime($eol_date_str); $now = new DateTime(); return ($now < $eol_date) ? 'supported' : 'eol'; } catch (Exception $e) { return 'unknown'; } } return 'unknown'; } ?>