Compare commits

...

8 Commits

10 changed files with 499 additions and 81 deletions

69
.github/workflows/release.yml vendored Normal file
View File

@ -0,0 +1,69 @@
name: Build Release
on:
push:
tags:
- 'v*'
jobs:
build:
name: Build and Create Release
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Get version
id: get_version
run: echo "VERSION=${GITHUB_REF#refs/tags/v}" >> $GITHUB_OUTPUT
- name: Create build directory
run: mkdir -p build/wp-fix-plugin-does-not-exist-notices
- name: Copy plugin files
run: |
cp wp-fix-plugin-does-not-exist-notices.php build/wp-fix-plugin-does-not-exist-notices/
cp readme.txt build/wp-fix-plugin-does-not-exist-notices/
cp LICENSE build/wp-fix-plugin-does-not-exist-notices/
cp README.md build/wp-fix-plugin-does-not-exist-notices/
cp -r assets build/wp-fix-plugin-does-not-exist-notices/
- name: Create ZIP file
run: |
cd build
zip -r ../wp-fix-plugin-does-not-exist-notices-${{ steps.get_version.outputs.VERSION }}.zip wp-fix-plugin-does-not-exist-notices
- name: Create Release
id: create_release
uses: softprops/action-gh-release@v1
with:
name: Release v${{ steps.get_version.outputs.VERSION }}
draft: false
prerelease: false
files: |
wp-fix-plugin-does-not-exist-notices-${{ steps.get_version.outputs.VERSION }}.zip
body: |
Fix 'Plugin file does not exist.' Notices v${{ steps.get_version.outputs.VERSION }}
See [CHANGELOG.md](https://github.com/wpallstars/wp-fix-plugin-does-not-exist-notices/blob/main/CHANGELOG.md) for details.
# Deploy to WordPress.org
wordpress:
name: Deploy to WordPress.org
needs: build
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: WordPress Plugin Deploy
id: deploy
uses: 10up/action-wordpress-plugin-deploy@stable
with:
generate-zip: true
env:
SVN_USERNAME: ${{ secrets.SVN_USERNAME }}
SVN_PASSWORD: ${{ secrets.SVN_PASSWORD }}
SLUG: wp-fix-plugin-does-not-exist-notices

View File

@ -2,6 +2,24 @@
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
## [2.0.10] - 2024-05-18
### Fixed
- Plugin details popup version display issue with Git Updater integration
- Added JavaScript-based solution to ensure correct version display in plugin details
### Improved
- Version consistency across all plugin views
- Enhanced cache busting for plugin information API
## [2.0.9] - 2024-05-18
### Fixed
- Plugin details popup now correctly shows version and author information
- Added support for both old and new plugin slugs to fix caching issues
### Improved
- Cache clearing mechanism to ensure plugin details are always up-to-date
- Enhanced version display in plugin details popup
## [2.0.8] - 2024-05-17 ## [2.0.8] - 2024-05-17
### Fixed ### Fixed
- Plugin details popup now correctly shows version and author information - Plugin details popup now correctly shows version and author information

View File

@ -0,0 +1,74 @@
/**
* Fix Plugin Details Popup
*
* This script directly modifies the plugin details popup to show the correct version
* when the popup is opened for our plugin.
*/
(function($) {
'use strict';
// Current plugin version - this should match the version in the main plugin file
const CURRENT_VERSION = '2.0.10';
// Plugin slugs to check for
const OUR_SLUGS = ['wp-fix-plugin-does-not-exist-notices', 'fix-plugin-does-not-exist-notices'];
// Wait for the document to be ready
$(document).ready(function() {
// Listen for the thickbox to open (WordPress uses thickbox for plugin details)
$(document).on('tb_init', function() {
// Check if we're on the plugins page
if (window.location.href.indexOf('plugins.php') === -1) {
return;
}
// Set a timeout to allow the thickbox content to load
setTimeout(function() {
// Get the thickbox content
const $thickbox = $('#TB_window');
if (!$thickbox.length) return;
// Get the plugin slug from the URL
const tbUrl = $('#TB_iframeContent').attr('src');
if (!tbUrl) return;
// Extract the plugin slug from the URL
const slugMatch = tbUrl.match(/plugin=([^&]+)/);
if (!slugMatch || !slugMatch[1]) return;
const pluginSlug = decodeURIComponent(slugMatch[1]);
// Check if this is our plugin
if (OUR_SLUGS.indexOf(pluginSlug) !== -1) {
console.log('Fixing plugin details for: ' + pluginSlug);
// Find the version element in the thickbox
const $iframe = $('#TB_iframeContent');
if (!$iframe.length) return;
// Wait for iframe to load
$iframe.on('load', function() {
const iframeDoc = this.contentDocument || this.contentWindow.document;
// Find the version element
const $versionElement = $(iframeDoc).find('.plugin-version-author-uri');
if (!$versionElement.length) return;
// Update the version text
const versionText = $versionElement.text();
const newVersionText = versionText.replace(/Version: [0-9.]+/, 'Version: ' + CURRENT_VERSION);
$versionElement.text(newVersionText);
// Also update the version in the header if it exists
const $versionHeader = $(iframeDoc).find('h2:contains("Version:")');
if ($versionHeader.length) {
$versionHeader.text('Version: ' + CURRENT_VERSION);
}
console.log('Plugin details updated to version: ' + CURRENT_VERSION);
});
}
}, 500); // Wait 500ms for the thickbox to load
});
});
})(jQuery);

View File

@ -52,6 +52,10 @@ cd ..
if [ -f "$ZIP_FILE" ]; then if [ -f "$ZIP_FILE" ]; then
echo "✅ Build successful: $ZIP_FILE created" echo "✅ Build successful: $ZIP_FILE created"
echo "File path: $(pwd)/$ZIP_FILE" echo "File path: $(pwd)/$ZIP_FILE"
# Deploy to local WordPress installation
echo "\nDeploying to local WordPress installation..."
./scripts/deploy-local.sh
else else
echo "❌ Build failed: ZIP file was not created" echo "❌ Build failed: ZIP file was not created"
exit 1 exit 1

109
clear-transients.php Normal file
View File

@ -0,0 +1,109 @@
<?php
/**
* Plugin Name: Clear Plugin Transients
* Description: A temporary plugin to clear all WordPress plugin transients
* Version: 1.0.0
*/
// If this file is called directly, abort.
if (!defined('WPINC')) {
die;
}
// Run on plugin activation
register_activation_hook(__FILE__, 'clear_plugin_transients');
// Also run immediately
add_action('admin_init', 'clear_plugin_transients');
/**
* Clear all plugin-related transients
*/
function clear_plugin_transients() {
global $wpdb;
// Log that we're running
error_log('Running clear_plugin_transients');
// Clear specific plugin transients
$our_slugs = array('wp-fix-plugin-does-not-exist-notices', 'fix-plugin-does-not-exist-notices');
foreach ($our_slugs as $slug) {
// Delete all possible transients for this plugin
delete_transient('plugins_api_' . $slug);
delete_site_transient('plugins_api_' . $slug);
delete_transient('plugin_information_' . $slug);
delete_site_transient('plugin_information_' . $slug);
// Log what we're deleting
error_log('Deleting transients for: ' . $slug);
// Delete any transients with the slug in the name
$wpdb->query($wpdb->prepare(
"DELETE FROM $wpdb->options WHERE option_name LIKE %s OR option_name LIKE %s",
'%' . $wpdb->esc_like('_transient_' . $slug) . '%',
'%' . $wpdb->esc_like('_transient_timeout_' . $slug) . '%'
));
// Delete site transients too (for multisite)
if (is_multisite()) {
$wpdb->query($wpdb->prepare(
"DELETE FROM $wpdb->sitemeta WHERE meta_key LIKE %s OR meta_key LIKE %s",
'%' . $wpdb->esc_like('_site_transient_' . $slug) . '%',
'%' . $wpdb->esc_like('_site_transient_timeout_' . $slug) . '%'
));
}
}
// Clear all plugin API transients
$wpdb->query("DELETE FROM $wpdb->options WHERE option_name LIKE '%_transient_plugins_api_%'");
$wpdb->query("DELETE FROM $wpdb->options WHERE option_name LIKE '%_transient_timeout_plugins_api_%'");
$wpdb->query("DELETE FROM $wpdb->options WHERE option_name LIKE '%_transient_plugin_information_%'");
$wpdb->query("DELETE FROM $wpdb->options WHERE option_name LIKE '%_transient_timeout_plugin_information_%'");
// Clear site transients too (for multisite)
if (is_multisite()) {
$wpdb->query("DELETE FROM $wpdb->sitemeta WHERE meta_key LIKE '%_site_transient_plugins_api_%'");
$wpdb->query("DELETE FROM $wpdb->sitemeta WHERE meta_key LIKE '%_site_transient_timeout_plugins_api_%'");
$wpdb->query("DELETE FROM $wpdb->sitemeta WHERE meta_key LIKE '%_site_transient_plugin_information_%'");
$wpdb->query("DELETE FROM $wpdb->sitemeta WHERE meta_key LIKE '%_site_transient_timeout_plugin_information_%'");
}
// Clear update cache
delete_site_transient('update_plugins');
delete_site_transient('update_themes');
delete_site_transient('update_core');
delete_site_transient('plugin_information');
// Clear plugin update counts
delete_transient('plugin_updates_count');
delete_site_transient('plugin_updates_count');
// Clear plugin slugs cache
delete_transient('plugin_slugs');
delete_site_transient('plugin_slugs');
// Force refresh of plugin update information
if (function_exists('wp_clean_plugins_cache')) {
wp_clean_plugins_cache(true);
}
// Clear object cache
if (function_exists('wp_cache_flush')) {
wp_cache_flush();
}
// Add admin notice
add_action('admin_notices', 'plugin_transients_cleared_notice');
}
/**
* Display admin notice
*/
function plugin_transients_cleared_notice() {
?>
<div class="notice notice-success is-dismissible">
<p><strong>Plugin Transients Cleared:</strong> All plugin transients have been cleared from the database.</p>
</div>
<?php
}

4
deploy-local.sh Executable file
View File

@ -0,0 +1,4 @@
#!/bin/bash
# Simple wrapper to call the deploy-local script
./scripts/deploy-local.sh

View File

@ -2,14 +2,14 @@
# This file is distributed under the GPL-2.0+. # This file is distributed under the GPL-2.0+.
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Fix 'Plugin file does not exist.' Notices 2.0.7\n" "Project-Id-Version: Fix 'Plugin file does not exist.' Notices 2.0.10\n"
"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/wp-fix-plugin-does-not-exist-notices\n" "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/wp-fix-plugin-does-not-exist-notices\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"POT-Creation-Date: 2024-05-17T12:00:00+00:00\n" "POT-Creation-Date: 2024-05-18T12:00:00+00:00\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"X-Generator: WP-CLI 2.8.1\n" "X-Generator: WP-CLI 2.8.1\n"
"X-Domain: wp-fix-plugin-does-not-exist-notices\n" "X-Domain: wp-fix-plugin-does-not-exist-notices\n"
@ -27,7 +27,7 @@ msgid "Adds missing plugins to the plugins list with a \"Remove Reference\" link
msgstr "" msgstr ""
#. Author of the plugin #. Author of the plugin
msgid "Marcus Quinn" msgid "Marcus Quinn & The WP ALLSTARS Team"
msgstr "" msgstr ""
#. Author URI of the plugin #. Author URI of the plugin

View File

@ -5,7 +5,7 @@ Tags: plugins, missing plugins, cleanup, error fix, admin tools, plugin file doe
Requires at least: 5.0 Requires at least: 5.0
Tested up to: 6.7.2 Tested up to: 6.7.2
Requires PHP: 7.0 Requires PHP: 7.0
Stable tag: 2.0.8 Stable tag: 2.0.10
License: GPL-2.0+ License: GPL-2.0+
License URI: https://www.gnu.org/licenses/gpl-2.0.html License URI: https://www.gnu.org/licenses/gpl-2.0.html
@ -140,6 +140,18 @@ Manually editing the WordPress database is risky and requires technical knowledg
== Changelog == == Changelog ==
= 2.0.10 =
* Fixed: Plugin details popup version display issue with Git Updater integration
* Added: JavaScript-based solution to ensure correct version display in plugin details
* Improved: Version consistency across all plugin views
* Enhanced: Cache busting for plugin information API
= 2.0.9 =
* Fixed: Plugin details popup now correctly shows version and author information
* Added: Support for both old and new plugin slugs to fix caching issues
* Improved: Cache clearing mechanism to ensure plugin details are always up-to-date
* Enhanced: Version display in plugin details popup
= 2.0.8 = = 2.0.8 =
* Fixed: Plugin details popup now correctly shows version and author information * Fixed: Plugin details popup now correctly shows version and author information
* Added: Cache-busting mechanism to ensure plugin details are always up-to-date * Added: Cache-busting mechanism to ensure plugin details are always up-to-date

View File

@ -7,6 +7,7 @@ set -e
PLUGIN_SLUG="wp-fix-plugin-does-not-exist-notices" PLUGIN_SLUG="wp-fix-plugin-does-not-exist-notices"
SOURCE_DIR="/Users/marcusquinn/Git/wp-fix-plugin-does-not-exist-notices/build/$PLUGIN_SLUG" SOURCE_DIR="/Users/marcusquinn/Git/wp-fix-plugin-does-not-exist-notices/build/$PLUGIN_SLUG"
DEST_DIR="/Users/marcusquinn/Local/plugin-testing/app/public/wp-content/plugins/$PLUGIN_SLUG" DEST_DIR="/Users/marcusquinn/Local/plugin-testing/app/public/wp-content/plugins/$PLUGIN_SLUG"
WP_CLI="/Users/marcusquinn/Local/plugin-testing/app/bin/wp"
# Check if build directory exists # Check if build directory exists
if [ ! -d "$SOURCE_DIR" ]; then if [ ! -d "$SOURCE_DIR" ]; then
@ -30,5 +31,16 @@ fi
echo "Deploying to local WordPress installation..." echo "Deploying to local WordPress installation..."
rsync -av --delete "$SOURCE_DIR/" "$DEST_DIR/" rsync -av --delete "$SOURCE_DIR/" "$DEST_DIR/"
# Clear WordPress transients to ensure fresh plugin data
echo "Clearing WordPress transients..."
if [ -f "$WP_CLI" ]; then
cd /Users/marcusquinn/Local/plugin-testing/app/public
"$WP_CLI" transient delete --all
"$WP_CLI" cache flush
echo "✅ WordPress transients cleared"
else
echo "⚠️ WP-CLI not found, skipping transient clearing"
fi
echo "✅ Local deployment successful!" echo "✅ Local deployment successful!"
echo "Plugin deployed to: $DEST_DIR" echo "Plugin deployed to: $DEST_DIR"

View File

@ -3,13 +3,16 @@
* Plugin Name: Fix 'Plugin file does not exist' Notices * Plugin Name: Fix 'Plugin file does not exist' Notices
* Plugin URI: https://www.wpallstars.com * Plugin URI: https://www.wpallstars.com
* Description: Adds missing plugins to your plugins list with a "Remove Notice" action link, allowing you to safely clean up invalid plugin references. * Description: Adds missing plugins to your plugins list with a "Remove Notice" action link, allowing you to safely clean up invalid plugin references.
* Version: 2.0.8 * Version: 2.0.10
* Author: Marcus Quinn & WP ALLSTARS * Author: Marcus Quinn & WP ALLSTARS
* Author URI: https://www.wpallstars.com * Author URI: https://www.wpallstars.com
* License: GPL-2.0+ * License: GPL-2.0+
* License URI: http://www.gnu.org/licenses/gpl-2.0.txt * License URI: http://www.gnu.org/licenses/gpl-2.0.txt
* Text Domain: wp-fix-plugin-does-not-exist-notices * Text Domain: wp-fix-plugin-does-not-exist-notices
* Domain Path: /languages * Domain Path: /languages
* GitHub Plugin URI: wpallstars/wp-fix-plugin-does-not-exist-notices
* GitHub Branch: main
* Update URI: https://github.com/wpallstars/wp-fix-plugin-does-not-exist-notices
* *
* @package Fix_Plugin_Does_Not_Exist_Notices * @package Fix_Plugin_Does_Not_Exist_Notices
*/ */
@ -20,7 +23,7 @@ if ( ! defined( 'WPINC' ) ) {
} }
// Define plugin constants. // Define plugin constants.
define( 'FPDEN_VERSION', '2.0.8' ); define( 'FPDEN_VERSION', '2.0.10' );
define( 'FPDEN_PLUGIN_DIR', plugin_dir_path( __FILE__ ) ); define( 'FPDEN_PLUGIN_DIR', plugin_dir_path( __FILE__ ) );
define( 'FPDEN_PLUGIN_URL', plugin_dir_url( __FILE__ ) ); define( 'FPDEN_PLUGIN_URL', plugin_dir_url( __FILE__ ) );
@ -85,7 +88,16 @@ class Fix_Plugin_Does_Not_Exist_Notices {
return; return;
} }
// Get invalid plugins to decide if assets are needed. // Always load the plugin details fix script on the plugins page
wp_enqueue_script(
'fpden-plugin-details-fix',
FPDEN_PLUGIN_URL . 'assets/js/plugin-details-fix.js',
array( 'jquery', 'thickbox' ), // Add thickbox dependency
FPDEN_VERSION . '.' . time(), // Add timestamp to force cache busting
true // Load in footer.
);
// Get invalid plugins to decide if other assets are needed.
$invalid_plugins = $this->get_invalid_plugins(); $invalid_plugins = $this->get_invalid_plugins();
if ( empty( $invalid_plugins ) ) { if ( empty( $invalid_plugins ) ) {
return; // No missing plugins, no need for the special notice JS/CSS. return; // No missing plugins, no need for the special notice JS/CSS.
@ -116,6 +128,7 @@ class Fix_Plugin_Does_Not_Exist_Notices {
'pluginMissing' => esc_html__( 'File Missing', 'wp-fix-plugin-does-not-exist-notices' ), 'pluginMissing' => esc_html__( 'File Missing', 'wp-fix-plugin-does-not-exist-notices' ),
'removeNotice' => esc_html__( 'Remove Notice', 'wp-fix-plugin-does-not-exist-notices' ), 'removeNotice' => esc_html__( 'Remove Notice', 'wp-fix-plugin-does-not-exist-notices' ),
), ),
'version' => FPDEN_VERSION, // Add version for the plugin details fix script
) )
); );
} }
@ -402,43 +415,63 @@ class Fix_Plugin_Does_Not_Exist_Notices {
return $result; return $result;
} }
// Debug: Log the requested slug
error_log('Plugin API request for slug: ' . $args->slug);
// Check if this is our own plugin (either old or new slug)
$our_plugin = false;
if ($args->slug === 'wp-fix-plugin-does-not-exist-notices' || $args->slug === 'fix-plugin-does-not-exist-notices') {
$our_plugin = true;
error_log('Detected request for our own plugin: ' . $args->slug);
// Force clear any cached data for our plugin
$this->clear_own_plugin_cache();
}
// Get our list of invalid plugins // Get our list of invalid plugins
$invalid_plugins = $this->get_invalid_plugins(); $invalid_plugins = $this->get_invalid_plugins();
// Check if the requested plugin is one of our missing plugins // Check if the requested plugin is one of our missing plugins or our own plugin
foreach ( $invalid_plugins as $plugin_file ) { if ($our_plugin || $this->is_missing_plugin($args->slug, $invalid_plugins)) {
// Extract the plugin slug from the plugin file path // Always create a new result object to bypass any caching
$plugin_slug = dirname( $plugin_file );
if ( '.' === $plugin_slug ) {
$plugin_slug = basename( $plugin_file, '.php' );
}
// If this is one of our missing plugins
if ( $args->slug === $plugin_slug ) {
// If we don't have a result yet, create one
if ( ! $result ) {
$result = new stdClass();
}
// Create a completely new result object to bypass any caching
$new_result = new stdClass(); $new_result = new stdClass();
// Set all the properties we need // Set all the properties we need
$new_result->name = isset($result->name) ? $result->name : basename( $plugin_file ); $new_result->name = $our_plugin ? 'Fix \'Plugin file does not exist\' Notices' : (isset($result->name) ? $result->name : $args->slug);
$new_result->slug = $args->slug; $new_result->slug = $args->slug;
$new_result->version = FPDEN_VERSION; $new_result->version = FPDEN_VERSION;
$new_result->author = '<a href="https://www.wpallstars.com">Marcus Quinn & WP ALLSTARS</a>'; $new_result->author = '<a href="https://www.wpallstars.com">Marcus Quinn & WP ALLSTARS</a>';
$new_result->author_profile = 'https://www.wpallstars.com'; $new_result->author_profile = 'https://www.wpallstars.com';
$new_result->requires = '5.0'; $new_result->requires = '5.0';
$new_result->tested = '6.5'; $new_result->tested = '6.7.2'; // Updated to match readme.txt
$new_result->requires_php = '7.0'; $new_result->requires_php = '7.0';
$new_result->last_updated = date('Y-m-d H:i:s'); $new_result->last_updated = date('Y-m-d H:i:s');
$new_result->sections = array(
'description' => sprintf( // Add a cache buster timestamp
$new_result->cache_buster = time();
// Get changelog from readme.txt
$readme_file = FPDEN_PLUGIN_DIR . 'readme.txt';
$changelog = '<h2>' . FPDEN_VERSION . '</h2><ul><li>Fixed: Plugin details popup now correctly shows version and author information</li><li>Added: Cache-busting mechanism to ensure plugin details are always up-to-date</li><li>Improved: Author and contributor information display</li></ul>';
if (file_exists($readme_file)) {
$readme_content = file_get_contents($readme_file);
if (preg_match('/== Changelog ==\s*\n\s*= ' . FPDEN_VERSION . ' =(.*?)(?:= \d|$)/s', $readme_content, $matches)) {
$version_changelog = trim($matches[1]);
$changelog = '<h2>' . FPDEN_VERSION . '</h2>' . wpautop($version_changelog);
}
}
$description = $our_plugin
? 'Adds missing plugins to your plugins list with a "Remove Notice" action link, allowing you to safely clean up invalid plugin references.'
: sprintf(
__( 'This plugin is still marked as "Active" in your database — but its folder and files can\'t be found in %s. Use the "Remove Notice" link on the plugins page to permanently remove it from your active plugins list and eliminate the error notice.', 'wp-fix-plugin-does-not-exist-notices' ), __( 'This plugin is still marked as "Active" in your database — but its folder and files can\'t be found in %s. Use the "Remove Notice" link on the plugins page to permanently remove it from your active plugins list and eliminate the error notice.', 'wp-fix-plugin-does-not-exist-notices' ),
'<code>/wp-content/plugins/</code>' '<code>/wp-content/plugins/</code>'
), );
'changelog' => '<h2>2.0.8</h2><ul><li>Fixed: Plugin details popup now correctly shows version and author information</li><li>Added: Cache-busting mechanism to ensure plugin details are always up-to-date</li><li>Improved: Author and contributor information display</li></ul>',
$new_result->sections = array(
'description' => $description,
'changelog' => $changelog,
'faq' => '<h3>Is it safe to remove plugin references?</h3><p>Yes, this plugin only removes entries from the WordPress active_plugins option, which is safe to modify when a plugin no longer exists.</p>' 'faq' => '<h3>Is it safe to remove plugin references?</h3><p>Yes, this plugin only removes entries from the WordPress active_plugins option, which is safe to modify when a plugin no longer exists.</p>'
); );
@ -456,8 +489,8 @@ class Fix_Plugin_Does_Not_Exist_Notices {
) )
); );
// Add a random number to force cache refresh // Add a random number and timestamp to force cache refresh
$new_result->download_link = 'https://www.wpallstars.com/plugins/wp-fix-plugin-does-not-exist-notices.zip?v=' . FPDEN_VERSION . '&cb=' . mt_rand(1000000, 9999999); $new_result->download_link = 'https://www.wpallstars.com/plugins/wp-fix-plugin-does-not-exist-notices.zip?v=' . FPDEN_VERSION . '&cb=' . mt_rand(1000000, 9999999) . '&t=' . time();
// Add active installations count // Add active installations count
$new_result->active_installs = 1000; $new_result->active_installs = 1000;
@ -476,14 +509,38 @@ class Fix_Plugin_Does_Not_Exist_Notices {
// Add homepage and download link // Add homepage and download link
$new_result->homepage = 'https://www.wpallstars.com'; $new_result->homepage = 'https://www.wpallstars.com';
// Set no caching
$new_result->cache_time = 0;
// Return our completely new result object // Return our completely new result object
return $new_result; return $new_result;
} }
}
return $result; return $result;
} }
/**
* Check if a slug matches one of our missing plugins.
*
* @param string $slug The plugin slug to check.
* @param array $invalid_plugins List of invalid plugin paths.
* @return bool True if the slug matches a missing plugin.
*/
private function is_missing_plugin($slug, $invalid_plugins) {
foreach ($invalid_plugins as $plugin_file) {
// Extract the plugin slug from the plugin file path
$plugin_slug = dirname($plugin_file);
if ('.' === $plugin_slug) {
$plugin_slug = basename($plugin_file, '.php');
}
if ($slug === $plugin_slug) {
return true;
}
}
return false;
}
/** /**
* Prevent WordPress from caching our plugin API responses. * Prevent WordPress from caching our plugin API responses.
* *
@ -552,12 +609,71 @@ class Fix_Plugin_Does_Not_Exist_Notices {
$plugin_slug = basename( $plugin_file, '.php' ); $plugin_slug = basename( $plugin_file, '.php' );
} }
// Delete the transient for this plugin // Delete all possible transients for this plugin
delete_transient( 'plugins_api_' . $plugin_slug ); delete_transient( 'plugins_api_' . $plugin_slug );
delete_site_transient( 'plugins_api_' . $plugin_slug ); delete_site_transient( 'plugins_api_' . $plugin_slug );
delete_transient( 'plugin_information_' . $plugin_slug );
delete_site_transient( 'plugin_information_' . $plugin_slug );
// Also delete the update transient which might cache plugin info // Clear any other transients that might be caching plugin info
$this->clear_all_plugin_transients();
}
// Also clear our own plugin's cache
$this->clear_own_plugin_cache();
}
/**
* Clear all plugin-related transients that might be caching information.
*
* @return void
*/
private function clear_all_plugin_transients() {
// Clear update cache
delete_site_transient( 'update_plugins' ); delete_site_transient( 'update_plugins' );
delete_site_transient( 'update_themes' );
delete_site_transient( 'update_core' );
// Clear plugins API cache
delete_site_transient( 'plugin_information' );
// Clear plugin update counts
delete_transient( 'plugin_updates_count' );
delete_site_transient( 'plugin_updates_count' );
// Clear plugin slugs cache
delete_transient( 'plugin_slugs' );
delete_site_transient( 'plugin_slugs' );
}
/**
* Clear cache specifically for our own plugin.
*
* @return void
*/
private function clear_own_plugin_cache() {
// Clear our own plugin's cache (both old and new slugs)
$our_slugs = array('wp-fix-plugin-does-not-exist-notices', 'fix-plugin-does-not-exist-notices');
foreach ($our_slugs as $slug) {
delete_transient( 'plugins_api_' . $slug );
delete_site_transient( 'plugins_api_' . $slug );
delete_transient( 'plugin_information_' . $slug );
delete_site_transient( 'plugin_information_' . $slug );
}
// Clear plugin update transients
delete_site_transient('update_plugins');
delete_site_transient('plugin_information');
// Force refresh of plugin update information if function exists
if (function_exists('wp_clean_plugins_cache')) {
wp_clean_plugins_cache(true);
}
// Clear object cache if function exists
if (function_exists('wp_cache_flush')) {
wp_cache_flush();
} }
} }
} // End class Fix_Plugin_Does_Not_Exist_Notices } // End class Fix_Plugin_Does_Not_Exist_Notices