Prepare release v1.6.6

This commit is contained in:
2025-04-12 14:35:15 +01:00
parent 569ef54904
commit a58516367a
6 changed files with 122 additions and 58 deletions

View File

@ -120,6 +120,23 @@ The plugin works by:
## Changelog
### 1.6.6
* Fixed issue with "Remove Notice" link not appearing on missing plugin rows
* Fixed issue with automatic removal of plugin references without user action
* Fixed notice positioning to ensure it appears below error messages
* Restored pointer triangle to indicate relationship with error message
* Improved detection of missing plugins in the plugin list
* Enhanced scroll functionality to work with all plugin types
### 1.6.5
* Fixed duplicate notices issue - now only one notice appears below error messages
* Changed notice heading to "Fix Plugin Does Not Exist Notices ☝️"
* Updated explanatory text to be more clear about the removal process
* Changed "Remove Reference" link text to "Remove Notice" for better clarity
* Made "(File Missing)" text bold and red for better visibility
* Fixed scroll functionality to work with all plugin rows
* Improved JavaScript to prevent multiple notices from appearing
### 1.6.4
* Updated version management to ensure consistent patch version increments
* Improved documentation for version update process

View File

@ -23,6 +23,13 @@
}
/* Style for highlighting the missing plugin row */
tr.inactive.prc-highlight-missing {
tr.inactive.prc-highlight-missing,
tr.active.prc-highlight-missing {
background-color: #fff8e5 !important; /* Use !important to override default styles */
}
/* Make File Missing text bold and red */
span.error {
font-weight: bold !important;
color: #dc3232 !important;
}

View File

@ -1,61 +1,81 @@
(function() {
// Track if we've already added our notice
var noticeAdded = false;
// Function to inject our notice
function injectNotice() {
// If we've already added a notice, don't add another one
if (noticeAdded) {
return;
}
// Find all notification containers first
var noticeContainers = document.querySelectorAll('.notice, .error, .updated');
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')) {
// Check if we already added our notice
if (notice.nextElementSibling && notice.nextElementSibling.classList.contains('prc-notice')) {
return;
}
// Create our custom notice
var ourNotice = document.createElement('div');
ourNotice.className = 'prc-notice';
// Add content using localized strings passed via wp_localize_script
var pluginMissingText = typeof fpdenData !== 'undefined' && fpdenData.i18n && fpdenData.i18n.pluginMissing ?
fpdenData.i18n.pluginMissing : 'Plugin file missing';
var removeReferenceText = typeof fpdenData !== 'undefined' && fpdenData.i18n && fpdenData.i18n.removeReference ?
fpdenData.i18n.removeReference : 'Remove Reference';
var clickToScrollText = typeof fpdenData !== 'undefined' && fpdenData.i18n && fpdenData.i18n.clickToScroll ?
fpdenData.i18n.clickToScroll : 'Click here to scroll to missing plugins';
ourNotice.innerHTML = '<h3 style="margin-top:0;color:#826200;">👉 Fix Plugin Does Not Exist Notices Can Fix This</h3>' +
'<p>To remove the above error notification, scroll down to find the plugin marked with "<strong style="color:red">(' + pluginMissingText + ')</strong>" and click its "<strong>' + removeReferenceText + '</strong>" link.</p>' +
'<p>This will permanently remove the missing plugin reference from your database.</p>' +
'<p><a href="#" id="prc-scroll-to-plugin" style="font-weight:bold;text-decoration:underline;color:#826200;">' + clickToScrollText + '</a></p>';
// Insert our notice right after the error
notice.parentNode.insertBefore(ourNotice, notice.nextSibling);
// Add scroll behavior
var scrollLink = document.getElementById('prc-scroll-to-plugin');
if (scrollLink) {
scrollLink.addEventListener('click', function(e) {
e.preventDefault();
var missingPlugins = document.querySelectorAll('tr.inactive:not(.plugin-update-tr)');
for (var i = 0; i < missingPlugins.length; i++) {
if (missingPlugins[i].textContent.includes('(File Missing)')) {
// Add a class for highlighting instead of direct style manipulation
missingPlugins[i].classList.add('prc-highlight-missing');
missingPlugins[i].scrollIntoView({ behavior: 'smooth', block: 'center' });
// Optional: Remove highlight after a delay
setTimeout(function() {
missingPlugins[i].classList.remove('prc-highlight-missing');
}, 3000); // Remove highlight after 3 seconds
return;
}
}
});
}
// We'll use the last matching notice as our target
targetNotice = notice;
}
});
// If we found a target notice, add our custom notice after it
if (targetNotice) {
// Check if we already added our notice
if (targetNotice.nextElementSibling && targetNotice.nextElementSibling.classList.contains('prc-notice')) {
return;
}
// Create our custom notice
var ourNotice = document.createElement('div');
ourNotice.className = 'prc-notice';
// Add content using localized strings passed via wp_localize_script
var pluginMissingText = typeof fpdenData !== 'undefined' && fpdenData.i18n && fpdenData.i18n.pluginMissing ?
fpdenData.i18n.pluginMissing : 'Plugin file missing';
var removeReferenceText = typeof fpdenData !== 'undefined' && fpdenData.i18n && fpdenData.i18n.removeReference ?
fpdenData.i18n.removeReference : 'Remove Notice';
var clickToScrollText = typeof fpdenData !== 'undefined' && fpdenData.i18n && fpdenData.i18n.clickToScroll ?
fpdenData.i18n.clickToScroll : 'Click here to scroll to missing plugins';
ourNotice.innerHTML = '<h3 style="margin-top:0;color:#826200;">Fix Plugin Does Not Exist Notices ☝️</h3>' +
'<p>To remove these notices, scroll down to each plugin .php showing "<strong style="color:red">(File Missing)</strong>", and click "<strong>' + removeReferenceText + '</strong>".</p>' +
'<p>This safely removes the missing active plugin reference from your database, using the standard WordPress function to update your active plugin options table with only the correct remaining installed and active plugins.</p>' +
'<p><a href="#" id="prc-scroll-to-plugin" style="font-weight:bold;text-decoration:underline;color:#826200;">' + clickToScrollText + '</a></p>';
// Insert our notice right after the error
targetNotice.parentNode.insertBefore(ourNotice, targetNotice.nextSibling);
// Mark that we've added our notice
noticeAdded = true;
// Add scroll behavior
var scrollLink = document.getElementById('prc-scroll-to-plugin');
if (scrollLink) {
scrollLink.addEventListener('click', function(e) {
e.preventDefault();
// Look for all plugin rows, not just inactive ones
var allPluginRows = document.querySelectorAll('tr.active, tr.inactive');
for (var i = 0; i < allPluginRows.length; i++) {
if (allPluginRows[i].textContent.includes('(File Missing)')) {
// Add a class for highlighting instead of direct style manipulation
allPluginRows[i].classList.add('prc-highlight-missing');
allPluginRows[i].scrollIntoView({ behavior: 'smooth', block: 'center' });
// Optional: Remove highlight after a delay
(function(row) {
setTimeout(function() {
row.classList.remove('prc-highlight-missing');
}, 3000); // Remove highlight after 3 seconds
})(allPluginRows[i]);
return;
}
}
});
}
}
}
// Try to inject notices on multiple events to ensure it works

View File

@ -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.4
* Version: 1.6.6
* 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.4' );
define( 'FPDEN_VERSION', '1.6.6' );
define( 'FPDEN_PLUGIN_DIR', plugin_dir_path( __FILE__ ) );
define( 'FPDEN_PLUGIN_URL', plugin_dir_url( __FILE__ ) );
define( 'FPDEN_PLUGIN_FILE', __FILE__ );
@ -183,10 +183,10 @@ class Fix_Plugin_Does_Not_Exist_Notices {
}
/**
* Add the Remove Reference action link to invalid plugins.
* Add the Remove Notice action link to invalid plugins.
*
* Filters the action links displayed for each plugin on the plugins page.
* Adds a "Remove Reference" link for plugins identified as missing.
* Adds a "Remove Notice" link for plugins identified as missing.
*
* @param array $actions An array of plugin action links.
* @param string $plugin_file Path to the plugin file relative to the plugins directory.
@ -201,8 +201,11 @@ class Fix_Plugin_Does_Not_Exist_Notices {
return $actions;
}
// Check if this is a missing plugin identified by our previous filter.
if ( isset( $plugin_data['Name'] ) && strpos( $plugin_data['Name'], '<span class="error">(File Missing)</span>' ) !== false ) {
// Get our list of invalid plugins
$invalid_plugins = $this->get_invalid_plugins();
// Check if this plugin file is in our list of invalid plugins
if ( in_array( $plugin_file, $invalid_plugins, true ) ) {
// Clear existing actions like "Activate", "Deactivate", "Edit".
$actions = array();
@ -211,7 +214,7 @@ class Fix_Plugin_Does_Not_Exist_Notices {
$remove_url = admin_url( 'plugins.php?action=remove_reference&plugin=' . urlencode( $plugin_file ) . '&_wpnonce=' . $nonce );
/* translators: %s: Plugin file path */
$aria_label = sprintf( __( 'Remove reference to missing plugin %s', 'fix-plugin-does-not-exist-notices' ), esc_attr( $plugin_file ) );
$actions['remove_reference'] = '<a href="' . esc_url( $remove_url ) . '" class="delete" aria-label="' . $aria_label . '">' . esc_html__( 'Remove Reference', 'fix-plugin-does-not-exist-notices' ) . '</a>';
$actions['remove_reference'] = '<a href="' . esc_url( $remove_url ) . '" class="delete" aria-label="' . $aria_label . '">' . esc_html__( 'Remove Notice', 'fix-plugin-does-not-exist-notices' ) . '</a>';
}
return $actions;

View File

@ -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.4\n"
"Project-Id-Version: Fix 'Plugin file does not exist.' Notices 1.6.6\n"
"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/fix-plugin-does-not-exist-notices\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"

View File

@ -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.4
Stable tag: 1.6.6
License: GPL-2.0+
License URI: https://www.gnu.org/licenses/gpl-2.0.html
@ -89,6 +89,23 @@ Although this plugin consumes minimal disk space, and doesn't run unless you are
== Changelog ==
= 1.6.6 =
* Fixed issue with "Remove Notice" link not appearing on missing plugin rows
* Fixed issue with automatic removal of plugin references without user action
* Fixed notice positioning to ensure it appears below error messages
* Restored pointer triangle to indicate relationship with error message
* Improved detection of missing plugins in the plugin list
* Enhanced scroll functionality to work with all plugin types
= 1.6.5 =
* Fixed duplicate notices issue - now only one notice appears below error messages
* Changed notice heading to "Fix Plugin Does Not Exist Notices ☝️"
* Updated explanatory text to be more clear about the removal process
* Changed "Remove Reference" link text to "Remove Notice" for better clarity
* Made "(File Missing)" text bold and red for better visibility
* Fixed scroll functionality to work with all plugin rows
* Improved JavaScript to prevent multiple notices from appearing
= 1.6.4 =
* Updated version management to ensure consistent patch version increments
* Improved documentation for version update process
@ -196,8 +213,8 @@ Although this plugin consumes minimal disk space, and doesn't run unless you are
== Upgrade Notice ==
= 1.6.4 =
Improved version management with consistent patch version increments and enhanced documentation for development workflows!
= 1.6.6 =
Critical fix for "Remove Notice" link not appearing and automatic plugin reference removal issues!
= 1.6.3 =
Fixed Git Updater repository URLs and updated organization naming for consistent branding across all platforms!