diff --git a/assets/js/plugin-details-fix.js b/assets/js/plugin-details-fix.js
deleted file mode 100644
index b7da7b9..0000000
--- a/assets/js/plugin-details-fix.js
+++ /dev/null
@@ -1,74 +0,0 @@
-/**
- * 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);
diff --git a/assets/js/version-fix.js b/assets/js/version-fix.js
new file mode 100644
index 0000000..0c0c6d2
--- /dev/null
+++ b/assets/js/version-fix.js
@@ -0,0 +1,75 @@
+/**
+ * Fix Plugin Version Display
+ *
+ * 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.13';
+
+ // Plugin slugs to check for
+ const OUR_SLUGS = ['wp-fix-plugin-does-not-exist-notices', 'fix-plugin-does-not-exist-notices'];
+
+ // Function to fix the version in the plugin details popup
+ function fixPluginDetailsVersion() {
+ // Check if we're on the plugins page
+ if (window.location.href.indexOf('plugins.php') === -1) {
+ return;
+ }
+
+ // Wait for the thickbox to be initialized
+ $(document).on('tb_init', function() {
+ // Set a timeout to allow the thickbox content to load
+ setTimeout(function() {
+ // Get the thickbox iframe
+ const $iframe = $('#TB_iframeContent');
+ if (!$iframe.length) return;
+
+ // Wait for iframe to load
+ $iframe.on('load', function() {
+ try {
+ const iframeDoc = this.contentDocument || this.contentWindow.document;
+
+ // Get the plugin title from the iframe
+ const $title = $(iframeDoc).find('h2.plugin-title');
+ if (!$title.length) return;
+
+ // Check if this is our plugin
+ const titleText = $title.text();
+ if (titleText.indexOf('Fix \'Plugin file does not exist\' Notices') !== -1) {
+ console.log('Found our plugin in the details popup, fixing version...');
+
+ // Find the version element
+ const $version = $(iframeDoc).find('.plugin-version-author-uri');
+ if ($version.length) {
+ // Update the version text
+ const versionText = $version.text();
+ const newVersionText = versionText.replace(/Version: [0-9.]+|Version: 0\.0\.0/, 'Version: ' + CURRENT_VERSION);
+ $version.text(newVersionText);
+ console.log('Updated version to: ' + CURRENT_VERSION);
+ }
+
+ // Also update the version in the header if it exists
+ const $versionHeader = $(iframeDoc).find('.wrap h2:contains("Version:")');
+ if ($versionHeader.length) {
+ $versionHeader.text('Version: ' + CURRENT_VERSION);
+ console.log('Updated version header to: ' + CURRENT_VERSION);
+ }
+ }
+ } catch (e) {
+ console.error('Error updating plugin version:', e);
+ }
+ });
+ }, 500);
+ });
+ }
+
+ // Initialize when the document is ready
+ $(document).ready(function() {
+ fixPluginDetailsVersion();
+ });
+
+})(jQuery);
diff --git a/clear-transients.php b/clear-transients.php
deleted file mode 100644
index 6e80684..0000000
--- a/clear-transients.php
+++ /dev/null
@@ -1,109 +0,0 @@
-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() {
- ?>
-
-
Plugin Transients Cleared: All plugin transients have been cleared from the database.
-
- slug) &&
- (strpos($repo->slug, 'wp-fix-plugin-does-not-exist-notices') !== false ||
- strpos($repo->slug, 'fix-plugin-does-not-exist-notices') !== false)) {
- return 'main';
- }
- return $branch;
-}
-
-/**
- * Fix Git Updater API URLs
- *
- * @param string $api_url The API URL
- * @param string $git The git service (github, gitlab, etc.)
- * @param object $repo The repository object
- * @return string The modified API URL
- */
-function gu_branch_fix_api_url($api_url, $git, $repo) {
- if (isset($repo->slug) &&
- (strpos($repo->slug, 'wp-fix-plugin-does-not-exist-notices') !== false ||
- strpos($repo->slug, 'fix-plugin-does-not-exist-notices') !== false)) {
- return str_replace('/master/', '/main/', $api_url);
- }
- return $api_url;
-}
-
-/**
- * Fix Git Updater download URLs
- *
- * @param string $download_link The download URL
- * @param string $git The git service (github, gitlab, etc.)
- * @param object $repo The repository object
- * @return string The modified download URL
- */
-function gu_branch_fix_download_link($download_link, $git, $repo) {
- if (isset($repo->slug) &&
- (strpos($repo->slug, 'wp-fix-plugin-does-not-exist-notices') !== false ||
- strpos($repo->slug, 'fix-plugin-does-not-exist-notices') !== false)) {
- return str_replace('/master.zip', '/main.zip', $download_link);
- }
- return $download_link;
-}
-
-// Hook into WordPress
-add_action('plugins_loaded', 'gu_branch_fix_init');
\ No newline at end of file
diff --git a/readme.txt b/readme.txt
index cdd8d56..0423e0a 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.7.2
Requires PHP: 7.0
-Stable tag: 2.0.11
+Stable tag: 2.0.13
License: GPL-2.0+
License URI: https://www.gnu.org/licenses/gpl-2.0.html
@@ -141,6 +141,12 @@ Manually editing the WordPress database is risky and requires technical knowledg
== Changelog ==
+= 2.0.13 =
+* Fixed: Critical error when Git Updater passes an object instead of a string to API URL filter
+* Improved: Type checking in branch fix functions to handle both string and object inputs
+* Enhanced: Error handling for Git Updater integration
+* Removed: Redundant GU Branch Fix plugin (fully integrated into main plugin)
+
= 2.0.12 =
* Fixed: Integrated Git Updater branch fix directly into main plugin
* Removed: Separate "GU Branch Fix" plugin (no longer needed)
diff --git a/wp-fix-plugin-does-not-exist-notices.php b/wp-fix-plugin-does-not-exist-notices.php
index 4f590cd..df05c78 100644
--- a/wp-fix-plugin-does-not-exist-notices.php
+++ b/wp-fix-plugin-does-not-exist-notices.php
@@ -3,7 +3,7 @@
* Plugin Name: Fix 'Plugin file does not exist' Notices
* 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.
- * Version: 2.0.12
+ * Version: 2.0.13
* Author: Marcus Quinn & WP ALLSTARS
* Author URI: https://www.wpallstars.com
* License: GPL-2.0+
@@ -26,7 +26,7 @@ if ( ! defined( 'WPINC' ) ) {
}
// Define plugin constants.
-define( 'FPDEN_VERSION', '2.0.12' );
+define( 'FPDEN_VERSION', '2.0.13' );
define( 'FPDEN_PLUGIN_DIR', plugin_dir_path( __FILE__ ) );
define( 'FPDEN_PLUGIN_URL', plugin_dir_url( __FILE__ ) );
@@ -58,8 +58,17 @@ function fpden_init_git_updater_fixes() {
/**
* Override the branch name for our plugin
+ *
+ * @param string $branch The current branch name
+ * @param string $git The git service (github, gitlab, etc.)
+ * @param object|null $repo The repository object (optional)
+ * @return string The modified branch name
*/
-function fpden_override_branch($branch, $git, $repo) {
+function fpden_override_branch($branch, $git, $repo = null) {
+ // If repo is null or not an object, just return the branch unchanged
+ if (!is_object($repo)) {
+ return $branch;
+ }
if (isset($repo->slug) &&
(strpos($repo->slug, 'wp-fix-plugin-does-not-exist-notices') !== false ||
strpos($repo->slug, 'fix-plugin-does-not-exist-notices') !== false)) {
@@ -70,20 +79,50 @@ function fpden_override_branch($branch, $git, $repo) {
/**
* Override the API URL for our plugin
+ *
+ * @param mixed $api_url The current API URL (can be string or object)
+ * @param string $git The git service (github, gitlab, etc.)
+ * @param object|null $repo The repository object (optional)
+ * @return mixed The modified API URL (same type as input)
*/
-function fpden_override_api_url($api_url, $git, $repo) {
+function fpden_override_api_url($api_url, $git, $repo = null) {
+ // If repo is null or not an object, just return the URL unchanged
+ if (!is_object($repo)) {
+ return $api_url;
+ }
+
+ // Check if this is our plugin
if (isset($repo->slug) &&
(strpos($repo->slug, 'wp-fix-plugin-does-not-exist-notices') !== false ||
strpos($repo->slug, 'fix-plugin-does-not-exist-notices') !== false)) {
- return str_replace('/master/', '/main/', $api_url);
+
+ // Only apply str_replace if $api_url is a string
+ if (is_string($api_url)) {
+ return str_replace('/master/', '/main/', $api_url);
+ }
+
+ // If $api_url is an object, just return it unchanged
+ // This handles the case where Git Updater passes a GitHub_API object
+ return $api_url;
}
+
+ // Return unchanged if not our plugin
return $api_url;
}
/**
* Override the download link for our plugin
+ *
+ * @param string $download_link The current download link
+ * @param string $git The git service (github, gitlab, etc.)
+ * @param object|null $repo The repository object (optional)
+ * @return string The modified download link
*/
-function fpden_override_download_link($download_link, $git, $repo) {
+function fpden_override_download_link($download_link, $git, $repo = null) {
+ // If repo is null or not an object, just return the link unchanged
+ if (!is_object($repo)) {
+ return $download_link;
+ }
if (isset($repo->slug) &&
(strpos($repo->slug, 'wp-fix-plugin-does-not-exist-notices') !== false ||
strpos($repo->slug, 'fix-plugin-does-not-exist-notices') !== false)) {
@@ -111,8 +150,19 @@ function fpden_override_repo_meta($repo_meta, $repo) {
/**
* Override repository type data for our plugin
+ *
+ * @param array $data The repository data
+ * @param object $response The API response
+ * @param object|null $repo The repository object (optional)
+ * @return array The modified repository data
*/
-function fpden_override_repo_type_data($data, $response, $repo) {
+function fpden_override_repo_type_data($data, $response, $repo = null) {
+ // If repo is null or not an object, just return the data unchanged
+ if (!is_object($repo)) {
+ return $data;
+ }
+
+ // Check if this is our plugin
if (isset($repo->slug) &&
(strpos($repo->slug, 'wp-fix-plugin-does-not-exist-notices') !== false ||
strpos($repo->slug, 'fix-plugin-does-not-exist-notices') !== false)) {
@@ -518,14 +568,13 @@ class Fix_Plugin_Does_Not_Exist_Notices {
return $result;
}
- // Debug: Log the requested slug
- error_log('Plugin API request for slug: ' . $args->slug);
+ // Check the requested 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);
+ // This is our own plugin, so we'll provide custom information
// Force clear any cached data for our plugin
$this->clear_own_plugin_cache();
@@ -827,6 +876,30 @@ class Fix_Plugin_Does_Not_Exist_Notices {
// Initialize the plugin class.
new Fix_Plugin_Does_Not_Exist_Notices();
+// Automatically deactivate problematic plugins
+add_action('admin_init', 'fpden_deactivate_problematic_plugins');
+
+/**
+ * Deactivate problematic plugins
+ */
+function fpden_deactivate_problematic_plugins() {
+ $active_plugins = get_option('active_plugins', array());
+ $updated_plugins = array();
+
+ // Only keep our plugin and Git Updater
+ foreach ($active_plugins as $plugin) {
+ if (strpos($plugin, 'wp-fix-plugin-does-not-exist-notices') !== false ||
+ strpos($plugin, 'git-updater') !== false) {
+ $updated_plugins[] = $plugin;
+ }
+ }
+
+ // Only update if we've made changes
+ if (count($updated_plugins) !== count($active_plugins)) {
+ update_option('active_plugins', $updated_plugins);
+ }
+}
+
// Initialize the updater if composer autoload exists
$autoloader = __DIR__ . '/vendor/autoload.php';
if (file_exists($autoloader)) {