PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 13.7.2
Jetpack – WP Security, Backup, Speed, & Growth v13.7.2
12.0.3 12.1.3 12.2.3 12.3.2 12.4.2 12.5.2 12.6.4 12.7.3 12.8.3 12.9.5 13.0.2 13.1.5 13.2.4 13.3.3 13.4.5 13.5.2 13.6.2 13.7.2 13.8.3 13.9.2 14.0.1 14.1.1 14.2.2 14.3.1 14.4.2 14.5.1 14.6.1 14.7.1 14.8.1 14.9.2 15.0.3 15.1.2 15.2.1 15.3.2 15.4.1 15.5.1 15.6.1 15.7.2 15.8.1 15.9.2 16.0.2 16.1.3 16.2-a.5 16.2-a.3 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 / modules / woocommerce-analytics / classes / class-jetpack-woocommerce-analytics-trait.php
jetpack / modules / woocommerce-analytics / classes Last commit date
class-jetpack-woocommerce-analytics-checkout-flow.php 2 years ago class-jetpack-woocommerce-analytics-my-account.php 2 years ago class-jetpack-woocommerce-analytics-trait.php 2 years ago class-jetpack-woocommerce-analytics-universal.php 2 years ago
class-jetpack-woocommerce-analytics-trait.php
598 lines
1 <?php
2 /**
3 * Jetpack_WooCommerce_Analytics_Trait
4 *
5 * @deprecated 13.3
6 *
7 * @package automattic/jetpack
8 * @author Automattic
9 */
10
11 /**
12 * Bail if accessed directly
13 */
14 if ( ! defined( 'ABSPATH' ) ) {
15 exit;
16 }
17
18 /**
19 * Jetpack_WooCommerce_Analytics_Trait
20 * Common functionality for WooCommerce Analytics classes.
21 *
22 * @deprecated 13.3
23 */
24 trait Jetpack_WooCommerce_Analytics_Trait {
25
26 /**
27 * Saves whether the cart/checkout templates are in use based on WC Blocks version.
28 *
29 * @var bool true if the templates are in use.
30 */
31 protected $cart_checkout_templates_in_use;
32
33 /**
34 * The content of the cart page or where the cart page is ultimately derived from if using a template.
35 *
36 * @var string
37 */
38 protected $cart_content_source = '';
39
40 /**
41 * The content of the checkout page or where the cart page is ultimately derived from if using a template.
42 *
43 * @var string
44 */
45 protected $checkout_content_source = '';
46
47 /**
48 * Tracks any additional blocks loaded on the Cart page.
49 *
50 * @var array
51 */
52 protected $additional_blocks_on_cart_page;
53
54 /**
55 * Tracks any additional blocks loaded on the Checkout page.
56 *
57 * @var array
58 */
59 protected $additional_blocks_on_checkout_page;
60
61 /**
62 * Format Cart Items or Order Items to an array
63 *
64 * @deprecated 13.3
65 *
66 * @param array|WC_Order_Item[] $items Cart Items or Order Items.
67 */
68 protected function format_items_to_json( $items ) {
69 $products = array();
70
71 foreach ( $items as $item ) {
72 if ( $item instanceof WC_Order_Item_Product ) {
73 $product = wc_get_product( $item->get_product_id() );
74 } else {
75 $product = $item['data'];
76 }
77
78 if ( ! $product || ! $product instanceof WC_Product ) {
79 continue;
80 }
81
82 $data = $this->get_product_details( $product );
83
84 if ( $item instanceof WC_Order_Item_Product ) {
85 $data['pq'] = $item->get_quantity();
86 } else {
87 $data['pq'] = $item['quantity'];
88 }
89 $products[] = $data;
90 }
91
92 return wp_json_encode( $products );
93 }
94
95 /**
96 * Get Cart/Checkout page view shared data
97 *
98 * @deprecated 13.3
99 */
100 protected function get_cart_checkout_shared_data() {
101 $cart = WC()->cart;
102
103 $guest_checkout = ucfirst( get_option( 'woocommerce_enable_guest_checkout', 'No' ) );
104 $create_account = ucfirst( get_option( 'woocommerce_enable_signup_and_login_from_checkout', 'No' ) );
105
106 $coupons = $cart->get_coupons();
107 $coupon_used = 0;
108 if ( is_countable( $coupons ) ) {
109 $coupon_used = count( $coupons ) ? 1 : 0;
110 }
111
112 $enabled_payment_options = array_filter(
113 WC()->payment_gateways->get_available_payment_gateways(),
114 function ( $payment_gateway ) {
115 if ( ! $payment_gateway instanceof WC_Payment_Gateway ) {
116 return false;
117 }
118
119 return $payment_gateway->is_available();
120 }
121 );
122
123 $enabled_payment_options = array_keys( $enabled_payment_options );
124 $cart_total = wc_prices_include_tax() ? $cart->get_cart_contents_total() + $cart->get_cart_contents_tax() : $cart->get_cart_contents_total();
125 $shared_data = array(
126 'products' => $this->format_items_to_json( $cart->get_cart() ),
127 'create_account' => $create_account,
128 'guest_checkout' => $guest_checkout,
129 'express_checkout' => 'null', // TODO: not solved yet.
130 'products_count' => $cart->get_cart_contents_count(),
131 'order_value' => $cart_total,
132 'shipping_options_count' => 'null', // TODO: not solved yet.
133 'coupon_used' => $coupon_used,
134 'payment_options' => $enabled_payment_options,
135 );
136
137 return $shared_data;
138 }
139
140 /**
141 * Gets the content of the cart/checkout page or where the cart/checkout page is ultimately derived from if using a template.
142 * This method sets the class properties $checkout_content_source and $cart_content_source.
143 *
144 * @deprecated 13.3
145 *
146 * @return void Does not return, but sets class properties.
147 */
148 public function find_cart_checkout_content_sources() {
149
150 /**
151 * The steps we take to find the content are:
152 * 1. Check the transient, if that contains content and is not expired, return that.
153 * 2. Check if the cart/checkout templates are in use. If *not in use*, get the content from the pages and
154 * return it, there is no need to dig further.
155 * 3. If the templates *are* in use, check if the `page-content-wrapper` block is in use. If so, get the content
156 * from the pages (same as step 2) and return it.
157 * 4. If the templates are in use but `page-content-wrapper` is not, then get the content directly from the
158 * template and return it.
159 * 5. At the end of each step, assign the found content to the relevant class properties and save them in a
160 * transient with a 1-day lifespan. This will prevent us from having to do this work on every page load.
161 */
162
163 $cart_checkout_content_cache_transient_name = 'jetpack_woocommerce_analytics_cart_checkout_content_sources';
164
165 $transient_value = get_transient( $cart_checkout_content_cache_transient_name );
166
167 if (
168 false !== $transient_value &&
169 ! empty( $transient_value['checkout_content_source'] ) &&
170 ! empty( $transient_value['cart_content_source'] )
171 ) {
172 $this->cart_content_source = $transient_value['cart_content_source'];
173 $this->checkout_content_source = $transient_value['checkout_content_source'];
174 return;
175 }
176
177 $this->cart_checkout_templates_in_use = wp_is_block_theme() && class_exists( 'Automattic\WooCommerce\Blocks\Package' ) && version_compare( Automattic\WooCommerce\Blocks\Package::get_version(), '10.6.0', '>=' );
178
179 // Cart/Checkout *pages* are in use if the templates are not in use. Return their content and do nothing else.
180 if ( ! $this->cart_checkout_templates_in_use ) {
181 $cart_page = get_post( wc_get_page_id( 'cart' ) );
182 $checkout_page = get_post( wc_get_page_id( 'checkout' ) );
183
184 if ( $cart_page && isset( $cart_page->post_content ) ) {
185 $this->cart_content_source = $cart_page->post_content;
186 }
187
188 if ( $checkout_page && isset( $checkout_page->post_content ) ) {
189 $this->checkout_content_source = $checkout_page->post_content;
190 }
191
192 set_transient(
193 $cart_checkout_content_cache_transient_name,
194 array(
195 'cart_content_source' => $this->cart_content_source,
196 'checkout_content_source' => $this->checkout_content_source,
197 ),
198 DAY_IN_SECONDS
199 );
200 return;
201 }
202
203 // We are in a Block theme - so we need to find out if the templates are being used.
204 if ( function_exists( 'get_block_template' ) ) {
205 $checkout_template = get_block_template( 'woocommerce/woocommerce//page-checkout' );
206 $cart_template = get_block_template( 'woocommerce/woocommerce//page-cart' );
207
208 if ( ! $checkout_template ) {
209 $checkout_template = get_block_template( 'woocommerce/woocommerce//checkout' );
210 }
211
212 if ( ! $cart_template ) {
213 $cart_template = get_block_template( 'woocommerce/woocommerce//cart' );
214 }
215 }
216
217 if ( ! empty( $checkout_template->content ) ) {
218 // Checkout template is in use, but we need to see if the page-content-wrapper is in use, or if the template is being used directly.
219 $this->checkout_content_source = $checkout_template->content;
220 $is_using_page_content = str_contains( $checkout_template->content, '<!-- wp:woocommerce/page-content-wrapper {"page":"checkout"}' );
221
222 if ( $is_using_page_content ) {
223 // The page-content-wrapper is in use, so we need to get the page content.
224 $checkout_page = get_post( wc_get_page_id( 'checkout' ) );
225
226 if ( $checkout_page && isset( $checkout_page->post_content ) ) {
227 $this->checkout_content_source = $checkout_page->post_content;
228 }
229 }
230 }
231
232 if ( ! empty( $cart_template->content ) ) {
233 // Cart template is in use, but we need to see if the page-content-wrapper is in use, or if the template is being used directly.
234 $this->cart_content_source = $cart_template->content;
235 $is_using_page_content = str_contains( $cart_template->content, '<!-- wp:woocommerce/page-content-wrapper {"page":"cart"}' );
236
237 if ( $is_using_page_content ) {
238 // The page-content-wrapper is in use, so we need to get the page content.
239 $cart_page = get_post( wc_get_page_id( 'cart' ) );
240
241 if ( $cart_page && isset( $cart_page->post_content ) ) {
242 $this->cart_content_source = $cart_page->post_content;
243 }
244 }
245 }
246
247 set_transient(
248 $cart_checkout_content_cache_transient_name,
249 array(
250 'cart_content_source' => $this->cart_content_source,
251 'checkout_content_source' => $this->checkout_content_source,
252 ),
253 DAY_IN_SECONDS
254 );
255 }
256
257 /**
258 * Default event properties which should be included with all events.
259 *
260 * @deprecated 13.3
261 *
262 * @return array Array of standard event props.
263 */
264 public function get_common_properties() {
265 $site_info = array(
266 'blog_id' => Jetpack::get_option( 'id' ),
267 'ui' => $this->get_user_id(),
268 'url' => home_url(),
269 'woo_version' => WC()->version,
270 'store_admin' => in_array( array( 'administrator', 'shop_manager' ), wp_get_current_user()->roles, true ) ? 1 : 0,
271 'device' => wp_is_mobile() ? 'mobile' : 'desktop',
272 'template_used' => $this->cart_checkout_templates_in_use ? '1' : '0',
273 'additional_blocks_on_cart_page' => $this->additional_blocks_on_cart_page,
274 'additional_blocks_on_checkout_page' => $this->additional_blocks_on_checkout_page,
275 'store_currency' => get_woocommerce_currency(),
276 );
277 $cart_checkout_info = $this->get_cart_checkout_info();
278 return array_merge( $site_info, $cart_checkout_info );
279 }
280
281 /**
282 * Render tracks event properties as string of JavaScript object props.
283 *
284 * @deprecated 13.3
285 *
286 * @param array $properties Array of key/value pairs.
287 * @return string String of the form "key1: value1, key2: value2, " (etc).
288 */
289 private function render_properties_as_js( $properties ) {
290 $js_args_string = '';
291 foreach ( $properties as $key => $value ) {
292 if ( is_array( $value ) ) {
293 $js_args_string = $js_args_string . "'$key': " . wp_json_encode( $value ) . ',';
294 } else {
295 $js_args_string = $js_args_string . "'$key': '" . esc_js( $value ) . "', ";
296 }
297 }
298 return $js_args_string;
299 }
300
301 /**
302 * Record an event with optional product and custom properties.
303 *
304 * @deprecated 13.3
305 *
306 * @param string $event_name The name of the event to record.
307 * @param array $properties Optional array of (key => value) event properties.
308 * @param integer $product_id The id of the product relating to the event.
309 *
310 * @return string|void
311 */
312 public function record_event( $event_name, $properties = array(), $product_id = null ) {
313 $js = $this->process_event_properties( $event_name, $properties, $product_id );
314 wc_enqueue_js( "_wca.push({$js});" );
315 }
316
317 /**
318 * Gather relevant product information
319 *
320 * @deprecated 13.3
321 *
322 * @param \WC_Product $product product.
323 * @return array
324 */
325 public function get_product_details( $product ) {
326 return array(
327 'pi' => $product->get_id(),
328 'pn' => $product->get_title(),
329 'pc' => $this->get_product_categories_concatenated( $product ),
330 'pp' => $product->get_price(),
331 'pt' => $product->get_type(),
332 );
333 }
334
335 /**
336 * Gets product categories or varation attributes as a formatted concatenated string
337 *
338 * @deprecated 13.3
339 *
340 * @param object $product WC_Product.
341 * @return string
342 */
343 public function get_product_categories_concatenated( $product ) {
344
345 if ( ! $product instanceof WC_Product ) {
346 return '';
347 }
348
349 $variation_data = $product->is_type( 'variation' ) ? wc_get_product_variation_attributes( $product->get_id() ) : '';
350 if ( is_array( $variation_data ) && ! empty( $variation_data ) ) {
351 $line = wc_get_formatted_variation( $variation_data, true );
352 } else {
353 $out = array();
354 $categories = get_the_terms( $product->get_id(), 'product_cat' );
355 if ( $categories ) {
356 foreach ( $categories as $category ) {
357 $out[] = $category->name;
358 }
359 }
360 $line = implode( '/', $out );
361 }
362 return $line;
363 }
364
365 /**
366 * Compose event properties.
367 *
368 * @deprecated 13.3
369 *
370 * @param string $event_name The name of the event to record.
371 * @param array $properties Optional array of (key => value) event properties.
372 * @param integer $product_id Optional id of the product relating to the event.
373 *
374 * @return string|void
375 */
376 public function process_event_properties( $event_name, $properties = array(), $product_id = null ) {
377
378 // Only set product details if we have a product id.
379 if ( $product_id ) {
380 $product = wc_get_product( $product_id );
381 if ( ! $product instanceof WC_Product ) {
382 return;
383 }
384 $product_details = $this->get_product_details( $product );
385 }
386
387 /**
388 * Allow defining custom event properties in WooCommerce Analytics.
389 *
390 * @module woocommerce-analytics
391 *
392 * @since 12.5
393 *
394 * @param array $all_props Array of event props to be filtered.
395 */
396 $all_props = apply_filters(
397 'jetpack_woocommerce_analytics_event_props',
398 array_merge(
399 $this->get_common_properties(), // We put this here to allow override of common props.
400 $properties
401 )
402 );
403
404 $js = "{'_en': '" . esc_js( $event_name ) . "'";
405
406 if ( isset( $product_details ) ) {
407 $all_props = array_merge( $all_props, $product_details );
408 }
409
410 $js .= ',' . $this->render_properties_as_js( $all_props ) . '}';
411
412 return $js;
413 }
414
415 /**
416 * Get the current user id
417 *
418 * @deprecated 13.3
419 *
420 * @return int
421 */
422 public function get_user_id() {
423 if ( is_user_logged_in() ) {
424 $blogid = Jetpack::get_option( 'id' );
425 $userid = get_current_user_id();
426 return $blogid . ':' . $userid;
427 }
428 return 'null';
429 }
430
431 /**
432 * Gets the IDs of additional blocks on the Cart/Checkout pages or templates.
433 *
434 * @deprecated 13.3
435 *
436 * @param string $cart_or_checkout Whether to get blocks on the cart or checkout page.
437 * @return array All inner blocks on the page.
438 */
439 public function get_additional_blocks_on_page( $cart_or_checkout = 'cart' ) {
440
441 $additional_blocks_on_page_transient_name = 'jetpack_woocommerce_analytics_additional_blocks_on_' . $cart_or_checkout . '_page';
442 $additional_blocks_on_page = get_transient( $additional_blocks_on_page_transient_name );
443
444 if ( false !== $additional_blocks_on_page ) {
445 return $additional_blocks_on_page;
446 }
447
448 $content = $this->cart_content_source;
449
450 if ( 'checkout' === $cart_or_checkout ) {
451 $content = $this->checkout_content_source;
452 }
453
454 $parsed_blocks = parse_blocks( $content );
455 $other_blocks = array_filter(
456 $parsed_blocks,
457 function ( $block ) use ( $cart_or_checkout ) {
458 if ( ! isset( $block['blockName'] ) ) {
459 return false;
460 }
461
462 if ( 'woocommerce/classic-shortcode' === $block['blockName'] ) {
463 return false;
464 }
465
466 if ( 'core/shortcode' === $block['blockName'] ) {
467 return false;
468 }
469
470 if ( 'checkout' === $cart_or_checkout && 'woocommerce/checkout' !== $block['blockName'] ) {
471 return true;
472 }
473
474 if ( 'cart' === $cart_or_checkout && 'woocommerce/cart' !== $block['blockName'] ) {
475 return true;
476 }
477
478 return false;
479 }
480 );
481
482 $all_inner_blocks = array();
483
484 // Loop over each "block group". In templates the blocks are grouped up.
485 foreach ( $other_blocks as $block ) {
486
487 // This check is necessary because sometimes this is null when using templates.
488 if ( ! empty( $block['blockName'] ) ) {
489 $all_inner_blocks[] = $block['blockName'];
490 }
491
492 if ( ! isset( $block['innerBlocks'] ) || ! is_array( $block['innerBlocks'] ) || 0 === count( $block['innerBlocks'] ) ) {
493 continue;
494 }
495
496 foreach ( $block['innerBlocks'] as $inner_content ) {
497 $all_inner_blocks = array_merge( $all_inner_blocks, $this->get_inner_blocks( $inner_content ) );
498 }
499 }
500 set_transient( $additional_blocks_on_page_transient_name, $all_inner_blocks, DAY_IN_SECONDS );
501 return $all_inner_blocks;
502 }
503
504 /**
505 * Gets an array containing the block or shortcode use properties for the Cart page.
506 *
507 * @deprecated 13.3
508 *
509 * @return array An array containing the block or shortcode use properties for the Cart page.
510 */
511 public function get_cart_page_block_usage() {
512 $new_info = array();
513
514 $content = $this->cart_content_source;
515 $block_presence = str_contains( $content, '<!-- wp:woocommerce/cart' );
516 $shortcode_presence = str_contains( $content, '[woocommerce_cart]' );
517 $classic_shortcode_presence = str_contains( $content, '<!-- wp:woocommerce/classic-shortcode' );
518
519 $new_info['cart_page_contains_cart_block'] = $block_presence ? '1' : '0';
520 $new_info['cart_page_contains_cart_shortcode'] = $shortcode_presence || $classic_shortcode_presence ? '1' : '0';
521 return $new_info;
522 }
523
524 /**
525 * Gets an array containing the block or shortcode use properties for the Checkout page.
526 *
527 * @deprecated 13.3
528 *
529 * @return array An array containing the block or shortcode use properties for the Checkout page.
530 */
531 public function get_checkout_page_block_usage() {
532 $new_info = array();
533
534 $content = $this->checkout_content_source;
535 $block_presence = str_contains( $content, '<!-- wp:woocommerce/checkout' );
536 $shortcode_presence = str_contains( $content, '[woocommerce_checkout]' );
537 $classic_shortcode_presence = str_contains( $content, '<!-- wp:woocommerce/classic-shortcode' );
538
539 $new_info['checkout_page_contains_checkout_block'] = $block_presence ? '1' : '0';
540 $new_info['checkout_page_contains_checkout_shortcode'] = $shortcode_presence || $classic_shortcode_presence ? '1' : '0';
541 return $new_info;
542 }
543
544 /**
545 * Get info about the cart & checkout pages, in particular
546 * whether the store is using shortcodes or Gutenberg blocks.
547 * This info is cached in a transient.
548 *
549 * Note: similar code is in a WooCommerce core PR:
550 * https://github.com/woocommerce/woocommerce/pull/25932
551 *
552 * @deprecated 13.3
553 *
554 * @return array
555 */
556 public function get_cart_checkout_info() {
557 $info = array_merge(
558 $this->get_cart_page_block_usage(),
559 $this->get_checkout_page_block_usage()
560 );
561 return $info;
562 }
563
564 /**
565 * Search a specific post for text content.
566 *
567 * Note: similar code is in a WooCommerce core PR:
568 * https://github.com/woocommerce/woocommerce/pull/25932
569 *
570 * @deprecated 13.3
571 *
572 * @param integer $post_id The id of the post to search.
573 * @param string $text The text to search for.
574 * @return integer 1 if post contains $text (otherwise 0).
575 */
576 public function post_contains_text( $post_id, $text ) {
577 global $wpdb;
578
579 // Search for the text anywhere in the post.
580 $wildcarded = "%{$text}%";
581
582 // No better way to search post content without having filters expanding blocks.
583 // This is already cached up in the parent function.
584 $result = $wpdb->get_var( // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery,WordPress.DB.DirectDatabaseQuery.NoCaching
585 $wpdb->prepare(
586 "
587 SELECT COUNT( * ) FROM {$wpdb->prefix}posts
588 WHERE ID=%d
589 AND {$wpdb->prefix}posts.post_content LIKE %s
590 ",
591 array( $post_id, $wildcarded )
592 )
593 );
594
595 return ( '0' !== $result ) ? 1 : 0;
596 }
597 }
598