From 03607c40ebf5910eaf820fbf42e4d2ed99128249 Mon Sep 17 00:00:00 2001 From: Shyamsundar Gadde <73636812+ShyamGadde@users.noreply.github.com> Date: Fri, 22 Nov 2024 19:04:31 +0530 Subject: [PATCH 1/6] Remove plugin version number from download link This is done so that it automatically downloads the latest version --- plugins/performance-lab/includes/admin/plugins.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/plugins/performance-lab/includes/admin/plugins.php b/plugins/performance-lab/includes/admin/plugins.php index 285d503e53..76136c3418 100644 --- a/plugins/performance-lab/includes/admin/plugins.php +++ b/plugins/performance-lab/includes/admin/plugins.php @@ -372,7 +372,9 @@ function perflab_install_and_activate_plugin( string $plugin_slug, array &$proce // Replace new Plugin_Installer_Skin with new Quiet_Upgrader_Skin when output needs to be suppressed. $skin = new WP_Ajax_Upgrader_Skin( array( 'api' => $plugin_data ) ); $upgrader = new Plugin_Upgrader( $skin ); - $result = $upgrader->install( $plugin_data['download_link'] ); + // Remove the version number from the link to download the latest plugin version. + $download_link = (string) preg_replace( '#(\/plugin\/[^\/]+)\.\d+\.\d+\.\d+\.zip#', '$1.zip', $plugin_data['download_link'] ); + $result = $upgrader->install( $download_link ); if ( is_wp_error( $result ) ) { return $result; From 8398cfe364df9796055016f933a06a8b2d6e09b6 Mon Sep 17 00:00:00 2001 From: Shyamsundar Gadde <73636812+ShyamGadde@users.noreply.github.com> Date: Sat, 23 Nov 2024 01:05:31 +0530 Subject: [PATCH 2/6] Update regex to handle version tags like `-rc` and `-beta` in plugin download links --- plugins/performance-lab/includes/admin/plugins.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/performance-lab/includes/admin/plugins.php b/plugins/performance-lab/includes/admin/plugins.php index 76136c3418..36bec1e165 100644 --- a/plugins/performance-lab/includes/admin/plugins.php +++ b/plugins/performance-lab/includes/admin/plugins.php @@ -373,7 +373,7 @@ function perflab_install_and_activate_plugin( string $plugin_slug, array &$proce $skin = new WP_Ajax_Upgrader_Skin( array( 'api' => $plugin_data ) ); $upgrader = new Plugin_Upgrader( $skin ); // Remove the version number from the link to download the latest plugin version. - $download_link = (string) preg_replace( '#(\/plugin\/[^\/]+)\.\d+\.\d+\.\d+\.zip#', '$1.zip', $plugin_data['download_link'] ); + $download_link = (string) preg_replace( '#(\/plugin\/[^\/]+)\.\d+\.\d+\.\d+(?:-\w+)?\.zip#', '$1.zip', $plugin_data['download_link'] ); $result = $upgrader->install( $download_link ); if ( is_wp_error( $result ) ) { From 03b05fd91947a4738afb89f3e8840d99f760f534 Mon Sep 17 00:00:00 2001 From: Shyamsundar Gadde Date: Tue, 26 Nov 2024 03:00:24 +0530 Subject: [PATCH 3/6] Avoid transient cache for plugin installation to ensure latest version Replaced transient-cached plugin data with a real-time `plugins_api()` call during installation to avoid installing outdated versions. --- .../includes/admin/plugins.php | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/plugins/performance-lab/includes/admin/plugins.php b/plugins/performance-lab/includes/admin/plugins.php index 36bec1e165..ce6ad8c63c 100644 --- a/plugins/performance-lab/includes/admin/plugins.php +++ b/plugins/performance-lab/includes/admin/plugins.php @@ -343,11 +343,24 @@ function perflab_install_and_activate_plugin( string $plugin_slug, array &$proce } $processed_plugins[] = $plugin_slug; - $plugin_data = perflab_query_plugin_info( $plugin_slug ); + $plugin_data = plugins_api( + 'plugin_information', + array( + 'slug' => $plugin_slug, + 'fields' => array( + 'sections' => false, + ), + ) + ); + if ( $plugin_data instanceof WP_Error ) { return $plugin_data; } + if ( is_object( $plugin_data ) ) { + $plugin_data = (array) $plugin_data; + } + // Add recommended plugins (soft dependencies) to the list of plugins installed and activated. if ( 'embed-optimizer' === $plugin_slug ) { $plugin_data['requires_plugins'][] = 'optimization-detective'; @@ -372,9 +385,7 @@ function perflab_install_and_activate_plugin( string $plugin_slug, array &$proce // Replace new Plugin_Installer_Skin with new Quiet_Upgrader_Skin when output needs to be suppressed. $skin = new WP_Ajax_Upgrader_Skin( array( 'api' => $plugin_data ) ); $upgrader = new Plugin_Upgrader( $skin ); - // Remove the version number from the link to download the latest plugin version. - $download_link = (string) preg_replace( '#(\/plugin\/[^\/]+)\.\d+\.\d+\.\d+(?:-\w+)?\.zip#', '$1.zip', $plugin_data['download_link'] ); - $result = $upgrader->install( $download_link ); + $result = $upgrader->install( $plugin_data['download_link'] ); if ( is_wp_error( $result ) ) { return $result; From cdaf0f401c75862df3c79788c130cd64eab989b2 Mon Sep 17 00:00:00 2001 From: Weston Ruter Date: Mon, 25 Nov 2024 15:50:35 -0800 Subject: [PATCH 4/6] Remove download_link from data explicitly requested in perflab_query_plugin_info() --- plugins/performance-lab/includes/admin/plugins.php | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/plugins/performance-lab/includes/admin/plugins.php b/plugins/performance-lab/includes/admin/plugins.php index ce6ad8c63c..8898c63230 100644 --- a/plugins/performance-lab/includes/admin/plugins.php +++ b/plugins/performance-lab/includes/admin/plugins.php @@ -16,7 +16,7 @@ * @since 2.8.0 * * @param string $plugin_slug The string identifier for the plugin in questions slug. - * @return array{name: string, slug: string, short_description: string, requires: string|false, requires_php: string|false, requires_plugins: string[], download_link: string, version: string}|WP_Error Array of plugin data or WP_Error if failed. + * @return array{name: string, slug: string, short_description: string, requires: string|false, requires_php: string|false, requires_plugins: string[], version: string}|WP_Error Array of plugin data or WP_Error if failed. */ function perflab_query_plugin_info( string $plugin_slug ) { $transient_key = 'perflab_plugins_info'; @@ -40,7 +40,6 @@ function perflab_query_plugin_info( string $plugin_slug ) { 'requires', 'requires_php', 'requires_plugins', - 'download_link', 'version', // Needed by install_plugin_install_status(). ); @@ -113,7 +112,7 @@ function perflab_query_plugin_info( string $plugin_slug ) { /** * Validated (mostly) plugin data. * - * @var array $plugins + * @var array $plugins */ return $plugins[ $plugin_slug ]; } From 49424c8c928597da886882cc6320fdb373ca26e7 Mon Sep 17 00:00:00 2001 From: Weston Ruter Date: Mon, 25 Nov 2024 16:01:38 -0800 Subject: [PATCH 5/6] Explicitly request download_link and requires_plugins fields --- plugins/performance-lab/includes/admin/plugins.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/plugins/performance-lab/includes/admin/plugins.php b/plugins/performance-lab/includes/admin/plugins.php index 8898c63230..27f5e7f144 100644 --- a/plugins/performance-lab/includes/admin/plugins.php +++ b/plugins/performance-lab/includes/admin/plugins.php @@ -347,7 +347,9 @@ function perflab_install_and_activate_plugin( string $plugin_slug, array &$proce array( 'slug' => $plugin_slug, 'fields' => array( - 'sections' => false, + 'download_link' => true, + 'requires_plugins' => true, + 'sections' => false, // Omit the bulk of the response which we don't need. ), ) ); From b59b0d2f1b45b2303e45578b4f2e216be654766f Mon Sep 17 00:00:00 2001 From: Weston Ruter Date: Mon, 25 Nov 2024 16:06:30 -0800 Subject: [PATCH 6/6] Explain why perflab_query_plugin_info() isn't used in perflab_install_and_activate_plugin() --- plugins/performance-lab/includes/admin/plugins.php | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/performance-lab/includes/admin/plugins.php b/plugins/performance-lab/includes/admin/plugins.php index 27f5e7f144..c3633c5d60 100644 --- a/plugins/performance-lab/includes/admin/plugins.php +++ b/plugins/performance-lab/includes/admin/plugins.php @@ -342,6 +342,7 @@ function perflab_install_and_activate_plugin( string $plugin_slug, array &$proce } $processed_plugins[] = $plugin_slug; + // Get the freshest data (including the most recent download_link) as opposed what is cached by perflab_query_plugin_info(). $plugin_data = plugins_api( 'plugin_information', array(