PluginProbe
Product Labels, Quick View, Buy Now, Pre-Orders, Frequently Bought Together & More for WooCommerce – Merchant / 1.10.4
Product Labels, Quick View, Buy Now, Pre-Orders, Frequently Bought Together & More for WooCommerce – Merchant v1.10.4
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 1.10.4, at inc/modules/side-cart/class-side-cart.php

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