From 29a4554e433d811e661c129657aaff9c33541cb9 Mon Sep 17 00:00:00 2001 From: "Md. Asif Hossain Nadim" <90011088+MdAsifHossainNadim@users.noreply.github.com> Date: Tue, 28 Jan 2025 11:56:29 +0600 Subject: [PATCH] enhance: Add analytics cache modifier for seller analytics filter. (#2529) * enhance: Add seller analytic stats modifier for seller filter. * fix: phpcs issue for subquery refund method. * enhance: add filter for analytics query argument entities. * fix: class name stuff on CacheKeyModifier class constructor. --- .../Analytics/Reports/BaseQueryFilter.php | 4 +- .../Analytics/Reports/CacheKeyModifier.php | 115 ++++++++++++++++++ .../Providers/AnalyticsServiceProvider.php | 1 + 3 files changed, 118 insertions(+), 2 deletions(-) create mode 100644 includes/Analytics/Reports/CacheKeyModifier.php diff --git a/includes/Analytics/Reports/BaseQueryFilter.php b/includes/Analytics/Reports/BaseQueryFilter.php index c5e4f58be4..bdb1cd024e 100644 --- a/includes/Analytics/Reports/BaseQueryFilter.php +++ b/includes/Analytics/Reports/BaseQueryFilter.php @@ -69,7 +69,7 @@ public function add_where_subquery( array $clauses ): array { * @return array The modified where clauses. */ protected function add_where_subquery_for_refund( array $clauses ): array { - if ( ! isset( $_GET['refunds'] ) ) { + if ( ! isset( $_GET['refunds'] ) ) { //phpcs:ignore return $clauses; } @@ -176,6 +176,6 @@ public function get_vendor_id() { return dokan_get_current_user_id(); } - return (int) ( wp_unslash( $_GET['sellers'] ?? 0 ) ); // phpcs:ignore + return (int) ( wp_unslash( $_GET['sellers'] ?? 0 ) ); // phpcs:ignore } } diff --git a/includes/Analytics/Reports/CacheKeyModifier.php b/includes/Analytics/Reports/CacheKeyModifier.php new file mode 100644 index 0000000000..2bd70274b4 --- /dev/null +++ b/includes/Analytics/Reports/CacheKeyModifier.php @@ -0,0 +1,115 @@ +setup_entities(); + $this->register_hooks(); + } + + /** + * Setup analytics entities + * + * @since DOKAN_SINCE + * + * WC apply filters from @see https://github.com/woocommerce/woocommerce/blob/be602de39d39878085e752f30ec1dabf16b0d642/plugins/woocommerce/src/Admin/API/Reports/GenericQuery.php#L77 + * WC reports generation pattern @see https://github.com/woocommerce/woocommerce/blob/be602de39d39878085e752f30ec1dabf16b0d642/plugins/woocommerce/src/Admin/API/Reports/Products/Controller.php#L53 + * + * @return void + */ + protected function setup_entities(): void { + $this->entities = apply_filters( + 'dokan_analytics_entities_for_query_args', + [ + 'categories', + 'coupons', + 'coupons_stats', + 'customers', + 'downloads', + 'downloads_stats', + 'orders', + 'orders_stats', + 'products', + 'products_stats', + 'revenue', + 'taxes', + 'taxes_stats', + 'variations', + 'variations_stats', + ] + ); + } + + /** + * Register necessary hooks. + * + * @since DOKAN_SINCE + * + * @return void + */ + public function register_hooks(): void { + foreach ( $this->entities as $entity ) { + add_filter( "woocommerce_analytics_{$entity}_query_args", [ $this, 'apply_seller_filter' ] ); + } + } + + /** + * Apply seller filter to query arguments. + * + * Customize the WooCommerce analytics stats datastore to override the $total_query and $interval_query properties. + * This modification replaces the Automattic\WooCommerce\Admin\API\Reports\SqlQuery class with WeDevs\Dokan\Analytics\Reports\WcSqlQuery + * to apply specific filters to queries. + * + * @see https://github.com/woocommerce/woocommerce/tree/trunk/plugins/woocommerce/src/Admin/API/Reports + * + * @param array $args An array of query arguments. + * + * @return array Modified array of query arguments. + */ + public function apply_seller_filter( array $args ): array { + $seller_id = (int) dokan()->get_container()->get( \WeDevs\Dokan\Analytics\Reports\Stock\QueryFilter::class )->get_vendor_id(); + + // If seller ID is not set, return the original arguments. + if ( ! $this->is_valid_seller_id( $seller_id ) ) { + return $args; + } + + $args['seller_id'] = $seller_id; + return $args; + } + + /** + * Check if report can be filtered. + * + * @param int $seller_id Seller ID. + * + * @since DOKAN_SINCE + * + * @return bool + */ + protected function is_valid_seller_id( int $seller_id ): bool { + return $seller_id > 0; + } +} diff --git a/includes/DependencyManagement/Providers/AnalyticsServiceProvider.php b/includes/DependencyManagement/Providers/AnalyticsServiceProvider.php index 44f9d17ab5..f1f5916e9f 100644 --- a/includes/DependencyManagement/Providers/AnalyticsServiceProvider.php +++ b/includes/DependencyManagement/Providers/AnalyticsServiceProvider.php @@ -24,6 +24,7 @@ class AnalyticsServiceProvider extends BaseServiceProvider { \WeDevs\Dokan\Analytics\Reports\Variations\Stats\QueryFilter::class, \WeDevs\Dokan\Analytics\Reports\Categories\QueryFilter::class, \WeDevs\Dokan\Analytics\Reports\DataStoreModifier::class, + \WeDevs\Dokan\Analytics\Reports\CacheKeyModifier::class, \WeDevs\Dokan\Analytics\Reports\Taxes\QueryFilter::class, \WeDevs\Dokan\Analytics\Reports\Taxes\Stats\QueryFilter::class, \WeDevs\Dokan\Analytics\Reports\Coupons\QueryFilter::class,