From 2b00936abb3dfdd039bba5310519da0952a9c103 Mon Sep 17 00:00:00 2001 From: Chi-Hsuan Huang Date: Thu, 18 Sep 2025 16:40:52 +0800 Subject: [PATCH 1/7] Add proxy speed module to WooCommerce Analytics - Introduced a new class `WooCommerceAnalyticsProxySpeed` to handle proxy requests and optimize performance. - Added methods to manage the installation and removal of the proxy speed module. - Implemented functionality to filter active plugins based on proxy requests. - Created a new MU plugin file for the proxy speed module. --- .../src/class-woocommerce-analytics.php | 63 ++++++++++ ...ocommerce-analytics-proxy-speed-module.php | 114 ++++++++++++++++++ 2 files changed, 177 insertions(+) create mode 100644 projects/packages/woocommerce-analytics/src/mu-plugin/woocommerce-analytics-proxy-speed-module.php diff --git a/projects/packages/woocommerce-analytics/src/class-woocommerce-analytics.php b/projects/packages/woocommerce-analytics/src/class-woocommerce-analytics.php index c72a7363af441..3ef64ac9d74c3 100644 --- a/projects/packages/woocommerce-analytics/src/class-woocommerce-analytics.php +++ b/projects/packages/woocommerce-analytics/src/class-woocommerce-analytics.php @@ -22,6 +22,8 @@ class Woocommerce_Analytics { */ const PACKAGE_VERSION = '0.8.0'; + const PROXY_SPEED_MODULE_VERSION = '1.0.0'; + /** * Initializer. * Used to configure the WooCommerce Analytics package. @@ -131,4 +133,65 @@ public static function register_rest_routes() { $controller = new WC_Analytics_Tracking_Proxy(); $controller->register_routes(); } + + /** + * Maybe add proxy speed module. + */ + public static function maybe_add_proxy_speed_module() { + if ( ! current_user_can( 'install_plugins' ) ) { + return; + } + + if ( ! function_exists( 'WP_Filesystem' ) ) { + require_once ABSPATH . 'wp-admin/includes/file.php'; + } + + // Initialize the WP filesystem. + WP_Filesystem(); + + // Create the mu-plugin directory if it doesn't exist. + if ( ! is_dir( WPMU_PLUGIN_DIR ) ) { + wp_mkdir_p( WPMU_PLUGIN_DIR ); + } + + // If the mu-plugin directory doesn't exist, we can't copy the files. + if ( ! is_dir( WPMU_PLUGIN_DIR ) ) { + return; + } + + if ( get_option( 'woocommerce_analytics_proxy_speed_module_version' ) === self::PROXY_SPEED_MODULE_VERSION ) { + // No need to copy the files again. + return; + } + + update_option( 'woocommerce_analytics_proxy_speed_module_version', self::PROXY_SPEED_MODULE_VERSION ); + $mu_plugin_src_dir = __DIR__ . '/mu-plugin'; + $results = copy_dir( $mu_plugin_src_dir, WPMU_PLUGIN_DIR ); + + if ( is_wp_error( $results ) ) { + if ( function_exists( 'wc_get_logger' ) ) { + wc_get_logger()->error( 'Failed to copy the WooCommerce Analytics proxy speed module files.', array( 'source' => 'woocommerce-analytics' ) ); + } + } + } + + /** + * Maybe remove proxy speed module. + */ + public static function maybe_remove_proxy_speed_module() { + if ( ! current_user_can( 'install_plugins' ) ) { + return; + } + + /** + * Clean up MU plugin. + */ + $file_path = WP_CONTENT_DIR . '/mu-plugins/woocommerce-analytics-proxy-speed-module.php'; + + if ( file_exists( $file_path ) ) { + wp_delete_file( $file_path ); + } + + delete_option( 'woocommerce_analytics_proxy_speed_module_version' ); + } } diff --git a/projects/packages/woocommerce-analytics/src/mu-plugin/woocommerce-analytics-proxy-speed-module.php b/projects/packages/woocommerce-analytics/src/mu-plugin/woocommerce-analytics-proxy-speed-module.php new file mode 100644 index 0000000000000..f8692197066e7 --- /dev/null +++ b/projects/packages/woocommerce-analytics/src/mu-plugin/woocommerce-analytics-proxy-speed-module.php @@ -0,0 +1,114 @@ +request_uri = $this->get_request_uri(); + $this->is_proxy_request = $this->is_proxy_request(); + + $this->init(); + } + + /** + * Helper method to retrieve Request URI. Checks several globals. + * + * @return mixed + */ + private function get_request_uri() { + return isset( $_SERVER['REQUEST_URI'] ) ? wp_unslash( $_SERVER['REQUEST_URI'] ) : ''; // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized + } + + /** + * Check if current request is a proxy request. + * + * @return bool + */ + private function is_proxy_request() { + + if ( ! $this->path ) { + return false; + } + + return strpos( $this->request_uri, $this->path ) !== false; + } + + /** + * Add filters and actions. + * + * @return void + */ + private function init() { + add_filter( 'option_active_plugins', array( $this, 'filter_active_plugins' ) ); + } + + /** + * Filter the list of active plugins for custom endpoint requests. + * + * @param array $active_plugins The list of active plugins. + * + * @return array The filtered list of active plugins. + */ + public function filter_active_plugins( $active_plugins ) { + if ( ! $this->is_proxy_request || ! is_array( $active_plugins ) ) { + return $active_plugins; + } + + $filtered_plugins = array(); + + foreach ( $active_plugins as $plugin ) { + foreach ( $this->allowed_plugin_files as $allowed_plugin_file ) { + if ( strpos( $plugin, $allowed_plugin_file ) !== false ) { + $filtered_plugins[] = $plugin; + break; + } + } + } + + return $filtered_plugins; + } +} + +new WooCommerceAnalyticsProxySpeed(); // @phan-suppress-current-line PhanNoopNew From a1d40522ba2cc9f3ed72c28996e45b486b8df0c7 Mon Sep 17 00:00:00 2001 From: Chi-Hsuan Huang Date: Fri, 19 Sep 2025 14:03:20 +0800 Subject: [PATCH 2/7] Enhance WooCommerce Analytics proxy speed module integration - Added a constant for the proxy speed module version. - Updated methods to manage the addition and removal of the proxy speed module, removing unnecessary user capability checks. - Changed the installation process to copy the proxy speed module file instead of a directory. - Integrated calls to add and remove the proxy speed module in Jetpack plugin initialization and deactivation processes. --- .../src/class-woocommerce-analytics.php | 20 +++++++++---------- projects/plugins/jetpack/class.jetpack.php | 9 +++++++++ 2 files changed, 18 insertions(+), 11 deletions(-) diff --git a/projects/packages/woocommerce-analytics/src/class-woocommerce-analytics.php b/projects/packages/woocommerce-analytics/src/class-woocommerce-analytics.php index 3ef64ac9d74c3..f15365f2f914f 100644 --- a/projects/packages/woocommerce-analytics/src/class-woocommerce-analytics.php +++ b/projects/packages/woocommerce-analytics/src/class-woocommerce-analytics.php @@ -22,6 +22,11 @@ class Woocommerce_Analytics { */ const PACKAGE_VERSION = '0.8.0'; + /** + * Proxy speed module version. + * + * @var string + */ const PROXY_SPEED_MODULE_VERSION = '1.0.0'; /** @@ -138,10 +143,6 @@ public static function register_rest_routes() { * Maybe add proxy speed module. */ public static function maybe_add_proxy_speed_module() { - if ( ! current_user_can( 'install_plugins' ) ) { - return; - } - if ( ! function_exists( 'WP_Filesystem' ) ) { require_once ABSPATH . 'wp-admin/includes/file.php'; } @@ -165,8 +166,9 @@ public static function maybe_add_proxy_speed_module() { } update_option( 'woocommerce_analytics_proxy_speed_module_version', self::PROXY_SPEED_MODULE_VERSION ); - $mu_plugin_src_dir = __DIR__ . '/mu-plugin'; - $results = copy_dir( $mu_plugin_src_dir, WPMU_PLUGIN_DIR ); + $mu_plugin_src_file = __DIR__ . '/mu-plugin/woocommerce-analytics-proxy-speed-module.php'; + $mu_plugin_dest_file = WPMU_PLUGIN_DIR . '/woocommerce-analytics-proxy-speed-module.php'; + $results = copy( $mu_plugin_src_file, $mu_plugin_dest_file ); if ( is_wp_error( $results ) ) { if ( function_exists( 'wc_get_logger' ) ) { @@ -176,13 +178,9 @@ public static function maybe_add_proxy_speed_module() { } /** - * Maybe remove proxy speed module. + * Maybe removes the proxy speed module. This should be invoked when the plugin is deactivated. */ public static function maybe_remove_proxy_speed_module() { - if ( ! current_user_can( 'install_plugins' ) ) { - return; - } - /** * Clean up MU plugin. */ diff --git a/projects/plugins/jetpack/class.jetpack.php b/projects/plugins/jetpack/class.jetpack.php index 805bfd8982dc9..0cb731b7c68c5 100644 --- a/projects/plugins/jetpack/class.jetpack.php +++ b/projects/plugins/jetpack/class.jetpack.php @@ -39,6 +39,7 @@ use Automattic\Jetpack\Sync\Sender; use Automattic\Jetpack\Terms_Of_Service; use Automattic\Jetpack\Tracking; +use Automattic\Woocommerce_Analytics; if ( ! defined( 'ABSPATH' ) ) { exit( 0 ); @@ -2623,6 +2624,10 @@ public static function plugin_activation( $network_wide ) { Sync_Actions::do_only_first_initial_sync(); } + if ( ! defined( 'WC_ANALYTICS' ) && class_exists( 'Automattic\Woocommerce_Analytics' ) ) { + Woocommerce_Analytics::maybe_add_proxy_speed_module(); + } + self::plugin_initialize(); } @@ -2803,6 +2808,10 @@ public static function plugin_deactivation() { self::disconnect(); Jetpack_Options::delete_option( 'version' ); } + + if ( ! defined( 'WC_ANALYTICS' ) && class_exists( 'Automattic\Woocommerce_Analytics' ) ) { + Woocommerce_Analytics::maybe_remove_proxy_speed_module(); + } } /** From 28686779cb73b756e12bb5a5105251946b46b0f1 Mon Sep 17 00:00:00 2001 From: Chi-Hsuan Huang Date: Fri, 19 Sep 2025 14:04:36 +0800 Subject: [PATCH 3/7] changelog --- projects/plugins/jetpack/changelog/add-wca-proxy-speed-module | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 projects/plugins/jetpack/changelog/add-wca-proxy-speed-module diff --git a/projects/plugins/jetpack/changelog/add-wca-proxy-speed-module b/projects/plugins/jetpack/changelog/add-wca-proxy-speed-module new file mode 100644 index 0000000000000..a7a586e7bf423 --- /dev/null +++ b/projects/plugins/jetpack/changelog/add-wca-proxy-speed-module @@ -0,0 +1,4 @@ +Significance: minor +Type: other + +Integrate calls to add and remove the proxy speed module in Jetpack plugin initialization and deactivation processes From ef18385c8e0a9315250bf8f6e8f20bd2b83ef27f Mon Sep 17 00:00:00 2001 From: Chi-Hsuan Huang Date: Fri, 19 Sep 2025 14:18:23 +0800 Subject: [PATCH 4/7] Improve WooCommerceAnalyticsProxySpeed --- ...ocommerce-analytics-proxy-speed-module.php | 77 ++++++------------- 1 file changed, 23 insertions(+), 54 deletions(-) diff --git a/projects/packages/woocommerce-analytics/src/mu-plugin/woocommerce-analytics-proxy-speed-module.php b/projects/packages/woocommerce-analytics/src/mu-plugin/woocommerce-analytics-proxy-speed-module.php index f8692197066e7..03a8d65a604fe 100644 --- a/projects/packages/woocommerce-analytics/src/mu-plugin/woocommerce-analytics-proxy-speed-module.php +++ b/projects/packages/woocommerce-analytics/src/mu-plugin/woocommerce-analytics-proxy-speed-module.php @@ -12,75 +12,26 @@ * Inspired by: https://github.com/plausible/wordpress/blob/092b97b247f45bf347ae32f9614f20a81d9e10c0/mu-plugin/plausible-proxy-speed-module.php */ class WooCommerceAnalyticsProxySpeed { - /** - * Is current request a request to our proxy? - * - * @var bool - */ - private $is_proxy_request = false; - - /** - * Current request URI. - * - * @var string - */ - private $request_uri = ''; - /** * Path of the proxy request. * * @var string */ - private $path = 'woocommerce-analytics/v1/track'; + const PROXY_REQUEST_PATH = 'woocommerce-analytics/v1/track'; /** - * Allowed plugin files. + * Allowed plugin files for proxy request. * * @var array */ private $allowed_plugin_files = array( 'woocommerce.php', 'woocommerce-analytics.php', 'jetpack.php' ); - /** - * Build properties. - * - * @return void - */ - public function __construct() { - $this->request_uri = $this->get_request_uri(); - $this->is_proxy_request = $this->is_proxy_request(); - - $this->init(); - } - - /** - * Helper method to retrieve Request URI. Checks several globals. - * - * @return mixed - */ - private function get_request_uri() { - return isset( $_SERVER['REQUEST_URI'] ) ? wp_unslash( $_SERVER['REQUEST_URI'] ) : ''; // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized - } - - /** - * Check if current request is a proxy request. - * - * @return bool - */ - private function is_proxy_request() { - - if ( ! $this->path ) { - return false; - } - - return strpos( $this->request_uri, $this->path ) !== false; - } - /** * Add filters and actions. * * @return void */ - private function init() { + public function init() { add_filter( 'option_active_plugins', array( $this, 'filter_active_plugins' ) ); } @@ -92,7 +43,7 @@ private function init() { * @return array The filtered list of active plugins. */ public function filter_active_plugins( $active_plugins ) { - if ( ! $this->is_proxy_request || ! is_array( $active_plugins ) ) { + if ( ! $this->is_proxy_request() || ! is_array( $active_plugins ) ) { return $active_plugins; } @@ -109,6 +60,24 @@ public function filter_active_plugins( $active_plugins ) { return $filtered_plugins; } + + /** + * Helper method to retrieve Request URI. Checks several globals. + * + * @return mixed + */ + private function get_request_uri() { + return isset( $_SERVER['REQUEST_URI'] ) ? wp_unslash( $_SERVER['REQUEST_URI'] ) : ''; // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized + } + + /** + * Check if current request is a proxy request. + * + * @return bool + */ + private function is_proxy_request() { + return strpos( $this->get_request_uri(), self::PROXY_REQUEST_PATH ) !== false; + } } -new WooCommerceAnalyticsProxySpeed(); // @phan-suppress-current-line PhanNoopNew +( new WooCommerceAnalyticsProxySpeed() )->init(); From 3e2273b4d030cdf3d8d75af13a84aa652c14e17e Mon Sep 17 00:00:00 2001 From: Chi-Hsuan Huang Date: Fri, 19 Sep 2025 14:33:32 +0800 Subject: [PATCH 5/7] Add changelog --- .../changelog/add-wca-proxy-speed-module | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 projects/packages/woocommerce-analytics/changelog/add-wca-proxy-speed-module diff --git a/projects/packages/woocommerce-analytics/changelog/add-wca-proxy-speed-module b/projects/packages/woocommerce-analytics/changelog/add-wca-proxy-speed-module new file mode 100644 index 0000000000000..843a1087d645b --- /dev/null +++ b/projects/packages/woocommerce-analytics/changelog/add-wca-proxy-speed-module @@ -0,0 +1,4 @@ +Significance: minor +Type: added + +Add proxy speed module to enhance proxy API performance From cc717e6b205ef5bef171b6e90a846eee2bb280a5 Mon Sep 17 00:00:00 2001 From: Chi-Hsuan Huang Date: Wed, 24 Sep 2025 14:38:44 +0800 Subject: [PATCH 6/7] Update projects/packages/woocommerce-analytics/src/class-woocommerce-analytics.php Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../woocommerce-analytics/src/class-woocommerce-analytics.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/projects/packages/woocommerce-analytics/src/class-woocommerce-analytics.php b/projects/packages/woocommerce-analytics/src/class-woocommerce-analytics.php index f15365f2f914f..af82c2c42568d 100644 --- a/projects/packages/woocommerce-analytics/src/class-woocommerce-analytics.php +++ b/projects/packages/woocommerce-analytics/src/class-woocommerce-analytics.php @@ -170,7 +170,7 @@ public static function maybe_add_proxy_speed_module() { $mu_plugin_dest_file = WPMU_PLUGIN_DIR . '/woocommerce-analytics-proxy-speed-module.php'; $results = copy( $mu_plugin_src_file, $mu_plugin_dest_file ); - if ( is_wp_error( $results ) ) { + if ( ! $results ) { if ( function_exists( 'wc_get_logger' ) ) { wc_get_logger()->error( 'Failed to copy the WooCommerce Analytics proxy speed module files.', array( 'source' => 'woocommerce-analytics' ) ); } From b0ad9c0469c46453c4e1a79fd20c2b6bc1389667 Mon Sep 17 00:00:00 2001 From: Chi-Hsuan Huang Date: Wed, 24 Sep 2025 14:39:14 +0800 Subject: [PATCH 7/7] Update projects/packages/woocommerce-analytics/src/class-woocommerce-analytics.php Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../woocommerce-analytics/src/class-woocommerce-analytics.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/projects/packages/woocommerce-analytics/src/class-woocommerce-analytics.php b/projects/packages/woocommerce-analytics/src/class-woocommerce-analytics.php index af82c2c42568d..9eef7961e983f 100644 --- a/projects/packages/woocommerce-analytics/src/class-woocommerce-analytics.php +++ b/projects/packages/woocommerce-analytics/src/class-woocommerce-analytics.php @@ -184,7 +184,7 @@ public static function maybe_remove_proxy_speed_module() { /** * Clean up MU plugin. */ - $file_path = WP_CONTENT_DIR . '/mu-plugins/woocommerce-analytics-proxy-speed-module.php'; + $file_path = WPMU_PLUGIN_DIR . '/woocommerce-analytics-proxy-speed-module.php'; if ( file_exists( $file_path ) ) { wp_delete_file( $file_path );