From 24ff0f9552fd4ffa136cc501760c66a40f399f72 Mon Sep 17 00:00:00 2001 From: Marcus Quinn <6428977+marcusquinn@users.noreply.github.com> Date: Sat, 12 Apr 2025 15:01:34 +0100 Subject: [PATCH] Fix notice positioning and prevent auto-clearing of error notices (v1.6.9) --- README.md | 7 ++++ assets/js/admin-scripts.js | 26 ++++++++++--- fix-plugin-does-not-exist-notices.php | 38 ++++++++++++++++++- .../fix-plugin-does-not-exist-notices.pot | 2 +- readme.txt | 13 +++++-- 5 files changed, 75 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index cf97fbf..17d5555 100644 --- a/README.md +++ b/README.md @@ -120,6 +120,13 @@ The plugin works by: ## Changelog +### 1.6.9 +* Fixed issue with notices not appearing below WordPress error messages +* Improved JavaScript detection of WordPress error notices +* Prevented WordPress from automatically clearing error notices on page refresh +* Added multiple timing attempts to ensure notices appear correctly +* Enhanced error notice targeting for better compatibility + ### 1.6.8 * Fixed notice positioning to appear directly below WordPress error messages * Improved notice width to match WordPress error messages diff --git a/assets/js/admin-scripts.js b/assets/js/admin-scripts.js index c891b54..de41ee7 100644 --- a/assets/js/admin-scripts.js +++ b/assets/js/admin-scripts.js @@ -10,20 +10,30 @@ } // Find all notification containers first - var noticeContainers = document.querySelectorAll('.notice, .error, .updated'); + var noticeContainers = document.querySelectorAll('.notice, .error, .updated, div.error'); var targetNotice = null; // Find all error notifications about missing plugins noticeContainers.forEach(function(notice) { if ((notice.textContent.includes('Plugin file does not exist') || notice.textContent.includes('has been deactivated due to an error')) && - notice.classList.contains('error')) { + (notice.classList.contains('error') || notice.classList.contains('notice-error'))) { // We'll use the last matching notice as our target targetNotice = notice; console.log('Found WordPress error notice:', notice.textContent); } }); + // If we didn't find a specific error notice, look for the general WordPress error at the top + if (!targetNotice) { + // Try to find the WordPress error message at the top of the page + var wpError = document.querySelector('.error:not(.below-h2), div.error:not(.below-h2), .notice-error:not(.below-h2)'); + if (wpError) { + targetNotice = wpError; + console.log('Found general WordPress error notice'); + } + } + // If we found a target notice, add our custom notice after it if (targetNotice) { // Check if we already added our notice @@ -88,7 +98,8 @@ // Try to inject notices on multiple events to ensure it works document.addEventListener('DOMContentLoaded', function() { - injectNotice(); + // Delay the initial injection to ensure WordPress has fully loaded its notices + setTimeout(injectNotice, 100); // Also set up a MutationObserver to watch for dynamically added notices var observer = new MutationObserver(function(mutations) { @@ -96,8 +107,8 @@ if (mutation.addedNodes && mutation.addedNodes.length > 0) { // Check if added nodes are notices or contain notices mutation.addedNodes.forEach(function(node) { - if (node.nodeType === 1 && (node.matches('.notice, .error, .updated') || node.querySelector('.notice, .error, .updated'))) { - injectNotice(); + if (node.nodeType === 1 && (node.matches('.notice, .error, .updated, div.error') || node.querySelector('.notice, .error, .updated, div.error'))) { + setTimeout(injectNotice, 50); // Small delay to ensure the DOM is updated } }); } @@ -113,4 +124,9 @@ setTimeout(injectNotice, 500); // Delay slightly to ensure dynamic content is loaded }); + // Additional attempt after a longer delay to catch late-loading notices + window.addEventListener('load', function() { + setTimeout(injectNotice, 1000); // Longer delay as final attempt + }); + })(); diff --git a/fix-plugin-does-not-exist-notices.php b/fix-plugin-does-not-exist-notices.php index 9060c1f..a41ffc4 100644 --- a/fix-plugin-does-not-exist-notices.php +++ b/fix-plugin-does-not-exist-notices.php @@ -13,7 +13,7 @@ * Plugin Name: Fix 'Plugin file does not exist.' Notices * Plugin URI: https://wordpress.org/plugins/fix-plugin-does-not-exist-notices/ * Description: Adds missing plugins to the plugins list with a "Remove Reference" link so you can permanently clean up invalid plugin entries and remove error notices. - * Version: 1.6.8 + * Version: 1.6.9 * Author: Marcus Quinn * Author URI: https://www.wpallstars.com * License: GPL-2.0+ @@ -48,7 +48,7 @@ if ( ! defined( 'ABSPATH' ) ) { } // Define plugin constants -define( 'FPDEN_VERSION', '1.6.8' ); +define( 'FPDEN_VERSION', '1.6.9' ); define( 'FPDEN_PLUGIN_DIR', plugin_dir_path( __FILE__ ) ); define( 'FPDEN_PLUGIN_URL', plugin_dir_url( __FILE__ ) ); define( 'FPDEN_PLUGIN_FILE', __FILE__ ); @@ -98,6 +98,9 @@ class Fix_Plugin_Does_Not_Exist_Notices { // Enqueue admin scripts and styles. add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_admin_assets' ) ); + + // Prevent WordPress from automatically deactivating missing plugins + add_filter( 'pre_option_recently_activated', array( $this, 'prevent_auto_deactivation' ) ); } /** @@ -391,6 +394,37 @@ class Fix_Plugin_Does_Not_Exist_Notices { return $this->invalid_plugins; } + + /** + * Prevent WordPress from automatically deactivating missing plugins. + * + * WordPress normally deactivates plugins that don't exist and adds them to the + * 'recently_activated' option. This filter prevents that behavior so we can + * handle the deactivation ourselves through our UI. + * + * @param mixed $pre_option The value to return instead of the option value. + * @return mixed The original value (null) to let WordPress proceed, or an array to override. + */ + public function prevent_auto_deactivation( $pre_option ) { + // Only run on the plugins page + if ( ! $this->is_plugins_page() ) { + return $pre_option; + } + + // Get our invalid plugins + $invalid_plugins = $this->get_invalid_plugins(); + + // If we have invalid plugins and we're on the plugins page, return an empty array + // to prevent WordPress from auto-deactivating the plugins + if ( ! empty( $invalid_plugins ) ) { + // Return the current value of the option to prevent WordPress from modifying it + $recently_activated = get_option( 'recently_activated', array() ); + return $recently_activated; + } + + // Otherwise, let WordPress handle it normally + return $pre_option; + } } // End class Fix_Plugin_Does_Not_Exist_Notices // Initialize the plugin class. diff --git a/languages/fix-plugin-does-not-exist-notices.pot b/languages/fix-plugin-does-not-exist-notices.pot index bc6e1aa..ff6a037 100644 --- a/languages/fix-plugin-does-not-exist-notices.pot +++ b/languages/fix-plugin-does-not-exist-notices.pot @@ -2,7 +2,7 @@ # This file is distributed under the GPL-2.0+. msgid "" msgstr "" -"Project-Id-Version: Fix 'Plugin file does not exist.' Notices 1.6.8\n" +"Project-Id-Version: Fix 'Plugin file does not exist.' Notices 1.6.9\n" "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/fix-plugin-does-not-exist-notices\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/readme.txt b/readme.txt index a5b7097..b8c1f4e 100644 --- a/readme.txt +++ b/readme.txt @@ -5,7 +5,7 @@ Tags: plugins, missing plugins, cleanup, error fix, admin tools, plugin file doe Requires at least: 5.0 Tested up to: 6.4 Requires PHP: 7.0 -Stable tag: 1.6.8 +Stable tag: 1.6.9 License: GPL-2.0+ License URI: https://www.gnu.org/licenses/gpl-2.0.html @@ -89,6 +89,13 @@ Although this plugin consumes minimal disk space, and doesn't run unless you are == Changelog == += 1.6.9 = +* Fixed issue with notices not appearing below WordPress error messages +* Improved JavaScript detection of WordPress error notices +* Prevented WordPress from automatically clearing error notices on page refresh +* Added multiple timing attempts to ensure notices appear correctly +* Enhanced error notice targeting for better compatibility + = 1.6.8 = * Fixed notice positioning to appear directly below WordPress error messages * Improved notice width to match WordPress error messages @@ -227,8 +234,8 @@ Although this plugin consumes minimal disk space, and doesn't run unless you are == Upgrade Notice == -= 1.6.8 = -Improved notice positioning and appearance, with better explanatory text and more reliable error detection! += 1.6.9 = +Fixed critical issue with WordPress automatically clearing error notices on page refresh and improved notice positioning! = 1.6.3 = Fixed Git Updater repository URLs and updated organization naming for consistent branding across all platforms!