From c00bef482c012ea38c195d7d5857c9033a105061 Mon Sep 17 00:00:00 2001 From: marcusquinn <6428977+marcusquinn@users.noreply.github.com> Date: Sun, 13 Apr 2025 04:47:24 +0100 Subject: [PATCH] Version 2.0.13: Fixed critical error with Git Updater integration and cleaned up codebase --- assets/js/plugin-details-fix.js | 74 --------------- assets/js/version-fix.js | 75 ++++++++++++++++ clear-transients.php | 109 ----------------------- gu-branch-fix.php | 87 ------------------ readme.txt | 8 +- wp-fix-plugin-does-not-exist-notices.php | 93 ++++++++++++++++--- 6 files changed, 165 insertions(+), 281 deletions(-) delete mode 100644 assets/js/plugin-details-fix.js create mode 100644 assets/js/version-fix.js delete mode 100644 clear-transients.php delete mode 100644 gu-branch-fix.php 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)) {