PluginProbe
Product Labels, Quick View, Buy Now, Pre-Orders, Frequently Bought Together & More for WooCommerce – Merchant / 2.3.2
Product Labels, Quick View, Buy Now, Pre-Orders, Frequently Bought Together & More for WooCommerce – Merchant v2.3.2
2.3.2 2.3.1 2.3.0 2.2.8 2.2.7 trunk 1.10.0 1.10.1 1.10.2 1.10.3 1.10.4 1.10.5 1.11.0 1.11.1 1.11.2 1.6 1.7 1.8 1.8.1 1.8.2 1.8.3 1.9.0 1.9.1 1.9.10 1.9.11 All 60 releases
merchant / inc / modules / side-cart / class-side-cart.php

class-side-cart.php in Product Labels, Quick View, Buy Now, Pre-Orders, Frequently Bought Together & More for WooCommerce – Merchant 2.3.2, at inc/modules/side-cart/class-side-cart.php

477 lines 21.7 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 /**
4 * Side Cart
5 *
6 * @package Merchant
7 */
8
9 if ( ! defined( 'ABSPATH' ) ) {
10 exit; // Exit if accessed directly
11 }
12
13 /**
14 * Side Cart Class.
15 *
16 */
17 class Merchant_Side_Cart extends Merchant_Add_Module {
18
19 /**
20 * Module ID.
21 */
22 const MODULE_ID = 'side-cart';
23
24 /**
25 * Module template path.
26 */
27 const MODULE_TEMPLATES_PATH = 'modules/' . self::MODULE_ID;
28
29 /**
30 * Is module preview.
31 *
32 */
33 public static $is_module_preview = false;
34
35 /**
36 * Initialize the module's option group definitions.
37 *
38 * @return array<int, array<string, mixed>> Array of option group arrays.
39 */
40 protected function init_option_groups() {
41 return require MERCHANT_DIR . 'inc/modules/' . self::MODULE_ID . '/admin/options.php';
42 }
43
44 /**
45 * Constructor.
46 *
47 */
48 public function __construct() {
49 // Module id.
50 $this->module_id = self::MODULE_ID;
51
52 // WooCommerce only.
53 $this->wc_only = true;
54
55 // Parent construct.
56 parent::__construct();
57
58 $this->migrate_floating_mini_cart_to_side_cart(); // Run on both BE & FE
59
60 // Module default settings.
61 $this->module_default_settings = array(
62 'show_after_add_to_cart' => 1,
63 'show_after_add_to_cart_single_product' => 0,
64 'show_on_cart_url_click' => 1,
65 'enable-floating-cart' => false,
66 'show_view_cart_btn' => true,
67 'show_checkout_btn' => true,
68 );
69
70 // Module data.
71 $this->module_data = Merchant_Admin_Modules::$modules_data[ self::MODULE_ID ];
72
73 // Module section.
74 $this->module_section = $this->module_data['section'];
75
76 // AI prompt examples.
77 $this->ai_examples = array(
78 'blurb' => esc_html__( 'See what AI can do for your side cart, from choosing which pages it slides open on to setting up product upsells inside it.', 'merchant' ),
79 'prompts' => array(
80 esc_html__( 'Explore the abilities WPVibe gives you access to, then make the side cart slide open from the left and show it after adding a product from the single product page', 'merchant' ),
81 esc_html__( 'Check what abilities you have available through WPVibe, then set up a side cart upsell that recommends our Wool Beanie whenever a Winter Jacket is added to the cart', 'merchant' ),
82 esc_html__( "Look at your available WPVibe abilities, then change the upsell heading to 'Complete your look' and limit the side cart to 3 upsell suggestions", 'merchant' ),
83 esc_html__( 'See what abilities WPVibe exposes, then turn on the side cart\'s floating cart icon and move it to the left side of the screen', 'merchant' ),
84 ),
85 );
86
87 // Module options path.
88 $this->module_options_path = MERCHANT_DIR . 'inc/modules/' . self::MODULE_ID . '/admin/options.php';
89 if ( Merchant_Modules::is_module_active( self::MODULE_ID ) && is_admin() ) {
90 // Init translations.
91 $this->init_translations();
92 }
93
94 // Is module preview page.
95 if ( is_admin() && parent::is_module_settings_page() ) {
96 self::$is_module_preview = true;
97
98 // Enqueue admin styles.
99 add_action( 'admin_enqueue_scripts', array( $this, 'admin_enqueue_css' ) );
100
101 // Enqueue admin scripts.
102 add_action( 'admin_enqueue_scripts', array( $this, 'admin_enqueue_scripts' ) );
103
104 // Admin preview box.
105 add_filter( 'merchant_module_preview', array( $this, 'render_admin_preview' ), 10, 2 );
106
107 // Custom CSS.
108 add_filter( 'merchant_custom_css', array( $this, 'admin_custom_css' ) );
109
110 add_filter( 'admin_body_class', array( $this, 'admin_body_class' ) );
111 }
112 }
113
114 public function init_translations() {
115 $settings = $this->get_module_settings();
116 if ( ! empty( $settings['checkout_btn_text'] ) ) {
117 Merchant_Translator::register_string( $settings['checkout_btn_text'], esc_html__( 'Side cart checkout button text', 'merchant' ) );
118 }
119 if ( ! empty( $settings['view_cart_btn_text'] ) ) {
120 Merchant_Translator::register_string( $settings['view_cart_btn_text'], esc_html__( 'Side cart view cart button text', 'merchant' ) );
121 }
122 if ( ! empty( $settings['upsells_title'] ) ) {
123 Merchant_Translator::register_string( $settings['upsells_title'], esc_html__( 'Side cart upsells title', 'merchant' ) );
124 }
125 if ( ! empty( $settings['upsells_add_to_cart_text'] ) ) {
126 Merchant_Translator::register_string( $settings['upsells_add_to_cart_text'], esc_html__( 'Side cart upsells add to cart text', 'merchant' ) );
127 }
128 }
129
130 /**
131 * Admin enqueue CSS.
132 *
133 * @return void
134 */
135 public function admin_enqueue_css() {
136 if ( $this->is_module_settings_page() ) {
137 wp_enqueue_style(
138 'merchant-' . self::MODULE_ID,
139 MERCHANT_URI . 'assets/css/modules/' . self::MODULE_ID . '/side-cart.min.css',
140 array(),
141 MERCHANT_VERSION
142 );
143
144 wp_enqueue_style(
145 'merchant-admin-preview-' . self::MODULE_ID,
146 MERCHANT_URI . 'assets/css/modules/' . self::MODULE_ID . '/admin/preview.min.css',
147 array(),
148 MERCHANT_VERSION
149 );
150 }
151 }
152
153 /**
154 * Admin Enqueue scripts.
155 *
156 * @return void
157 */
158 public function admin_enqueue_scripts() {
159 wp_enqueue_script(
160 'merchant-' . self::MODULE_ID,
161 MERCHANT_URI . 'assets/js/modules/' . self::MODULE_ID . '/side-cart.min.js',
162 array(),
163 MERCHANT_VERSION,
164 true
165 );
166
167 wp_enqueue_script(
168 'merchant-preview-' . self::MODULE_ID,
169 MERCHANT_URI . 'assets/js/modules/' . self::MODULE_ID . '/admin/preview.min.js',
170 array(),
171 MERCHANT_VERSION,
172 true
173 );
174
175 wp_localize_script( 'merchant-preview-' . self::MODULE_ID, 'merchant_side_cart_params', array(
176 'keywords' => array(
177 'multi_categories' => esc_html__( 'Multi Categories', 'merchant' ),
178 'category_trigger' => esc_html__( 'Category Trigger:', 'merchant' ),
179 'no_cats_selected' => esc_html__( 'No Categories Selected', 'merchant' ),
180 'no_products_selected' => esc_html__( 'No Products Selected', 'merchant' ),
181 'multi_products' => esc_html__( 'Multi Products', 'merchant' ),
182 'all_products' => esc_html__( 'All Products', 'merchant' ),
183 ),
184 ) );
185 }
186
187
188 /**
189 * Render admin preview
190 *
191 * @param Merchant_Admin_Preview $preview
192 * @param string $module
193 *
194 * @return Merchant_Admin_Preview
195 */
196 public function render_admin_preview( $preview, $module ) {
197 if ( $module === self::MODULE_ID ) {
198 ob_start();
199 self::admin_preview_content();
200 $content = ob_get_clean();
201
202 // HTML.
203 $preview->set_html( $content );
204
205 // View Cart button
206 $preview->set_text( 'view_cart_btn_text', '.merchant-side-cart-view-cart-btn' );
207
208 // Checkout button
209 $preview->set_text( 'checkout_btn_text', '.merchant-side-cart-checkout-btn' );
210
211 // Icon visibility
212 $preview->set_class( 'enable-floating-cart', '.merchant-side-cart-floating-cart', array(), 'merchant-show' );
213
214 // Icon.
215 $preview->set_svg_icon( 'icon', '.merchant-side-cart-floating-cart-icon' );
216
217 // Position.
218 $preview->set_class( 'icon-position', '.merchant-side-cart-floating-cart', array( 'merchant-side-cart-floating-cart-position-left', 'merchant-side-cart-floating-cart-position-right' ) );
219
220 $preview->set_class( 'show_view_cart_btn', '.merchant-side-cart-view-cart-btn', array(), 'show-btn' );
221 $preview->set_class( 'show_checkout_btn', '.merchant-side-cart-checkout-btn', array(), 'show-btn' );
222 }
223
224 return $preview;
225 }
226
227 /**
228 * Admin preview content.
229 *
230 * @return void
231 */
232 public function admin_preview_content() {
233 $settings = $this->get_module_settings();
234
235 ?>
236 <div class="mrc-preview-single-product-elements">
237 <div class="mrc-preview-left-column">
238 <div class="mrc-preview-product-image-wrapper">
239 <div class="mrc-preview-product-image"></div>
240 <div class="mrc-preview-product-image-thumbs">
241 <div class="mrc-preview-product-image-thumb"></div>
242 <div class="mrc-preview-product-image-thumb"></div>
243 <div class="mrc-preview-product-image-thumb"></div>
244 </div>
245 </div>
246 </div>
247 <div class="mrc-preview-right-column">
248 <div class="mrc-preview-text-placeholder"></div>
249 <div class="mrc-preview-text-placeholder mrc-mw-70"></div>
250 <div class="mrc-preview-text-placeholder mrc-mw-30"></div>
251 <div class="mrc-preview-text-placeholder"></div>
252 <div class="mrc-preview-text-placeholder mrc-mw-70"></div>
253 <div class="mrc-preview-text-placeholder mrc-mw-30"></div>
254 <div class="mrc-preview-text-placeholder"></div>
255 <div class="mrc-preview-text-placeholder mrc-mw-70"></div>
256 <div class="mrc-preview-text-placeholder mrc-mw-30"></div>
257 <div class="mrc-preview-text-placeholder"></div>
258 <div class="mrc-preview-text-placeholder mrc-mw-70"></div>
259 <div class="mrc-preview-addtocart-placeholder"></div>
260 </div>
261 </div>
262
263 <?php
264 $icon_classes = 'merchant-side-cart-floating-cart merchant-side-cart-floating-cart-position-' . ( $settings['icon-position'] ?? 'right' ) ;
265 $icon_classes .= ! empty( $settings['enable-floating-cart'] ) ? ' merchant-show' : '';
266 $icon_classes .= ' js-merchant-side-cart-toggle-handler';
267 ?>
268 <a href="#" class="<?php echo esc_attr( $icon_classes ); ?>">
269 <span class="merchant-side-cart-floating-cart-counter"><?php echo esc_attr( 2 ); ?></span>
270 <i class="merchant-side-cart-floating-cart-icon"><?php echo wp_kses( Merchant_SVG_Icons::get_svg_icon( $settings['icon'] ?? 'cart-icon-1' ), merchant_kses_allowed_tags( array(), false ) ); ?></i>
271 </a>
272
273 <div class="merchant-side-cart-wrapper">
274 <div class="merchant-side-cart-overlay"></div>
275 <div class="merchant-side-cart <?php echo esc_attr( 'slide-' . ( $settings['slide_direction'] ?? 'right' ) ); ?>">
276 <div class="merchant-side-cart-body">
277 <a href="#" class="merchant-side-cart-close-button js-merchant-side-cart-toggle-handler"
278 title="<?php
279 echo esc_attr__( 'Close the side mini cart', 'merchant' ); ?>">
280 <?php
281 echo wp_kses( Merchant_SVG_Icons::get_svg_icon( 'icon-cancel' ), merchant_kses_allowed_tags( array(), false ) ); ?>
282 </a>
283
284 <div class="merchant-side-cart-widget">
285 <div class="merchant-side-cart-widget-title"><?php
286 echo esc_html__( 'Your Cart', 'merchant' ); ?></div>
287 <div class="widget_shopping_cart_content">
288 <ul class="woocommerce-mini-cart cart_list product_list_widget">
289 <li class="woocommerce-mini-cart-item mini_cart_item">
290 <a href="#" class="remove remove_from_cart_button">×</a>
291 <a href="#">
292 <span class="mrc-product-image"></span>
293 <?php
294 echo esc_html__( 'Product Sample Title', 'merchant' ); ?>
295 </a>
296 <span class="quantity">1 ×
297 <span class="woocommerce-Price-amount amount">
298 <bdi><span class="woocommerce-Price-currencySymbol">$</span>12.00 </bdi>
299 </span>
300 </span>
301 </li>
302 <li class="woocommerce-mini-cart-item mini_cart_item">
303 <a href="#" class="remove remove_from_cart_button">×</a>
304 <a href="#">
305 <span class="mrc-product-image"></span>
306 <?php
307 echo esc_html__( 'Product Sample Title', 'merchant' ); ?>
308 </a>
309 <span class="quantity">1 ×
310 <span class="woocommerce-Price-amount amount">
311 <bdi><span class="woocommerce-Price-currencySymbol">$</span>12.00 </bdi>
312 </span>
313 </span>
314 </li>
315 </ul>
316
317 <p class="woocommerce-mini-cart__total total">
318 <strong><?php
319 echo esc_html__( 'Subtotal:', 'merchant' ); ?></strong>
320 <span class="woocommerce-Price-amount amount">
321 <bdi><span class="woocommerce-Price-currencySymbol">$</span>12.00 </bdi>
322 </span>
323 </p>
324 <p class="woocommerce-mini-cart__buttons buttons">
325 <a href="#" class="button wc-forward merchant-side-cart-view-cart-btn<?php echo esc_attr( ! empty( $settings['show_view_cart_btn'] ) ) ? ' show-btn' : ''; ?>"><?php echo esc_html( $settings['view_cart_btn_text'] ?? 'View Cart' ); ?></a>
326 <a href="#" class="button checkout wc-forward merchant-side-cart-checkout-btn<?php echo esc_attr( ! empty( $settings['show_checkout_btn'] ) ) ? ' show-btn' : ''; ?>"><?php echo esc_html( $settings['checkout_btn_text'] ?? 'Checkout' ); ?></a>
327 </p>
328 </div>
329 </div>
330 </div>
331 </div>
332 </div>
333 <?php
334 }
335
336 /**
337 * Add class to body in admin.
338 *
339 * @param $classes
340 *
341 * @return string
342 */
343 public function admin_body_class( $classes ) {
344 $classes .= ' merchant-side-cart-show';
345
346 return $classes;
347 }
348
349 /**
350 * Admin custom CSS.
351 *
352 * @param string $css The custom CSS.
353 *
354 * @return string $css The custom CSS.
355 */
356 public function admin_custom_css( $css ) {
357 $css .= self::get_module_custom_css();
358
359 return $css;
360 }
361
362 /**
363 * Custom CSS.
364 *
365 * @return string
366 */
367 public static function get_module_custom_css() {
368 $css = '';
369
370 $css .= Merchant_Custom_CSS::get_variable_css( self::MODULE_ID, 'icon-size', 25, '.merchant-side-cart-floating-cart', '--mrc-fmci-icon-size', 'px' );
371 $css .= Merchant_Custom_CSS::get_variable_css( self::MODULE_ID, 'icon-corner-offset', 30, '.merchant-side-cart-floating-cart', '--mrc-fmci-corner-offset', 'px' );
372 $css .= Merchant_Custom_CSS::get_variable_css( self::MODULE_ID, 'icon-position', 'right', '.merchant-side-cart-floating-cart', '--mrc-fmci-icon-position' );
373 $css .= Merchant_Custom_CSS::get_variable_css( self::MODULE_ID, 'icon-border-radius', 35, '.merchant-side-cart-floating-cart-icon', '--mrc-fmci-border-radius', 'px' );
374 $css .= Merchant_Custom_CSS::get_variable_css( self::MODULE_ID, 'icon-color', '#ffffff', '.merchant-side-cart-floating-cart-icon', '--mrc-fmci-icon-color' );
375 $css .= Merchant_Custom_CSS::get_variable_css( self::MODULE_ID, 'icon-background-color', '#212121', '.merchant-side-cart-floating-cart-icon', '--mrc-fmci-background-color' );
376 $css .= Merchant_Custom_CSS::get_variable_css( self::MODULE_ID, 'icon-counter-color', '#ffffff', '.merchant-side-cart-floating-cart-counter', '--mrc-fmci-counter-color' );
377 $css .= Merchant_Custom_CSS::get_variable_css( self::MODULE_ID, 'icon-counter-background-color', '#757575', '.merchant-side-cart-floating-cart-counter', '--mrc-fmci-counter-background-color' );
378 $css .= Merchant_Custom_CSS::get_variable_css( self::MODULE_ID, 'side-cart-width', 380, '.merchant-side-cart', '--mrc-fmci-side-cart-width', 'px' );
379 $css .= Merchant_Custom_CSS::get_variable_css( self::MODULE_ID, 'side-cart-title-color', '#212121', '.merchant-side-cart', '--mrc-fmci-side-cart-title-color' );
380 $css .= Merchant_Custom_CSS::get_variable_css( self::MODULE_ID, 'side-cart-title-icon-color', '#212121', '.merchant-side-cart', '--mrc-fmci-side-cart-title-icon-color' );
381 $css .= Merchant_Custom_CSS::get_variable_css( self::MODULE_ID, 'side-cart-title-background-color', '#cccccc', '.merchant-side-cart', '--mrc-fmci-side-cart-title-background-color' );
382 $css .= Merchant_Custom_CSS::get_variable_css( self::MODULE_ID, 'side-cart-content-text-color', '#212121', '.merchant-side-cart', '--mrc-fmci-side-cart-content-text-color' );
383 $css .= Merchant_Custom_CSS::get_variable_css( self::MODULE_ID, 'side-cart-content-background-color', '#ffffff', '.merchant-side-cart', '--mrc-fmci-side-cart-content-background-color' );
384 $css .= Merchant_Custom_CSS::get_variable_css( self::MODULE_ID, 'side-cart-content-remove-color', '#ffffff', '.merchant-side-cart', '--mrc-fmci-side-cart-content-remove-color' );
385 $css .= Merchant_Custom_CSS::get_variable_css( self::MODULE_ID, 'side-cart-content-remove-background-color', '#212121', '.merchant-side-cart', '--mrc-fmci-side-cart-content-remove-background-color' );
386 $css .= Merchant_Custom_CSS::get_variable_css( self::MODULE_ID, 'side-cart-total-text-color', '#212121', '.merchant-side-cart', '--mrc-fmci-side-cart-total-text-color' );
387 $css .= Merchant_Custom_CSS::get_variable_css( self::MODULE_ID, 'side-cart-total-background-color', '#f5f5f5', '.merchant-side-cart', '--mrc-fmci-side-cart-total-background-color' );
388 $css .= Merchant_Custom_CSS::get_variable_css( self::MODULE_ID, 'side-cart-button-color', '#ffffff', '.merchant-side-cart', '--mrc-fmci-side-cart-button-color' );
389 $css .= Merchant_Custom_CSS::get_variable_css( self::MODULE_ID, 'side-cart-button-color-hover', '#ffffff', '.merchant-side-cart', '--mrc-fmci-side-cart-button-color-hover' );
390 $css .= Merchant_Custom_CSS::get_variable_css( self::MODULE_ID, 'side-cart-button-border-color', '#212121', '.merchant-side-cart', '--mrc-fmci-side-cart-button-border-color' );
391 $css .= Merchant_Custom_CSS::get_variable_css( self::MODULE_ID, 'side-cart-button-border-color-hover', '#313131', '.merchant-side-cart', '--mrc-fmci-side-cart-button-border-color-hover' );
392 $css .= Merchant_Custom_CSS::get_variable_css( self::MODULE_ID, 'side-cart-button-background-color', '#212121', '.merchant-side-cart', '--mrc-fmci-side-cart-button-background-color' );
393 $css .= Merchant_Custom_CSS::get_variable_css( self::MODULE_ID, 'side-cart-button-background-color-hover', '#313131', '.merchant-side-cart', '--mrc-fmci-side-cart-button-background-color-hover' );
394
395 return $css;
396 }
397
398 /**
399 * Merge Some Floating Mini Cart Settings to Side Cart
400 *
401 * @return void
402 */
403 private function migrate_floating_mini_cart_to_side_cart() {
404 if ( get_option( 'merchant_floating_mini_cart_merged_with_side_cart', false ) || ! method_exists( 'Merchant_Admin_Options', 'set' ) ) {
405 return;
406 }
407
408 // Floating Mini Cart
409 $fmc_module_id = 'floating-mini-cart';
410 $is_fmc_enabled = Merchant_Modules::is_module_active( $fmc_module_id );
411 if ( $is_fmc_enabled ) {
412 $fmc_settings = Merchant_Admin_Options::get_all( $fmc_module_id );
413
414 // Map Side cart options data by Floating Mini Cart options.
415 $side_cart_options = array(
416 'enable-floating-cart' => true,
417 'icon-display' => sanitize_text_field( $fmc_settings['display'] ?? 'always' ),
418 'icon' => sanitize_text_field( $fmc_settings['icon'] ?? 'cart-icon-1' ),
419 'icon-position' => sanitize_text_field( $fmc_settings['icon-position'] ?? 'right' ),
420 'icon-size' => absint( $fmc_settings['icon-size'] ?? 25 ),
421 'icon-corner-offset' => absint( $fmc_settings['corner-offset'] ?? 30 ),
422 'icon-border-radius' => absint( $fmc_settings['border-radius'] ?? 35 ),
423 'icon-color' => sanitize_hex_color( $fmc_settings['icon-color'] ?? '#ffffff' ),
424 'icon-background-color' => sanitize_hex_color( $fmc_settings['background-color'] ?? '#212121' ),
425 'icon-counter-color' => sanitize_hex_color( $fmc_settings['counter-color'] ?? '#ffffff' ),
426 'icon-counter-background-color' => sanitize_hex_color( $fmc_settings['counter-background-color'] ?? '#757575' ),
427 );
428
429 // Update the Side Cart options.
430 foreach ( $side_cart_options as $key => $value ) {
431 Merchant_Admin_Options::set( self::MODULE_ID, $key, $value );
432 }
433 }
434
435 // Free Shipping Bar - Field options ids were changed. So map old ids to the new ids.
436 $fsb_module_id = 'free-shipping-progress-bar';
437 $is_fsb_enabled = Merchant_Modules::is_module_active( $fsb_module_id );
438 if ( $is_fsb_enabled ) {
439 $side_cart_placement = Merchant_Admin_Options::get( $fsb_module_id, 'side_cart_placement', 'merchant_widget_shopping_cart_before_buttons' );
440
441 // Define the old-to-new placement mappings
442 $placement_mapping = array(
443 'woocommerce_before_mini_cart_contents' => 'merchant_before_mini_cart_contents',
444 'woocommerce_widget_shopping_cart_before_buttons' => 'merchant_widget_shopping_cart_before_buttons',
445 'woocommerce_widget_shopping_cart_after_buttons' => 'merchant_widget_shopping_cart_after_buttons',
446 );
447
448 // Check and update side cart placement if the current setting has a mapped new value
449 if ( isset( $placement_mapping[ $side_cart_placement ] ) ) {
450 Merchant_Admin_Options::set( $fsb_module_id, 'side_cart_placement', sanitize_text_field( $placement_mapping[ $side_cart_placement ] ) );
451 }
452 }
453
454 // Delete FMC Module's Enabled/Disabled data from DB
455 $modules = get_option( Merchant_Modules::$option, array() );
456 if ( isset( $modules[ $fmc_module_id ] ) ) {
457 unset( $modules[ $fmc_module_id ] );
458 update_option( Merchant_Modules::$option, $modules );
459 }
460
461 // Delete FMC Module's settings information from DB
462 $options = get_option( 'merchant', array() );
463 if ( isset( $options[ $fmc_module_id ] ) ) {
464 unset( $options[ $fmc_module_id ] );
465 update_option( 'merchant', $options );
466 }
467
468 // Track Migration to do the action once only.
469 update_option( 'merchant_floating_mini_cart_merged_with_side_cart', true );
470 }
471 }
472
473 // Initialize the module.
474 add_action( 'init', function () {
475 Merchant_Modules::create_module( new Merchant_Side_Cart() );
476 } );
477