PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 16.2-a.1
Jetpack – WP Security, Backup, Speed, & Growth v16.2-a.1
16.1.2 16.2-a.1 16.1.1 16.1 16.1-beta 16.1-beta.2 16.1-beta.3 16.1-a.5 16.1-a.3 16.0.1 16.1-a.1 16.0 16.0-beta 16.0-a.7 16.0-a.5 15.9.1 16.0-a.3 16.0-a.1 15.9 15.9-beta 15.9-a.7 15.9-a.5 15.9-a.3 15.9-a.1 15.8 15.8-beta 15.8-a.7 15.8-a.5 5.2.5 5.3.4 5.4.4 5.5.5 5.6.5 5.7.5 5.8.4 5.9.4 6.0.4 6.1 6.1.1 6.1.2 6.1.3 6.1.4 6.1.5 6.2 6.2.1 6.2.2 6.2.3 6.2.4 6.2.5 6.3 6.3.1 6.3.2 6.3.3 6.3.4 6.3.5 6.3.6 6.3.7 6.4 6.4.1 6.4.2 6.4.3 6.4.4 6.4.5 6.4.6 6.5 6.5.1 6.5.2 6.5.3 6.5.4 6.6 6.6.1 6.6.2 6.6.3 6.6.4 6.6.5 6.7 6.7.1 6.7.2 6.7.3 6.7.4 6.8 6.8.1 6.8.2 6.8.3 6.8.4 6.8.5 6.9 6.9.1 6.9.2 6.9.3 6.9.4 7.0 7.0.1 7.0.2 7.0.3 7.0.4 7.0.5 7.1 7.1.1 7.1.2 7.1.3 7.1.4 7.1.5 7.2 7.2.1 7.2.1.1 7.2.2 7.2.3 7.2.4 7.2.5 7.3 7.3.0.1 7.3.1 7.3.1.1 7.3.2 7.3.3 7.3.4 7.3.5 7.4 7.4.1 7.4.2 7.4.3 7.4.4 7.4.5 7.5 7.5.0.1 7.5.1 7.5.2 7.5.3 7.5.4 7.5.5 7.5.6 7.5.7 7.6 7.6.1 7.6.2 7.6.3 7.6.4 7.7 7.7.1 7.7.2 7.7.3 7.7.4 7.7.5 7.7.6 7.8 7.8.1 7.8.2 7.8.3 7.8.4 7.9 7.9.1 7.9.2 7.9.3 7.9.4 8.0 8.0.1 8.0.2 8.0.3 8.1 8.1.1 8.1.2 8.1.3 8.1.4 8.2 8.2.0.1 8.2.1 8.2.2 8.2.3 8.2.4 8.2.5 8.2.6 8.3 8.3.1 8.3.2 8.3.3 8.4 8.4.1 8.4.2 8.4.3 8.4.4 8.4.5 8.5 8.5.1 8.5.2 8.5.3 8.6 8.6.1 8.6.2 8.6.3 8.6.4 8.7 8.7.0.1 8.7.1 8.7.2 8.7.3 8.7.4 8.8 8.8.1 8.8.2 8.8.3 8.8.4 8.8.5 8.9 8.9.1 8.9.2 8.9.3 8.9.4 9.0 9.0.1 9.0.2 9.0.3 9.0.4 9.0.5 9.1 9.1.1 9.1.2 9.1.3 9.2 9.2.1 9.2.2 9.2.3 9.2.4 9.3 9.3.1 9.3.2 9.3.3 9.3.4 9.3.5 9.4 9.4.1 9.4.2 9.4.3 9.4.4 9.5 9.5.1 9.5.2 9.5.3 9.5.4 9.5.5 9.6 9.6.1 9.6.2 9.6.3 9.6.4 9.7 9.7.1 9.7.2 15.7-beta.2 9.7.3 15.7.1 9.8 15.8-a.1 9.8.1 15.8-a.3 9.8.2 2.0.9 9.8.3 2.1.7 9.9 2.2.10 9.9.1 2.3.10 9.9.2 2.4.7 9.9.3 2.5.5 2.6.6 2.7.5 2.8.5 2.9.6 3.0.6 3.1.5 3.2.5 3.3.6 3.4.6 3.5.6 3.6.4 3.7.5 3.8.5 3.9.10 4.0.7 4.1.4 4.2.5 4.3.5 4.4.5 4.5.3 4.6.3 4.7.4 4.8.5 4.9.3 5.0.3 5.1.4 trunk 10.0 10.0.1 10.0.2 10.1 10.1.1 10.1.2 10.2 10.2.1 10.2.2 10.2.3 10.3 10.3.1 10.3.2 10.4 10.4.1 10.4.2 10.5 10.5.1 10.5.2 10.5.3 10.6 10.6.1 10.6.2 10.7 10.7.1 10.7.2 10.8 10.8.1 10.8.2 10.9 10.9.1 10.9.2 10.9.3 11.0 11.0.1 11.0.2 11.1 11.1.1 11.1.2 11.1.3 11.1.4 11.2 11.2.1 11.2.2 11.3 11.3.1 11.3.2 11.3.3 11.3.4 11.4 11.4.1 11.4.2 11.5 11.5.1 11.5.2 11.5.3 11.6 11.6.1 11.6.2 11.7 11.7.1 11.7.2 11.7.3 11.8 11.8.3 11.8.4 11.8.5 11.8.6 11.9 11.9.1 11.9.2 11.9.3 12.0 12.0.1 12.0.2 12.1 12.1.1 12.1.2 12.2 12.2.1 12.2.2 12.3 12.3.1 12.4 12.4.1 12.5 12.5.1 12.6 12.6.1 12.6.2 12.6.3 12.7 12.7.1 12.7.2 12.8 12.8.1 12.8.2 12.9 12.9.1 12.9.2 12.9.3 12.9.4 13.0 13.0.1 13.1 13.1.1 13.1.2 13.1.3 13.1.4 13.2 13.2.1 13.2.2 13.2.3 13.3 13.3.1 13.3.2 13.4 13.4.1 13.4.2 13.4.3 13.4.4 13.5 13.5.1 13.6 13.6.1 13.7 13.7.1 13.8 13.8.1 13.8.2 13.9 13.9.1 14.0 14.1 14.2 14.2.1 14.3 14.4 14.4.1 14.5 14.6 14.7 14.8 14.9 14.9.1 15.0 15.0.1 15.0.2 15.1 15.1.1 15.2 15.3 15.3.1 15.4 15.5 15.6 15.7 15.7-a.1 15.7-a.3 15.7-a.5 15.7-a.7 15.7-beta
jetpack / jetpack_vendor / automattic / jetpack-premium-analytics / src / Sync / class-configuration.php
jetpack / jetpack_vendor / automattic / jetpack-premium-analytics / src / Sync Last commit date
class-configuration.php 2 weeks ago class-sync-status-tracker.php 2 weeks ago class-woocommerce-analytics-module.php 2 weeks ago trait-utilities.php 2 weeks ago
class-configuration.php
268 lines
1 <?php
2 /**
3 * TEMPORARY: interim port for WOOA7S-1550 — remove when the shared sync-modules composer package lands.
4 *
5 * Plain replacement for woocommerce-analytics' src/Internal/Jetpack/Sync/Configuration.php.
6 * The upstream class is wired through a PHP-DI container and RegistrableInterface; the
7 * monorepo package has no DI container, so this is a plain class invoked from
8 * {@see \Automattic\Jetpack\PremiumAnalytics\Analytics::init()}.
9 *
10 * It registers the same Jetpack Sync filters upstream's Configuration does and ensures the
11 * Sync feature so the `woocommerce_analytics` full-sync module runs. Connection bootstrap and
12 * the admin-script enqueue from the upstream class are intentionally omitted — they are handled
13 * elsewhere in the monorepo and are out of scope for this sync port.
14 *
15 * WooCommerce is a runtime (not composer) dependency, so {@see register()} guards on WooCommerce
16 * being active before hooking anything; the ported module is only ever instantiated in that case.
17 *
18 * @package automattic/jetpack-premium-analytics
19 */
20
21 namespace Automattic\Jetpack\PremiumAnalytics\Sync;
22
23 use Automattic\Jetpack\Config;
24 use Automattic\Jetpack\Sync\Data_Settings;
25 use Automattic\Jetpack\Sync\Modules as JetpackSyncModules;
26 use Automattic\Jetpack\Sync\Modules\Meta as Meta_Module;
27 use Automattic\Jetpack\Sync\Modules\Posts as Posts_Module;
28 use Automattic\Jetpack\Sync\Modules\Term_Relationships as Term_Relationships_Module;
29 use Automattic\Jetpack\Sync\Modules\Terms as Terms_Module;
30
31 defined( 'ABSPATH' ) || exit;
32
33 /**
34 * Registers the WooCommerce Analytics Jetpack Sync module and its supporting filters.
35 */
36 class Configuration {
37
38 use Utilities;
39
40 /**
41 * List of post meta to add to Sync's post meta whitelist.
42 * Any changes to these meta will by synced to WordPress.com.
43 *
44 * @static
45 * @var array
46 */
47 private static $postmeta_to_sync = array(
48 // Products.
49 '_stock',
50 '_stock_quantity',
51 '_cogs_total_value',
52 '_global_unique_id',
53 // Bookings.
54 '_booking_parent_id',
55 '_booking_duplicate_of',
56 '_booking_product_id',
57 '_booking_resource_id',
58 '_booking_order_id',
59 '_booking_order_item_id',
60 '_booking_customer_id',
61 '_booking_start',
62 '_booking_end',
63 '_booking_all_day',
64 '_booking_persons',
65 '_booking_cost',
66 '_booking_date_cancelled',
67 '_booking_attendance_status',
68 );
69
70 /**
71 * Entry point called from Analytics::init(). Schedules the Sync hookups on plugins_loaded;
72 * the actual registration is a no-op unless WooCommerce is active (see {@see configure_sync()}).
73 *
74 * @return void
75 */
76 public static function register(): void {
77 $instance = new self();
78
79 // Defer the WooCommerce-active guard and all hookups to plugins_loaded so they run after
80 // every plugin (including WooCommerce) has loaded, regardless of plugin load order.
81 // Analytics::init() runs during plugin include, before plugins_loaded fires; the priority-1
82 // timing also lets the Jetpack Config constructed below run its own on_plugins_loaded
83 // (priority 2) handler in the same cycle.
84 if ( did_action( 'plugins_loaded' ) ) {
85 $instance->configure_sync();
86 } else {
87 add_action( 'plugins_loaded', array( $instance, 'configure_sync' ), 1 );
88 }
89 }
90
91 /**
92 * Whether WooCommerce is active in the current request.
93 *
94 * Public so the sync milestone tracker can decide which full sync gates the
95 * dashboard: the `woocommerce_analytics` module when WooCommerce is active,
96 * or Jetpack's generic initial full sync when it is not.
97 *
98 * @return bool
99 */
100 public static function is_woocommerce_active(): bool {
101 return class_exists( 'WooCommerce' ) || function_exists( 'WC' );
102 }
103
104 /**
105 * Register the Jetpack Sync filters and ensure the Sync feature, when WooCommerce is active.
106 *
107 * No-op unless WooCommerce is active, since the module relies on WooCommerce runtime symbols
108 * (WC_Order, the wc_order_stats table, OrderUtil, etc.).
109 *
110 * @return void
111 */
112 public function configure_sync(): void {
113 if ( ! self::is_woocommerce_active() ) {
114 return;
115 }
116
117 add_filter( 'jetpack_sync_modules', array( $this, 'add_woocommerce_analytics_module' ) );
118 add_filter( 'jetpack_full_sync_config', array( $this, 'expand_full_sync_config' ) );
119 add_filter( 'jetpack_sync_checksum_allowed_tables', array( $this, 'add_order_stats_to_checksum' ) );
120 add_filter( 'jetpack_sync_post_meta_whitelist', array( $this, 'add_meta_to_sync_post_meta_whitelist' ) );
121
122 ( new Config() )->ensure( 'sync', $this->get_jetpack_sync_config() );
123 }
124
125 /**
126 * Add the WooCommerce Analytics module to the list of Jetpack Sync modules.
127 *
128 * Additive: appends to whatever module list is already configured rather than replacing it.
129 *
130 * @param array $modules The current list of sync module class names.
131 * @return array
132 */
133 public function add_woocommerce_analytics_module( $modules ) {
134 if ( is_array( $modules ) && ! in_array( WooCommerce_Analytics_Module::class, $modules, true ) ) {
135 $modules[] = WooCommerce_Analytics_Module::class;
136 }
137
138 return $modules;
139 }
140
141 /**
142 * Jetpack Sync module configuration.
143 *
144 * @return array Jetpack Sync config array.
145 */
146 private function get_jetpack_sync_config(): array {
147 $jetpack_sync_modules = array_keys(
148 array_filter(
149 array(
150 WooCommerce_Analytics_Module::class => true, // WooCommerce Analytics module.
151 Meta_Module::class => true,
152 Posts_Module::class => true,
153 Terms_Module::class => true,
154 Term_Relationships_Module::class => true,
155 )
156 )
157 );
158
159 return array_merge_recursive(
160 Data_Settings::MUST_SYNC_DATA_SETTINGS,
161 array(
162 'jetpack_sync_modules' => $jetpack_sync_modules,
163 'jetpack_sync_options_whitelist' => array(
164 'woocommerce_custom_orders_table_enabled', // Required for HPOS checksums.
165 'woocommerce_excluded_report_order_statuses', // Required for generating analytics reports.
166 'woocommerce_date_type', // Date used to determine the date range for analytics reports.
167 ),
168 'jetpack_sync_constants_whitelist' => array(
169 // Syncing this triggers WPCom to provision the WC Analytics tables. Defined by the
170 // plugin at load (double underscore, per the JETPACK__VERSION convention). (WOOA7S-1643)
171 // WC_ANALYTICS_VERSION is intentionally omitted: it is defined and whitelisted by the
172 // standalone woocommerce-analytics plugin, and on a PA-only store would only sync null.
173 'JETPACK_PREMIUM_ANALYTICS__VERSION',
174 ),
175 )
176 );
177 }
178
179 /**
180 * Expand full sync config with module required by WooCommerce Analytics if not already present.
181 *
182 * @param array $config The current full sync configuration.
183 * @return array The modified full sync configuration.
184 */
185 public function expand_full_sync_config( array $config ): array {
186 if ( ! $this->can_site_sync_orders() ) {
187 return $config;
188 }
189
190 // Let's ensure Terms and Term_Relationships will always get synced before Posts during Full Sync.
191 if ( isset( $config['posts'] ) ) {
192 unset( $config['posts'] );
193 $config += array( 'posts' => 1 );
194 }
195
196 if ( ! isset( $config['woocommerce_analytics'] ) ) {
197 $config = array( 'woocommerce_analytics' => 1 ) + $config;
198 }
199
200 return $config;
201 }
202
203 /**
204 * Adds the order stats table to the checksum allowed tables.
205 *
206 * @param array $tables The current checksum allowed tables.
207 * @return array The modified checksum allowed tables.
208 */
209 public function add_order_stats_to_checksum( array $tables ): array {
210 if ( ! $this->can_site_sync_orders() ) {
211 return $tables;
212 }
213
214 global $wpdb;
215 $order_stats_checksum_table = array(
216 'wc_order_stats' => array(
217 'table' => "{$wpdb->prefix}wc_order_stats",
218 'range_field' => 'order_id',
219 'key_fields' => array( 'order_id' ),
220 'checksum_fields' => array( 'date_paid', 'date_completed', 'total_sales' ),
221 'checksum_text_fields' => array( 'status' ),
222 'is_table_enabled_callback' => function () {
223 return false !== JetpackSyncModules::get_module( 'woocommerce_analytics' );
224 },
225 ),
226 'wc_order_product_lookup' => array(
227 'table' => "{$wpdb->prefix}wc_order_product_lookup",
228 'range_field' => 'order_id',
229 'key_fields' => array( 'order_id', 'order_item_id' ),
230 'checksum_fields' => array( 'product_id', 'variation_id', 'product_qty', 'product_net_revenue', 'date_created' ),
231 'is_table_enabled_callback' => function () {
232 return false !== JetpackSyncModules::get_module( 'woocommerce_analytics' );
233 },
234 ),
235 'wc_order_coupon_lookup' => array(
236 'table' => "{$wpdb->prefix}wc_order_coupon_lookup",
237 'range_field' => 'order_id',
238 'key_fields' => array( 'order_id', 'coupon_id' ),
239 'checksum_fields' => array( 'discount_amount', 'date_created' ),
240 'is_table_enabled_callback' => function () {
241 return false !== JetpackSyncModules::get_module( 'woocommerce_analytics' );
242 },
243 ),
244 'wc_order_tax_lookup' => array(
245 'table' => "{$wpdb->prefix}wc_order_tax_lookup",
246 'range_field' => 'order_id',
247 'key_fields' => array( 'order_id', 'tax_rate_id' ),
248 'checksum_fields' => array( 'order_tax', 'total_tax', 'shipping_tax', 'date_created' ),
249 'is_table_enabled_callback' => function () {
250 return false !== JetpackSyncModules::get_module( 'woocommerce_analytics' );
251 },
252 ),
253 );
254 return array_merge( $tables, $order_stats_checksum_table );
255 }
256
257 /**
258 * Add WC Analytics post meta to Sync's post meta whitelist.
259 * Any changes to these meta will by synced to WordPress.com.
260 *
261 * @param array $whitelist Existing post meta whitelist.
262 * @return array Updated post meta whitelist.
263 */
264 public function add_meta_to_sync_post_meta_whitelist( array $whitelist ): array {
265 return array_merge( self::$postmeta_to_sync, $whitelist );
266 }
267 }
268