Booster for WooCommerce - Version 5.6.8

Version Description

16/11/2022 =

  • FIXED - CART & CHECKOUT - EU VAT Number - Replace endpoint to validate EU VAT number for without soap method.
  • FIXED - CART & CHECKOUT - EU VAT Number - Fixed tools UI.
  • FIXED - EMAILS & MISC. - Admin Tools - Fixed admin order page issue when order item value is array.
  • FIXED - EMAILS & MISC. - Reports - Fixed Product Sales (Monthly) report not highlight selected year.
  • FIXED - BUTTON & PRICE LABELS - Custom Price Labels- Escape the HTML content from the "per page product meta box" value.
  • FIXED - SHIPPING & ORDERS- Order Quantities - Fixed Maximum allowed quantity issue.
  • FIXED - Added Security vulnerability fixes - Multiple CSRF.
  • FIXED - Added Security vulnerability fixes.
  • FIXED - Current timestamp issue - Created new function wcj_get_timestamp_date_from_gmt() and replace with gmdate( 'U' ).
  • FIXED - PHP Warning: asort() expects parameter 1 to be array, string given in .../includes/shortcodes/class-wcj-general-shortcodes.php on line 501
  • WooCommerce 7.1.0 tested
  • WordPress 6.1 Tested
Download this release

Release Info

Developer ronyp
Plugin Icon 128x128 Booster for WooCommerce
Version 5.6.8
Comparing to
See all releases

Code changes from version 5.6.7 to 5.6.8

Files changed (146) hide show
  1. includes/add-to-cart/class-wcj-add-to-cart-per-product.php +4 -4
  2. includes/admin/class-wc-settings-jetpack.php +46 -35
  3. includes/admin/class-wcj-settings-custom-fields.php +10 -13
  4. includes/admin/class-wcj-settings-manager.php +23 -8
  5. includes/admin/class-wcj-tools.php +12 -15
  6. includes/admin/class-wcj-welcome.php +6 -12
  7. includes/admin/wcj-welcome-screen-content.php +2 -2
  8. includes/class-wcj-admin-bar.php +14 -14
  9. includes/class-wcj-admin-orders-list.php +17 -24
  10. includes/class-wcj-admin-tools.php +8 -4
  11. includes/class-wcj-checkout-custom-fields.php +4 -3
  12. includes/class-wcj-checkout-files-upload.php +4 -4
  13. includes/class-wcj-coupon-by-user-role.php +2 -3
  14. includes/class-wcj-coupon-code-generator.php +5 -8
  15. includes/class-wcj-cross-sells.php +15 -11
  16. includes/class-wcj-crowdfunding.php +8 -8
  17. includes/class-wcj-currency-exchange-rates.php +12 -7
  18. includes/class-wcj-currency-per-product.php +5 -7
  19. includes/class-wcj-custom-php.php +11 -7
  20. includes/class-wcj-debug-tools.php +3 -6
  21. includes/class-wcj-emails-verification.php +16 -16
  22. includes/class-wcj-eu-vat-number.php +20 -14
  23. includes/class-wcj-export-import.php +18 -31
  24. includes/class-wcj-general.php +3 -3
  25. includes/class-wcj-global-discount.php +3 -3
  26. includes/class-wcj-max-products-per-user.php +8 -6
  27. includes/class-wcj-multicurrency-product-base-price.php +22 -18
  28. includes/class-wcj-multicurrency.php +11 -16
  29. includes/class-wcj-my-account.php +16 -12
  30. includes/class-wcj-offer-price.php +32 -40
  31. includes/class-wcj-old-slugs.php +4 -4
  32. includes/class-wcj-order-numbers.php +8 -10
  33. includes/class-wcj-order-quantities.php +4 -4
  34. includes/class-wcj-orders.php +33 -3
  35. includes/class-wcj-payment-gateways-by-country.php +10 -8
  36. includes/class-wcj-payment-gateways-fees.php +7 -5
  37. includes/class-wcj-payment-gateways.php +10 -9
  38. includes/class-wcj-pdf-invoicing.php +12 -10
  39. includes/class-wcj-price-by-user-role.php +4 -4
  40. includes/class-wcj-price-labels.php +6 -6
  41. includes/class-wcj-product-add-to-cart.php +5 -8
  42. includes/class-wcj-product-addons.php +29 -20
  43. includes/class-wcj-product-bookings.php +28 -24
  44. includes/class-wcj-product-bulk-meta-editor.php +29 -20
  45. includes/class-wcj-product-bulk-price-converter.php +28 -36
  46. includes/class-wcj-product-by-country.php +8 -6
  47. includes/class-wcj-product-by-date.php +3 -3
  48. includes/class-wcj-product-by-time.php +3 -4
  49. includes/class-wcj-product-by-user-role.php +3 -3
  50. includes/class-wcj-product-by-user.php +25 -11
  51. includes/class-wcj-product-custom-visibility.php +3 -6
  52. includes/class-wcj-product-msrp.php +8 -7
  53. includes/class-wcj-product-open-pricing.php +22 -25
  54. includes/class-wcj-product-price-by-formula.php +23 -14
  55. includes/class-wcj-product-tabs.php +10 -10
  56. includes/class-wcj-products-xml.php +20 -18
  57. includes/class-wcj-purchase-data.php +4 -6
  58. includes/class-wcj-related-products.php +16 -37
  59. includes/class-wcj-reports.php +26 -23
  60. includes/class-wcj-shipping-by-cities.php +14 -8
  61. includes/class-wcj-shipping-by-time.php +3 -3
  62. includes/class-wcj-shipping-by-user-role.php +3 -3
  63. includes/class-wcj-shipping.php +4 -4
  64. includes/class-wcj-sku.php +6 -9
  65. includes/class-wcj-sorting.php +8 -8
  66. includes/class-wcj-template-editor.php +6 -3
  67. includes/class-wcj-track-users.php +45 -29
  68. includes/class-wcj-wpml.php +5 -4
  69. includes/classes/class-wcj-dummy-term.php +37 -0
  70. includes/classes/class-wcj-invoice.php +3 -3
  71. includes/classes/class-wcj-module.php +7 -9
  72. includes/core/class-wcj-admin.php +8 -8
  73. includes/css/wcj-admin.css +5 -1
  74. includes/exchange-rates/class-wcj-exchange-rates.php +3 -2
  75. includes/export/class-wcj-exporter-orders.php +5 -11
  76. includes/functions/wcj-functions-admin.php +6 -8
  77. includes/functions/wcj-functions-date-time.php +37 -5
  78. includes/functions/wcj-functions-eu-vat.php +17 -9
  79. includes/functions/wcj-functions-general.php +33 -16
  80. includes/functions/wcj-functions-html.php +10 -3
  81. includes/functions/wcj-functions-invoicing.php +12 -9
  82. includes/functions/wcj-functions-reports.php +5 -5
  83. includes/gateways/{class-wc-gateway-wcj-custom.php → class-wc-gateway-wcj-custom-template.php} +7 -7
  84. includes/input-fields/class-wcj-product-input-fields-core.php +17 -25
  85. includes/js/wcj-ajax-exchange-rates.js +3 -2
  86. includes/js/wcj-bookings.js +4 -2
  87. includes/js/wcj-eu-vat-number.js +2 -1
  88. includes/js/wcj-product-addons.js +3 -1
  89. includes/js/wcj-track-users.js +2 -1
  90. includes/pdf-invoices/class-wcj-pdf-invoicing-renumerate-tool.php +8 -4
  91. includes/pdf-invoices/class-wcj-pdf-invoicing-report-tool.php +8 -8
  92. includes/pdf-invoices/submodules/class-wcj-pdf-invoicing-styling.php +6 -9
  93. includes/pdf-invoices/submodules/class-wcj-pdf-invoicing-templates.php +3 -3
  94. includes/price-by-country/class-wcj-price-by-country-core.php +17 -23
  95. includes/price-by-country/class-wcj-price-by-country-group-generator.php +9 -12
  96. includes/price-by-country/class-wcj-price-by-country-local.php +2 -2
  97. includes/reports/class-wcj-currency-reports.php +15 -12
  98. includes/reports/class-wcj-reports-monthly-sales.php +4 -7
  99. includes/reports/class-wcj-reports-product-sales-daily.php +13 -12
  100. includes/reports/{wcj-class-reports-sales-gateways.php → class-wcj-reports-sales-gateways.php} +20 -24
  101. includes/reports/class-wcj-reports-sales.php +19 -23
  102. includes/reports/class-wcj-reports-stock.php +3 -3
  103. includes/settings/pdf-invoicing/wcj-content-template-credit_note.html +60 -0
  104. includes/settings/pdf-invoicing/wcj-content-template-credit_note.php +0 -34
  105. includes/settings/pdf-invoicing/wcj-content-template-custom_doc.html +64 -0
  106. includes/settings/pdf-invoicing/wcj-content-template-custom_doc.php +0 -35
  107. includes/settings/pdf-invoicing/wcj-content-template-invoice.html +56 -0
  108. includes/settings/pdf-invoicing/wcj-content-template-invoice.php +0 -33
  109. includes/settings/pdf-invoicing/wcj-content-template-packing_slip.html +44 -0
  110. includes/settings/pdf-invoicing/wcj-content-template-packing_slip.php +0 -28
  111. includes/settings/pdf-invoicing/wcj-content-template-proforma_invoice.html +56 -0
  112. includes/settings/pdf-invoicing/wcj-content-template-proforma_invoice.php +0 -33
  113. includes/settings/wcj-settings-admin-orders-list.php +2 -2
  114. includes/settings/wcj-settings-checkout-files-upload.php +3 -3
  115. includes/settings/wcj-settings-currency-per-product.php +2 -2
  116. includes/settings/wcj-settings-debug-tools.php +10 -2
  117. includes/settings/wcj-settings-max-products-per-user.php +2 -2
  118. includes/settings/wcj-settings-multicurrency-base-price.php +2 -2
  119. includes/settings/wcj-settings-multicurrency.php +3 -3
  120. includes/settings/wcj-settings-order-min-amount.php +2 -2
  121. includes/settings/wcj-settings-payment-gateways-by-user-role.php +2 -2
  122. includes/settings/wcj-settings-payment-gateways-currency.php +2 -2
  123. includes/settings/wcj-settings-pdf-invoicing-advanced.php +9 -2
  124. includes/settings/wcj-settings-pdf-invoicing-header.php +2 -2
  125. includes/settings/wcj-settings-pdf-invoicing-page.php +2 -2
  126. includes/settings/wcj-settings-price-by-country.php +12 -4
  127. includes/settings/wcj-settings-price-by-user-role.php +2 -2
  128. includes/settings/wcj-settings-product-by-user.php +2 -2
  129. includes/settings/wcj-settings-related-products.php +2 -2
  130. includes/settings/wcj-settings-shipping-options.php +2 -2
  131. includes/settings/wcj-settings-url-coupons.php +2 -2
  132. includes/shipping/class-wc-shipping-wcj-custom-with-shipping-zones.php +6 -6
  133. includes/shortcodes/class-wcj-general-shortcodes.php +17 -15
  134. includes/shortcodes/class-wcj-invoices-shortcodes.php +5 -7
  135. includes/shortcodes/class-wcj-orders-shortcodes.php +8 -6
  136. includes/shortcodes/class-wcj-products-add-form-shortcodes.php +5 -7
  137. includes/shortcodes/class-wcj-products-crowdfunding-shortcodes.php +5 -5
  138. includes/shortcodes/class-wcj-products-shortcodes.php +5 -5
  139. includes/tools/class-wcj-eu-countries-vat-rates-tool.php +21 -18
  140. langs/woocommerce-jetpack.pot +754 -760
  141. readme.txt +18 -3
  142. tracking/README.md +0 -1
  143. tracking/class-example-settings.php +0 -203
  144. tracking/class-plugin-usage-tracker.php +138 -67
  145. version-details.json +6 -4
  146. woocommerce-jetpack.php +4 -4
includes/add-to-cart/class-wcj-add-to-cart-per-product.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce Add to Cart per Product
4
  *
5
- * @version 5.6.2
6
  * @author Pluggabl LLC.
7
  * @package Booster_For_WooCommerce/includes
8
  */
@@ -71,15 +71,15 @@ if ( ! class_exists( 'WCJ_Add_To_Cart_Per_Product' ) ) :
71
  /**
72
  * Save_custom_add_to_cart_meta_box.
73
  *
74
- * @version 5.6.2
75
  *
76
  * @param int $post_id Get post Id.
77
  * @param Array $post Get post.
78
  */
79
  public function save_custom_add_to_cart_meta_box( $post_id, $post ) {
80
- $nonce = wp_verify_nonce( wp_unslash( isset( $_POST['woocommerce_meta_nonce'] ) ? sanitize_text_field( wp_unslash( $_POST['woocommerce_meta_nonce'] ) ) : '' ), 'woocommerce_save_data' );
81
  // Check that we are saving with custom add to cart metabox displayed.
82
- if ( ! $nonce || ! isset( $_POST['woojetpack_custom_add_to_cart_save_post'] ) ) {
83
  return;
84
  }
85
  $option_name = 'wcj_custom_add_to_cart_local_single';
2
  /**
3
  * Booster for WooCommerce Add to Cart per Product
4
  *
5
+ * @version 5.6.8
6
  * @author Pluggabl LLC.
7
  * @package Booster_For_WooCommerce/includes
8
  */
71
  /**
72
  * Save_custom_add_to_cart_meta_box.
73
  *
74
+ * @version 5.6.8
75
  *
76
  * @param int $post_id Get post Id.
77
  * @param Array $post Get post.
78
  */
79
  public function save_custom_add_to_cart_meta_box( $post_id, $post ) {
80
+ $wpnonce = isset( $_POST['woocommerce_meta_nonce'] ) ? wp_verify_nonce( sanitize_text_field( wp_unslash( $_POST['woocommerce_meta_nonce'] ) ), 'woocommerce_save_data' ) : false;
81
  // Check that we are saving with custom add to cart metabox displayed.
82
+ if ( ! $wpnonce || ! isset( $_POST['woojetpack_custom_add_to_cart_save_post'] ) ) {
83
  return;
84
  }
85
  $option_name = 'wcj_custom_add_to_cart_local_single';
includes/admin/class-wc-settings-jetpack.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Settings
4
  *
5
- * @version 5.6.7
6
  * @since 1.0.0
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/admin
@@ -25,7 +25,7 @@ if ( ! class_exists( 'WC_Settings_Jetpack' ) ) :
25
  /**
26
  * Constructor.
27
  *
28
- * @version 5.3.1
29
  */
30
  public function __construct() {
31
 
@@ -52,10 +52,30 @@ if ( ! class_exists( 'WC_Settings_Jetpack' ) ) :
52
  add_action( 'woocommerce_after_settings_' . $this->id, array( $this, 'create_pro_version_footer_review_notice' ) );
53
 
54
  add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_admin_script' ) );
55
-
56
  require_once 'class-wcj-settings-custom-fields.php';
57
  }
58
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
59
  /**
60
  * Wcj_new_desing_dashboard.
61
  *
@@ -63,9 +83,9 @@ if ( ! class_exists( 'WC_Settings_Jetpack' ) ) :
63
  * @since 5.5.6
64
  */
65
  public function wcj_new_desing_dashboard() {
66
- $wpnonce = true;
67
- if ( function_exists( 'wp_verify_nonce' ) ) {
68
- $wpnonce = isset( $_REQUEST['_wpnonce'] ) ? wp_verify_nonce( sanitize_key( isset( $_REQUEST['_wpnonce'] ) ? $_REQUEST['_wpnonce'] : '' ), 'woocommerce-settings' ) : true;
69
  }
70
  if ( $wpnonce && isset( $_GET['tab'] ) && 'jetpack' === $_GET['tab'] ) {
71
  wp_enqueue_style( 'wcj-admin-wcj-new_desing', wcj_plugin_url() . '/includes/css/admin-style.css', array(), w_c_j()->version );
@@ -337,7 +357,7 @@ if ( ! class_exists( 'WC_Settings_Jetpack' ) ) :
337
  /**
338
  * Output the settings.
339
  *
340
- * @version 5.6.2
341
  * @todo (maybe) admin_notices
342
  */
343
  public function output() {
@@ -360,7 +380,7 @@ if ( ! class_exists( 'WC_Settings_Jetpack' ) ) :
360
  /* translators: %s: search term */
361
  __( 'Please note that current <em>%1$s</em> module is deprecated and will be removed in future updates. Please use <em>%2$s</em> module instead.', 'woocommerce-jetpack' ),
362
  w_c_j()->modules[ $current_section ]->short_desc,
363
- '<a href="' . admin_url( 'admin.php?page=wc-settings&tab=jetpack&wcj-cat=' . $replacement_module['cat'] . '&section=' . $replacement_module['module'] ) . '">' .
364
  $replacement_module['title'] . '</a>'
365
  )
366
  );
@@ -399,10 +419,7 @@ if ( ! class_exists( 'WC_Settings_Jetpack' ) ) :
399
  break;
400
  }
401
  }
402
- $wpnonce = true;
403
- if ( function_exists( 'wp_verify_nonce' ) ) {
404
- $wpnonce = isset( $_REQUEST['_wpnonce'] ) ? wp_verify_nonce( sanitize_key( isset( $_REQUEST['_wpnonce'] ) ? $_REQUEST['_wpnonce'] : '' ) ) : true;
405
- }
406
  if ( $wpnonce && $is_dashboard && isset( $_GET['wcj-cat'] ) && 'dashboard' !== $_GET['wcj-cat'] ) {
407
  $breadcrumbs_html .= $this->cats[ sanitize_text_field( wp_unslash( $_GET['wcj-cat'] ) ) ]['label'];
408
  }
@@ -429,7 +446,7 @@ if ( ! class_exists( 'WC_Settings_Jetpack' ) ) :
429
  /**
430
  * Output_dashboard.
431
  *
432
- * @version 5.6.2
433
  * @param array $current_section defines the current section.
434
  */
435
  public function output_dashboard( $current_section ) {
@@ -456,11 +473,11 @@ if ( ! class_exists( 'WC_Settings_Jetpack' ) ) :
456
  if ( 'dashboard' === $cat_id ) {
457
  continue;
458
  }
459
- $wpnonce = true;
460
- if ( function_exists( 'wp_verify_nonce' ) ) {
461
- $wpnonce = isset( $_REQUEST['_wpnonce'] ) ? wp_verify_nonce( sanitize_key( isset( $_REQUEST['_wpnonce'] ) ? $_REQUEST['_wpnonce'] : '' ), 'woocommerce-settings' ) : true;
462
  }
463
- if ( $wpnonce && isset( $_GET['wcj-cat'] ) && 'dashboard' !== $_GET['wcj-cat'] ) {
464
  if ( $cat_id !== $_GET['wcj-cat'] ) {
465
  continue;
466
  }
@@ -562,7 +579,7 @@ if ( ! class_exists( 'WC_Settings_Jetpack' ) ) :
562
  /**
563
  * Output_dashboard_modules.
564
  *
565
- * @version 5.6.2
566
  * @param array $settings this defines title.
567
  * @param string $cat_id this defines title.
568
  */
@@ -620,7 +637,7 @@ if ( ! class_exists( 'WC_Settings_Jetpack' ) ) :
620
  $html .= '</th>';
621
  $html .= '<td class="plugin-title"><strong>' . $the_feature['title'] . '</strong>';
622
  $html .= '<div class="row-actions visible">';
623
- $html .= '<span class="0"><a href="' . admin_url() . 'admin.php?page=wc-settings&tab=jetpack&wcj-cat=' . $this->get_cat_by_section( $section ) . '&section=' . $section . '">' . __( 'Settings', 'woocommerce' ) . '</a></span>';
624
  if ( isset( $the_feature['wcj_link'] ) && '' !== $the_feature['wcj_link'] ) {
625
  $html .= ' | <span class="0"><a href="' . $the_feature['wcj_link'] . '?utm_source=module_documentation&utm_medium=dashboard_link&utm_campaign=booster_documentation" target="_blank">' . __( 'Documentation', 'woocommerce' ) . '</a></span>';
626
  }
@@ -662,7 +679,7 @@ if ( ! class_exists( 'WC_Settings_Jetpack' ) ) :
662
  /**
663
  * Disable_autoload_options.
664
  *
665
- * @version 5.6.2
666
  * @since 5.3.3
667
  *
668
  * @param array $settings defines the settings.
@@ -676,7 +693,7 @@ if ( ! class_exists( 'WC_Settings_Jetpack' ) ) :
676
  global $wpdb;
677
 
678
  if ( count( $field_ids ) > 0 ) {
679
- $wpdb->query( $wpdb->prepare( "UPDATE {$wpdb->options} SET autoload = 'no' WHERE option_name IN (" . implode( ', ', array_fill( 0, count( $field_ids ), '%s' ) ) . ") AND autoload != 'no'", $field_ids ) ); // WPCS: db call ok and cache ok.
680
  }
681
  }
682
 
@@ -775,7 +792,7 @@ if ( ! class_exists( 'WC_Settings_Jetpack' ) ) :
775
  /**
776
  * Get settings array
777
  *
778
- * @version 5.6.2
779
  * @param array $current_section defines the current section array.
780
  * @return array $current_section defines the current section.
781
  */
@@ -787,10 +804,7 @@ if ( ! class_exists( 'WC_Settings_Jetpack' ) ) :
787
  } elseif ( isset( $this->custom_dashboard_modules[ $current_section ] ) ) {
788
  return $this->custom_dashboard_modules[ $current_section ]['settings'];
789
  } else {
790
- $wpnonce = true;
791
- if ( function_exists( 'wp_verify_nonce' ) ) {
792
- $wpnonce = isset( $_REQUEST['_wpnonce'] ) ? wp_verify_nonce( sanitize_key( isset( $_REQUEST['_wpnonce'] ) ? $_REQUEST['_wpnonce'] : '' ), 'woocommerce-settings' ) : true;
793
- }
794
  $cat_id = $wpnonce && ( isset( $_GET['wcj-cat'] ) && '' !== $_GET['wcj-cat'] ) ? sanitize_text_field( wp_unslash( $_GET['wcj-cat'] ) ) : 'dashboard';
795
  $settings[] = array(
796
  'title' => __( 'Booster for WooCommerce', 'woocommerce-jetpack' ) . ' - ' . $this->cats[ $cat_id ]['label'],
@@ -857,18 +871,15 @@ if ( ! class_exists( 'WC_Settings_Jetpack' ) ) :
857
  /**
858
  * Dasboard_menu.
859
  *
860
- * @version 5.6.2
861
  */
862
  public function dasboard_menu() {
863
  global $current_section;
864
- $wpnonce = true;
865
- if ( function_exists( 'wp_verify_nonce' ) ) {
866
- $wpnonce = isset( $_REQUEST['_wpnonce'] ) ? wp_verify_nonce( sanitize_key( isset( $_REQUEST['_wpnonce'] ) ? $_REQUEST['_wpnonce'] : '' ), 'woocommerce-settings' ) : true;
867
- }
868
- $_section = $wpnonce && isset( $_GET['section'] ) ? sanitize_text_field( wp_unslash( $_GET['section'] ) ) : '';
869
- $_wcj_cat = $wpnonce && isset( $_GET['wcj-cat'] ) ? sanitize_text_field( wp_unslash( $_GET['wcj-cat'] ) ) : '';
870
- $_wcj_tab = $wpnonce && isset( $_GET['tab'] ) ? sanitize_text_field( wp_unslash( $_GET['tab'] ) ) : '';
871
- if ( 'jetpack' === $_wcj_tab && ( '' === $_section || 'by_category' === $_section ) && ( '' === $_wcj_cat || 'dashboard' === $_wcj_cat ) ) {
872
  ?>
873
  <style>
874
  button.button-primary.woocommerce-save-button {
2
  /**
3
  * Booster for WooCommerce - Settings
4
  *
5
+ * @version 5.6.8
6
  * @since 1.0.0
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/admin
25
  /**
26
  * Constructor.
27
  *
28
+ * @version 5.6.8
29
  */
30
  public function __construct() {
31
 
52
  add_action( 'woocommerce_after_settings_' . $this->id, array( $this, 'create_pro_version_footer_review_notice' ) );
53
 
54
  add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_admin_script' ) );
55
+ add_action( 'admin_footer', array( $this, 'update_booster_tab_link' ), PHP_INT_MAX );
56
  require_once 'class-wcj-settings-custom-fields.php';
57
  }
58
 
59
+ /**
60
+ * Update_booster_tab_link.
61
+ *
62
+ * @version 5.6.7
63
+ */
64
+ public function update_booster_tab_link() {
65
+ ?>
66
+ <script type="text/javascript">
67
+ jQuery(function ($) {
68
+ var selector = $('.woocommerce #mainform .woo-nav-tab-wrapper a');
69
+ $( selector ).each(function( index ) {
70
+ if( this.text == 'Booster' && this.href.split("&").pop() == 'tab=jetpack' ){
71
+ this.href = this.href + '&wcj-cat-nonce=' + "<?php echo esc_html( wp_create_nonce( 'wcj-cat-nonce' ) ); ?>";
72
+ }
73
+ })
74
+ });
75
+ </script>
76
+ <?php
77
+ }
78
+
79
  /**
80
  * Wcj_new_desing_dashboard.
81
  *
83
  * @since 5.5.6
84
  */
85
  public function wcj_new_desing_dashboard() {
86
+ $wpnonce = isset( $_REQUEST['wcj-cat-nonce'] ) ? wp_verify_nonce( sanitize_key( $_REQUEST['wcj-cat-nonce'] ), 'wcj-cat-nonce' ) : false;
87
+ if ( ! $wpnonce && isset( $_GET['tab'] ) && 'jetpack' === $_GET['tab'] ) {
88
+ wp_safe_redirect( admin_url( 'admin.php?page=wc-settings' ) );
89
  }
90
  if ( $wpnonce && isset( $_GET['tab'] ) && 'jetpack' === $_GET['tab'] ) {
91
  wp_enqueue_style( 'wcj-admin-wcj-new_desing', wcj_plugin_url() . '/includes/css/admin-style.css', array(), w_c_j()->version );
357
  /**
358
  * Output the settings.
359
  *
360
+ * @version 5.6.8
361
  * @todo (maybe) admin_notices
362
  */
363
  public function output() {
380
  /* translators: %s: search term */
381
  __( 'Please note that current <em>%1$s</em> module is deprecated and will be removed in future updates. Please use <em>%2$s</em> module instead.', 'woocommerce-jetpack' ),
382
  w_c_j()->modules[ $current_section ]->short_desc,
383
+ '<a href="' . admin_url( wcj_admin_tab_url() . '&wcj-cat=' . $replacement_module['cat'] . '&section=' . $replacement_module['module'] ) . '">' .
384
  $replacement_module['title'] . '</a>'
385
  )
386
  );
419
  break;
420
  }
421
  }
422
+ $wpnonce = isset( $_REQUEST['wcj-cat-nonce'] ) ? wp_verify_nonce( sanitize_key( $_REQUEST['wcj-cat-nonce'] ), 'wcj-cat-nonce' ) : false;
 
 
 
423
  if ( $wpnonce && $is_dashboard && isset( $_GET['wcj-cat'] ) && 'dashboard' !== $_GET['wcj-cat'] ) {
424
  $breadcrumbs_html .= $this->cats[ sanitize_text_field( wp_unslash( $_GET['wcj-cat'] ) ) ]['label'];
425
  }
446
  /**
447
  * Output_dashboard.
448
  *
449
+ * @version 5.6.8
450
  * @param array $current_section defines the current section.
451
  */
452
  public function output_dashboard( $current_section ) {
473
  if ( 'dashboard' === $cat_id ) {
474
  continue;
475
  }
476
+ $wpnonce = isset( $_REQUEST['wcj-cat-nonce'] ) ? wp_verify_nonce( sanitize_key( $_REQUEST['wcj-cat-nonce'] ), 'wcj-cat-nonce' ) : false;
477
+ if ( ! $wpnonce ) {
478
+ continue;
479
  }
480
+ if ( isset( $_GET['wcj-cat'] ) && 'dashboard' !== $_GET['wcj-cat'] ) {
481
  if ( $cat_id !== $_GET['wcj-cat'] ) {
482
  continue;
483
  }
579
  /**
580
  * Output_dashboard_modules.
581
  *
582
+ * @version 5.6.8
583
  * @param array $settings this defines title.
584
  * @param string $cat_id this defines title.
585
  */
637
  $html .= '</th>';
638
  $html .= '<td class="plugin-title"><strong>' . $the_feature['title'] . '</strong>';
639
  $html .= '<div class="row-actions visible">';
640
+ $html .= '<span class="0"><a href="' . admin_url() . wcj_admin_tab_url() . '&wcj-cat=' . $this->get_cat_by_section( $section ) . '&section=' . $section . '">' . __( 'Settings', 'woocommerce' ) . '</a></span>';
641
  if ( isset( $the_feature['wcj_link'] ) && '' !== $the_feature['wcj_link'] ) {
642
  $html .= ' | <span class="0"><a href="' . $the_feature['wcj_link'] . '?utm_source=module_documentation&utm_medium=dashboard_link&utm_campaign=booster_documentation" target="_blank">' . __( 'Documentation', 'woocommerce' ) . '</a></span>';
643
  }
679
  /**
680
  * Disable_autoload_options.
681
  *
682
+ * @version 5.6.8
683
  * @since 5.3.3
684
  *
685
  * @param array $settings defines the settings.
693
  global $wpdb;
694
 
695
  if ( count( $field_ids ) > 0 ) {
696
+ $wpdb->query( $wpdb->prepare( "UPDATE {$wpdb->options} SET autoload = 'no' WHERE option_name IN (" . implode( ', ', array_fill( 0, count( $field_ids ), '%s' ) ) . ") AND autoload != 'no'", $field_ids ) ); // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching
697
  }
698
  }
699
 
792
  /**
793
  * Get settings array
794
  *
795
+ * @version 5.6.8
796
  * @param array $current_section defines the current section array.
797
  * @return array $current_section defines the current section.
798
  */
804
  } elseif ( isset( $this->custom_dashboard_modules[ $current_section ] ) ) {
805
  return $this->custom_dashboard_modules[ $current_section ]['settings'];
806
  } else {
807
+ $wpnonce = isset( $_REQUEST['wcj-cat-nonce'] ) ? wp_verify_nonce( sanitize_key( $_REQUEST['wcj-cat-nonce'] ), 'wcj-cat-nonce' ) : false;
 
 
 
808
  $cat_id = $wpnonce && ( isset( $_GET['wcj-cat'] ) && '' !== $_GET['wcj-cat'] ) ? sanitize_text_field( wp_unslash( $_GET['wcj-cat'] ) ) : 'dashboard';
809
  $settings[] = array(
810
  'title' => __( 'Booster for WooCommerce', 'woocommerce-jetpack' ) . ' - ' . $this->cats[ $cat_id ]['label'],
871
  /**
872
  * Dasboard_menu.
873
  *
874
+ * @version 5.6.8
875
  */
876
  public function dasboard_menu() {
877
  global $current_section;
878
+ $wpnonce = isset( $_REQUEST['wcj-cat-nonce'] ) ? wp_verify_nonce( sanitize_key( $_REQUEST['wcj-cat-nonce'] ), 'wcj-cat-nonce' ) : false;
879
+ $_section = isset( $_GET['section'] ) ? sanitize_text_field( wp_unslash( $_GET['section'] ) ) : '';
880
+ $_wcj_cat = isset( $_GET['wcj-cat'] ) ? sanitize_text_field( wp_unslash( $_GET['wcj-cat'] ) ) : '';
881
+ $_wcj_tab = isset( $_GET['tab'] ) ? sanitize_text_field( wp_unslash( $_GET['tab'] ) ) : '';
882
+ if ( $wpnonce && 'jetpack' === $_wcj_tab && ( '' === $_section || 'by_category' === $_section ) && ( '' === $_wcj_cat || 'dashboard' === $_wcj_cat ) ) {
 
 
 
883
  ?>
884
  <style>
885
  button.button-primary.woocommerce-save-button {
includes/admin/class-wcj-settings-custom-fields.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Settings Custom Fields
4
  *
5
- * @version 5.6.2
6
  * @since 2.8.0
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/admin
@@ -249,7 +249,7 @@ if ( ! class_exists( 'WCJ_Settings_Custom_Fields' ) ) :
249
  /**
250
  * Output_custom_textarea.
251
  *
252
- * @version 5.6.2
253
  * @since 2.2.6
254
  * @param Array $value Get values.
255
  */
@@ -258,14 +258,14 @@ if ( ! class_exists( 'WCJ_Settings_Custom_Fields' ) ) :
258
  $custom_attributes = ( isset( $value['custom_attributes'] ) && is_array( $value['custom_attributes'] ) ) ?
259
  $value['custom_attributes'] : array();
260
  $description = ' <p class="description">' . $value['desc'] . '</p>';
261
- $tooltip_html = ( isset( $value['desc_tip'] ) && '' !== $value['desc_tip'] ) ?
262
  '<span class="woocommerce-help-tip" data-tip="' . $value['desc_tip'] . '"></span>' : '';
263
  // Output.
264
  ?>
265
  <tr valign="top">
266
  <th scope="row" class="titledesc">
267
  <label for="<?php echo esc_attr( $value['id'] ); ?>"><?php echo esc_html( $value['title'] ); ?></label>
268
- <?php echo $tooltip_html; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>
269
  </th>
270
  <td class="forminp forminp-<?php echo wp_kses_post( $value['type'] ); ?>">
271
  <?php echo wp_kses_post( $description ); ?>
@@ -286,7 +286,7 @@ if ( ! class_exists( 'WCJ_Settings_Custom_Fields' ) ) :
286
  /**
287
  * Output_module_tools.
288
  *
289
- * @version 5.6.2
290
  * @since 2.2.3
291
  * @param Array $value Get values.
292
  */
@@ -299,10 +299,7 @@ if ( ! class_exists( 'WCJ_Settings_Custom_Fields' ) ) :
299
  </th>
300
  <td class="forminp forminp-<?php echo wp_kses_post( $value['type'] ); ?>">
301
  <?php
302
- $wpnonce = true;
303
- if ( function_exists( 'wp_verify_nonce' ) ) {
304
- $wpnonce = isset( $_REQUEST['_wpnonce'] ) ? wp_verify_nonce( sanitize_key( isset( $_REQUEST['_wpnonce'] ) ? $_REQUEST['_wpnonce'] : '' ), 'woocommerce-settings' ) : true;
305
- }
306
  if ( $wpnonce && isset( $_GET['section'] ) ) {
307
  do_action( 'wcj_module_tools_' . sanitize_text_field( wp_unslash( $_GET['section'] ) ) );}
308
  ?>
@@ -314,12 +311,12 @@ if ( ! class_exists( 'WCJ_Settings_Custom_Fields' ) ) :
314
  /**
315
  * Output_custom_link.
316
  *
317
- * @version 2.7.0
318
  * @since 2.2.8
319
  * @param Array $value Get values.
320
  */
321
  public function output_custom_link( $value ) {
322
- $tooltip_html = ( isset( $value['desc_tip'] ) && '' !== $value['desc_tip'] ) ?
323
  '<span class="woocommerce-help-tip" data-tip="' . $value['desc_tip'] . '"></span>' : '';
324
  ?>
325
  <tr valign="top">
@@ -336,13 +333,13 @@ if ( ! class_exists( 'WCJ_Settings_Custom_Fields' ) ) :
336
  /**
337
  * Output_custom_number.
338
  *
339
- * @version 5.5.6
340
  * @param Array $value Get values.
341
  */
342
  public function output_custom_number( $value ) {
343
  $type = 'number';
344
  $option_value = get_option( $value['id'], $value['default'] );
345
- $tooltip_html = ( isset( $value['desc_tip'] ) && '' !== $value['desc_tip'] ) ?
346
  '<span class="woocommerce-help-tip" data-tip="' . $value['desc_tip'] . '"></span>' : '';
347
  $description = ' <span class="description">' . $value['desc'] . '</span>';
348
  $save_button = apply_filters(
2
  /**
3
  * Booster for WooCommerce - Settings Custom Fields
4
  *
5
+ * @version 5.6.8
6
  * @since 2.8.0
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/admin
249
  /**
250
  * Output_custom_textarea.
251
  *
252
+ * @version 5.6.8
253
  * @since 2.2.6
254
  * @param Array $value Get values.
255
  */
258
  $custom_attributes = ( isset( $value['custom_attributes'] ) && is_array( $value['custom_attributes'] ) ) ?
259
  $value['custom_attributes'] : array();
260
  $description = ' <p class="description">' . $value['desc'] . '</p>';
261
+ $tooltip_html = ( $value['desc_tip'] && isset( $value['desc_tip'] ) && '' !== $value['desc_tip'] ) ?
262
  '<span class="woocommerce-help-tip" data-tip="' . $value['desc_tip'] . '"></span>' : '';
263
  // Output.
264
  ?>
265
  <tr valign="top">
266
  <th scope="row" class="titledesc">
267
  <label for="<?php echo esc_attr( $value['id'] ); ?>"><?php echo esc_html( $value['title'] ); ?></label>
268
+ <?php echo wp_kses_post( $tooltip_html ); ?>
269
  </th>
270
  <td class="forminp forminp-<?php echo wp_kses_post( $value['type'] ); ?>">
271
  <?php echo wp_kses_post( $description ); ?>
286
  /**
287
  * Output_module_tools.
288
  *
289
+ * @version 5.6.8
290
  * @since 2.2.3
291
  * @param Array $value Get values.
292
  */
299
  </th>
300
  <td class="forminp forminp-<?php echo wp_kses_post( $value['type'] ); ?>">
301
  <?php
302
+ $wpnonce = isset( $_REQUEST['wcj-cat-nonce'] ) ? wp_verify_nonce( sanitize_key( $_REQUEST['wcj-cat-nonce'] ), 'wcj-cat-nonce' ) : false;
 
 
 
303
  if ( $wpnonce && isset( $_GET['section'] ) ) {
304
  do_action( 'wcj_module_tools_' . sanitize_text_field( wp_unslash( $_GET['section'] ) ) );}
305
  ?>
311
  /**
312
  * Output_custom_link.
313
  *
314
+ * @version 5.6.8
315
  * @since 2.2.8
316
  * @param Array $value Get values.
317
  */
318
  public function output_custom_link( $value ) {
319
+ $tooltip_html = ( $value['desc_tip'] && isset( $value['desc_tip'] ) && '' !== $value['desc_tip'] ) ?
320
  '<span class="woocommerce-help-tip" data-tip="' . $value['desc_tip'] . '"></span>' : '';
321
  ?>
322
  <tr valign="top">
333
  /**
334
  * Output_custom_number.
335
  *
336
+ * @version 5.6.8
337
  * @param Array $value Get values.
338
  */
339
  public function output_custom_number( $value ) {
340
  $type = 'number';
341
  $option_value = get_option( $value['id'], $value['default'] );
342
+ $tooltip_html = ( $value['desc_tip'] && isset( $value['desc_tip'] ) && '' !== $value['desc_tip'] ) ?
343
  '<span class="woocommerce-help-tip" data-tip="' . $value['desc_tip'] . '"></span>' : '';
344
  $description = ' <span class="description">' . $value['desc'] . '</span>';
345
  $save_button = apply_filters(
includes/admin/class-wcj-settings-manager.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Settings Manager - Import / Export / Reset Booster's settings
4
  *
5
- * @version 5.6.2
6
  * @since 2.9.0
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/admin
@@ -32,7 +32,7 @@ if ( ! class_exists( 'WCJ_Settings_Manager' ) ) :
32
  /**
33
  * Manage_options.
34
  *
35
- * @version 5.6.2
36
  * @since 2.5.2
37
  */
38
  public function manage_options() {
@@ -40,6 +40,14 @@ if ( ! class_exists( 'WCJ_Settings_Manager' ) ) :
40
  if ( ! function_exists( 'current_user_can' ) || ! current_user_can( 'manage_options' ) ) {
41
  return;
42
  }
 
 
 
 
 
 
 
 
43
  $wpnonce = wp_verify_nonce( sanitize_key( isset( $_REQUEST['_wpnonce'] ) ? $_REQUEST['_wpnonce'] : '' ), 'woocommerce-settings' );
44
  if ( $wpnonce && isset( $_POST['booster_import_settings'] ) ) {
45
  $this->manage_options_import();
@@ -59,7 +67,7 @@ if ( ! class_exists( 'WCJ_Settings_Manager' ) ) :
59
  /**
60
  * Manage_options_import.
61
  *
62
- * @version 5.6.2
63
  * @since 2.5.2
64
  */
65
  public function manage_options_import() {
@@ -72,8 +80,11 @@ if ( ! class_exists( 'WCJ_Settings_Manager' ) ) :
72
  unset( $_POST['booster_import_settings'] );
73
  }
74
  } else {
 
 
 
75
  $import_counter = 0;
76
- $import_settings = file_get_contents( sanitize_text_field( wp_unslash( $_FILES['booster_import_settings_file']['tmp_name'] ) ) ); //phpcs:ignore
77
  $bom = pack( 'H*', 'EFBBBF' );
78
  $import_settings = preg_replace( "/^$bom/", '', $import_settings );
79
  $import_settings = explode( PHP_EOL, preg_replace( '~(*BSR_ANYCRLF)\R~', PHP_EOL, $import_settings ) );
@@ -102,11 +113,14 @@ if ( ! class_exists( 'WCJ_Settings_Manager' ) ) :
102
  /**
103
  * Manage_options_export.
104
  *
105
- * @version 5.6.2
106
  * @since 2.5.2
107
  * @see http://php.net/manual/en/function.header.php
108
  */
109
  public function manage_options_export() {
 
 
 
110
  $export_settings = array();
111
  $export_counter = array();
112
  $wpnonce = wp_verify_nonce( sanitize_key( isset( $_REQUEST['_wpnonce'] ) ? $_REQUEST['_wpnonce'] : '' ), 'woocommerce-settings' );
@@ -126,9 +140,10 @@ if ( ! class_exists( 'WCJ_Settings_Manager' ) ) :
126
  }
127
  $export_settings = wp_json_encode( $export_settings );
128
  $export_settings = 'Booster for WooCommerce v' . wcj_get_option( WCJ_VERSION_OPTION, 'NA' ) . PHP_EOL . $export_settings;
129
- header( 'Content-Type: application/download' );
130
- header( 'Content-Disposition: attachment; filename=booster_settings.txt' );
131
- echo $export_settings; //phpcs:ignore
 
132
  die();
133
  }
134
 
2
  /**
3
  * Booster for WooCommerce - Settings Manager - Import / Export / Reset Booster's settings
4
  *
5
+ * @version 5.6.8
6
  * @since 2.9.0
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/admin
32
  /**
33
  * Manage_options.
34
  *
35
+ * @version 5.6.8
36
  * @since 2.5.2
37
  */
38
  public function manage_options() {
40
  if ( ! function_exists( 'current_user_can' ) || ! current_user_can( 'manage_options' ) ) {
41
  return;
42
  }
43
+ require_once ABSPATH . '/wp-admin/includes/file.php';
44
+ global $wp_filesystem;
45
+ WP_Filesystem();
46
+ $file_name = 'booster_settings.txt';
47
+ $file_path = wcj_get_wcj_uploads_dir() . DIRECTORY_SEPARATOR . $file_name;
48
+ if ( $wp_filesystem->exists( $file_path ) ) {
49
+ $wp_filesystem->delete( $file_path, true );
50
+ }
51
  $wpnonce = wp_verify_nonce( sanitize_key( isset( $_REQUEST['_wpnonce'] ) ? $_REQUEST['_wpnonce'] : '' ), 'woocommerce-settings' );
52
  if ( $wpnonce && isset( $_POST['booster_import_settings'] ) ) {
53
  $this->manage_options_import();
67
  /**
68
  * Manage_options_import.
69
  *
70
+ * @version 5.6.8
71
  * @since 2.5.2
72
  */
73
  public function manage_options_import() {
80
  unset( $_POST['booster_import_settings'] );
81
  }
82
  } else {
83
+ require_once ABSPATH . '/wp-admin/includes/file.php';
84
+ global $wp_filesystem;
85
+ WP_Filesystem();
86
  $import_counter = 0;
87
+ $import_settings = $wp_filesystem->get_contents( sanitize_text_field( wp_unslash( $_FILES['booster_import_settings_file']['tmp_name'] ) ) );
88
  $bom = pack( 'H*', 'EFBBBF' );
89
  $import_settings = preg_replace( "/^$bom/", '', $import_settings );
90
  $import_settings = explode( PHP_EOL, preg_replace( '~(*BSR_ANYCRLF)\R~', PHP_EOL, $import_settings ) );
113
  /**
114
  * Manage_options_export.
115
  *
116
+ * @version 5.6.8
117
  * @since 2.5.2
118
  * @see http://php.net/manual/en/function.header.php
119
  */
120
  public function manage_options_export() {
121
+ require_once ABSPATH . '/wp-admin/includes/file.php';
122
+ global $wp_filesystem;
123
+ WP_Filesystem();
124
  $export_settings = array();
125
  $export_counter = array();
126
  $wpnonce = wp_verify_nonce( sanitize_key( isset( $_REQUEST['_wpnonce'] ) ? $_REQUEST['_wpnonce'] : '' ), 'woocommerce-settings' );
140
  }
141
  $export_settings = wp_json_encode( $export_settings );
142
  $export_settings = 'Booster for WooCommerce v' . wcj_get_option( WCJ_VERSION_OPTION, 'NA' ) . PHP_EOL . $export_settings;
143
+ $file_name = 'booster_settings.txt';
144
+ $file_path = wcj_get_wcj_uploads_dir() . DIRECTORY_SEPARATOR . $file_name;
145
+ $wp_filesystem->put_contents( $file_path, $export_settings, FS_CHMOD_FILE );
146
+ WC_Download_Handler::download_file_force( $file_path, $file_name );
147
  die();
148
  }
149
 
includes/admin/class-wcj-tools.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce Tools
4
  *
5
- * @version 5.6.7
6
  * @author Pluggabl LLC.
7
  * @package Booster_For_WooCommerce/admin
8
  */
@@ -32,15 +32,13 @@ if ( ! class_exists( 'WCJ_Tools' ) ) :
32
  /**
33
  * Wcj_new_desing_dashboard_enqueue.
34
  *
35
- * @version 5.6.2
36
  * @since 5.5.6
37
  */
38
  public function wcj_new_desing_dashboard_enqueue() {
39
- $wpnonce = true;
40
- if ( function_exists( 'wp_verify_nonce' ) ) {
41
- $wpnonce = isset( $_REQUEST['_wpnonce'] ) ? wp_verify_nonce( sanitize_key( isset( $_REQUEST['_wpnonce'] ) ? $_REQUEST['_wpnonce'] : '' ) ) : true;
42
- }
43
- $page = ( $wpnonce && isset( $_GET['page'] ) ) ? sanitize_text_field( wp_unslash( $_GET['page'] ) ) : '';
44
  if ( 'wcj-tools' === $page ) {
45
  wp_enqueue_style( 'wcj-admin-wcj-new_desing', wcj_plugin_url() . '/includes/css/admin-style.css', array(), time() );
46
  wp_enqueue_script( 'wcj-admin-script', wcj_plugin_url() . '/includes/js/admin-script.js', array( 'jquery' ), '5.0.0', true );
@@ -68,12 +66,12 @@ if ( ! class_exists( 'WCJ_Tools' ) ) :
68
  /**
69
  * Create_tools_page.
70
  *
71
- * @version 5.6.7
72
  */
73
  public function create_tools_page() {
74
 
75
  // Tabs.
76
- $tabs = apply_filters(
77
  'wcj_tools_tabs',
78
  array(
79
  array(
@@ -82,12 +80,11 @@ if ( ! class_exists( 'WCJ_Tools' ) ) :
82
  ),
83
  )
84
  );
85
- $html = '<h2 class="nav-tab-wrapper woo-nav-tab-wrapper wcj_tool_tab_part">';
86
- $wpnonce = true;
87
- if ( function_exists( 'wp_verify_nonce' ) ) {
88
- $wpnonce = isset( $_REQUEST['_wpnonce'] ) ? wp_verify_nonce( sanitize_key( isset( $_REQUEST['_wpnonce'] ) ? $_REQUEST['_wpnonce'] : '' ) ) : true;
89
- }
90
- $active_tab = ( $wpnonce && isset( $_GET['tab'] ) ) ? sanitize_text_field( wp_unslash( $_GET['tab'] ) ) : 'dashboard';
91
  foreach ( $tabs as $tab ) {
92
  $is_active = ( $active_tab === $tab['id'] ) ? 'nav-tab-active' : '';
93
  $html .= '<a href="' . esc_url(
2
  /**
3
  * Booster for WooCommerce Tools
4
  *
5
+ * @version 5.6.8
6
  * @author Pluggabl LLC.
7
  * @package Booster_For_WooCommerce/admin
8
  */
32
  /**
33
  * Wcj_new_desing_dashboard_enqueue.
34
  *
35
+ * @version 5.6.8
36
  * @since 5.5.6
37
  */
38
  public function wcj_new_desing_dashboard_enqueue() {
39
+ $_get = array();
40
+ parse_str( isset( $_SERVER['QUERY_STRING'] ) ? sanitize_text_field( wp_unslash( $_SERVER['QUERY_STRING'] ) ) : '', $_get );
41
+ $page = isset( $_get['page'] ) ? sanitize_text_field( wp_unslash( $_get['page'] ) ) : '';
 
 
42
  if ( 'wcj-tools' === $page ) {
43
  wp_enqueue_style( 'wcj-admin-wcj-new_desing', wcj_plugin_url() . '/includes/css/admin-style.css', array(), time() );
44
  wp_enqueue_script( 'wcj-admin-script', wcj_plugin_url() . '/includes/js/admin-script.js', array( 'jquery' ), '5.0.0', true );
66
  /**
67
  * Create_tools_page.
68
  *
69
+ * @version 5.6.8
70
  */
71
  public function create_tools_page() {
72
 
73
  // Tabs.
74
+ $tabs = apply_filters(
75
  'wcj_tools_tabs',
76
  array(
77
  array(
80
  ),
81
  )
82
  );
83
+ $html = '<h2 class="nav-tab-wrapper woo-nav-tab-wrapper wcj_tool_tab_part">';
84
+ // phpcs:disable WordPress.Security.NonceVerification
85
+ $active_tab = ( isset( $_GET['tab'] ) ) ? sanitize_text_field( wp_unslash( $_GET['tab'] ) ) : 'dashboard';
86
+ // phpcs:enable WordPress.Security.NonceVerification
87
+
 
88
  foreach ( $tabs as $tab ) {
89
  $is_active = ( $active_tab === $tab['id'] ) ? 'nav-tab-active' : '';
90
  $html .= '<a href="' . esc_url(
includes/admin/class-wcj-welcome.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster getting started
4
  *
5
- * @version 5.6.2
6
  * @author Pluggabl LLC.
7
  * @package Booster_For_WooCommerce/admin
8
  */
@@ -22,10 +22,7 @@ if ( ! class_exists( 'WCJ_Welcome' ) ) :
22
  public function __construct() {
23
  if ( is_admin() ) {
24
 
25
- $wpnonce = true;
26
- if ( function_exists( 'wp_verify_nonce' ) ) {
27
- $wpnonce = isset( $_REQUEST['_wpnonce'] ) ? wp_verify_nonce( sanitize_key( isset( $_REQUEST['_wpnonce'] ) ? $_REQUEST['_wpnonce'] : '' ) ) : true;
28
- }
29
  if ( $wpnonce && isset( $_GET['page'] ) && 'jetpack-getting-started' === $_GET['page'] ) {
30
  add_action(
31
  'in_admin_header',
@@ -73,20 +70,17 @@ if ( ! class_exists( 'WCJ_Welcome' ) ) :
73
  /**
74
  * Wcj_redirect_to_getting_started.
75
  *
76
- * @version 5.6.2
77
  */
78
  public function wcj_redirect_to_getting_started() {
79
- $wpnonce = true;
80
- if ( function_exists( 'wp_verify_nonce' ) ) {
81
- $wpnonce = isset( $_REQUEST['_wpnonce'] ) ? wp_verify_nonce( sanitize_key( isset( $_REQUEST['_wpnonce'] ) ? $_REQUEST['_wpnonce'] : '' ) ) : true;
82
- }
83
- if ( ! get_transient( '_wcj_activation_redirect' ) || isset( $_GET['wcj-redirect'] ) || ! $wpnonce ) {
84
  return;
85
  }
86
 
87
  delete_transient( '_wcj_activation_redirect' );
88
 
89
- $redirect = admin_url( 'index.php?page=jetpack-getting-started&wcj-redirect=1' );
90
  wp_safe_redirect( $redirect );
91
  exit;
92
  }
2
  /**
3
  * Booster getting started
4
  *
5
+ * @version 5.6.8
6
  * @author Pluggabl LLC.
7
  * @package Booster_For_WooCommerce/admin
8
  */
22
  public function __construct() {
23
  if ( is_admin() ) {
24
 
25
+ $wpnonce = isset( $_REQUEST['wcj-redirect-nonce'] ) ? wp_verify_nonce( sanitize_key( $_REQUEST['wcj-redirect-nonce'] ), 'wcj-redirect' ) : false;
 
 
 
26
  if ( $wpnonce && isset( $_GET['page'] ) && 'jetpack-getting-started' === $_GET['page'] ) {
27
  add_action(
28
  'in_admin_header',
70
  /**
71
  * Wcj_redirect_to_getting_started.
72
  *
73
+ * @version 5.6.8
74
  */
75
  public function wcj_redirect_to_getting_started() {
76
+ $wpnonce = isset( $_REQUEST['wcj-redirect-nonce'] ) ? wp_verify_nonce( sanitize_key( $_REQUEST['wcj-redirect-nonce'] ), 'wcj-redirect' ) : false;
77
+ if ( ! get_transient( '_wcj_activation_redirect' ) || isset( $_GET['wcj-redirect'] ) || $wpnonce ) {
 
 
 
78
  return;
79
  }
80
 
81
  delete_transient( '_wcj_activation_redirect' );
82
 
83
+ $redirect = admin_url( 'index.php?page=jetpack-getting-started&wcj-redirect=1&wcj-redirect-nonce=' . wp_create_nonce( 'wcj-redirect' ) );
84
  wp_safe_redirect( $redirect );
85
  exit;
86
  }
includes/admin/wcj-welcome-screen-content.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Welcome Screen Content
4
  *
5
- * @version 5.6.7
6
  * @author Pluggabl LLC.
7
  * @package Booster_For_WooCommerce/admin
8
  */
@@ -18,7 +18,7 @@
18
  <div class="wcj-welcome-content-inner">
19
  <h3> <?php esc_html_e( 'Welcome to booster.', 'woocommerce-jetpack' ); ?> </h3>
20
  <p> <?php esc_html_e( 'Thank you for choosing Booster - Supercharge your WooCommerce site with these awesome powerful features. More than 100 modules. All in one WooCommerce plugin.', 'woocommerce-jetpack' ); ?> </p>
21
- <a href="<?php echo wp_kses_post( admin_url( 'admin.php?page=wc-settings&tab=jetpack' ) ); ?>" class="wcj-buy-puls-btn"> <?php esc_html_e( 'Launch Booster Settings', 'woocommerce-jetpack' ); ?> </a>
22
  </div>
23
  </div>
24
  <div class="wcj-welcome-content-main wcj-welcome-padding-top-0">
2
  /**
3
  * Booster for WooCommerce - Welcome Screen Content
4
  *
5
+ * @version 5.6.8
6
  * @author Pluggabl LLC.
7
  * @package Booster_For_WooCommerce/admin
8
  */
18
  <div class="wcj-welcome-content-inner">
19
  <h3> <?php esc_html_e( 'Welcome to booster.', 'woocommerce-jetpack' ); ?> </h3>
20
  <p> <?php esc_html_e( 'Thank you for choosing Booster - Supercharge your WooCommerce site with these awesome powerful features. More than 100 modules. All in one WooCommerce plugin.', 'woocommerce-jetpack' ); ?> </p>
21
+ <a href="<?php echo wp_kses_post( admin_url( wcj_admin_tab_url() ) ); ?>" class="wcj-buy-puls-btn"> <?php esc_html_e( 'Launch Booster Settings', 'woocommerce-jetpack' ); ?> </a>
22
  </div>
23
  </div>
24
  <div class="wcj-welcome-content-main wcj-welcome-padding-top-0">
includes/class-wcj-admin-bar.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Module - Admin Bar
4
  *
5
- * @version 5.6.1
6
  * @since 2.9.0
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/includes
@@ -131,7 +131,7 @@ if ( ! class_exists( 'WCJ_Admin_Bar' ) ) :
131
  /**
132
  * Get_nodes_booster_modules.
133
  *
134
- * @version 5.6.1
135
  * @since 2.9.0
136
  * @todo (maybe) dashes instead of underscores
137
  * @todo (maybe) dashboard > alphabetically - list all modules
@@ -144,7 +144,7 @@ if ( ! class_exists( 'WCJ_Admin_Bar' ) ) :
144
  foreach ( $cats as $id => $label_info ) {
145
  $nodes[ $id ] = array(
146
  'title' => $label_info['label'],
147
- 'href' => admin_url( 'admin.php?page=wc-settings&tab=jetpack&wcj-cat=' . $id ),
148
  'meta' => array( 'title' => wp_strip_all_tags( $label_info['desc'] ) ),
149
  );
150
  if ( 'dashboard' === $id ) {
@@ -153,19 +153,19 @@ if ( ! class_exists( 'WCJ_Admin_Bar' ) ) :
153
  array(
154
  'alphabetically' => array(
155
  'title' => __( 'Alphabetically', 'woocommerce-jetpack' ),
156
- 'href' => admin_url( 'admin.php?page=wc-settings&tab=jetpack&wcj-cat=dashboard&section=alphabetically' ),
157
  ),
158
  'by_category' => array(
159
  'title' => __( 'By Category', 'woocommerce-jetpack' ),
160
- 'href' => admin_url( 'admin.php?page=wc-settings&tab=jetpack&wcj-cat=dashboard&section=by_category' ),
161
  ),
162
  'active' => array(
163
  'title' => __( 'Active', 'woocommerce-jetpack' ),
164
- 'href' => admin_url( 'admin.php?page=wc-settings&tab=jetpack&wcj-cat=dashboard&section=active' ),
165
  ),
166
  'manager' => array(
167
  'title' => __( 'Manage Settings', 'woocommerce-jetpack' ),
168
- 'href' => admin_url( 'admin.php?page=wc-settings&tab=jetpack&wcj-cat=dashboard&section=manager' ),
169
  ),
170
  )
171
  );
@@ -177,12 +177,12 @@ if ( ! class_exists( 'WCJ_Admin_Bar' ) ) :
177
  }
178
  $cat_nodes[ $link_id ] = array(
179
  'title' => w_c_j()->modules[ $link_id ]->short_desc,
180
- 'href' => admin_url( 'admin.php?page=wc-settings&tab=jetpack&wcj-cat=' . $id . '&section=' . $link_id ),
181
  'meta' => array( 'title' => w_c_j()->modules[ $link_id ]->desc ),
182
  'nodes' => array(
183
  'settings' => array(
184
  'title' => __( 'Settings', 'woocommerce-jetpack' ),
185
- 'href' => admin_url( 'admin.php?page=wc-settings&tab=jetpack&wcj-cat=' . $id . '&section=' . $link_id ),
186
  ),
187
  'docs' => array(
188
  'title' => __( 'Documentation', 'woocommerce-jetpack' ),
@@ -251,7 +251,7 @@ if ( ! class_exists( 'WCJ_Admin_Bar' ) ) :
251
  /**
252
  * Add_booster_active_admin_bar.
253
  *
254
- * @version 3.9.0
255
  * @since 3.1.0
256
  * @param string $wp_admin_bar defines the wp_admin_bar.
257
  */
@@ -273,7 +273,7 @@ if ( ! class_exists( 'WCJ_Admin_Bar' ) ) :
273
  $nodes = array(
274
  'booster-active' => array(
275
  'title' => '<span class="ab-icon"></span>' . __( 'Booster: Active', 'woocommerce-jetpack' ),
276
- 'href' => admin_url( 'admin.php?page=wc-settings&tab=jetpack&wcj-cat=dashboard&section=active' ),
277
  'meta' => array(
278
  'title' => __( 'Booster - Active', 'woocommerce-jetpack' ),
279
  ),
@@ -286,7 +286,7 @@ if ( ! class_exists( 'WCJ_Admin_Bar' ) ) :
286
  /**
287
  * Add_booster_admin_bar.
288
  *
289
- * @version 3.6.0
290
  * @since 2.9.0
291
  * @param string $wp_admin_bar defines the wp_admin_bar.
292
  */
@@ -297,14 +297,14 @@ if ( ! class_exists( 'WCJ_Admin_Bar' ) ) :
297
  $nodes = array(
298
  'booster' => array(
299
  'title' => '<span class="ab-icon"></span>' . __( 'Booster', 'woocommerce-jetpack' ),
300
- 'href' => admin_url( 'admin.php?page=wc-settings&tab=jetpack' ),
301
  'meta' => array(
302
  'title' => __( 'Booster - Settings', 'woocommerce-jetpack' ),
303
  ),
304
  'nodes' => array(
305
  'modules' => array(
306
  'title' => __( 'Modules', 'woocommerce-jetpack' ),
307
- 'href' => admin_url( 'admin.php?page=wc-settings&tab=jetpack' ),
308
  'nodes' => $this->get_nodes_booster_modules(),
309
  ),
310
  'tools' => array(
2
  /**
3
  * Booster for WooCommerce - Module - Admin Bar
4
  *
5
+ * @version 5.6.8
6
  * @since 2.9.0
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/includes
131
  /**
132
  * Get_nodes_booster_modules.
133
  *
134
+ * @version 5.6.8
135
  * @since 2.9.0
136
  * @todo (maybe) dashes instead of underscores
137
  * @todo (maybe) dashboard > alphabetically - list all modules
144
  foreach ( $cats as $id => $label_info ) {
145
  $nodes[ $id ] = array(
146
  'title' => $label_info['label'],
147
+ 'href' => admin_url( wcj_admin_tab_url() . '&wcj-cat=' . $id ),
148
  'meta' => array( 'title' => wp_strip_all_tags( $label_info['desc'] ) ),
149
  );
150
  if ( 'dashboard' === $id ) {
153
  array(
154
  'alphabetically' => array(
155
  'title' => __( 'Alphabetically', 'woocommerce-jetpack' ),
156
+ 'href' => admin_url( wcj_admin_tab_url() . '&wcj-cat=dashboard&section=alphabetically' ),
157
  ),
158
  'by_category' => array(
159
  'title' => __( 'By Category', 'woocommerce-jetpack' ),
160
+ 'href' => admin_url( wcj_admin_tab_url() . '&wcj-cat=dashboard&section=by_category' ),
161
  ),
162
  'active' => array(
163
  'title' => __( 'Active', 'woocommerce-jetpack' ),
164
+ 'href' => admin_url( wcj_admin_tab_url() . '&wcj-cat=dashboard&section=active' ),
165
  ),
166
  'manager' => array(
167
  'title' => __( 'Manage Settings', 'woocommerce-jetpack' ),
168
+ 'href' => admin_url( wcj_admin_tab_url() . '&wcj-cat=dashboard&section=manager' ),
169
  ),
170
  )
171
  );
177
  }
178
  $cat_nodes[ $link_id ] = array(
179
  'title' => w_c_j()->modules[ $link_id ]->short_desc,
180
+ 'href' => admin_url( wcj_admin_tab_url() . '&wcj-cat=' . $id . '&section=' . $link_id ),
181
  'meta' => array( 'title' => w_c_j()->modules[ $link_id ]->desc ),
182
  'nodes' => array(
183
  'settings' => array(
184
  'title' => __( 'Settings', 'woocommerce-jetpack' ),
185
+ 'href' => admin_url( wcj_admin_tab_url() . '&wcj-cat=' . $id . '&section=' . $link_id ),
186
  ),
187
  'docs' => array(
188
  'title' => __( 'Documentation', 'woocommerce-jetpack' ),
251
  /**
252
  * Add_booster_active_admin_bar.
253
  *
254
+ * @version 5.6.8
255
  * @since 3.1.0
256
  * @param string $wp_admin_bar defines the wp_admin_bar.
257
  */
273
  $nodes = array(
274
  'booster-active' => array(
275
  'title' => '<span class="ab-icon"></span>' . __( 'Booster: Active', 'woocommerce-jetpack' ),
276
+ 'href' => admin_url( wcj_admin_tab_url() . 'wcj-cat=dashboard&section=active' ),
277
  'meta' => array(
278
  'title' => __( 'Booster - Active', 'woocommerce-jetpack' ),
279
  ),
286
  /**
287
  * Add_booster_admin_bar.
288
  *
289
+ * @version 5.6.8
290
  * @since 2.9.0
291
  * @param string $wp_admin_bar defines the wp_admin_bar.
292
  */
297
  $nodes = array(
298
  'booster' => array(
299
  'title' => '<span class="ab-icon"></span>' . __( 'Booster', 'woocommerce-jetpack' ),
300
+ 'href' => admin_url( wcj_admin_tab_url() ),
301
  'meta' => array(
302
  'title' => __( 'Booster - Settings', 'woocommerce-jetpack' ),
303
  ),
304
  'nodes' => array(
305
  'modules' => array(
306
  'title' => __( 'Modules', 'woocommerce-jetpack' ),
307
+ 'href' => admin_url( wcj_admin_tab_url() ),
308
  'nodes' => $this->get_nodes_booster_modules(),
309
  ),
310
  'tools' => array(
includes/class-wcj-admin-orders-list.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Module - Admin Orders List
4
  *
5
- * @version 5.6.7
6
  * @since 3.2.4
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/includes
@@ -80,7 +80,7 @@ if ( ! class_exists( 'WCJ_Admin_Orders_List' ) ) :
80
  /**
81
  * Admin_menu_multiple_status.
82
  *
83
- * @version 3.7.0
84
  * @since 3.7.0
85
  * @todo add presets as links (same as "Not completed" link)
86
  * @todo fix: custom (i.e. presets) menus are not highlighted
@@ -108,7 +108,7 @@ if ( ! class_exists( 'WCJ_Admin_Orders_List' ) ) :
108
  foreach ( $statuses[ $i ] as $x => $status ) {
109
  $order_count += wc_orders_count( substr( $status, 3 ) );
110
  }
111
- $orders_count_html = ' <span class="awaiting-mod update-plugins count-' . esc_attr( $order_count ) . ' wcj-order-count-wrapper"><span class="wcj-order-count">' . number_format_i18n( $order_count ) . '</span></span>'; // WPCS: override ok.
112
  }
113
  add_submenu_page( 'woocommerce', $titles[ $i ], $titles[ $i ] . $orders_count_html, 'edit_shop_orders', $menu_slug );
114
  }
@@ -231,17 +231,14 @@ if ( ! class_exists( 'WCJ_Admin_Orders_List' ) ) :
231
  /**
232
  * Filter_shop_order_multiple_statuses_not_completed_link.
233
  *
234
- * @version 5.6.7
235
  * @since 2.5.7
236
  * @param string $query defines the query.
237
  */
238
  public function filter_shop_order_multiple_statuses_not_completed_link( $query ) {
239
  if ( isset( $_SERVER['REQUEST_URI'] ) && false !== strpos( sanitize_text_field( wp_unslash( $_SERVER['REQUEST_URI'] ) ), '/wp-admin/edit.php' ) && isset( $_GET['post_type'] ) && 'shop_order' === $_GET['post_type'] ) {
240
  if ( wcj_current_user_can( 'edit_others_pages' ) ) {
241
- $wpnonce = false;
242
- if ( function_exists( 'wp_verify_nonce' ) ) {
243
- $wpnonce = isset( $_REQUEST['multiple_statuses_not_completed_link_nonce'] ) ? wp_verify_nonce( sanitize_key( isset( $_REQUEST['multiple_statuses_not_completed_link_nonce'] ) ? $_REQUEST['multiple_statuses_not_completed_link_nonce'] : '' ), 'multiple_statuses_not_completed_link_nonce' ) : false;
244
- }
245
  if ( $wpnonce && isset( $_GET['post_status'] ) && false !== strpos( sanitize_text_field( wp_unslash( $_GET['post_status'] ) ), ',' ) ) {
246
  $post_statuses = explode( ',', sanitize_text_field( wp_unslash( $_GET['post_status'] ) ) );
247
  $query->query['post_status'] = $post_statuses;
@@ -300,7 +297,7 @@ if ( ! class_exists( 'WCJ_Admin_Orders_List' ) ) :
300
  /**
301
  * Filter_shop_order_multiple_statuses.
302
  *
303
- * @version 5.6.7
304
  * @since 2.5.7
305
  * @param string $query defines the query.
306
  */
@@ -308,7 +305,7 @@ if ( ! class_exists( 'WCJ_Admin_Orders_List' ) ) :
308
  if ( isset( $_SERVER['REQUEST_URI'] ) && ( false !== strpos( sanitize_text_field( wp_unslash( $_SERVER['REQUEST_URI'] ) ), '/wp-admin/edit.php' ) && isset( $_GET['post_type'] ) && 'shop_order' === $_GET['post_type'] ) ) {
309
  if ( wcj_current_user_can( 'edit_others_pages' ) ) {
310
  if ( isset( $_GET['wcj_admin_filter_statuses'] ) ) {
311
- $wpnonce = isset( $_REQUEST['wcj_admin_filter_statuses_nonce'] ) ? wp_verify_nonce( sanitize_key( isset( $_REQUEST['wcj_admin_filter_statuses_nonce'] ) ? $_REQUEST['wcj_admin_filter_statuses_nonce'] : '' ), 'wcj_admin_filter_statuses_nonce' ) : false;
312
  if ( $wpnonce ) {
313
  $post_statuses = array_map( 'sanitize_text_field', wp_unslash( $_GET['wcj_admin_filter_statuses'] ) );
314
  $query->query['post_status'] = $post_statuses;
@@ -322,7 +319,7 @@ if ( ! class_exists( 'WCJ_Admin_Orders_List' ) ) :
322
  /**
323
  * Filter the orders in admin based on options.
324
  *
325
- * @version 5.6.2
326
  * @access public
327
  * @param mixed $query defines the query.
328
  * @return void
@@ -332,37 +329,32 @@ if ( ! class_exists( 'WCJ_Admin_Orders_List' ) ) :
332
  if ( 'shop_order' !== $typenow ) {
333
  return;
334
  }
335
- $wpnonce = true;
336
- if ( function_exists( 'wp_verify_nonce' ) ) {
337
- $wpnonce = isset( $_REQUEST['_wpnonce'] ) ? wp_verify_nonce( sanitize_key( isset( $_REQUEST['_wpnonce'] ) ? $_REQUEST['_wpnonce'] : '' ), 'woocommerce-settings' ) : true;
338
- }
339
- if ( $wpnonce && 'yes' === wcj_get_option( 'wcj_orders_list_custom_columns_country', 'no' ) && isset( $_GET['country'] ) && 'all' !== $_GET['country'] ) {
340
  $query->query_vars['meta_query'][] = array(
341
  'key' => '_billing_country',
342
  'value' => sanitize_text_field( wp_unslash( $_GET['country'] ) ),
343
  );
344
  }
345
- if ( $wpnonce && 'yes' === wcj_get_option( 'wcj_orders_list_custom_columns_currency', 'no' ) && isset( $_GET['currency'] ) && 'all' !== $_GET['currency'] ) {
346
  $query->query_vars['meta_query'][] = array(
347
  'key' => '_order_currency',
348
  'value' => sanitize_text_field( wp_unslash( $_GET['currency'] ) ),
349
  );
350
  }
 
351
  }
352
 
353
  /**
354
  * Filters for post types.
355
  *
356
- * @version 5.6.2
357
  */
358
  public function restrict_manage_posts() {
359
  global $typenow, $wp_query;
360
  if ( in_array( $typenow, wc_get_order_types( 'order-meta-boxes' ), true ) ) {
361
- $wpnonce = true;
362
- if ( function_exists( 'wp_verify_nonce' ) ) {
363
- $wpnonce = isset( $_REQUEST['_wpnonce'] ) ? wp_verify_nonce( sanitize_key( isset( $_REQUEST['_wpnonce'] ) ? $_REQUEST['_wpnonce'] : '' ), 'woocommerce-settings' ) : true;
364
- }
365
- if ( $wpnonce && 'yes' === wcj_get_option( 'wcj_orders_list_custom_columns_country', 'no' ) ) {
366
  $selected_coutry = isset( $_GET['country'] ) ? sanitize_text_field( wp_unslash( $_GET['country'] ) ) : 'all';
367
  $countries = array_merge( array( 'all' => __( 'All countries', 'woocommerce-jetpack' ) ), wcj_get_countries() );
368
  echo '<select id="country" name="country">';
@@ -371,7 +363,7 @@ if ( ! class_exists( 'WCJ_Admin_Orders_List' ) ) :
371
  }
372
  echo '</select>';
373
  }
374
- if ( $wpnonce && 'yes' === wcj_get_option( 'wcj_orders_list_custom_columns_currency', 'no' ) ) {
375
  $selected_currency = isset( $_GET['currency'] ) ? sanitize_text_field( wp_unslash( $_GET['currency'] ) ) : 'all';
376
  $currencies = array_merge( array( 'all' => __( 'All currencies', 'woocommerce-jetpack' ) ), wcj_get_woocommerce_currencies_and_symbols() );
377
  echo '<select id="currency" name="currency">';
@@ -380,6 +372,7 @@ if ( ! class_exists( 'WCJ_Admin_Orders_List' ) ) :
380
  }
381
  echo '</select>';
382
  }
 
383
  }
384
  }
385
 
2
  /**
3
  * Booster for WooCommerce - Module - Admin Orders List
4
  *
5
+ * @version 5.6.8
6
  * @since 3.2.4
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/includes
80
  /**
81
  * Admin_menu_multiple_status.
82
  *
83
+ * @version 5.6.8
84
  * @since 3.7.0
85
  * @todo add presets as links (same as "Not completed" link)
86
  * @todo fix: custom (i.e. presets) menus are not highlighted
108
  foreach ( $statuses[ $i ] as $x => $status ) {
109
  $order_count += wc_orders_count( substr( $status, 3 ) );
110
  }
111
+ $orders_count_html = ' <span class="awaiting-mod update-plugins count-' . esc_attr( $order_count ) . ' wcj-order-count-wrapper"><span class="wcj-order-count">' . number_format_i18n( $order_count ) . '</span></span>';
112
  }
113
  add_submenu_page( 'woocommerce', $titles[ $i ], $titles[ $i ] . $orders_count_html, 'edit_shop_orders', $menu_slug );
114
  }
231
  /**
232
  * Filter_shop_order_multiple_statuses_not_completed_link.
233
  *
234
+ * @version 5.6.8
235
  * @since 2.5.7
236
  * @param string $query defines the query.
237
  */
238
  public function filter_shop_order_multiple_statuses_not_completed_link( $query ) {
239
  if ( isset( $_SERVER['REQUEST_URI'] ) && false !== strpos( sanitize_text_field( wp_unslash( $_SERVER['REQUEST_URI'] ) ), '/wp-admin/edit.php' ) && isset( $_GET['post_type'] ) && 'shop_order' === $_GET['post_type'] ) {
240
  if ( wcj_current_user_can( 'edit_others_pages' ) ) {
241
+ $wpnonce = isset( $_REQUEST['multiple_statuses_not_completed_link_nonce'] ) ? wp_verify_nonce( sanitize_key( $_REQUEST['multiple_statuses_not_completed_link_nonce'] ), 'multiple_statuses_not_completed_link_nonce' ) : false;
 
 
 
242
  if ( $wpnonce && isset( $_GET['post_status'] ) && false !== strpos( sanitize_text_field( wp_unslash( $_GET['post_status'] ) ), ',' ) ) {
243
  $post_statuses = explode( ',', sanitize_text_field( wp_unslash( $_GET['post_status'] ) ) );
244
  $query->query['post_status'] = $post_statuses;
297
  /**
298
  * Filter_shop_order_multiple_statuses.
299
  *
300
+ * @version 5.6.8
301
  * @since 2.5.7
302
  * @param string $query defines the query.
303
  */
305
  if ( isset( $_SERVER['REQUEST_URI'] ) && ( false !== strpos( sanitize_text_field( wp_unslash( $_SERVER['REQUEST_URI'] ) ), '/wp-admin/edit.php' ) && isset( $_GET['post_type'] ) && 'shop_order' === $_GET['post_type'] ) ) {
306
  if ( wcj_current_user_can( 'edit_others_pages' ) ) {
307
  if ( isset( $_GET['wcj_admin_filter_statuses'] ) ) {
308
+ $wpnonce = isset( $_REQUEST['wcj_admin_filter_statuses_nonce'] ) ? wp_verify_nonce( sanitize_key( $_REQUEST['wcj_admin_filter_statuses_nonce'] ), 'wcj_admin_filter_statuses_nonce' ) : false;
309
  if ( $wpnonce ) {
310
  $post_statuses = array_map( 'sanitize_text_field', wp_unslash( $_GET['wcj_admin_filter_statuses'] ) );
311
  $query->query['post_status'] = $post_statuses;
319
  /**
320
  * Filter the orders in admin based on options.
321
  *
322
+ * @version 5.6.8
323
  * @access public
324
  * @param mixed $query defines the query.
325
  * @return void
329
  if ( 'shop_order' !== $typenow ) {
330
  return;
331
  }
332
+ // phpcs:disable WordPress.Security.NonceVerification
333
+ if ( 'yes' === wcj_get_option( 'wcj_orders_list_custom_columns_country', 'no' ) && isset( $_GET['country'] ) && 'all' !== $_GET['country'] ) {
 
 
 
334
  $query->query_vars['meta_query'][] = array(
335
  'key' => '_billing_country',
336
  'value' => sanitize_text_field( wp_unslash( $_GET['country'] ) ),
337
  );
338
  }
339
+ if ( 'yes' === wcj_get_option( 'wcj_orders_list_custom_columns_currency', 'no' ) && isset( $_GET['currency'] ) && 'all' !== $_GET['currency'] ) {
340
  $query->query_vars['meta_query'][] = array(
341
  'key' => '_order_currency',
342
  'value' => sanitize_text_field( wp_unslash( $_GET['currency'] ) ),
343
  );
344
  }
345
+ // phpcs:enable WordPress.Security.NonceVerification
346
  }
347
 
348
  /**
349
  * Filters for post types.
350
  *
351
+ * @version 5.6.8
352
  */
353
  public function restrict_manage_posts() {
354
  global $typenow, $wp_query;
355
  if ( in_array( $typenow, wc_get_order_types( 'order-meta-boxes' ), true ) ) {
356
+ // phpcs:disable WordPress.Security.NonceVerification
357
+ if ( 'yes' === wcj_get_option( 'wcj_orders_list_custom_columns_country', 'no' ) ) {
 
 
 
358
  $selected_coutry = isset( $_GET['country'] ) ? sanitize_text_field( wp_unslash( $_GET['country'] ) ) : 'all';
359
  $countries = array_merge( array( 'all' => __( 'All countries', 'woocommerce-jetpack' ) ), wcj_get_countries() );
360
  echo '<select id="country" name="country">';
363
  }
364
  echo '</select>';
365
  }
366
+ if ( 'yes' === wcj_get_option( 'wcj_orders_list_custom_columns_currency', 'no' ) ) {
367
  $selected_currency = isset( $_GET['currency'] ) ? sanitize_text_field( wp_unslash( $_GET['currency'] ) ) : 'all';
368
  $currencies = array_merge( array( 'all' => __( 'All currencies', 'woocommerce-jetpack' ) ), wcj_get_woocommerce_currencies_and_symbols() );
369
  echo '<select id="currency" name="currency">';
372
  }
373
  echo '</select>';
374
  }
375
+ // phpcs:enable WordPress.Security.NonceVerification
376
  }
377
  }
378
 
includes/class-wcj-admin-tools.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Module - Admin Tools
4
  *
5
- * @version 5.6.7
6
  * @author Pluggabl LLC.
7
  * @package Booster_For_WooCommerce/includes
8
  */
@@ -212,7 +212,7 @@ if ( ! class_exists( 'WCJ_Admin_Tools' ) ) :
212
  /**
213
  * Create_meta_meta_box.
214
  *
215
- * @version 5.6.2
216
  * @since 2.5.8
217
  * @param string $post defines the post.
218
  */
@@ -223,7 +223,9 @@ if ( ! class_exists( 'WCJ_Admin_Tools' ) ) :
223
  $meta = get_post_meta( $post_id );
224
  $table_data = array();
225
  foreach ( $meta as $meta_key => $meta_values ) {
226
- $table_data[] = array( $meta_key, esc_html( print_r( maybe_unserialize( $meta_values[0] ), true ) ) ); // phpcs:ignore
 
 
227
  }
228
  $html .= wcj_get_table_html(
229
  $table_data,
@@ -238,7 +240,9 @@ if ( ! class_exists( 'WCJ_Admin_Tools' ) ) :
238
  $table_data = array();
239
  foreach ( $_order->get_items() as $item_key => $item ) {
240
  foreach ( $item['item_meta'] as $item_meta_key => $item_meta_value ) {
241
- $table_data[] = array( $item_key, $item_meta_key, wp_kses_post( maybe_unserialize( $item_meta_value ), true ) );
 
 
242
  }
243
  }
244
  if ( ! empty( $table_data ) ) {
2
  /**
3
  * Booster for WooCommerce - Module - Admin Tools
4
  *
5
+ * @version 5.6.8
6
  * @author Pluggabl LLC.
7
  * @package Booster_For_WooCommerce/includes
8
  */
212
  /**
213
  * Create_meta_meta_box.
214
  *
215
+ * @version 5.6.8
216
  * @since 2.5.8
217
  * @param string $post defines the post.
218
  */
223
  $meta = get_post_meta( $post_id );
224
  $table_data = array();
225
  foreach ( $meta as $meta_key => $meta_values ) {
226
+ $meta_value = maybe_unserialize( $meta_values[0] );
227
+ $meta_value = is_array( $meta_value ) ? wp_json_encode( $meta_value ) : $meta_value;
228
+ $table_data[] = array( $meta_key, esc_html( $meta_value ) );
229
  }
230
  $html .= wcj_get_table_html(
231
  $table_data,
240
  $table_data = array();
241
  foreach ( $_order->get_items() as $item_key => $item ) {
242
  foreach ( $item['item_meta'] as $item_meta_key => $item_meta_value ) {
243
+ $item_meta_value = maybe_unserialize( $item_meta_value );
244
+ $item_meta_value = is_array( $item_meta_value ) ? wp_json_encode( $item_meta_value ) : $item_meta_value;
245
+ $table_data[] = array( $item_key, $item_meta_key, $item_meta_value );
246
  }
247
  }
248
  if ( ! empty( $table_data ) ) {
includes/class-wcj-checkout-custom-fields.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Module - Checkout Custom Fields
4
  *
5
- * @version 5.6.7
6
  * @author Pluggabl LLC.
7
  * @package Booster_For_WooCommerce/includes
8
  */
@@ -405,14 +405,13 @@ if ( ! class_exists( 'WCJ_Checkout_Custom_Fields' ) ) :
405
  /**
406
  * Add_woocommerce_admin_fields.
407
  *
408
- * @version 5.6.7
409
  * @todo converting from before version 2.3.0: section?
410
  * @todo add alternative way of displaying fields (e.g. new meta box), so we have more control over displaying fields' values (e.g. line breaks)
411
  * @param string $fields defines the fields.
412
  * @param string $section defines the section.
413
  */
414
  public function add_woocommerce_admin_fields( $fields, $section ) {
415
- $wpnonce = isset( $_REQUEST['_wpnonce'] ) ? wp_verify_nonce( sanitize_key( $_REQUEST['_wpnonce'] ), '' ) : false;
416
  for ( $i = 1; $i <= $this->wcj_checkout_custom_fields_total_number; $i++ ) {
417
  if ( 'yes' === wcj_get_option( 'wcj_checkout_custom_field_enabled_' . $i ) ) {
418
  $the_section = wcj_get_option( 'wcj_checkout_custom_field_section_' . $i );
@@ -478,6 +477,7 @@ if ( ! class_exists( 'WCJ_Checkout_Custom_Fields' ) ) :
478
  update_post_meta( get_the_ID(), '_' . $section . '_' . $the_key_label, $the_meta['label'] );
479
  }
480
  }
 
481
  if ( ! isset( $_POST[ '_' . $section . '_' . $the_key ] ) ) {
482
  $fields[ $the_key ] = array(
483
  'type' => $the_type,
@@ -504,6 +504,7 @@ if ( ! class_exists( 'WCJ_Checkout_Custom_Fields' ) ) :
504
  $fields[ $the_key ]['options'] = $options;
505
  }
506
  }
 
507
  }
508
  }
509
  return $fields;
2
  /**
3
  * Booster for WooCommerce - Module - Checkout Custom Fields
4
  *
5
+ * @version 5.6.8
6
  * @author Pluggabl LLC.
7
  * @package Booster_For_WooCommerce/includes
8
  */
405
  /**
406
  * Add_woocommerce_admin_fields.
407
  *
408
+ * @version 5.6.8
409
  * @todo converting from before version 2.3.0: section?
410
  * @todo add alternative way of displaying fields (e.g. new meta box), so we have more control over displaying fields' values (e.g. line breaks)
411
  * @param string $fields defines the fields.
412
  * @param string $section defines the section.
413
  */
414
  public function add_woocommerce_admin_fields( $fields, $section ) {
 
415
  for ( $i = 1; $i <= $this->wcj_checkout_custom_fields_total_number; $i++ ) {
416
  if ( 'yes' === wcj_get_option( 'wcj_checkout_custom_field_enabled_' . $i ) ) {
417
  $the_section = wcj_get_option( 'wcj_checkout_custom_field_section_' . $i );
477
  update_post_meta( get_the_ID(), '_' . $section . '_' . $the_key_label, $the_meta['label'] );
478
  }
479
  }
480
+ // phpcs:disable WordPress.Security.NonceVerification
481
  if ( ! isset( $_POST[ '_' . $section . '_' . $the_key ] ) ) {
482
  $fields[ $the_key ] = array(
483
  'type' => $the_type,
504
  $fields[ $the_key ]['options'] = $options;
505
  }
506
  }
507
+ // phpcs:enable WordPress.Security.NonceVerification
508
  }
509
  }
510
  return $fields;
includes/class-wcj-checkout-files-upload.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Module - Checkout Files Upload
4
  *
5
- * @version 5.6.7
6
  * @since 2.4.5
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/includes
@@ -424,7 +424,7 @@ if ( ! class_exists( 'WCJ_Checkout_Files_Upload' ) ) :
424
  /**
425
  * Process_checkout_files_upload.
426
  *
427
- * @version 5.6.7
428
  * @since 2.4.5
429
  * @todo add option for admin to delete files one by one (i.e. not all at once)
430
  * @todo `$this->additional_admin_emails_settings` - more customization options, e.g.: admin email, subject, content, from
@@ -653,9 +653,9 @@ if ( ! class_exists( 'WCJ_Checkout_Files_Upload' ) ) :
653
  $real_base_path = realpath( wcj_get_wcj_uploads_dir( 'checkout_files_upload' ) ) . DIRECTORY_SEPARATOR;
654
 
655
  if ( false === $real_file_path || 0 !== strpos( $real_file_path, $real_base_path ) ) {
656
- continue;
657
  } else {
658
- unlink( $tmp_file_name );
659
  }
660
  }
661
  delete_post_meta( $order_id, '_wcj_checkout_files_upload_' . $i );
2
  /**
3
  * Booster for WooCommerce - Module - Checkout Files Upload
4
  *
5
+ * @version 5.6.8
6
  * @since 2.4.5
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/includes
424
  /**
425
  * Process_checkout_files_upload.
426
  *
427
+ * @version 5.6.8
428
  * @since 2.4.5
429
  * @todo add option for admin to delete files one by one (i.e. not all at once)
430
  * @todo `$this->additional_admin_emails_settings` - more customization options, e.g.: admin email, subject, content, from
653
  $real_base_path = realpath( wcj_get_wcj_uploads_dir( 'checkout_files_upload' ) ) . DIRECTORY_SEPARATOR;
654
 
655
  if ( false === $real_file_path || 0 !== strpos( $real_file_path, $real_base_path ) ) {
656
+ continue;
657
  } else {
658
+ unlink( $tmp_file_name );
659
  }
660
  }
661
  delete_post_meta( $order_id, '_wcj_checkout_files_upload_' . $i );
includes/class-wcj-coupon-by-user-role.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Module - Coupon by User Role
4
  *
5
- * @version 5.6.2
6
  * @since 3.6.0
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/includes
@@ -68,7 +68,7 @@ if ( ! class_exists( 'WCJ_Coupon_By_User_Role' ) ) :
68
  /**
69
  * Coupon_valid.
70
  *
71
- * @version 3.6.0
72
  * @since 3.6.0
73
  * @todo (maybe) check if `$coupon->get_id()` is working in WC below v3.0.0
74
  * @param string | bool $valid defines the valid.
@@ -96,7 +96,6 @@ if ( ! class_exists( 'WCJ_Coupon_By_User_Role' ) ) :
96
  ),
97
  10000
98
  );
99
- return false; // phpcs:ignore
100
  }
101
  return $valid;
102
  }
2
  /**
3
  * Booster for WooCommerce - Module - Coupon by User Role
4
  *
5
+ * @version 5.6.8
6
  * @since 3.6.0
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/includes
68
  /**
69
  * Coupon_valid.
70
  *
71
+ * @version 5.6.8
72
  * @since 3.6.0
73
  * @todo (maybe) check if `$coupon->get_id()` is working in WC below v3.0.0
74
  * @param string | bool $valid defines the valid.
96
  ),
97
  10000
98
  );
 
99
  }
100
  return $valid;
101
  }
includes/class-wcj-coupon-code-generator.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Module - Coupon Code Generator
4
  *
5
- * @version 5.6.2
6
  * @since 3.2.3
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/includes
@@ -47,20 +47,17 @@ if ( ! class_exists( 'WCJ_Coupon_Code_Generator' ) ) :
47
  /**
48
  * Enqueue_generate_coupon_code_script.
49
  *
50
- * @version 5.6.2
51
  * @since 3.1.3
52
  */
53
  public function enqueue_generate_coupon_code_script() {
54
  global $pagenow;
55
-
56
- $wpnonce = true;
57
- if ( function_exists( 'wp_verify_nonce' ) ) {
58
- $wpnonce = isset( $_REQUEST['_wpnonce'] ) ? wp_verify_nonce( sanitize_key( isset( $_REQUEST['_wpnonce'] ) ? $_REQUEST['_wpnonce'] : '' ) ) : true;
59
- }
60
- if ( 'post-new.php' === $pagenow && isset( $_GET['post_type'] ) && 'shop_coupon' === $_GET['post_type'] && $wpnonce ) {
61
  wp_enqueue_script( 'wcj-coupons-code-generator', wcj_plugin_url() . '/includes/js/wcj-coupons-code-generator.js', array( 'jquery' ), w_c_j()->version, true );
62
  wp_localize_script( 'wcj-coupons-code-generator', 'ajax_object', array( 'ajax_url' => admin_url( 'admin-ajax.php' ) ) );
63
  }
 
64
  }
65
 
66
  /**
2
  /**
3
  * Booster for WooCommerce - Module - Coupon Code Generator
4
  *
5
+ * @version 5.6.8
6
  * @since 3.2.3
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/includes
47
  /**
48
  * Enqueue_generate_coupon_code_script.
49
  *
50
+ * @version 5.6.8
51
  * @since 3.1.3
52
  */
53
  public function enqueue_generate_coupon_code_script() {
54
  global $pagenow;
55
+ // phpcs:disable WordPress.Security.NonceVerification
56
+ if ( ! empty( $_GET ) && 'post-new.php' === $pagenow && isset( $_GET['post_type'] ) && 'shop_coupon' === $_GET['post_type'] ) {
 
 
 
 
57
  wp_enqueue_script( 'wcj-coupons-code-generator', wcj_plugin_url() . '/includes/js/wcj-coupons-code-generator.js', array( 'jquery' ), w_c_j()->version, true );
58
  wp_localize_script( 'wcj-coupons-code-generator', 'ajax_object', array( 'ajax_url' => admin_url( 'admin-ajax.php' ) ) );
59
  }
60
+ // phpcs:enable WordPress.Security.NonceVerification
61
  }
62
 
63
  /**
includes/class-wcj-cross-sells.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Module - Cross-sells
4
  *
5
- * @version 5.6.2
6
  * @since 3.5.3
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/includes
@@ -35,7 +35,7 @@ if ( ! class_exists( 'WCJ_Cross_Sells' ) ) :
35
  /* translators: %s: translation added */
36
  __( 'You can also use %1$s shortcode to display cross-sells anywhere on your site, for example on checkout page with %2$s module.', 'woocommerce-jetpack' ),
37
  '<code>[wcj_cross_sell_display]</code>',
38
- '<a href="' . admin_url( 'admin.php?page=wc-settings&tab=jetpack&wcj-cat=cart_and_checkout&section=checkout_custom_info' ) . '">' .
39
  __( 'Checkout Custom Info', 'woocommerce-jetpack' ) . '</a>'
40
  );
41
  $this->desc = __( 'Customize cross-sells products display. Global Cross-sells (Plus); Exclude "Not in Stock" Products (Plus); Replace Cart Products with Cross-sells (Plus).', 'woocommerce-jetpack' );
@@ -75,7 +75,7 @@ if ( ! class_exists( 'WCJ_Cross_Sells' ) ) :
75
  /**
76
  * Replace_with_cross_sells_to_url.
77
  *
78
- * @version 5.6.2
79
  * @since 3.9.0
80
  * @todo [dev] re-check variable products
81
  * @param string $url defines the url.
@@ -94,7 +94,15 @@ if ( ! class_exists( 'WCJ_Cross_Sells' ) ) :
94
  }
95
  }
96
  if ( ! empty( $product_ids_to_remove ) ) {
97
- $url = esc_url( add_query_arg( array( 'wcj-remove-from-cart' => implode( ',', array_unique( $product_ids_to_remove ) ) ), $url ) );
 
 
 
 
 
 
 
 
98
  }
99
  }
100
  return $url;
@@ -103,17 +111,13 @@ if ( ! class_exists( 'WCJ_Cross_Sells' ) ) :
103
  /**
104
  * Remove_from_cart_by_product_id.
105
  *
106
- * @version 5.6.2
107
  * @since 3.9.0
108
  * @todo [dev] AJAX
109
  */
110
  public function remove_from_cart_by_product_id() {
111
  $_cart = WC()->cart;
112
- $wpnonce = true;
113
- if ( function_exists( 'wp_verify_nonce' ) ) {
114
- $wpnonce = isset( $_REQUEST['_wpnonce'] ) ? wp_verify_nonce( sanitize_key( isset( $_REQUEST['_wpnonce'] ) ? $_REQUEST['_wpnonce'] : '' ) ) : true;
115
- }
116
-
117
  if ( isset( $_GET['wcj-remove-from-cart'] ) && $wpnonce ) {
118
  if ( isset( $_cart ) ) {
119
  $product_ids_to_remove = explode( ',', sanitize_text_field( wp_unslash( $_GET['wcj-remove-from-cart'] ) ) );
@@ -123,7 +127,7 @@ if ( ! class_exists( 'WCJ_Cross_Sells' ) ) :
123
  }
124
  }
125
  }
126
- wp_safe_redirect( remove_query_arg( 'wcj-remove-from-cart' ) );
127
  exit;
128
  }
129
  }
2
  /**
3
  * Booster for WooCommerce - Module - Cross-sells
4
  *
5
+ * @version 5.6.8
6
  * @since 3.5.3
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/includes
35
  /* translators: %s: translation added */
36
  __( 'You can also use %1$s shortcode to display cross-sells anywhere on your site, for example on checkout page with %2$s module.', 'woocommerce-jetpack' ),
37
  '<code>[wcj_cross_sell_display]</code>',
38
+ '<a href="' . admin_url( wcj_admin_tab_url() . '&wcj-cat=cart_and_checkout&section=checkout_custom_info' ) . '">' .
39
  __( 'Checkout Custom Info', 'woocommerce-jetpack' ) . '</a>'
40
  );
41
  $this->desc = __( 'Customize cross-sells products display. Global Cross-sells (Plus); Exclude "Not in Stock" Products (Plus); Replace Cart Products with Cross-sells (Plus).', 'woocommerce-jetpack' );
75
  /**
76
  * Replace_with_cross_sells_to_url.
77
  *
78
+ * @version 5.6.8
79
  * @since 3.9.0
80
  * @todo [dev] re-check variable products
81
  * @param string $url defines the url.
94
  }
95
  }
96
  if ( ! empty( $product_ids_to_remove ) ) {
97
+ $url = esc_url_raw(
98
+ add_query_arg(
99
+ array(
100
+ 'wcj-remove-from-cart' => implode( ',', array_unique( $product_ids_to_remove ) ),
101
+ 'wcj-remove-from-cart-nonce' => wp_create_nonce( 'wcj-remove-from-cart' ),
102
+ ),
103
+ $url
104
+ )
105
+ );
106
  }
107
  }
108
  return $url;
111
  /**
112
  * Remove_from_cart_by_product_id.
113
  *
114
+ * @version 5.6.8
115
  * @since 3.9.0
116
  * @todo [dev] AJAX
117
  */
118
  public function remove_from_cart_by_product_id() {
119
  $_cart = WC()->cart;
120
+ $wpnonce = isset( $_GET['wcj-remove-from-cart-nonce'] ) ? wp_verify_nonce( sanitize_key( $_GET['wcj-remove-from-cart-nonce'] ), 'wcj-remove-from-cart' ) : false;
 
 
 
 
121
  if ( isset( $_GET['wcj-remove-from-cart'] ) && $wpnonce ) {
122
  if ( isset( $_cart ) ) {
123
  $product_ids_to_remove = explode( ',', sanitize_text_field( wp_unslash( $_GET['wcj-remove-from-cart'] ) ) );
127
  }
128
  }
129
  }
130
+ wp_safe_redirect( remove_query_arg( array( 'wcj-remove-from-cart', 'wcj-remove-from-cart-nonce' ) ) );
131
  exit;
132
  }
133
  }
includes/class-wcj-crowdfunding.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Module - Crowdfunding
4
  *
5
- * @version 5.6.2
6
  * @since 2.2.6
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/includes
@@ -21,7 +21,7 @@ if ( ! class_exists( 'WCJ_Crowdfunding' ) ) :
21
  /**
22
  * Constructor.
23
  *
24
- * @version 5.4.0
25
  * @since 2.2.6
26
  */
27
  public function __construct() {
@@ -43,21 +43,21 @@ if ( ! class_exists( 'WCJ_Crowdfunding' ) ) :
43
  sprintf(
44
  /* translators: %s: translation added */
45
  __( 'Shortcodes could be used for example in <a href="%s">Product Info module</a>.', 'woocommerce-jetpack' ),
46
- admin_url( 'admin.php?page=wc-settings&tab=jetpack&wcj-cat=products&section=product_custom_info' )
47
  ) .
48
  '</li>' .
49
  '<li>' .
50
  sprintf(
51
  /* translators: %s: translation added */
52
  __( 'To change add to cart button labels use <a href="%s">Add to Cart Labels module</a>.', 'woocommerce-jetpack' ),
53
- admin_url( 'admin.php?page=wc-settings&tab=jetpack&wcj-cat=labels&section=add_to_cart' )
54
  ) .
55
  '</li>' .
56
  '<li>' .
57
  sprintf(
58
  /* translators: %s: translation added */
59
  __( 'If you want to allow customers to choose dynamic price, Use <a href="%s">Product Open Pricing (Name Your Price) module</a>.', 'woocommerce-jetpack' ),
60
- admin_url( 'admin.php?page=wc-settings&tab=jetpack&wcj-cat=prices_and_currencies&section=product_open_pricing' )
61
  ) .
62
  '</li>' .
63
  '</ol>';
@@ -75,7 +75,7 @@ if ( ! class_exists( 'WCJ_Crowdfunding' ) ) :
75
  /**
76
  * Check_dates.
77
  *
78
- * @version 5.6.2
79
  * @since 2.2.6
80
  * @param bool $purchasable defines the purchasable.
81
  * @param string | array $_product defines the _product.
@@ -88,10 +88,10 @@ if ( ! class_exists( 'WCJ_Crowdfunding' ) ) :
88
  $end_date_str = get_post_meta( $_product_id, '_wcj_crowdfunding_deadline', true );
89
  $start_date = ( '' !== $start_date_str ) ? strtotime( $start_date_str ) : 0;
90
  $end_date = ( '' !== $end_date_str ) ? strtotime( $end_date_str ) : 0;
91
- if ( $start_date > 0 && ( $start_date - (int) gmdate( 'U' ) ) > 0 ) {
92
  $purchasable = false;
93
  }
94
- if ( $end_date > 0 && ( $end_date - (int) gmdate( 'U' ) ) < 0 ) {
95
  $purchasable = false;
96
  }
97
  }
2
  /**
3
  * Booster for WooCommerce - Module - Crowdfunding
4
  *
5
+ * @version 5.6.8
6
  * @since 2.2.6
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/includes
21
  /**
22
  * Constructor.
23
  *
24
+ * @version 5.6.8
25
  * @since 2.2.6
26
  */
27
  public function __construct() {
43
  sprintf(
44
  /* translators: %s: translation added */
45
  __( 'Shortcodes could be used for example in <a href="%s">Product Info module</a>.', 'woocommerce-jetpack' ),
46
+ admin_url( wcj_admin_tab_url() . '&wcj-cat=products&section=product_custom_info' )
47
  ) .
48
  '</li>' .
49
  '<li>' .
50
  sprintf(
51
  /* translators: %s: translation added */
52
  __( 'To change add to cart button labels use <a href="%s">Add to Cart Labels module</a>.', 'woocommerce-jetpack' ),
53
+ admin_url( wcj_admin_tab_url() . '&wcj-cat=labels&section=add_to_cart' )
54
  ) .
55
  '</li>' .
56
  '<li>' .
57
  sprintf(
58
  /* translators: %s: translation added */
59
  __( 'If you want to allow customers to choose dynamic price, Use <a href="%s">Product Open Pricing (Name Your Price) module</a>.', 'woocommerce-jetpack' ),
60
+ admin_url( wcj_admin_tab_url() . '&wcj-cat=prices_and_currencies&section=product_open_pricing' )
61
  ) .
62
  '</li>' .
63
  '</ol>';
75
  /**
76
  * Check_dates.
77
  *
78
+ * @version 5.6.8
79
  * @since 2.2.6
80
  * @param bool $purchasable defines the purchasable.
81
  * @param string | array $_product defines the _product.
88
  $end_date_str = get_post_meta( $_product_id, '_wcj_crowdfunding_deadline', true );
89
  $start_date = ( '' !== $start_date_str ) ? strtotime( $start_date_str ) : 0;
90
  $end_date = ( '' !== $end_date_str ) ? strtotime( $end_date_str ) : 0;
91
+ if ( $start_date > 0 && ( $start_date - wcj_get_timestamp_date_from_gmt() ) > 0 ) {
92
  $purchasable = false;
93
  }
94
+ if ( $end_date > 0 && ( $end_date - wcj_get_timestamp_date_from_gmt() ) < 0 ) {
95
  $purchasable = false;
96
  }
97
  }
includes/class-wcj-currency-exchange-rates.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Module - Currency Exchange Rates
4
  *
5
- * @version 5.6.2
6
  * @since 2.3.0
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/includes
@@ -64,11 +64,12 @@ if ( ! class_exists( 'WCJ_Currency_Exchange_Rates' ) ) :
64
  /**
65
  * Maybe_update_all_rates.
66
  *
67
- * @version 5.6.2
68
  * @since 3.4.5
69
  */
70
  public function maybe_update_all_rates() {
71
- if ( isset( $_GET['wcj_currency_exchange_rates_update_now'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification
 
72
  do_action( 'auto_update_exchange_rates_hook' );
73
  wp_safe_redirect( remove_query_arg( 'wcj_currency_exchange_rates_update_now' ) );
74
  }
@@ -77,14 +78,18 @@ if ( ! class_exists( 'WCJ_Currency_Exchange_Rates' ) ) :
77
  /**
78
  * Wcj_ajax_get_exchange_rates.
79
  *
80
- * @version 5.6.2
81
  * @since 2.6.0
82
  * @todo (maybe) move this to `class-wcj-exchange-rates.php`
83
  */
84
  public function wcj_ajax_get_exchange_rates() {
85
- $wcj_currency_from = isset( $_POST['wcj_currency_from'] ) ? sanitize_text_field( wp_unslash( $_POST['wcj_currency_from'] ) ) : ''; // phpcs:ignore WordPress.Security.NonceVerification
86
- $wcj_currency_to = isset( $_POST['wcj_currency_to'] ) ? sanitize_text_field( wp_unslash( $_POST['wcj_currency_to'] ) ) : ''; // phpcs:ignore WordPress.Security.NonceVerification
87
- echo wcj_get_exchange_rate( $wcj_currency_from, $wcj_currency_to ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
 
 
 
 
88
  die();
89
  }
90
 
2
  /**
3
  * Booster for WooCommerce - Module - Currency Exchange Rates
4
  *
5
+ * @version 5.6.8
6
  * @since 2.3.0
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/includes
64
  /**
65
  * Maybe_update_all_rates.
66
  *
67
+ * @version 5.6.8
68
  * @since 3.4.5
69
  */
70
  public function maybe_update_all_rates() {
71
+ $wpnonce = isset( $_REQUEST['wcj-cat-nonce'] ) ? wp_verify_nonce( sanitize_key( $_REQUEST['wcj-cat-nonce'] ), 'wcj-cat-nonce' ) : false;
72
+ if ( $wpnonce && isset( $_GET['wcj_currency_exchange_rates_update_now'] ) ) {
73
  do_action( 'auto_update_exchange_rates_hook' );
74
  wp_safe_redirect( remove_query_arg( 'wcj_currency_exchange_rates_update_now' ) );
75
  }
78
  /**
79
  * Wcj_ajax_get_exchange_rates.
80
  *
81
+ * @version 5.6.8
82
  * @since 2.6.0
83
  * @todo (maybe) move this to `class-wcj-exchange-rates.php`
84
  */
85
  public function wcj_ajax_get_exchange_rates() {
86
+ $wpnonce = isset( $_POST['wpnonce'] ) ? wp_verify_nonce( sanitize_key( $_POST['wpnonce'] ), 'ajax-nonce' ) : false;
87
+ if ( ! $wpnonce ) {
88
+ die();
89
+ }
90
+ $wcj_currency_from = isset( $_POST['wcj_currency_from'] ) ? sanitize_text_field( wp_unslash( $_POST['wcj_currency_from'] ) ) : '';
91
+ $wcj_currency_to = isset( $_POST['wcj_currency_to'] ) ? sanitize_text_field( wp_unslash( $_POST['wcj_currency_to'] ) ) : '';
92
+ echo esc_html( wcj_get_exchange_rate( $wcj_currency_from, $wcj_currency_to ) );
93
  die();
94
  }
95
 
includes/class-wcj-currency-per-product.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Module - Currency per Product
4
  *
5
- * @version 5.6.2
6
  * @since 2.5.2
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/includes
@@ -424,20 +424,17 @@ if ( ! class_exists( 'WCJ_Currency_Per_Product' ) ) :
424
  /**
425
  * Get_current_product_id_and_currency.
426
  *
427
- * @version 5.6.2
428
  * @since 2.7.0
429
  */
430
  public function get_current_product_id_and_currency() {
431
- $wpnonce = true;
432
- if ( function_exists( 'wp_verify_nonce' ) ) {
433
- $wpnonce = isset( $_REQUEST['_wpnonce'] ) ? wp_verify_nonce( sanitize_key( isset( $_REQUEST['_wpnonce'] ) ? $_REQUEST['_wpnonce'] : '' ) ) : true;
434
- }
435
  // Get ID.
436
  $the_id = false;
437
  global $product;
438
- if ( $product && $wpnonce ) {
439
  $the_id = wcj_get_product_id_or_variation_parent_id( $product );
440
  }
 
441
  if ( ! $the_id && isset( $_REQUEST['product_id'] ) ) {
442
  $the_id = isset( $_REQUEST['product_id'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['product_id'] ) ) : '';
443
  }
@@ -447,6 +444,7 @@ if ( ! class_exists( 'WCJ_Currency_Per_Product' ) ) :
447
  parse_str( $post_form, $posted );
448
  $the_id = isset( $posted['add-to-cart'] ) ? $posted['add-to-cart'] : 0;
449
  }
 
450
  $eventon_wc_product_id = get_post_meta( get_the_ID(), 'tx_woocommerce_product_id', true );
451
  if ( ! $the_id && '' !== ( $eventon_wc_product_id ) ) { // EventON plugin.
452
  $the_id = $eventon_wc_product_id;
2
  /**
3
  * Booster for WooCommerce - Module - Currency per Product
4
  *
5
+ * @version 5.6.8
6
  * @since 2.5.2
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/includes
424
  /**
425
  * Get_current_product_id_and_currency.
426
  *
427
+ * @version 5.6.8
428
  * @since 2.7.0
429
  */
430
  public function get_current_product_id_and_currency() {
 
 
 
 
431
  // Get ID.
432
  $the_id = false;
433
  global $product;
434
+ if ( $product ) {
435
  $the_id = wcj_get_product_id_or_variation_parent_id( $product );
436
  }
437
+ // phpcs:disable WordPress.Security.NonceVerification
438
  if ( ! $the_id && isset( $_REQUEST['product_id'] ) ) {
439
  $the_id = isset( $_REQUEST['product_id'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['product_id'] ) ) : '';
440
  }
444
  parse_str( $post_form, $posted );
445
  $the_id = isset( $posted['add-to-cart'] ) ? $posted['add-to-cart'] : 0;
446
  }
447
+ // phpcs:enable WordPress.Security.NonceVerification
448
  $eventon_wc_product_id = get_post_meta( get_the_ID(), 'tx_woocommerce_product_id', true );
449
  if ( ! $the_id && '' !== ( $eventon_wc_product_id ) ) { // EventON plugin.
450
  $the_id = $eventon_wc_product_id;
includes/class-wcj-custom-php.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Module - Custom PHP
4
  *
5
- * @version 5.6.7
6
  * @since 4.0.0
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/includes
@@ -21,7 +21,7 @@ if ( ! class_exists( 'WCJ_Custom_PHP' ) ) :
21
  /**
22
  * Constructor.
23
  *
24
- * @version 5.6.7
25
  * @since 4.0.0
26
  * @todo [dev] maybe remove `wcj_disable_custom_php` from URL on settings save
27
  * @todo [dev] allow tab in content (i.e. settings (textarea))
@@ -38,10 +38,10 @@ if ( ! class_exists( 'WCJ_Custom_PHP' ) ) :
38
  '<strong>wp-login.php</strong>'
39
  ) . ' ' .
40
  sprintf(
41
- /* translators: %s: translation added */
42
  __( 'E.g.: %s', 'woocommerce-jetpack' ),
43
- '<a href="' . admin_url( 'admin.php?page=wc-settings&tab=jetpack&wcj-cat=emails_and_misc&section=custom_php&wcj_disable_custom_php&wcj_disable_custom_php_nonce=' . wp_create_nonce( 'wcj-disable-custom-php' ) ) . '">' .
44
- admin_url( 'admin.php?page=wc-settings&tab=jetpack&wcj-cat=emails_and_misc&section=custom_php&wcj_disable_custom_php' ) . '</a>'
45
  );
46
  $this->link_slug = 'woocommerce-booster-custom-php';
47
  parent::__construct();
@@ -76,7 +76,7 @@ if ( ! class_exists( 'WCJ_Custom_PHP' ) ) :
76
  /**
77
  * Create_php_file.
78
  *
79
- * @version 5.6.2
80
  * @since 4.0.0
81
  * @todo [dev] `unlink` and `rmdir` on settings reset
82
  * @todo [dev] on empty content - delete dir also (`rmdir`).
@@ -84,11 +84,15 @@ if ( ! class_exists( 'WCJ_Custom_PHP' ) ) :
84
  * @param string | array $current_section defines the current_section.
85
  */
86
  public function create_php_file( $sections, $current_section ) {
 
 
 
87
  if ( $this->id === $current_section ) {
88
  $file_content = wcj_get_option( 'wcj_custom_php', '' );
89
  if ( '' !== $file_content ) {
90
  $file_path = wcj_get_wcj_uploads_dir( 'custom_php' ) . DIRECTORY_SEPARATOR . 'booster.php';
91
- file_put_contents( $file_path, '<?php' . PHP_EOL . $file_content ); // phpcs:ignore
 
92
  } else {
93
  $file_path = wcj_get_wcj_uploads_dir( 'custom_php', false ) . DIRECTORY_SEPARATOR . 'booster.php';
94
  if ( file_exists( $file_path ) ) {
2
  /**
3
  * Booster for WooCommerce - Module - Custom PHP
4
  *
5
+ * @version 5.6.8
6
  * @since 4.0.0
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/includes
21
  /**
22
  * Constructor.
23
  *
24
+ * @version 5.6.8
25
  * @since 4.0.0
26
  * @todo [dev] maybe remove `wcj_disable_custom_php` from URL on settings save
27
  * @todo [dev] allow tab in content (i.e. settings (textarea))
38
  '<strong>wp-login.php</strong>'
39
  ) . ' ' .
40
  sprintf(
41
+ /* translators: %s: translation added */
42
  __( 'E.g.: %s', 'woocommerce-jetpack' ),
43
+ '<a href="' . admin_url( wcj_admin_tab_url() . '&wcj-cat=emails_and_misc&section=custom_php&wcj_disable_custom_php&wcj_disable_custom_php_nonce=' . wp_create_nonce( 'wcj-disable-custom-php' ) ) . '">' .
44
+ admin_url( wcj_admin_tab_url() . '&wcj-cat=emails_and_misc&section=custom_php&wcj_disable_custom_php&wcj_disable_custom_php_nonce=' . wp_create_nonce( 'wcj-disable-custom-php' ) ) . '</a>'
45
  );
46
  $this->link_slug = 'woocommerce-booster-custom-php';
47
  parent::__construct();
76
  /**
77
  * Create_php_file.
78
  *
79
+ * @version 5.6.8
80
  * @since 4.0.0
81
  * @todo [dev] `unlink` and `rmdir` on settings reset
82
  * @todo [dev] on empty content - delete dir also (`rmdir`).
84
  * @param string | array $current_section defines the current_section.
85
  */
86
  public function create_php_file( $sections, $current_section ) {
87
+ require_once ABSPATH . '/wp-admin/includes/file.php';
88
+ global $wp_filesystem;
89
+
90
  if ( $this->id === $current_section ) {
91
  $file_content = wcj_get_option( 'wcj_custom_php', '' );
92
  if ( '' !== $file_content ) {
93
  $file_path = wcj_get_wcj_uploads_dir( 'custom_php' ) . DIRECTORY_SEPARATOR . 'booster.php';
94
+ WP_Filesystem();
95
+ $wp_filesystem->put_contents( $file_path, '<?php' . PHP_EOL . $file_content, FS_CHMOD_FILE );
96
  } else {
97
  $file_path = wcj_get_wcj_uploads_dir( 'custom_php', false ) . DIRECTORY_SEPARATOR . 'booster.php';
98
  if ( file_exists( $file_path ) ) {
includes/class-wcj-debug-tools.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Module - Debug Tools
4
  *
5
- * @version 5.6.7
6
  * @author Pluggabl LLC.
7
  * @package Booster_For_WooCommerce/includes
8
  */
@@ -91,7 +91,7 @@ if ( ! class_exists( 'WCJ_Debug_Tools' ) ) :
91
  /**
92
  * Get_system_info_table_array.
93
  *
94
- * @version 5.6.2
95
  * @since 2.5.7
96
  * @todo [feature] (maybe) 'DB_NAME', 'DB_USER', 'DB_PASSWORD', 'DB_HOST', 'DB_CHARSET', 'DB_COLLATE'
97
  */
@@ -110,10 +110,7 @@ if ( ! class_exists( 'WCJ_Debug_Tools' ) ) :
110
  foreach ( $constants_array as $the_constant ) {
111
  $system_info[] = array( $the_constant, ( defined( $the_constant ) ? constant( $the_constant ) : __( 'NOT DEFINED', 'woocommerce-jetpack' ) ) );
112
  }
113
- $wpnonce = true;
114
- if ( function_exists( 'wp_verify_nonce' ) ) {
115
- $wpnonce = isset( $_REQUEST['_wpnonce'] ) ? wp_verify_nonce( sanitize_key( isset( $_REQUEST['_wpnonce'] ) ? $_REQUEST['_wpnonce'] : '' ) ) : true;
116
- }
117
  if ( isset( $_GET['wcj_debug'] ) && $wpnonce ) {
118
  foreach ( $_SERVER as $server_var_id => $server_var_value ) {
119
  $system_info[] = array( $server_var_id, esc_html( $server_var_value ) );
2
  /**
3
  * Booster for WooCommerce - Module - Debug Tools
4
  *
5
+ * @version 5.6.8
6
  * @author Pluggabl LLC.
7
  * @package Booster_For_WooCommerce/includes
8
  */
91
  /**
92
  * Get_system_info_table_array.
93
  *
94
+ * @version 5.6.8
95
  * @since 2.5.7
96
  * @todo [feature] (maybe) 'DB_NAME', 'DB_USER', 'DB_PASSWORD', 'DB_HOST', 'DB_CHARSET', 'DB_COLLATE'
97
  */
110
  foreach ( $constants_array as $the_constant ) {
111
  $system_info[] = array( $the_constant, ( defined( $the_constant ) ? constant( $the_constant ) : __( 'NOT DEFINED', 'woocommerce-jetpack' ) ) );
112
  }
113
+ $wpnonce = isset( $_REQUEST['wcj_debug-nonce'] ) ? wp_verify_nonce( sanitize_key( $_REQUEST['wcj_debug-nonce'] ), 'wcj_debug' ) : false;
 
 
 
114
  if ( isset( $_GET['wcj_debug'] ) && $wpnonce ) {
115
  foreach ( $_SERVER as $server_var_id => $server_var_value ) {
116
  $system_info[] = array( $server_var_id, esc_html( $server_var_value ) );
includes/class-wcj-emails-verification.php CHANGED
@@ -1,8 +1,8 @@
1
- <?php //phpcs:ignore
2
  /**
3
  * Booster for WooCommerce - Module - Email Verification
4
  *
5
- * @version 5.6.2
6
  * @since 2.8.0
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/includes
@@ -12,11 +12,11 @@ if ( ! defined( 'ABSPATH' ) ) {
12
  exit; // Exit if accessed directly.
13
  }
14
 
15
- if ( ! class_exists( 'WCJ_Email_Verification' ) ) :
16
  /**
17
  * WCJ_Currencies.
18
  */
19
- class WCJ_Email_Verification extends WCJ_Module {
20
 
21
  /**
22
  * Constructor.
@@ -191,7 +191,7 @@ if ( ! class_exists( 'WCJ_Email_Verification' ) ) :
191
  /**
192
  * Reset_and_mail_activation_link.
193
  *
194
- * @version 5.6.2
195
  * @since 2.8.0
196
  * @todo %site_name% etc. in `wcj_emails_verification_email_subject`
197
  * @param int $user_id defines the user_id.
@@ -202,7 +202,7 @@ if ( ! class_exists( 'WCJ_Email_Verification' ) ) :
202
  $url = wp_nonce_url(
203
  add_query_arg(
204
  'wcj_verify_email',
205
- base64_encode( // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions.obfuscation_base64_encode
206
  wp_json_encode(
207
  array(
208
  'id' => $user_id,
@@ -248,13 +248,13 @@ if ( ! class_exists( 'WCJ_Email_Verification' ) ) :
248
  /**
249
  * Process_email_verification.
250
  *
251
- * @version 5.6.2
252
  * @since 2.8.0
253
  */
254
  public function process_email_verification() {
255
- if ( isset( $_GET['wcj_verified_email'] ) ) { // phpcs:ignore
256
  if ( function_exists( 'wc_add_notice' ) ) {
257
- $data = json_decode( base64_decode( $_GET['wcj_verified_email'] ), true ); // phpcs:ignore
258
  if ( ! empty( $data['id'] ) && ! empty( $data['code'] ) && get_user_meta( $data['id'], 'wcj_activation_code', true ) === $data['code'] ) {
259
  wc_add_notice(
260
  do_shortcode(
@@ -266,8 +266,8 @@ if ( ! class_exists( 'WCJ_Email_Verification' ) ) :
266
  );
267
  }
268
  }
269
- } elseif ( isset( $_GET['wcj_verify_email'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification
270
- $data = json_decode( base64_decode( sanitize_text_field( wp_unslash( $_GET['wcj_verify_email'] ) ) ), true ); // phpcs:ignore
271
  if ( ! empty( $data['id'] ) && ! empty( $data['code'] ) && get_user_meta( $data['id'], 'wcj_activation_code', true ) === $data['code'] ) {
272
  update_user_meta( $data['id'], 'wcj_is_activated', '1' );
273
  if ( 'yes' === wcj_get_option( 'wcj_emails_verification_redirect_on_success', 'yes' ) ) {
@@ -276,7 +276,7 @@ if ( ! class_exists( 'WCJ_Email_Verification' ) ) :
276
  }
277
  $custom_url = wcj_get_option( 'wcj_emails_verification_redirect_on_success_custom_url', '' );
278
  $url = ( '' !== ( $custom_url ) ? $custom_url : wc_get_page_permalink( 'myaccount' ) );
279
- wp_safe_redirect( add_query_arg( 'wcj_verified_email', sanitize_text_field( wp_unslash( $_GET['wcj_verify_email'] ) ), $url ) ); // phpcs:ignore
280
  exit;
281
  } elseif ( ! empty( $data['id'] ) ) {
282
  $_notice = do_shortcode(
@@ -294,7 +294,7 @@ if ( ! class_exists( 'WCJ_Email_Verification' ) ) :
294
  );
295
  wc_add_notice( $_notice, 'error' );
296
  }
297
- } elseif ( isset( $_GET['wcj_activate_account_message'] ) ) {// phpcs:ignore WordPress.Security.NonceVerification
298
  wc_add_notice(
299
  do_shortcode(
300
  wcj_get_option(
@@ -303,8 +303,8 @@ if ( ! class_exists( 'WCJ_Email_Verification' ) ) :
303
  )
304
  )
305
  );
306
- } elseif ( isset( $_GET['wcj_user_id'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification
307
- $this->reset_and_mail_activation_link( sanitize_text_field( wp_unslash( $_GET['wcj_user_id'] ) ) ); // phpcs:ignore WordPress.Security.NonceVerification
308
  wc_add_notice(
309
  do_shortcode(
310
  wcj_get_option(
@@ -320,4 +320,4 @@ if ( ! class_exists( 'WCJ_Email_Verification' ) ) :
320
 
321
  endif;
322
 
323
- return new WCJ_Email_Verification();
1
+ <?php
2
  /**
3
  * Booster for WooCommerce - Module - Email Verification
4
  *
5
+ * @version 5.6.8
6
  * @since 2.8.0
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/includes
12
  exit; // Exit if accessed directly.
13
  }
14
 
15
+ if ( ! class_exists( 'WCJ_Emails_Verification' ) ) :
16
  /**
17
  * WCJ_Currencies.
18
  */
19
+ class WCJ_Emails_Verification extends WCJ_Module {
20
 
21
  /**
22
  * Constructor.
191
  /**
192
  * Reset_and_mail_activation_link.
193
  *
194
+ * @version 5.6.8
195
  * @since 2.8.0
196
  * @todo %site_name% etc. in `wcj_emails_verification_email_subject`
197
  * @param int $user_id defines the user_id.
202
  $url = wp_nonce_url(
203
  add_query_arg(
204
  'wcj_verify_email',
205
+ base64_encode(
206
  wp_json_encode(
207
  array(
208
  'id' => $user_id,
248
  /**
249
  * Process_email_verification.
250
  *
251
+ * @version 5.6.8
252
  * @since 2.8.0
253
  */
254
  public function process_email_verification() {
255
+ if ( isset( $_GET['wcj_verified_email'] ) ) {
256
  if ( function_exists( 'wc_add_notice' ) ) {
257
+ $data = json_decode( base64_decode( sanitize_email( wp_unslash( $_GET['wcj_verified_email'] ) ) ), true );
258
  if ( ! empty( $data['id'] ) && ! empty( $data['code'] ) && get_user_meta( $data['id'], 'wcj_activation_code', true ) === $data['code'] ) {
259
  wc_add_notice(
260
  do_shortcode(
266
  );
267
  }
268
  }
269
+ } elseif ( isset( $_GET['wcj_verify_email'] ) ) {
270
+ $data = json_decode( base64_decode( sanitize_text_field( wp_unslash( $_GET['wcj_verify_email'] ) ) ), true );
271
  if ( ! empty( $data['id'] ) && ! empty( $data['code'] ) && get_user_meta( $data['id'], 'wcj_activation_code', true ) === $data['code'] ) {
272
  update_user_meta( $data['id'], 'wcj_is_activated', '1' );
273
  if ( 'yes' === wcj_get_option( 'wcj_emails_verification_redirect_on_success', 'yes' ) ) {
276
  }
277
  $custom_url = wcj_get_option( 'wcj_emails_verification_redirect_on_success_custom_url', '' );
278
  $url = ( '' !== ( $custom_url ) ? $custom_url : wc_get_page_permalink( 'myaccount' ) );
279
+ wp_safe_redirect( add_query_arg( 'wcj_verified_email', sanitize_text_field( wp_unslash( $_GET['wcj_verify_email'] ) ), $url ) );
280
  exit;
281
  } elseif ( ! empty( $data['id'] ) ) {
282
  $_notice = do_shortcode(
294
  );
295
  wc_add_notice( $_notice, 'error' );
296
  }
297
+ } elseif ( isset( $_GET['wcj_activate_account_message'] ) ) {
298
  wc_add_notice(
299
  do_shortcode(
300
  wcj_get_option(
303
  )
304
  )
305
  );
306
+ } elseif ( isset( $_GET['wcj_user_id'] ) ) {
307
+ $this->reset_and_mail_activation_link( sanitize_text_field( wp_unslash( $_GET['wcj_user_id'] ) ) );
308
  wc_add_notice(
309
  do_shortcode(
310
  wcj_get_option(
320
 
321
  endif;
322
 
323
+ return new WCJ_Emails_Verification();
includes/class-wcj-eu-vat-number.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Module - EU VAT Number
4
  *
5
- * @version 5.6.7
6
  * @since 2.3.9
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/includes
@@ -119,14 +119,11 @@ if ( ! class_exists( 'WCJ_EU_VAT_Number' ) ) :
119
  /**
120
  * Admin_validate_vat_and_maybe_remove_taxes.
121
  *
122
- * @version 5.6.2
123
  * @since 3.3.0
124
  */
125
  public function admin_validate_vat_and_maybe_remove_taxes() {
126
- $wpnonce = true;
127
- if ( function_exists( 'wp_verify_nonce' ) ) {
128
- $wpnonce = isset( $_REQUEST['_wpnonce'] ) ? wp_verify_nonce( sanitize_key( isset( $_REQUEST['_wpnonce'] ) ? $_REQUEST['_wpnonce'] : '' ) ) : true;
129
- }
130
  if ( $wpnonce && isset( $_GET['validate_vat_and_maybe_remove_taxes'] ) ) {
131
  $order_id = sanitize_text_field( wp_unslash( $_GET['validate_vat_and_maybe_remove_taxes'] ) );
132
  $order = wc_get_order( $order_id );
@@ -145,7 +142,7 @@ if ( ! class_exists( 'WCJ_EU_VAT_Number' ) ) :
145
  }
146
  }
147
  }
148
- wp_safe_redirect( esc_url( remove_query_arg( 'validate_vat_and_maybe_remove_taxes' ) ) );
149
  exit;
150
  }
151
  }
@@ -187,7 +184,7 @@ if ( ! class_exists( 'WCJ_EU_VAT_Number' ) ) :
187
  /**
188
  * Create_meta_box.
189
  *
190
- * @version 5.5.9
191
  * @since 2.6.0
192
  */
193
  public function create_meta_box() {
@@ -253,7 +250,14 @@ if ( ! class_exists( 'WCJ_EU_VAT_Number' ) ) :
253
  )
254
  )
255
  );
256
- echo '<p><a href="' . esc_url( add_query_arg( 'validate_vat_and_maybe_remove_taxes', $order_id ) ) . '">' .
 
 
 
 
 
 
 
257
  wp_kses_post( 'Validate VAT and remove taxes', 'woocommerce-jetpack' ) . '</a></p>';
258
  }
259
 
@@ -426,7 +430,7 @@ if ( ! class_exists( 'WCJ_EU_VAT_Number' ) ) :
426
  /**
427
  * Enqueue_scripts.
428
  *
429
- * @version 5.4.5
430
  */
431
  public function enqueue_scripts() {
432
  if (
@@ -449,6 +453,7 @@ if ( ! class_exists( 'WCJ_EU_VAT_Number' ) ) :
449
  'progress_text_valid' => do_shortcode( wcj_get_option( 'wcj_eu_vat_number_progress_text_valid', __( 'VAT is valid.', 'woocommerce-jetpack' ) ) ),
450
  'progress_text_not_valid' => do_shortcode( wcj_get_option( 'wcj_eu_vat_number_progress_text_not_valid', __( 'VAT is not valid.', 'woocommerce-jetpack' ) ) ),
451
  'progress_text_validation_failed' => do_shortcode( wcj_get_option( 'wcj_eu_vat_number_progress_text_validation_failed', __( 'Validation failed. Please try again.', 'woocommerce-jetpack' ) ) ),
 
452
  )
453
  );
454
  }
@@ -456,7 +461,7 @@ if ( ! class_exists( 'WCJ_EU_VAT_Number' ) ) :
456
  /**
457
  * Wcj_validate_eu_vat_number.
458
  *
459
- * @version 5.6.2
460
  * @param array $param defines the param.
461
  */
462
  public function wcj_validate_eu_vat_number( $param ) {
@@ -467,8 +472,9 @@ if ( ! class_exists( 'WCJ_EU_VAT_Number' ) ) :
467
  'echo' => true,
468
  )
469
  );
 
470
  $eu_vat_number = isset( $param['wcj_eu_vat_number_to_check'] ) && '' !== $param['wcj_eu_vat_number_to_check'] && null !== $param['wcj_eu_vat_number_to_check'] ? sanitize_text_field( wp_unslash( $param['wcj_eu_vat_number_to_check'] ) ) : '';
471
- $eu_vat_number = empty( $eu_vat_number ) && isset( $_POST['wcj_eu_vat_number_to_check'] ) && '' !== $_POST['wcj_eu_vat_number_to_check'] && null !== $_POST['wcj_eu_vat_number_to_check'] ? sanitize_text_field( wp_unslash( $_POST['wcj_eu_vat_number_to_check'] ) ) : $eu_vat_number; // phpcs:ignore WordPress.Security.NonceVerification
472
  if ( ! empty( $eu_vat_number ) ) {
473
  $eu_vat_number_to_check = substr( $eu_vat_number, 2 );
474
  $eu_vat_number_country_to_check = substr( $eu_vat_number, 0, 2 );
@@ -506,7 +512,7 @@ if ( ! class_exists( 'WCJ_EU_VAT_Number' ) ) :
506
  /**
507
  * Need_to_exclude_vat.
508
  *
509
- * @version 5.6.2
510
  * @since 4.6.0
511
  *
512
  * @return bool
@@ -524,7 +530,7 @@ if ( ! class_exists( 'WCJ_EU_VAT_Number' ) ) :
524
  'yes' === wcj_get_option( 'wcj_eu_vat_number_disable_for_valid', 'yes' ) &&
525
  (
526
  ( true === wcj_session_get( 'wcj_is_eu_vat_number_valid' ) && null !== ( $eu_vat_number ) ) ||
527
- ( 'yes' === wcj_get_option( 'wcj_eu_vat_number_disable_for_valid_by_user_vat', 'no' ) && is_user_logged_in() && ! empty( $eu_vat_number = get_user_meta( get_current_user_id(), 'billing_eu_vat_number', true ) ) && '1' === $this->wcj_validate_eu_vat_number(// phpcs:ignore
528
  array(
529
  'wcj_eu_vat_number_to_check' => $eu_vat_number,
530
  'echo' => false,
2
  /**
3
  * Booster for WooCommerce - Module - EU VAT Number
4
  *
5
+ * @version 5.6.8
6
  * @since 2.3.9
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/includes
119
  /**
120
  * Admin_validate_vat_and_maybe_remove_taxes.
121
  *
122
+ * @version 5.6.8
123
  * @since 3.3.0
124
  */
125
  public function admin_validate_vat_and_maybe_remove_taxes() {
126
+ $wpnonce = isset( $_REQUEST['validate_vat_and_maybe_remove_taxes-nonce'] ) ? wp_verify_nonce( sanitize_key( $_REQUEST['validate_vat_and_maybe_remove_taxes-nonce'] ), 'validate_vat_and_maybe_remove_taxes' ) : false;
 
 
 
127
  if ( $wpnonce && isset( $_GET['validate_vat_and_maybe_remove_taxes'] ) ) {
128
  $order_id = sanitize_text_field( wp_unslash( $_GET['validate_vat_and_maybe_remove_taxes'] ) );
129
  $order = wc_get_order( $order_id );
142
  }
143
  }
144
  }
145
+ wp_safe_redirect( esc_url_raw( remove_query_arg( array( 'validate_vat_and_maybe_remove_taxes', 'validate_vat_and_maybe_remove_taxes-nonce' ) ) ) );
146
  exit;
147
  }
148
  }
184
  /**
185
  * Create_meta_box.
186
  *
187
+ * @version 5.6.8
188
  * @since 2.6.0
189
  */
190
  public function create_meta_box() {
250
  )
251
  )
252
  );
253
+ echo '<p><a href="' . esc_url(
254
+ add_query_arg(
255
+ array(
256
+ 'validate_vat_and_maybe_remove_taxes' => $order_id,
257
+ 'validate_vat_and_maybe_remove_taxes-nonce' => wp_create_nonce( 'validate_vat_and_maybe_remove_taxes' ),
258
+ )
259
+ )
260
+ ) . '">' .
261
  wp_kses_post( 'Validate VAT and remove taxes', 'woocommerce-jetpack' ) . '</a></p>';
262
  }
263
 
430
  /**
431
  * Enqueue_scripts.
432
  *
433
+ * @version 5.6.8
434
  */
435
  public function enqueue_scripts() {
436
  if (
453
  'progress_text_valid' => do_shortcode( wcj_get_option( 'wcj_eu_vat_number_progress_text_valid', __( 'VAT is valid.', 'woocommerce-jetpack' ) ) ),
454
  'progress_text_not_valid' => do_shortcode( wcj_get_option( 'wcj_eu_vat_number_progress_text_not_valid', __( 'VAT is not valid.', 'woocommerce-jetpack' ) ) ),
455
  'progress_text_validation_failed' => do_shortcode( wcj_get_option( 'wcj_eu_vat_number_progress_text_validation_failed', __( 'Validation failed. Please try again.', 'woocommerce-jetpack' ) ) ),
456
+ '_wpnonce' => wp_create_nonce( 'wcj_eu_vat_number_to_check' ),
457
  )
458
  );
459
  }
461
  /**
462
  * Wcj_validate_eu_vat_number.
463
  *
464
+ * @version 5.6.8
465
  * @param array $param defines the param.
466
  */
467
  public function wcj_validate_eu_vat_number( $param ) {
472
  'echo' => true,
473
  )
474
  );
475
+ $wpnonce = isset( $_REQUEST['_wpnonce'] ) ? wp_verify_nonce( sanitize_key( $_REQUEST['_wpnonce'] ), 'wcj_eu_vat_number_to_check' ) : false;
476
  $eu_vat_number = isset( $param['wcj_eu_vat_number_to_check'] ) && '' !== $param['wcj_eu_vat_number_to_check'] && null !== $param['wcj_eu_vat_number_to_check'] ? sanitize_text_field( wp_unslash( $param['wcj_eu_vat_number_to_check'] ) ) : '';
477
+ $eu_vat_number = $wpnonce && empty( $eu_vat_number ) && isset( $_POST['wcj_eu_vat_number_to_check'] ) && '' !== $_POST['wcj_eu_vat_number_to_check'] && null !== $_POST['wcj_eu_vat_number_to_check'] ? sanitize_text_field( wp_unslash( $_POST['wcj_eu_vat_number_to_check'] ) ) : $eu_vat_number;
478
  if ( ! empty( $eu_vat_number ) ) {
479
  $eu_vat_number_to_check = substr( $eu_vat_number, 2 );
480
  $eu_vat_number_country_to_check = substr( $eu_vat_number, 0, 2 );
512
  /**
513
  * Need_to_exclude_vat.
514
  *
515
+ * @version 5.6.8
516
  * @since 4.6.0
517
  *
518
  * @return bool
530
  'yes' === wcj_get_option( 'wcj_eu_vat_number_disable_for_valid', 'yes' ) &&
531
  (
532
  ( true === wcj_session_get( 'wcj_is_eu_vat_number_valid' ) && null !== ( $eu_vat_number ) ) ||
533
+ ( 'yes' === wcj_get_option( 'wcj_eu_vat_number_disable_for_valid_by_user_vat', 'no' ) && is_user_logged_in() && ! empty( $eu_vat_number = get_user_meta( get_current_user_id(), 'billing_eu_vat_number', true ) ) && '1' === $this->wcj_validate_eu_vat_number( // phpcs:ignore Squiz.PHP.DisallowMultipleAssignments.FoundInControlStructure, WordPress.CodeAnalysis.AssignmentInCondition.Found
534
  array(
535
  'wcj_eu_vat_number_to_check' => $eu_vat_number,
536
  'echo' => false,
includes/class-wcj-export-import.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Module - Export
4
  *
5
- * @version 5.6.7
6
  * @since 2.5.4
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/includes
@@ -72,7 +72,7 @@ if ( ! class_exists( 'WCJ_Export_Import' ) ) :
72
  /**
73
  * Export.
74
  *
75
- * @version 5.6.2
76
  * @since 2.4.8
77
  * @todo [dev] when filtering now using `strpos`, but other options would be `stripos` (case-insensitive) or strict equality
78
  * @todo [dev] (maybe) do filtering directly in WP_Query
@@ -102,10 +102,7 @@ if ( ! class_exists( 'WCJ_Export_Import' ) ) :
102
  $data = $exporter->export_products( $this->fields_helper );
103
  break;
104
  }
105
- $wpnonce = true;
106
- if ( function_exists( 'wp_verify_nonce' ) ) {
107
- $wpnonce = isset( $_REQUEST['_wpnonce'] ) ? wp_verify_nonce( sanitize_key( isset( $_REQUEST['_wpnonce'] ) ? $_REQUEST['_wpnonce'] : '' ) ) : true;
108
- }
109
  if ( $wpnonce && isset( $_POST['wcj_export_filter_all_columns'] ) && '' !== $_POST['wcj_export_filter_all_columns'] ) {
110
  foreach ( $data as $row_id => $row ) {
111
  if ( 0 === $row_id ) {
@@ -129,16 +126,13 @@ if ( ! class_exists( 'WCJ_Export_Import' ) ) :
129
  /**
130
  * Export_xml.
131
  *
132
- * @version 5.6.2
133
  * @since 2.5.9
134
  * @todo [dev] templates for xml_start, xml_end, xml_item.
135
  * @todo [dev] `strip_tags`
136
  */
137
  public function export_xml() {
138
- $wpnonce = true;
139
- if ( function_exists( 'wp_verify_nonce' ) ) {
140
- $wpnonce = isset( $_REQUEST['_wpnonce'] ) ? wp_verify_nonce( sanitize_key( isset( $_REQUEST['_wpnonce'] ) ? $_REQUEST['_wpnonce'] : '' ) ) : true;
141
- }
142
  if ( $wpnonce && isset( $_POST['wcj_export_xml'] ) ) {
143
  $data = $this->export( sanitize_text_field( wp_unslash( $_POST['wcj_export_xml'] ) ) );
144
  if ( is_array( $data ) ) {
@@ -203,14 +197,11 @@ if ( ! class_exists( 'WCJ_Export_Import' ) ) :
203
  /**
204
  * Export_csv.
205
  *
206
- * @version 5.6.7
207
  * @since 2.4.8
208
  */
209
  public function export_csv() {
210
- $wpnonce = true;
211
- if ( function_exists( 'wp_verify_nonce' ) ) {
212
- $wpnonce = isset( $_REQUEST['_wpnonce'] ) ? wp_verify_nonce( sanitize_key( isset( $_REQUEST['_wpnonce'] ) ? $_REQUEST['_wpnonce'] : '' ) ) : true;
213
- }
214
  if ( $wpnonce && isset( $_POST['wcj_export'] ) ) {
215
  $data = $this->export( sanitize_text_field( wp_unslash( $_POST['wcj_export'] ) ) );
216
  if ( is_array( $data ) ) {
@@ -238,17 +229,14 @@ if ( ! class_exists( 'WCJ_Export_Import' ) ) :
238
  /**
239
  * Export_filter_fields.
240
  *
241
- * @version 5.6.2
242
  * @since 2.5.5
243
  * @todo [dev] filter each field separately
244
  * @param int $tool_id defines the tool_id.
245
  */
246
  public function export_filter_fields( $tool_id ) {
247
  $fields = array();
248
- $wpnonce = true;
249
- if ( function_exists( 'wp_verify_nonce' ) ) {
250
- $wpnonce = isset( $_REQUEST['_wpnonce'] ) ? wp_verify_nonce( sanitize_key( isset( $_REQUEST['_wpnonce'] ) ? $_REQUEST['_wpnonce'] : '' ) ) : true;
251
- }
252
  switch ( $tool_id ) {
253
  case 'orders':
254
  $fields = array(
@@ -289,17 +277,14 @@ if ( ! class_exists( 'WCJ_Export_Import' ) ) :
289
  /**
290
  * Export_date_fields.
291
  *
292
- * @version 5.6.2
293
  * @since 3.0.0
294
  * @todo [dev] maybe make `$dateformat` optional
295
  * @todo [dev] mark current (i.e. active) link (if exists)
296
  * @param int $tool_id defines the tool_id.
297
  */
298
  public function export_date_fields( $tool_id ) {
299
- $wpnonce = true;
300
- if ( function_exists( 'wp_verify_nonce' ) ) {
301
- $wpnonce = isset( $_REQUEST['_wpnonce'] ) ? wp_verify_nonce( sanitize_key( isset( $_REQUEST['_wpnonce'] ) ? $_REQUEST['_wpnonce'] : '' ) ) : true;
302
- }
303
  $current_start_date = ( $wpnonce && isset( $_GET['start_date'] ) ? sanitize_text_field( wp_unslash( $_GET['start_date'] ) ) : '' );
304
  $current_end_date = ( $wpnonce && isset( $_GET['end_date'] ) ? sanitize_text_field( wp_unslash( $_GET['end_date'] ) ) : '' );
305
  $predefined_ranges = array();
@@ -328,6 +313,7 @@ if ( ! class_exists( 'WCJ_Export_Import' ) ) :
328
  '<strong> - </strong>' .
329
  '<input name="end_date" id="end_date" type="text" display="date"' . $dateformat . ' value="' . $current_end_date . '">' .
330
  ' ' .
 
331
  '<button class="button-primary" name="range" id="range" type="submit" value="custom">' . __( 'Go', 'woocommerce-jetpack' ) . '</button>' .
332
  '</form>';
333
  return $predefined_ranges . '<br>' . $date_input_fields;
@@ -336,19 +322,20 @@ if ( ! class_exists( 'WCJ_Export_Import' ) ) :
336
  /**
337
  * Create_export_tool.
338
  *
339
- * @version 5.6.2
340
  * @since 2.4.8
341
  * @param int $tool_id defines the tool_id.
342
  */
343
  public function create_export_tool( $tool_id ) {
344
- $wpnonce = true;
345
- if ( function_exists( 'wp_verify_nonce' ) ) {
346
- $wpnonce = isset( $_REQUEST['_wpnonce'] ) ? wp_verify_nonce( sanitize_key( isset( $_REQUEST['_wpnonce'] ) ? $_REQUEST['_wpnonce'] : '' ) ) : true;
 
347
  }
348
  echo '<div class="wcj-setting-jetpack-body wcj_tools_cnt_main">';
349
  echo wp_kses_post( $this->get_tool_header_html( 'export_' . $tool_id ) );
350
  echo '<p>' . wp_kses_post( $this->export_date_fields( $tool_id ) ) . '</p>';
351
- if ( $wpnonce && ! isset( $_GET['range'] ) ) {
352
  echo '</div>';
353
  return;
354
  }
2
  /**
3
  * Booster for WooCommerce - Module - Export
4
  *
5
+ * @version 5.6.8
6
  * @since 2.5.4
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/includes
72
  /**
73
  * Export.
74
  *
75
+ * @version 5.6.8
76
  * @since 2.4.8
77
  * @todo [dev] when filtering now using `strpos`, but other options would be `stripos` (case-insensitive) or strict equality
78
  * @todo [dev] (maybe) do filtering directly in WP_Query
102
  $data = $exporter->export_products( $this->fields_helper );
103
  break;
104
  }
105
+ $wpnonce = isset( $_REQUEST['wcj_tools_nonce'] ) ? wp_verify_nonce( sanitize_key( $_REQUEST['wcj_tools_nonce'] ), 'wcj_tools' ) : false;
 
 
 
106
  if ( $wpnonce && isset( $_POST['wcj_export_filter_all_columns'] ) && '' !== $_POST['wcj_export_filter_all_columns'] ) {
107
  foreach ( $data as $row_id => $row ) {
108
  if ( 0 === $row_id ) {
126
  /**
127
  * Export_xml.
128
  *
129
+ * @version 5.6.8
130
  * @since 2.5.9
131
  * @todo [dev] templates for xml_start, xml_end, xml_item.
132
  * @todo [dev] `strip_tags`
133
  */
134
  public function export_xml() {
135
+ $wpnonce = isset( $_REQUEST['wcj_tools_nonce'] ) ? wp_verify_nonce( sanitize_key( $_REQUEST['wcj_tools_nonce'] ), 'wcj_tools' ) : false;
 
 
 
136
  if ( $wpnonce && isset( $_POST['wcj_export_xml'] ) ) {
137
  $data = $this->export( sanitize_text_field( wp_unslash( $_POST['wcj_export_xml'] ) ) );
138
  if ( is_array( $data ) ) {
197
  /**
198
  * Export_csv.
199
  *
200
+ * @version 5.6.8
201
  * @since 2.4.8
202
  */
203
  public function export_csv() {
204
+ $wpnonce = isset( $_REQUEST['wcj_tools_nonce'] ) ? wp_verify_nonce( sanitize_key( $_REQUEST['wcj_tools_nonce'] ), 'wcj_tools' ) : false;
 
 
 
205
  if ( $wpnonce && isset( $_POST['wcj_export'] ) ) {
206
  $data = $this->export( sanitize_text_field( wp_unslash( $_POST['wcj_export'] ) ) );
207
  if ( is_array( $data ) ) {
229
  /**
230
  * Export_filter_fields.
231
  *
232
+ * @version 5.6.8
233
  * @since 2.5.5
234
  * @todo [dev] filter each field separately
235
  * @param int $tool_id defines the tool_id.
236
  */
237
  public function export_filter_fields( $tool_id ) {
238
  $fields = array();
239
+ $wpnonce = isset( $_REQUEST['wcj_tools_nonce'] ) ? wp_verify_nonce( sanitize_key( $_REQUEST['wcj_tools_nonce'] ), 'wcj_tools' ) : false;
 
 
 
240
  switch ( $tool_id ) {
241
  case 'orders':
242
  $fields = array(
277
  /**
278
  * Export_date_fields.
279
  *
280
+ * @version 5.6.8
281
  * @since 3.0.0
282
  * @todo [dev] maybe make `$dateformat` optional
283
  * @todo [dev] mark current (i.e. active) link (if exists)
284
  * @param int $tool_id defines the tool_id.
285
  */
286
  public function export_date_fields( $tool_id ) {
287
+ $wpnonce = isset( $_REQUEST['wcj_tools_nonce'] ) ? wp_verify_nonce( sanitize_key( $_REQUEST['wcj_tools_nonce'] ), 'wcj_tools' ) : false;
 
 
 
288
  $current_start_date = ( $wpnonce && isset( $_GET['start_date'] ) ? sanitize_text_field( wp_unslash( $_GET['start_date'] ) ) : '' );
289
  $current_end_date = ( $wpnonce && isset( $_GET['end_date'] ) ? sanitize_text_field( wp_unslash( $_GET['end_date'] ) ) : '' );
290
  $predefined_ranges = array();
313
  '<strong> - </strong>' .
314
  '<input name="end_date" id="end_date" type="text" display="date"' . $dateformat . ' value="' . $current_end_date . '">' .
315
  ' ' .
316
+ '<input name="wcj_tools_nonce" id="wcj_tools_nonce" type="hidden" value="' . wp_create_nonce( 'wcj_tools' ) . '">' .
317
  '<button class="button-primary" name="range" id="range" type="submit" value="custom">' . __( 'Go', 'woocommerce-jetpack' ) . '</button>' .
318
  '</form>';
319
  return $predefined_ranges . '<br>' . $date_input_fields;
322
  /**
323
  * Create_export_tool.
324
  *
325
+ * @version 5.6.8
326
  * @since 2.4.8
327
  * @param int $tool_id defines the tool_id.
328
  */
329
  public function create_export_tool( $tool_id ) {
330
+ $wpnonce = isset( $_REQUEST['wcj_tools_nonce'] ) ? wp_verify_nonce( sanitize_key( $_REQUEST['wcj_tools_nonce'] ), 'wcj_tools' ) : false;
331
+ if ( ! $wpnonce ) {
332
+ wp_safe_redirect( admin_url( 'admin.php?page=wcj-tools' ) );
333
+ exit;
334
  }
335
  echo '<div class="wcj-setting-jetpack-body wcj_tools_cnt_main">';
336
  echo wp_kses_post( $this->get_tool_header_html( 'export_' . $tool_id ) );
337
  echo '<p>' . wp_kses_post( $this->export_date_fields( $tool_id ) ) . '</p>';
338
+ if ( ! isset( $_GET['range'] ) ) {
339
  echo '</div>';
340
  return;
341
  }
includes/class-wcj-general.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Module - General
4
  *
5
- * @version 5.6.7
6
  * @author Pluggabl LLC.
7
  * @package Booster_For_WooCommerce/includes
8
  */
@@ -20,7 +20,7 @@ if ( ! class_exists( 'WCJ_General' ) ) :
20
  /**
21
  * Constructor.
22
  *
23
- * @version 5.6.2
24
  * @todo [dev] maybe expand `$this->desc` (e.g.: Custom roles tool, shortcodes in WordPress text widgets etc.)
25
  */
26
  public function __construct() {
@@ -49,7 +49,7 @@ if ( ! class_exists( 'WCJ_General' ) ) :
49
  $php_time_limit = wcj_get_option( 'wcj_admin_tools_php_time_limit', '0' );
50
  // PHP Memory Limit.
51
  if ( '0' !== ( $php_memory_limit ) ) {
52
- ini_set( 'memory_limit', $php_memory_limit . 'M' ); //phpcs:ignore
53
  }
54
  /* translators: %s: translation added */
55
  $this->current_php_memory_limit = sprintf( ' ' . __( 'Current PHP memory limit: %s.', 'woocommerce-jetpack' ), ini_get( 'memory_limit' ) );
2
  /**
3
  * Booster for WooCommerce - Module - General
4
  *
5
+ * @version 5.6.8
6
  * @author Pluggabl LLC.
7
  * @package Booster_For_WooCommerce/includes
8
  */
20
  /**
21
  * Constructor.
22
  *
23
+ * @version 5.6.8
24
  * @todo [dev] maybe expand `$this->desc` (e.g.: Custom roles tool, shortcodes in WordPress text widgets etc.)
25
  */
26
  public function __construct() {
49
  $php_time_limit = wcj_get_option( 'wcj_admin_tools_php_time_limit', '0' );
50
  // PHP Memory Limit.
51
  if ( '0' !== ( $php_memory_limit ) ) {
52
+ ini_set( 'memory_limit', $php_memory_limit . 'M' ); // phpcs:ignore WordPress.PHP.IniSet
53
  }
54
  /* translators: %s: translation added */
55
  $this->current_php_memory_limit = sprintf( ' ' . __( 'Current PHP memory limit: %s.', 'woocommerce-jetpack' ), ini_get( 'memory_limit' ) );
includes/class-wcj-global-discount.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Module - Global Discount
4
  *
5
- * @version 5.6.7
6
  * @since 2.5.7
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/includes
@@ -103,7 +103,7 @@ if ( ! class_exists( 'WCJ_Global_Discount' ) ) :
103
  /**
104
  * Get_wcj_sale_products.
105
  *
106
- * @version 5.6.2
107
  * @since 4.8.0
108
  *
109
  * @return array|mixed
@@ -178,7 +178,7 @@ if ( ! class_exists( 'WCJ_Global_Discount' ) ) :
178
 
179
  // Tax Query.
180
  if ( ! empty( $cats ) || ! empty( $tags ) ) {
181
- $args['tax_query'] = array(// phpcs:ignore
182
  'relation' => 'AND',
183
  );
184
  if ( ! empty( $cats ) ) {
2
  /**
3
  * Booster for WooCommerce - Module - Global Discount
4
  *
5
+ * @version 5.6.8
6
  * @since 2.5.7
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/includes
103
  /**
104
  * Get_wcj_sale_products.
105
  *
106
+ * @version 5.6.8
107
  * @since 4.8.0
108
  *
109
  * @return array|mixed
178
 
179
  // Tax Query.
180
  if ( ! empty( $cats ) || ! empty( $tags ) ) {
181
+ $args['tax_query'] = array(// phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_tax_query
182
  'relation' => 'AND',
183
  );
184
  if ( ! empty( $cats ) ) {
includes/class-wcj-max-products-per-user.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Module - Max Products per User
4
  *
5
- * @version 5.6.2
6
  * @since 3.5.0
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/includes
@@ -149,15 +149,16 @@ if ( ! class_exists( 'WCJ_Max_Products_Per_User' ) ) :
149
  /**
150
  * Calculate_data_notice.
151
  *
152
- * @version 5.6.2
153
  * @since 3.5.0
154
  */
155
  public function calculate_data_notice() {
156
- if ( isset( $_GET['wcj_max_products_per_user_calculate_data_finished'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification
 
157
  $class = 'notice notice-info';
158
  $message = __( 'Data re-calculated.', 'woocommerce-jetpack' ) . ' ' .
159
  /* translators: %s: translation added */
160
- sprintf( __( '%s order(s) processed.', 'woocommerce-jetpack' ), sanitize_text_field( wp_unslash( $_GET['wcj_max_products_per_user_calculate_data_finished'] ) ) ); // phpcs:ignore WordPress.Security.NonceVerification
161
  printf( '<div class="%1$s"><p>%2$s</p></div>', esc_attr( $class ), esc_html( $message ) );
162
  }
163
  }
@@ -165,12 +166,13 @@ if ( ! class_exists( 'WCJ_Max_Products_Per_User' ) ) :
165
  /**
166
  * Calculate_data.
167
  *
168
- * @version 5.6.2
169
  * @since 3.5.0
170
  * @todo reset `wcj_max_products_per_user_report` and `wcj_max_products_per_user_saved` meta
171
  */
172
  public function calculate_data() {
173
- if ( isset( $_GET['wcj_max_products_per_user_calculate_data'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification
 
174
  $offset = 0;
175
  $block_size = 512;
176
  $total_orders = 0;
2
  /**
3
  * Booster for WooCommerce - Module - Max Products per User
4
  *
5
+ * @version 5.6.8
6
  * @since 3.5.0
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/includes
149
  /**
150
  * Calculate_data_notice.
151
  *
152
+ * @version 5.6.8
153
  * @since 3.5.0
154
  */
155
  public function calculate_data_notice() {
156
+ $wpnonce = isset( $_REQUEST['wcj-cat-nonce'] ) ? wp_verify_nonce( sanitize_key( $_REQUEST['wcj-cat-nonce'] ), 'wcj-cat-nonce' ) : false;
157
+ if ( $wpnonce && isset( $_GET['wcj_max_products_per_user_calculate_data_finished'] ) ) {
158
  $class = 'notice notice-info';
159
  $message = __( 'Data re-calculated.', 'woocommerce-jetpack' ) . ' ' .
160
  /* translators: %s: translation added */
161
+ sprintf( __( '%s order(s) processed.', 'woocommerce-jetpack' ), sanitize_text_field( wp_unslash( $_GET['wcj_max_products_per_user_calculate_data_finished'] ) ) );
162
  printf( '<div class="%1$s"><p>%2$s</p></div>', esc_attr( $class ), esc_html( $message ) );
163
  }
164
  }
166
  /**
167
  * Calculate_data.
168
  *
169
+ * @version 5.6.8
170
  * @since 3.5.0
171
  * @todo reset `wcj_max_products_per_user_report` and `wcj_max_products_per_user_saved` meta
172
  */
173
  public function calculate_data() {
174
+ $wpnonce = isset( $_REQUEST['wcj-cat-nonce'] ) ? wp_verify_nonce( sanitize_key( $_REQUEST['wcj-cat-nonce'] ), 'wcj-cat-nonce' ) : false;
175
+ if ( $wpnonce && isset( $_GET['wcj_max_products_per_user_calculate_data'] ) ) {
176
  $offset = 0;
177
  $block_size = 512;
178
  $total_orders = 0;
includes/class-wcj-multicurrency-product-base-price.php CHANGED
@@ -1,8 +1,8 @@
1
- <?php //phpcs:ignore
2
  /**
3
  * Booster for WooCommerce - Module - Multicurrency Product Base Price
4
  *
5
- * @version 5.6.2
6
  * @since 2.4.8
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/includes
@@ -12,11 +12,11 @@ if ( ! defined( 'ABSPATH' ) ) {
12
  exit;
13
  }
14
 
15
- if ( ! class_exists( 'WCJ_Multicurrency_Base_Price' ) ) :
16
  /**
17
- * WCJ_Multicurrency_Base_Price.
18
  */
19
- class WCJ_Multicurrency_Base_Price extends WCJ_Module {
20
 
21
  /**
22
  * Constructor.
@@ -110,7 +110,7 @@ if ( ! class_exists( 'WCJ_Multicurrency_Base_Price' ) ) :
110
  /**
111
  * Modify_default_price_filter_hook.
112
  *
113
- * @version 5.6.2
114
  * @since 4.8.0
115
  *
116
  * @param string $query defines the query.
@@ -118,13 +118,15 @@ if ( ! class_exists( 'WCJ_Multicurrency_Base_Price' ) ) :
118
  * @return mixed
119
  */
120
  public function modify_default_price_filter_hook( $query ) {
 
121
  if (
122
  'no' === wcj_get_option( 'wcj_multicurrency_base_price_advanced_price_filter_comp', 'no' ) ||
123
- ! isset( $_GET['min_price'] ) || // phpcs:ignore WordPress.Security.NonceVerification
124
- ! isset( $_GET['max_price'] ) // phpcs:ignore WordPress.Security.NonceVerification
125
  ) {
126
  return $query;
127
  }
 
128
 
129
  // Remove Price Filter Meta Query.
130
  $meta_query = $query->get( 'meta_query' );
@@ -153,7 +155,7 @@ if ( ! class_exists( 'WCJ_Multicurrency_Base_Price' ) ) :
153
  /**
154
  * Price_filter_post_clauses.
155
  *
156
- * @version 5.6.2
157
  * @since 4.8.0
158
  *
159
  * @see WC_Query::price_filter_post_clauses
@@ -165,11 +167,13 @@ if ( ! class_exists( 'WCJ_Multicurrency_Base_Price' ) ) :
165
  */
166
  public function price_filter_post_clauses( $args, $wp_query ) {
167
  global $wpdb;
168
- if ( ! $wp_query->is_main_query() || ( ! isset( $_GET['max_price'] ) && ! isset( $_GET['min_price'] ) ) ) { // phpcs:ignore WordPress.Security.NonceVerification
 
169
  return $args;
170
  }
171
- $current_min_price = isset( $_GET['min_price'] ) ? floatval( wp_unslash( $_GET['min_price'] ) ) : 0; // phpcs:ignore WordPress.Security.NonceVerification
172
- $current_max_price = isset( $_GET['max_price'] ) ? floatval( wp_unslash( $_GET['max_price'] ) ) : PHP_INT_MAX; // phpcs:ignore WordPress.Security.NonceVerification
 
173
  if ( wc_tax_enabled() && 'incl' === wcj_get_option( 'woocommerce_tax_display_shop' ) && ! wc_prices_include_tax() ) {
174
  $tax_class = apply_filters( 'woocommerce_price_filter_widget_tax_class', '' ); // Uses standard tax class.
175
  $tax_rates = WC_Tax::get_rates( $tax_class );
@@ -389,7 +393,7 @@ if ( ! class_exists( 'WCJ_Multicurrency_Base_Price' ) ) :
389
  /**
390
  * Gets products by base price currency.
391
  *
392
- * @version 4.3.1
393
  * @since 4.3.1
394
  *
395
  * @param string $compare defines the compare.
@@ -408,7 +412,7 @@ if ( ! class_exists( 'WCJ_Multicurrency_Base_Price' ) ) :
408
  'update_post_meta_cache' => false,
409
  'update_post_term_cache' => false,
410
  'fields' => 'ids',
411
- 'meta_query' => array( //phpcs:ignore
412
  array(
413
  'key' => '_wcj_multicurrency_base_price_currency',
414
  'value' => $currency,
@@ -504,19 +508,18 @@ if ( ! class_exists( 'WCJ_Multicurrency_Base_Price' ) ) :
504
  /**
505
  * Change_currency_symbol_on_product_edit.
506
  *
507
- * @version 3.9.0
508
  * @since 2.4.8
509
  * @param string $currency_symbol defines the currency_symbol.
510
  * @param string | int $currency defines the currency.
511
  */
512
  public function change_currency_symbol_on_product_edit( $currency_symbol, $currency ) {
513
- $nonce = wp_create_nonce();
514
  if ( is_admin() ) {
515
  global $pagenow;
 
516
  if (
517
  ( 'post.php' === $pagenow && isset( $_GET['action'] ) && 'edit' === $_GET['action'] ) || // admin product edit page.
518
  ( ! $this->do_convert_in_back_end && 'edit.php' === $pagenow && isset( $_GET['post_type'] ) && 'product' === $_GET['post_type'] ) // admin products list.
519
- && wp_verify_nonce( $nonce )
520
  ) {
521
  $multicurrency_base_price_currency = get_post_meta( get_the_ID(), '_wcj_multicurrency_base_price_currency', true );
522
  if ( '' !== $multicurrency_base_price_currency ) {
@@ -526,6 +529,7 @@ if ( ! class_exists( 'WCJ_Multicurrency_Base_Price' ) ) :
526
  return $return;
527
  }
528
  }
 
529
  }
530
  return $currency_symbol;
531
  }
@@ -534,4 +538,4 @@ if ( ! class_exists( 'WCJ_Multicurrency_Base_Price' ) ) :
534
 
535
  endif;
536
 
537
- return new WCJ_Multicurrency_Base_Price();
1
+ <?php
2
  /**
3
  * Booster for WooCommerce - Module - Multicurrency Product Base Price
4
  *
5
+ * @version 5.6.8
6
  * @since 2.4.8
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/includes
12
  exit;
13
  }
14
 
15
+ if ( ! class_exists( 'WCJ_Multicurrency_Product_Base_Price' ) ) :
16
  /**
17
+ * WCJ_Multicurrency_Product_Base_Price.
18
  */
19
+ class WCJ_Multicurrency_Product_Base_Price extends WCJ_Module {
20
 
21
  /**
22
  * Constructor.
110
  /**
111
  * Modify_default_price_filter_hook.
112
  *
113
+ * @version 5.6.8
114
  * @since 4.8.0
115
  *
116
  * @param string $query defines the query.
118
  * @return mixed
119
  */
120
  public function modify_default_price_filter_hook( $query ) {
121
+ // phpcs:disable WordPress.Security.NonceVerification
122
  if (
123
  'no' === wcj_get_option( 'wcj_multicurrency_base_price_advanced_price_filter_comp', 'no' ) ||
124
+ ! isset( $_GET['min_price'] ) ||
125
+ ! isset( $_GET['max_price'] )
126
  ) {
127
  return $query;
128
  }
129
+ // phpcs:enable WordPress.Security.NonceVerification
130
 
131
  // Remove Price Filter Meta Query.
132
  $meta_query = $query->get( 'meta_query' );
155
  /**
156
  * Price_filter_post_clauses.
157
  *
158
+ * @version 5.6.8
159
  * @since 4.8.0
160
  *
161
  * @see WC_Query::price_filter_post_clauses
167
  */
168
  public function price_filter_post_clauses( $args, $wp_query ) {
169
  global $wpdb;
170
+ // phpcs:disable WordPress.Security.NonceVerification
171
+ if ( ! $wp_query->is_main_query() || ( ! isset( $_GET['max_price'] ) && ! isset( $_GET['min_price'] ) ) ) {
172
  return $args;
173
  }
174
+ $current_min_price = isset( $_GET['min_price'] ) ? floatval( wp_unslash( $_GET['min_price'] ) ) : 0;
175
+ $current_max_price = isset( $_GET['max_price'] ) ? floatval( wp_unslash( $_GET['max_price'] ) ) : PHP_INT_MAX;
176
+ // phpcs:enable WordPress.Security.NonceVerification
177
  if ( wc_tax_enabled() && 'incl' === wcj_get_option( 'woocommerce_tax_display_shop' ) && ! wc_prices_include_tax() ) {
178
  $tax_class = apply_filters( 'woocommerce_price_filter_widget_tax_class', '' ); // Uses standard tax class.
179
  $tax_rates = WC_Tax::get_rates( $tax_class );
393
  /**
394
  * Gets products by base price currency.
395
  *
396
+ * @version 5.6.8
397
  * @since 4.3.1
398
  *
399
  * @param string $compare defines the compare.
412
  'update_post_meta_cache' => false,
413
  'update_post_term_cache' => false,
414
  'fields' => 'ids',
415
+ 'meta_query' => array( // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_query
416
  array(
417
  'key' => '_wcj_multicurrency_base_price_currency',
418
  'value' => $currency,
508
  /**
509
  * Change_currency_symbol_on_product_edit.
510
  *
511
+ * @version 5.6.8
512
  * @since 2.4.8
513
  * @param string $currency_symbol defines the currency_symbol.
514
  * @param string | int $currency defines the currency.
515
  */
516
  public function change_currency_symbol_on_product_edit( $currency_symbol, $currency ) {
 
517
  if ( is_admin() ) {
518
  global $pagenow;
519
+ // phpcs:disable WordPress.Security.NonceVerification
520
  if (
521
  ( 'post.php' === $pagenow && isset( $_GET['action'] ) && 'edit' === $_GET['action'] ) || // admin product edit page.
522
  ( ! $this->do_convert_in_back_end && 'edit.php' === $pagenow && isset( $_GET['post_type'] ) && 'product' === $_GET['post_type'] ) // admin products list.
 
523
  ) {
524
  $multicurrency_base_price_currency = get_post_meta( get_the_ID(), '_wcj_multicurrency_base_price_currency', true );
525
  if ( '' !== $multicurrency_base_price_currency ) {
529
  return $return;
530
  }
531
  }
532
+ // phpcs:enable WordPress.Security.NonceVerification
533
  }
534
  return $currency_symbol;
535
  }
538
 
539
  endif;
540
 
541
+ return new WCJ_Multicurrency_Product_Base_Price();
includes/class-wcj-multicurrency.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Module - Multicurrency (Currency Switcher)
4
  *
5
- * @version 5.6.6
6
  * @since 2.4.3
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/includes
@@ -534,7 +534,7 @@ if ( ! class_exists( 'WCJ_Multicurrency' ) ) :
534
  * First it removes products witch `_wcj_multicurrency_per_product_regular_price_{$current_currency_code}` meta don't match min and max.
535
  * Then it adds products witch `_wcj_multicurrency_per_product_regular_price_{$current_currency_code}` meta match min and max.
536
  *
537
- * @version 5.6.2
538
  * @since 4.5.0
539
  *
540
  * @see WC_Query::price_filter_post_clauses()
@@ -560,14 +560,11 @@ if ( ! class_exists( 'WCJ_Multicurrency' ) ) :
560
  }
561
 
562
  global $wpdb;
563
- $wpnonce = true;
564
- if ( function_exists( 'wp_verify_nonce' ) ) {
565
- $wpnonce = isset( $_REQUEST['_wpnonce'] ) ? wp_verify_nonce( sanitize_key( isset( $_REQUEST['_wpnonce'] ) ? $_REQUEST['_wpnonce'] : '' ), 'woocommerce-settings' ) : true;
566
- }
567
  $current_currency_code = $this->get_current_currency_code();
568
  $exchange_rate = $this->get_currency_exchange_rate( $current_currency_code );
569
- $min_price = ( $wpnonce && isset( $_GET['min_price'] ) ) ? floatval( wp_unslash( $_GET['min_price'] ) ) : 0;
570
- $max_price = ( $wpnonce && isset( $_GET['max_price'] ) ) ? floatval( wp_unslash( $_GET['max_price'] ) ) : PHP_INT_MAX;
571
  $min_max_join = "LEFT JOIN {$wpdb->postmeta} AS pm on pm.post_id = {$wpdb->posts}.ID AND (pm.meta_key IN ('_wcj_multicurrency_per_product_min_price_{$current_currency_code}','_wcj_multicurrency_per_product_max_price_{$current_currency_code}') and pm.meta_value!='')";
572
  if ( false === strpos( $args['join'], $min_max_join ) ) {
573
  $args['join'] .= " {$min_max_join} ";
@@ -576,6 +573,7 @@ if ( ! class_exists( 'WCJ_Multicurrency' ) ) :
576
  $args['fields'] .= ", (IFNULL(MAX((pm.meta_value +0))/{$exchange_rate},max_price) +0) AS wcj_max_price ";
577
  $args['where'] = preg_replace( '/and wc_product_meta_lookup.min_price >= \d.* and wc_product_meta_lookup.max_price <= \d.*\s/i', '', $args['where'] );
578
  $args['groupby'] .= " having wcj_min_price >= $min_price AND wcj_min_price <= $max_price ";
 
579
  return $args;
580
  }
581
 
@@ -952,14 +950,14 @@ if ( ! class_exists( 'WCJ_Multicurrency' ) ) :
952
  /**
953
  * Updates min and max prices.
954
  *
955
- * @version 5.6.6
956
  * @since 4.5.0
957
  *
958
  * @param int $post_id defines the post_id.
959
  * @param int | string $currency_code_param defines the currency_code_param.
960
  */
961
  public function save_min_max_prices_per_product( $post_id, $currency_code_param = '' ) {
962
- $wpnonce = wp_verify_nonce( wp_unslash( isset( $_POST['woocommerce_meta_nonce'] ) ? sanitize_text_field( wp_unslash( $_POST['woocommerce_meta_nonce'] ) ) : '' ), 'woocommerce_save_data' );
963
  $product = wc_get_product( $post_id );
964
  $products = array();
965
  if ( $product->is_type( 'variable' ) ) {
@@ -1031,15 +1029,12 @@ if ( ! class_exists( 'WCJ_Multicurrency' ) ) :
1031
  /**
1032
  * Init.
1033
  *
1034
- * @version 5.6.2
1035
  * @since 3.4.5
1036
  */
1037
  public function init() {
1038
  wcj_session_maybe_start();
1039
- $wpnonce = true;
1040
- if ( function_exists( 'wp_verify_nonce' ) ) {
1041
- $wpnonce = isset( $_REQUEST['_wpnonce'] ) ? wp_verify_nonce( sanitize_key( isset( $_REQUEST['_wpnonce'] ) ? $_REQUEST['_wpnonce'] : '' ) ) : true;
1042
- }
1043
  $session_value = wcj_session_get( 'wcj-currency' );
1044
  if ( null === ( $session_value ) ) {
1045
  $currency = $this->get_default_currency();
@@ -1050,7 +1045,7 @@ if ( ! class_exists( 'WCJ_Multicurrency' ) ) :
1050
  if ( 'yes' === wcj_get_option( 'wcj_multicurrency_default_currency_force', 'no' ) ) {
1051
  $currency = $this->get_default_currency();
1052
  }
1053
- if ( $wpnonce && isset( $currency ) ) {
1054
  wcj_session_set( 'wcj-currency', $currency );
1055
  }
1056
  }
2
  /**
3
  * Booster for WooCommerce - Module - Multicurrency (Currency Switcher)
4
  *
5
+ * @version 5.6.8
6
  * @since 2.4.3
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/includes
534
  * First it removes products witch `_wcj_multicurrency_per_product_regular_price_{$current_currency_code}` meta don't match min and max.
535
  * Then it adds products witch `_wcj_multicurrency_per_product_regular_price_{$current_currency_code}` meta match min and max.
536
  *
537
+ * @version 5.6.8
538
  * @since 4.5.0
539
  *
540
  * @see WC_Query::price_filter_post_clauses()
560
  }
561
 
562
  global $wpdb;
563
+ // phpcs:disable WordPress.Security.NonceVerification
 
 
 
564
  $current_currency_code = $this->get_current_currency_code();
565
  $exchange_rate = $this->get_currency_exchange_rate( $current_currency_code );
566
+ $min_price = ( isset( $_GET['min_price'] ) ) ? floatval( wp_unslash( $_GET['min_price'] ) ) : 0;
567
+ $max_price = ( isset( $_GET['max_price'] ) ) ? floatval( wp_unslash( $_GET['max_price'] ) ) : PHP_INT_MAX;
568
  $min_max_join = "LEFT JOIN {$wpdb->postmeta} AS pm on pm.post_id = {$wpdb->posts}.ID AND (pm.meta_key IN ('_wcj_multicurrency_per_product_min_price_{$current_currency_code}','_wcj_multicurrency_per_product_max_price_{$current_currency_code}') and pm.meta_value!='')";
569
  if ( false === strpos( $args['join'], $min_max_join ) ) {
570
  $args['join'] .= " {$min_max_join} ";
573
  $args['fields'] .= ", (IFNULL(MAX((pm.meta_value +0))/{$exchange_rate},max_price) +0) AS wcj_max_price ";
574
  $args['where'] = preg_replace( '/and wc_product_meta_lookup.min_price >= \d.* and wc_product_meta_lookup.max_price <= \d.*\s/i', '', $args['where'] );
575
  $args['groupby'] .= " having wcj_min_price >= $min_price AND wcj_min_price <= $max_price ";
576
+ // phpcs:enable WordPress.Security.NonceVerification
577
  return $args;
578
  }
579
 
950
  /**
951
  * Updates min and max prices.
952
  *
953
+ * @version 5.6.8
954
  * @since 4.5.0
955
  *
956
  * @param int $post_id defines the post_id.
957
  * @param int | string $currency_code_param defines the currency_code_param.
958
  */
959
  public function save_min_max_prices_per_product( $post_id, $currency_code_param = '' ) {
960
+ $wpnonce = isset( $_POST['woocommerce_meta_nonce'] ) ? wp_verify_nonce( sanitize_text_field( wp_unslash( $_POST['woocommerce_meta_nonce'] ) ), 'woocommerce_save_data' ) : false;
961
  $product = wc_get_product( $post_id );
962
  $products = array();
963
  if ( $product->is_type( 'variable' ) ) {
1029
  /**
1030
  * Init.
1031
  *
1032
+ * @version 5.6.8
1033
  * @since 3.4.5
1034
  */
1035
  public function init() {
1036
  wcj_session_maybe_start();
1037
+ $wpnonce = isset( $_REQUEST['wcj-currency-nonce'] ) ? wp_verify_nonce( sanitize_key( $_REQUEST['wcj-currency-nonce'] ), 'wcj-currency' ) : false;
 
 
 
1038
  $session_value = wcj_session_get( 'wcj-currency' );
1039
  if ( null === ( $session_value ) ) {
1040
  $currency = $this->get_default_currency();
1045
  if ( 'yes' === wcj_get_option( 'wcj_multicurrency_default_currency_force', 'no' ) ) {
1046
  $currency = $this->get_default_currency();
1047
  }
1048
+ if ( isset( $currency ) ) {
1049
  wcj_session_set( 'wcj-currency', $currency );
1050
  }
1051
  }
includes/class-wcj-my-account.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Module - My Account
4
  *
5
- * @version 5.6.7
6
  * @since 2.9.0
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/includes
@@ -169,14 +169,14 @@ if ( ! class_exists( 'WCJ_My_Account' ) ) :
169
  /**
170
  * Set_custom_page_title.
171
  *
172
- * @version 5.6.7
173
  * @since 4.3.0
174
  * @param string $title defines the title.
175
  */
176
  public function set_custom_page_title( $title ) {
177
- $wpnonce = isset( $_REQUEST['_wpnonce'] ) ? wp_verify_nonce( sanitize_key( $_REQUEST['_wpnonce'] ), 'woocommerce-settings' ) : true;
178
  if (
179
- $wpnonce && (
180
  ! isset( $_GET['section'] ) ||
181
  is_admin() ||
182
  ! in_the_loop() ||
@@ -228,7 +228,7 @@ if ( ! class_exists( 'WCJ_My_Account' ) ) :
228
  /**
229
  * Set_custom_page_url.
230
  *
231
- * @version 5.5.9
232
  * @since 4.3.0
233
  * @todo [dev] (maybe) customizable `section` (e.g. `wcj-section`)
234
  * @param string $url defines the url.
@@ -241,7 +241,11 @@ if ( ! class_exists( 'WCJ_My_Account' ) ) :
241
  if ( ! isset( $this->custom_pages ) ) {
242
  $this->get_custom_pages();
243
  }
244
- return ( isset( $this->custom_pages[ $endpoint ] ) && empty( $this->custom_pages[ $endpoint ]['endpoint'] ) && ( $myaccount_page_id ) ? esc_url( add_query_arg( 'section', $endpoint, get_permalink( $myaccount_page_id ) ) ) : esc_url( $url ) );
 
 
 
 
245
  }
246
 
247
  /**
@@ -283,7 +287,7 @@ if ( ! class_exists( 'WCJ_My_Account' ) ) :
283
  /**
284
  * Customize_dashboard.
285
  *
286
- * @version 5.6.7
287
  * @since 3.8.0
288
  * @see woocommerce/templates/myaccount/dashboard.php
289
  * @param string | array $value defines the value.
@@ -299,7 +303,7 @@ if ( ! class_exists( 'WCJ_My_Account' ) ) :
299
  if ( false !== $endpoint ) {
300
  $endpoint_tab = wp_list_filter( $this->custom_pages, array( 'endpoint' => $endpoint ) );
301
  }
302
- $wpnonce = isset( $_REQUEST['_wpnonce'] ) ? wp_verify_nonce( sanitize_key( $_REQUEST['_wpnonce'] ), 'woocommerce-settings' ) : true;
303
  $page_id = $wpnonce && sanitize_text_field( wp_unslash( ( $_GET['section'] ) ) ) ? sanitize_text_field( wp_unslash( ( $_GET['section'] ) ) ) : ( false !== $endpoint ? array_keys( wp_list_pluck( $endpoint_tab, 'endpoint' ) )[0] : '' );
304
  if ( isset( $this->custom_pages[ $page_id ] ) ) {
305
  echo do_shortcode( $this->custom_pages[ $page_id ]['content'] );
@@ -431,7 +435,7 @@ if ( ! class_exists( 'WCJ_My_Account' ) ) :
431
  /**
432
  * Add_registration_extra_fields.
433
  *
434
- * @version 5.6.7
435
  * @since 3.6.0
436
  * @todo (maybe) more fields to choose from (i.e. not only "user role" field)
437
  * @todo (maybe) customizable position (check for other hooks or at least customizable priority on `woocommerce_register_form`)
@@ -439,7 +443,7 @@ if ( ! class_exists( 'WCJ_My_Account' ) ) :
439
  */
440
  public function add_registration_extra_fields() {
441
  $user_roles_options_html = '';
442
- $wpnonce = isset( $_REQUEST['woocommerce-register-nonce'] ) ? wp_verify_nonce( sanitize_key( $_REQUEST['woocommerce-register-nonce'] ), 'woocommerce-register' ) : true;
443
  $current_user_role_input = ( $wpnonce && ! empty( $_POST['wcj_user_role'] ) ) ? sanitize_text_field( wp_unslash( $_POST['wcj_user_role'] ) ) :
444
  get_option( 'wcj_my_account_registration_extra_fields_user_role_default', 'customer' );
445
  $user_roles_options = wcj_get_option( 'wcj_my_account_registration_extra_fields_user_role_options', array( 'customer' ) );
@@ -458,7 +462,7 @@ if ( ! class_exists( 'WCJ_My_Account' ) ) :
458
  /**
459
  * Process_registration_extra_fields.
460
  *
461
- * @version 5.6.7
462
  * @since 3.6.0
463
  * @todo (maybe) optional admin confirmation for some user roles (probably will need to create additional `...-pending` user roles)
464
  * @param id $customer_id defines the customer_id.
@@ -466,7 +470,7 @@ if ( ! class_exists( 'WCJ_My_Account' ) ) :
466
  * @param string $password_generated defines the password_generated.
467
  */
468
  public function process_registration_extra_fields( $customer_id, $new_customer_data, $password_generated ) {
469
- $wpnonce = isset( $_REQUEST['woocommerce-register-nonce'] ) ? wp_verify_nonce( sanitize_key( $_REQUEST['woocommerce-register-nonce'] ), 'woocommerce-register' ) : true;
470
  if ( $wpnonce && isset( $_POST['wcj_user_role'] ) && '' !== $_POST['wcj_user_role'] ) {
471
  $user_roles_options = wcj_get_option( 'wcj_my_account_registration_extra_fields_user_role_options', array( 'customer' ) );
472
  if ( ! empty( $user_roles_options ) && in_array( $_POST['wcj_user_role'], $user_roles_options, true ) ) {
2
  /**
3
  * Booster for WooCommerce - Module - My Account
4
  *
5
+ * @version 5.6.8
6
  * @since 2.9.0
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/includes
169
  /**
170
  * Set_custom_page_title.
171
  *
172
+ * @version 5.6.8
173
  * @since 4.3.0
174
  * @param string $title defines the title.
175
  */
176
  public function set_custom_page_title( $title ) {
177
+ $wpnonce = isset( $_REQUEST['wcj_section_nonce'] ) ? wp_verify_nonce( sanitize_key( $_REQUEST['wcj_section_nonce'] ), 'wcj_section' ) : false;
178
  if (
179
+ ! $wpnonce || (
180
  ! isset( $_GET['section'] ) ||
181
  is_admin() ||
182
  ! in_the_loop() ||
228
  /**
229
  * Set_custom_page_url.
230
  *
231
+ * @version 5.6.8
232
  * @since 4.3.0
233
  * @todo [dev] (maybe) customizable `section` (e.g. `wcj-section`)
234
  * @param string $url defines the url.
241
  if ( ! isset( $this->custom_pages ) ) {
242
  $this->get_custom_pages();
243
  }
244
+ $section_link_arg = array(
245
+ 'section' => $endpoint,
246
+ 'wcj_section_nonce' => wp_create_nonce( 'wcj_section' ),
247
+ );
248
+ return ( isset( $this->custom_pages[ $endpoint ] ) && empty( $this->custom_pages[ $endpoint ]['endpoint'] ) && ( $myaccount_page_id ) ? esc_url( add_query_arg( $section_link_arg, get_permalink( $myaccount_page_id ) ) ) : esc_url( $url ) );
249
  }
250
 
251
  /**
287
  /**
288
  * Customize_dashboard.
289
  *
290
+ * @version 5.6.8
291
  * @since 3.8.0
292
  * @see woocommerce/templates/myaccount/dashboard.php
293
  * @param string | array $value defines the value.
303
  if ( false !== $endpoint ) {
304
  $endpoint_tab = wp_list_filter( $this->custom_pages, array( 'endpoint' => $endpoint ) );
305
  }
306
+ $wpnonce = isset( $_REQUEST['wcj_section_nonce'] ) ? wp_verify_nonce( sanitize_key( $_REQUEST['wcj_section_nonce'] ), 'wcj_section' ) : false;
307
  $page_id = $wpnonce && sanitize_text_field( wp_unslash( ( $_GET['section'] ) ) ) ? sanitize_text_field( wp_unslash( ( $_GET['section'] ) ) ) : ( false !== $endpoint ? array_keys( wp_list_pluck( $endpoint_tab, 'endpoint' ) )[0] : '' );
308
  if ( isset( $this->custom_pages[ $page_id ] ) ) {
309
  echo do_shortcode( $this->custom_pages[ $page_id ]['content'] );
435
  /**
436
  * Add_registration_extra_fields.
437
  *
438
+ * @version 5.6.8
439
  * @since 3.6.0
440
  * @todo (maybe) more fields to choose from (i.e. not only "user role" field)
441
  * @todo (maybe) customizable position (check for other hooks or at least customizable priority on `woocommerce_register_form`)
443
  */
444
  public function add_registration_extra_fields() {
445
  $user_roles_options_html = '';
446
+ $wpnonce = isset( $_REQUEST['woocommerce-register-nonce'] ) ? wp_verify_nonce( sanitize_key( $_REQUEST['woocommerce-register-nonce'] ), 'woocommerce-register' ) : false;
447
  $current_user_role_input = ( $wpnonce && ! empty( $_POST['wcj_user_role'] ) ) ? sanitize_text_field( wp_unslash( $_POST['wcj_user_role'] ) ) :
448
  get_option( 'wcj_my_account_registration_extra_fields_user_role_default', 'customer' );
449
  $user_roles_options = wcj_get_option( 'wcj_my_account_registration_extra_fields_user_role_options', array( 'customer' ) );
462
  /**
463
  * Process_registration_extra_fields.
464
  *
465
+ * @version 5.6.8
466
  * @since 3.6.0
467
  * @todo (maybe) optional admin confirmation for some user roles (probably will need to create additional `...-pending` user roles)
468
  * @param id $customer_id defines the customer_id.
470
  * @param string $password_generated defines the password_generated.
471
  */
472
  public function process_registration_extra_fields( $customer_id, $new_customer_data, $password_generated ) {
473
+ $wpnonce = isset( $_REQUEST['woocommerce-register-nonce'] ) ? wp_verify_nonce( sanitize_key( $_REQUEST['woocommerce-register-nonce'] ), 'woocommerce-register' ) : false;
474
  if ( $wpnonce && isset( $_POST['wcj_user_role'] ) && '' !== $_POST['wcj_user_role'] ) {
475
  $user_roles_options = wcj_get_option( 'wcj_my_account_registration_extra_fields_user_role_options', array( 'customer' ) );
476
  if ( ! empty( $user_roles_options ) && in_array( $_POST['wcj_user_role'], $user_roles_options, true ) ) {
includes/class-wcj-offer-price.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Module - Offer Price
4
  *
5
- * @version 5.6.7
6
  * @since 2.9.0
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/includes
@@ -92,7 +92,7 @@ if ( ! class_exists( 'WCJ_Offer_Price' ) ) :
92
  /**
93
  * Add_styling.
94
  *
95
- * @version 5.6.2
96
  * @since 3.7.0
97
  */
98
  public function add_styling() {
@@ -110,25 +110,13 @@ if ( ! class_exists( 'WCJ_Offer_Price' ) ) :
110
  }
111
  }
112
  $css = "<style type=\"text/css\">
113
- .wcj-offer-price-modal-content {
114
- width: {$styling_options['form_content_width']};
115
- }
116
- .wcj-offer-modal-header {
117
- background-color: {$styling_options['form_header_back_color']};
118
- color: {$styling_options['form_header_text_color']};
119
- }
120
- .wcj-offer-modal-header h1, .wcj-offer-modal-header h2, .wcj-offer-modal-header h3, .wcj-offer-modal-header h4, .wcj-offer-modal-header h5, .wcj-offer-modal-header h6 {
121
- color: {$styling_options['form_header_text_color']};
122
- }
123
- .wcj-offer-price-modal-footer {
124
- background-color: {$styling_options['form_footer_back_color']};
125
- color: {$styling_options['form_footer_text_color']};
126
- }
127
- .wcj-offer-price-modal-footer h1, .wcj-offer-price-modal-footer h2, .wcj-offer-price-modal-footer h3, .wcj-offer-price-modal-footer h4, .wcj-offer-price-modal-footer h5, .wcj-offer-price-modal-footer h6 {
128
- color: {$styling_options['form_footer_text_color']};
129
- }
130
  </style>";
131
- echo $css; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
132
  }
133
 
134
  /**
@@ -188,7 +176,7 @@ if ( ! class_exists( 'WCJ_Offer_Price' ) ) :
188
  /**
189
  * Create_offer_price_history_meta_box.
190
  *
191
- * @version 5.6.1
192
  * @since 2.9.0
193
  */
194
  public function create_offer_price_history_meta_box() {
@@ -255,12 +243,14 @@ if ( ! class_exists( 'WCJ_Offer_Price' ) ) :
255
  }
256
  echo wp_kses_post( wcj_get_table_html( $table_data, array( 'table_class' => 'widefat striped' ) ) );
257
  foreach ( $average_offers as $average_offer_currency_code => $average_offer_data ) {
258
- echo '<p>' . sprintf(
259
- /* translators: %s: search term */
260
- esc_html__( 'Average offer: %1$s (from %2$s offer(s))', 'woocommerce-jetpack' ),
261
- wc_price( ( $average_offer_data['offers_sum'] / $average_offer_data['total_offers'] ), array( 'currency' => $average_offer_currency_code ) ), // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
262
- $average_offer_data['total_offers'] // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
263
- ) . '</p>';
 
 
264
  }
265
  echo '<p>' .
266
  '<input type="checkbox" id="wcj_offer_price_delete_history" name="wcj_offer_price_delete_history">' .
@@ -472,7 +462,7 @@ if ( ! class_exists( 'WCJ_Offer_Price' ) ) :
472
  /**
473
  * Add_offer_price_button.
474
  *
475
- * @version 5.6.2
476
  * @since 2.9.0
477
  */
478
  public function add_offer_price_button() {
@@ -486,17 +476,19 @@ if ( ! class_exists( 'WCJ_Offer_Price' ) ) :
486
  if ( '' !== $additional_class ) {
487
  $additional_class = ' ' . $additional_class;
488
  }
489
- echo '<p>' .
490
- '<button type="submit"' .
491
- ' name="wcj-offer-price-button"' .
492
- ' class="wcj-offer-price-button' . $additional_class . '"' . // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
493
- ' value="' . esc_html( $product_id ) . '"' .
494
- ' style="' . wcj_get_option( 'wcj_offer_price_button_style', '' ) . '"' . // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
495
- ' wcj_data=\'' . wp_json_encode( $this->get_wcj_data_array( $product_id ) ) . '\'' .
496
- '>' .
497
- get_option( 'wcj_offer_price_button_label', __( 'Make an offer', 'woocommerce-jetpack' ) ) . // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
498
- '</button>' .
499
- '</p>';
 
 
500
  }
501
 
502
  /**
@@ -540,7 +532,7 @@ if ( ! class_exists( 'WCJ_Offer_Price' ) ) :
540
  }
541
  // Price offer array.
542
  $price_offer = array(
543
- 'offer_timestamp' => gmdate( 'U' ),
544
  'product_title' => $_product->get_title(),
545
  'product_edit_link' => get_edit_post_link( $_product->get_id() ),
546
  'offered_price' => isset( $_POST['wcj-offer-price-price'] ) ? sanitize_text_field( wp_unslash( $_POST['wcj-offer-price-price'] ) ) : '',
2
  /**
3
  * Booster for WooCommerce - Module - Offer Price
4
  *
5
+ * @version 5.6.8
6
  * @since 2.9.0
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/includes
92
  /**
93
  * Add_styling.
94
  *
95
+ * @version 5.6.8
96
  * @since 3.7.0
97
  */
98
  public function add_styling() {
110
  }
111
  }
112
  $css = "<style type=\"text/css\">
113
+ .wcj-offer-price-modal-content {width: {$styling_options['form_content_width']};}
114
+ .wcj-offer-modal-header {background-color: {$styling_options['form_header_back_color']};color: {$styling_options['form_header_text_color']};}
115
+ .wcj-offer-modal-header h1, .wcj-offer-modal-header h2, .wcj-offer-modal-header h3, .wcj-offer-modal-header h4, .wcj-offer-modal-header h5, .wcj-offer-modal-header h6 {color: {$styling_options['form_header_text_color']};}
116
+ .wcj-offer-price-modal-footer {background-color: {$styling_options['form_footer_back_color']};color: {$styling_options['form_footer_text_color']};}
117
+ .wcj-offer-price-modal-footer h1, .wcj-offer-price-modal-footer h2, .wcj-offer-price-modal-footer h3, .wcj-offer-price-modal-footer h4, .wcj-offer-price-modal-footer h5, .wcj-offer-price-modal-footer h6 {color: {$styling_options['form_footer_text_color']};}
 
 
 
 
 
 
 
 
 
 
 
 
118
  </style>";
119
+ echo wp_kses_post( $css );
120
  }
121
 
122
  /**
176
  /**
177
  * Create_offer_price_history_meta_box.
178
  *
179
+ * @version 5.6.8
180
  * @since 2.9.0
181
  */
182
  public function create_offer_price_history_meta_box() {
243
  }
244
  echo wp_kses_post( wcj_get_table_html( $table_data, array( 'table_class' => 'widefat striped' ) ) );
245
  foreach ( $average_offers as $average_offer_currency_code => $average_offer_data ) {
246
+ echo wp_kses_post(
247
+ '<p>' . sprintf(
248
+ /* translators: %s: search term */
249
+ esc_html__( 'Average offer: %1$s (from %2$s offer(s))', 'woocommerce-jetpack' ),
250
+ wc_price( ( $average_offer_data['offers_sum'] / $average_offer_data['total_offers'] ), array( 'currency' => $average_offer_currency_code ) ),
251
+ $average_offer_data['total_offers']
252
+ ) . '</p>'
253
+ );
254
  }
255
  echo '<p>' .
256
  '<input type="checkbox" id="wcj_offer_price_delete_history" name="wcj_offer_price_delete_history">' .
462
  /**
463
  * Add_offer_price_button.
464
  *
465
+ * @version 5.6.8
466
  * @since 2.9.0
467
  */
468
  public function add_offer_price_button() {
476
  if ( '' !== $additional_class ) {
477
  $additional_class = ' ' . $additional_class;
478
  }
479
+ echo wp_kses_post(
480
+ '<p>' .
481
+ '<button type="submit"' .
482
+ ' name="wcj-offer-price-button"' .
483
+ ' class="wcj-offer-price-button' . $additional_class . '"' .
484
+ ' value="' . esc_html( $product_id ) . '"' .
485
+ ' style="' . wcj_get_option( 'wcj_offer_price_button_style', '' ) . '"' .
486
+ ' wcj_data=\'' . wp_json_encode( $this->get_wcj_data_array( $product_id ) ) . '\'' .
487
+ '>' .
488
+ get_option( 'wcj_offer_price_button_label', __( 'Make an offer', 'woocommerce-jetpack' ) ) .
489
+ '</button>' .
490
+ '</p>'
491
+ );
492
  }
493
 
494
  /**
532
  }
533
  // Price offer array.
534
  $price_offer = array(
535
+ 'offer_timestamp' => wcj_get_timestamp_date_from_gmt(),
536
  'product_title' => $_product->get_title(),
537
  'product_edit_link' => get_edit_post_link( $_product->get_id() ),
538
  'offered_price' => isset( $_POST['wcj-offer-price-price'] ) ? sanitize_text_field( wp_unslash( $_POST['wcj-offer-price-price'] ) ) : '',
includes/class-wcj-old-slugs.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Module - Old Slugs
4
  *
5
- * @version 5.6.7
6
  * @author Pluggabl LLC.
7
  * @package Booster_For_WooCommerce/includes
8
  */
@@ -43,7 +43,7 @@ if ( ! class_exists( 'WCJ_Old_Slugs' ) ) :
43
  /**
44
  * Create_old_slugs_tool.
45
  *
46
- * @version 5.6.7
47
  */
48
  public function create_old_slugs_tool() {
49
 
@@ -89,8 +89,8 @@ if ( ! class_exists( 'WCJ_Old_Slugs' ) ) :
89
 
90
  if ( ( isset( $_POST['remove_old_products_slugs'] ) && $remove_old_products_slugs_wpnonce ) || ( isset( $_POST['remove_old_non_products_slugs'] ) && $remove_old_non_products_slugs_wpnonce ) ) {
91
  $post_ids_to_delete = join( ',', ( isset( $_POST['remove_old_products_slugs'] ) ? $posts_ids['products'] : $posts_ids['non_products'] ) );
92
- $delete_result = $wpdb->get_results( "DELETE FROM $wp_postmeta_table WHERE meta_key = '_wp_old_slug' AND post_id IN ($post_ids_to_delete)" ); //phpcs:ignore
93
- $recheck_result = $wpdb->get_results( "SELECT * FROM $wp_postmeta_table WHERE meta_key = '_wp_old_slug'" ); //phpcs:ignore
94
  $recheck_result_count = count( $recheck_result );
95
  $remove_result_html = '<div class="updated"><p>' .
96
  sprintf(
2
  /**
3
  * Booster for WooCommerce - Module - Old Slugs
4
  *
5
+ * @version 5.6.8
6
  * @author Pluggabl LLC.
7
  * @package Booster_For_WooCommerce/includes
8
  */
43
  /**
44
  * Create_old_slugs_tool.
45
  *
46
+ * @version 5.6.8
47
  */
48
  public function create_old_slugs_tool() {
49
 
89
 
90
  if ( ( isset( $_POST['remove_old_products_slugs'] ) && $remove_old_products_slugs_wpnonce ) || ( isset( $_POST['remove_old_non_products_slugs'] ) && $remove_old_non_products_slugs_wpnonce ) ) {
91
  $post_ids_to_delete = join( ',', ( isset( $_POST['remove_old_products_slugs'] ) ? $posts_ids['products'] : $posts_ids['non_products'] ) );
92
+ $delete_result = $wpdb->get_results( "DELETE FROM {$wpdb->prefix}postmeta WHERE meta_key = '_wp_old_slug' AND post_id IN ($post_ids_to_delete)" ); // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.PreparedSQL.InterpolatedNotPrepared
93
+ $recheck_result = $wpdb->get_results( "SELECT * FROM {$wpdb->prefix}postmeta WHERE meta_key = '_wp_old_slug'" ); // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching
94
  $recheck_result_count = count( $recheck_result );
95
  $remove_result_html = '<div class="updated"><p>' .
96
  sprintf(
includes/class-wcj-order-numbers.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Module - Order Numbers
4
  *
5
- * @version 5.6.7
6
  * @author Pluggabl LLC.
7
  * @package Booster_For_WooCommerce/includes
8
  */
@@ -192,7 +192,7 @@ if ( ! class_exists( 'WCJ_Order_Numbers' ) ) :
192
  /**
193
  * Search_by_custom_number.
194
  *
195
- * @version 5.6.7
196
  * @since 2.6.0
197
  * @todo `_wcj_order_number` is used for `sequential` and `hash` only
198
  * @param array | string $query defines the query.
@@ -230,11 +230,9 @@ if ( ! class_exists( 'WCJ_Order_Numbers' ) ) :
230
  }
231
  }
232
  // Post Status.
233
- $wpnonce = true;
234
- if ( function_exists( 'wp_verify_nonce' ) ) {
235
- $wpnonce = isset( $_REQUEST['_wpnonce'] ) ? wp_verify_nonce( sanitize_key( $_REQUEST['_wpnonce'] ), 'woocommerce-settings' ) : true;
236
- }
237
- $post_status = ( $wpnonce && isset( $_GET['post_status'] ) ) ? sanitize_text_field( wp_unslash( $_GET['post_status'] ) ) : 'any';
238
 
239
  // Try to search post by '_wcj_order_number' meta key.
240
  $meta_query_args = array(
@@ -251,7 +249,7 @@ if ( ! class_exists( 'WCJ_Order_Numbers' ) ) :
251
  'update_post_term_cache' => false,
252
  'post_status' => $post_status,
253
  'post_type' => 'shop_order',
254
- 'meta_query' => $meta_query_args, //phpcs:ignore
255
  )
256
  );
257
 
@@ -342,7 +340,7 @@ if ( ! class_exists( 'WCJ_Order_Numbers' ) ) :
342
  /**
343
  * Add Renumerate Orders tool to WooCommerce menu (the content).
344
  *
345
- * @version 5.6.7
346
  * @todo restyle
347
  * @todo add more result info (e.g. number of regenerated orders etc.)
348
  */
@@ -372,7 +370,7 @@ if ( ! class_exists( 'WCJ_Order_Numbers' ) ) :
372
  'Press the button below to renumerate all existing orders starting from order counter settings in <a href="%s">Order Numbers</a> module.',
373
  'woocommerce-jetpack'
374
  ),
375
- admin_url( 'admin.php?page=wc-settings&tab=jetpack&wcj-cat=shipping_and_orders&section=order_numbers' )
376
  );
377
  $html .= '</p>';
378
  $html .= $result_message;
2
  /**
3
  * Booster for WooCommerce - Module - Order Numbers
4
  *
5
+ * @version 5.6.8
6
  * @author Pluggabl LLC.
7
  * @package Booster_For_WooCommerce/includes
8
  */
192
  /**
193
  * Search_by_custom_number.
194
  *
195
+ * @version 5.6.8
196
  * @since 2.6.0
197
  * @todo `_wcj_order_number` is used for `sequential` and `hash` only
198
  * @param array | string $query defines the query.
230
  }
231
  }
232
  // Post Status.
233
+ $get_data = array();
234
+ parse_str( isset( $_SERVER['QUERY_STRING'] ) ? sanitize_text_field( wp_unslash( $_SERVER['QUERY_STRING'] ) ) : '', $get_data );
235
+ $post_status = isset( $get_data['post_status'] ) ? sanitize_text_field( wp_unslash( $get_data['post_status'] ) ) : 'any';
 
 
236
 
237
  // Try to search post by '_wcj_order_number' meta key.
238
  $meta_query_args = array(
249
  'update_post_term_cache' => false,
250
  'post_status' => $post_status,
251
  'post_type' => 'shop_order',
252
+ 'meta_query' => $meta_query_args, // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_query
253
  )
254
  );
255
 
340
  /**
341
  * Add Renumerate Orders tool to WooCommerce menu (the content).
342
  *
343
+ * @version 5.6.8
344
  * @todo restyle
345
  * @todo add more result info (e.g. number of regenerated orders etc.)
346
  */
370
  'Press the button below to renumerate all existing orders starting from order counter settings in <a href="%s">Order Numbers</a> module.',
371
  'woocommerce-jetpack'
372
  ),
373
+ admin_url( wcj_admin_tab_url() . '&wcj-cat=shipping_and_orders&section=order_numbers' )
374
  );
375
  $html .= '</p>';
376
  $html .= $result_message;
includes/class-wcj-order-quantities.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Module - Order Min/Max Quantities
4
  *
5
- * @version 5.6.7
6
  * @since 2.9.0
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/includes
@@ -629,7 +629,7 @@ if ( ! class_exists( 'WCJ_Order_Quantities' ) ) :
629
  /**
630
  * Check_quantities.
631
  *
632
- * @version 5.6.7
633
  * @since 2.9.0
634
  * @param string $min_or_max defines the min_or_max.
635
  * @param int $cart_item_quantities defines the cart_item_quantities.
@@ -654,7 +654,7 @@ if ( ! class_exists( 'WCJ_Order_Quantities' ) ) :
654
  if ( 'yes' === apply_filters( 'booster_option', 'no', wcj_get_option( 'wcj_order_quantities_' . $min_or_max . '_per_item_quantity_per_product', 'no' ) ) ) {
655
  foreach ( $cart_item_quantities as $_product_id => $cart_item_quantity ) {
656
  $max_or_max_per_item_quantity = get_post_meta( $_product_id, '_wcj_order_quantities_' . $min_or_max, true );
657
- if ( (string) 0 !== ( $max_or_max_per_item_quantity ) ) {
658
  if (
659
  ( 'max' === $min_or_max && $cart_item_quantity > $max_or_max_per_item_quantity ) ||
660
  ( 'min' === $min_or_max && $cart_item_quantity < $max_or_max_per_item_quantity )
@@ -669,7 +669,7 @@ if ( ! class_exists( 'WCJ_Order_Quantities' ) ) :
669
  }
670
  }
671
  $max_or_max_per_item_quantity = apply_filters( 'booster_option', 0, wcj_get_option( 'wcj_order_quantities_' . $min_or_max . '_per_item_quantity', 0 ) );
672
- if ( (string) 0 !== ( $max_or_max_per_item_quantity ) ) {
673
  foreach ( $cart_item_quantities as $_product_id => $cart_item_quantity ) {
674
  if (
675
  'yes' === apply_filters( 'booster_option', 'no', wcj_get_option( 'wcj_order_quantities_' . $min_or_max . '_per_item_quantity_per_product', 'no' ) ) &&
2
  /**
3
  * Booster for WooCommerce - Module - Order Min/Max Quantities
4
  *
5
+ * @version 5.6.8
6
  * @since 2.9.0
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/includes
629
  /**
630
  * Check_quantities.
631
  *
632
+ * @version 5.6.8
633
  * @since 2.9.0
634
  * @param string $min_or_max defines the min_or_max.
635
  * @param int $cart_item_quantities defines the cart_item_quantities.
654
  if ( 'yes' === apply_filters( 'booster_option', 'no', wcj_get_option( 'wcj_order_quantities_' . $min_or_max . '_per_item_quantity_per_product', 'no' ) ) ) {
655
  foreach ( $cart_item_quantities as $_product_id => $cart_item_quantity ) {
656
  $max_or_max_per_item_quantity = get_post_meta( $_product_id, '_wcj_order_quantities_' . $min_or_max, true );
657
+ if ( 0 !== ( $max_or_max_per_item_quantity ) ) {
658
  if (
659
  ( 'max' === $min_or_max && $cart_item_quantity > $max_or_max_per_item_quantity ) ||
660
  ( 'min' === $min_or_max && $cart_item_quantity < $max_or_max_per_item_quantity )
669
  }
670
  }
671
  $max_or_max_per_item_quantity = apply_filters( 'booster_option', 0, wcj_get_option( 'wcj_order_quantities_' . $min_or_max . '_per_item_quantity', 0 ) );
672
+ if ( 0 !== ( $max_or_max_per_item_quantity ) ) {
673
  foreach ( $cart_item_quantities as $_product_id => $cart_item_quantity ) {
674
  if (
675
  'yes' === apply_filters( 'booster_option', 'no', wcj_get_option( 'wcj_order_quantities_' . $min_or_max . '_per_item_quantity_per_product', 'no' ) ) &&
includes/class-wcj-orders.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Module - Orders
4
  *
5
- * @version 5.6.7
6
  * @author Pluggabl LLC.
7
  * @package Booster_For_WooCommerce/includes
8
  */
@@ -20,7 +20,7 @@ if ( ! class_exists( 'WCJ_Orders' ) ) :
20
  /**
21
  * Constructor.
22
  *
23
- * @version 5.6.2
24
  * @todo Bulk Regenerate Download Permissions - copy "cron" to plugin
25
  * @todo Bulk Regenerate Download Permissions - maybe move "bulk actions" to free
26
  * @todo Bulk Regenerate Download Permissions - maybe as new module
@@ -68,7 +68,7 @@ if ( ! class_exists( 'WCJ_Orders' ) ) :
68
  if ( 'disabled' !== apply_filters( 'booster_option', 'disabled', wcj_get_option( 'wcj_order_bulk_regenerate_download_permissions_all_orders_cron', 'disabled' ) ) ) {
69
  add_action( 'init', array( $this, 'schedule_bulk_regenerate_download_permissions_all_orders_cron' ) );
70
  add_action( 'admin_init', array( $this, 'schedule_bulk_regenerate_download_permissions_all_orders_cron' ) );
71
- add_filter( 'cron_schedules', 'wcj_crons_add_custom_intervals' ); //phpcs:ignore
72
  add_action( 'wcj_bulk_regenerate_download_permissions_all_orders_cron', array( $this, 'bulk_regenerate_download_permissions_all_orders' ) );
73
  }
74
  }
@@ -352,6 +352,36 @@ if ( ! class_exists( 'WCJ_Orders' ) ) :
352
  $order->update_status( 'completed' );
353
  }
354
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
355
  }
356
 
357
  endif;
2
  /**
3
  * Booster for WooCommerce - Module - Orders
4
  *
5
+ * @version 5.6.8
6
  * @author Pluggabl LLC.
7
  * @package Booster_For_WooCommerce/includes
8
  */
20
  /**
21
  * Constructor.
22
  *
23
+ * @version 5.6.8
24
  * @todo Bulk Regenerate Download Permissions - copy "cron" to plugin
25
  * @todo Bulk Regenerate Download Permissions - maybe move "bulk actions" to free
26
  * @todo Bulk Regenerate Download Permissions - maybe as new module
68
  if ( 'disabled' !== apply_filters( 'booster_option', 'disabled', wcj_get_option( 'wcj_order_bulk_regenerate_download_permissions_all_orders_cron', 'disabled' ) ) ) {
69
  add_action( 'init', array( $this, 'schedule_bulk_regenerate_download_permissions_all_orders_cron' ) );
70
  add_action( 'admin_init', array( $this, 'schedule_bulk_regenerate_download_permissions_all_orders_cron' ) );
71
+ add_filter( 'cron_schedules', array( $this, 'wcj_crons_add_custom_intervals' ) );
72
  add_action( 'wcj_bulk_regenerate_download_permissions_all_orders_cron', array( $this, 'bulk_regenerate_download_permissions_all_orders' ) );
73
  }
74
  }
352
  $order->update_status( 'completed' );
353
  }
354
 
355
+ /**
356
+ * Wcj_crons_add_custom_intervals.
357
+ *
358
+ * @version 5.6.8
359
+ * @since 3.2.4
360
+ * @param array $schedules defines the schedules.
361
+ */
362
+ public function wcj_crons_add_custom_intervals( $schedules ) {
363
+ $schedules['weekly'] = array(
364
+ 'interval' => 604800,
365
+ 'display' => __( 'Once weekly', 'woocommerce-jetpack' ),
366
+ );
367
+ $schedules['minute_30'] = array(
368
+ 'interval' => 1800,
369
+ 'display' => __( 'Once every 30 minutes', 'woocommerce-jetpack' ),
370
+ );
371
+ $schedules['minute_15'] = array(
372
+ 'interval' => 900,
373
+ 'display' => __( 'Once every 15 minutes', 'woocommerce-jetpack' ),
374
+ );
375
+ $schedules['minute_5'] = array(
376
+ 'interval' => 300,
377
+ 'display' => __( 'Once every 5 minutes', 'woocommerce-jetpack' ),
378
+ );
379
+ $schedules['minutely'] = array(
380
+ 'interval' => 60,
381
+ 'display' => __( 'Once a minute', 'woocommerce-jetpack' ),
382
+ );
383
+ return $schedules;
384
+ }
385
  }
386
 
387
  endif;
includes/class-wcj-payment-gateways-by-country.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Module - Payment Gateways by Country
4
  *
5
- * @version 5.6.2
6
  * @since 2.4.1
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/includes
@@ -39,12 +39,13 @@ if ( ! class_exists( 'WCJ_Payment_Gateways_By_Country' ) ) :
39
  /**
40
  * Get_location.
41
  *
42
- * @version 5.6.2
43
  * @since 3.4.0
44
  * @todo on `WCJ_IS_WC_VERSION_BELOW_3` recheck if `get_shipping_country()` and `get_shipping_state()` work correctly
45
  * @param string $type defines the type.
46
  */
47
  public function get_location( $type ) {
 
48
  switch ( $type ) {
49
  case 'country':
50
  $country_type = wcj_get_option( 'wcj_gateways_by_location_country_type', 'billing' );
@@ -53,27 +54,28 @@ if ( ! class_exists( 'WCJ_Payment_Gateways_By_Country' ) ) :
53
  case 'by_ip':
54
  return wcj_get_country_by_ip();
55
  case 'shipping':
56
- return ( ( ! empty( $_REQUEST['s_country'] ) ) ? sanitize_text_field( wp_unslash( $_REQUEST['s_country'] ) ) : ( isset( WC()->customer ) ? WC()->customer->get_shipping_country() : '' ) ); // phpcs:ignore WordPress.Security.NonceVerification
57
  default: // 'billing'
58
- return ( ! empty( $_REQUEST['country'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['country'] ) ) : ( isset( WC()->customer ) ? wcj_customer_get_country() : '' ) ); // phpcs:ignore WordPress.Security.NonceVerification
59
  }
60
  case 'state':
61
  $state_type = wcj_get_option( 'wcj_gateways_by_location_state_type', 'billing' );
62
  switch ( $state_type ) {
63
  case 'shipping':
64
- return ( ! empty( $_REQUEST['s_state'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['s_state'] ) ) : ( isset( WC()->customer ) ? WC()->customer->get_shipping_state() : '' ) ); // phpcs:ignore WordPress.Security.NonceVerification
65
  default: // 'billing'
66
- return ( ! empty( $_REQUEST['state'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['state'] ) ) : ( isset( WC()->customer ) ? wcj_customer_get_country_state() : '' ) ); // phpcs:ignore WordPress.Security.NonceVerification
67
  }
68
  case 'postcode':
69
  $postcodes_type = wcj_get_option( 'wcj_gateways_by_location_postcodes_type', 'billing' );
70
  switch ( $postcodes_type ) {
71
  case 'shipping':
72
- return ( ! empty( $_REQUEST['s_postcode'] ) ? strtoupper( sanitize_text_field( wp_unslash( $_REQUEST['s_postcode'] ) ) ) : ( ! empty( $_REQUEST['shipping_postcode'] ) ? strtoupper( sanitize_text_field( wp_unslash( $_REQUEST['shipping_postcode'] ) ) ) : strtoupper( WC()->countries->get_base_postcode() ) ) ); // phpcs:ignore WordPress.Security.NonceVerification
73
  default: // 'billing'
74
- return ( ! empty( $_REQUEST['postcode'] ) ? strtoupper( sanitize_text_field( wp_unslash( $_REQUEST['postcode'] ) ) ) : ( ! empty( $_REQUEST['billing_postcode'] ) ? strtoupper( sanitize_text_field( wp_unslash( $_REQUEST['billing_postcode'] ) ) ) : strtoupper( WC()->countries->get_base_postcode() ) ) ); // phpcs:ignore WordPress.Security.NonceVerification
75
  }
76
  }
 
77
  }
78
 
79
  /**
2
  /**
3
  * Booster for WooCommerce - Module - Payment Gateways by Country
4
  *
5
+ * @version 5.6.8
6
  * @since 2.4.1
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/includes
39
  /**
40
  * Get_location.
41
  *
42
+ * @version 5.6.8
43
  * @since 3.4.0
44
  * @todo on `WCJ_IS_WC_VERSION_BELOW_3` recheck if `get_shipping_country()` and `get_shipping_state()` work correctly
45
  * @param string $type defines the type.
46
  */
47
  public function get_location( $type ) {
48
+ // phpcs:disable WordPress.Security.NonceVerification
49
  switch ( $type ) {
50
  case 'country':
51
  $country_type = wcj_get_option( 'wcj_gateways_by_location_country_type', 'billing' );
54
  case 'by_ip':
55
  return wcj_get_country_by_ip();
56
  case 'shipping':
57
+ return ( ( ! empty( $_REQUEST['s_country'] ) ) ? sanitize_text_field( wp_unslash( $_REQUEST['s_country'] ) ) : ( isset( WC()->customer ) ? WC()->customer->get_shipping_country() : '' ) );
58
  default: // 'billing'
59
+ return ( ! empty( $_REQUEST['country'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['country'] ) ) : ( isset( WC()->customer ) ? wcj_customer_get_country() : '' ) );
60
  }
61
  case 'state':
62
  $state_type = wcj_get_option( 'wcj_gateways_by_location_state_type', 'billing' );
63
  switch ( $state_type ) {
64
  case 'shipping':
65
+ return ( ! empty( $_REQUEST['s_state'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['s_state'] ) ) : ( isset( WC()->customer ) ? WC()->customer->get_shipping_state() : '' ) );
66
  default: // 'billing'
67
+ return ( ! empty( $_REQUEST['state'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['state'] ) ) : ( isset( WC()->customer ) ? wcj_customer_get_country_state() : '' ) );
68
  }
69
  case 'postcode':
70
  $postcodes_type = wcj_get_option( 'wcj_gateways_by_location_postcodes_type', 'billing' );
71
  switch ( $postcodes_type ) {
72
  case 'shipping':
73
+ return ( ! empty( $_REQUEST['s_postcode'] ) ? strtoupper( sanitize_text_field( wp_unslash( $_REQUEST['s_postcode'] ) ) ) : ( ! empty( $_REQUEST['shipping_postcode'] ) ? strtoupper( sanitize_text_field( wp_unslash( $_REQUEST['shipping_postcode'] ) ) ) : strtoupper( WC()->countries->get_base_postcode() ) ) );
74
  default: // 'billing'
75
+ return ( ! empty( $_REQUEST['postcode'] ) ? strtoupper( sanitize_text_field( wp_unslash( $_REQUEST['postcode'] ) ) ) : ( ! empty( $_REQUEST['billing_postcode'] ) ? strtoupper( sanitize_text_field( wp_unslash( $_REQUEST['billing_postcode'] ) ) ) : strtoupper( WC()->countries->get_base_postcode() ) ) );
76
  }
77
  }
78
+ // phpcs:enable WordPress.Security.NonceVerification
79
  }
80
 
81
  /**
includes/class-wcj-payment-gateways-fees.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Module - Gateways Fees and Discounts
4
  *
5
- * @version 5.6.2
6
  * @since 2.2.2
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/includes
@@ -143,21 +143,23 @@ if ( ! class_exists( 'WCJ_Payment_Gateways_Fees' ) ) :
143
  /**
144
  * Get_current_gateway.
145
  *
146
- * @version 5.6.2
147
  * @since 3.3.0
148
  */
149
  public function get_current_gateway() {
150
  $gateway = '';
151
- if ( isset( $_GET['wc-api'] ) && 'WC_Gateway_PayPal_Express_AngellEYE' === $_GET['wc-api'] ) { // phpcs:ignore WordPress.Security.NonceVerification
 
152
  $gateway = 'paypal_express'; // PayPal for WooCommerce (By Angell EYE).
153
  } elseif (
154
- ( isset( $_GET['wc-ajax'] ) && 'wc_ppec_generate_cart' === $_GET['wc-ajax'] ) || // phpcs:ignore WordPress.Security.NonceVerification
155
- ( isset( $_GET['startcheckout'] ) && 'true' === $_GET['startcheckout'] ) // phpcs:ignore WordPress.Security.NonceVerification
156
  ) {
157
  $gateway = 'ppec_paypal'; // WooCommerce PayPal Express Checkout Payment Gateway (By WooCommerce).
158
  } else {
159
  $gateway = WC()->session->get( 'chosen_payment_method' );
160
  }
 
161
 
162
  // Pre-sets the default available payment gateway on cart and checkout pages.
163
  if (
2
  /**
3
  * Booster for WooCommerce - Module - Gateways Fees and Discounts
4
  *
5
+ * @version 5.6.8
6
  * @since 2.2.2
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/includes
143
  /**
144
  * Get_current_gateway.
145
  *
146
+ * @version 5.6.8
147
  * @since 3.3.0
148
  */
149
  public function get_current_gateway() {
150
  $gateway = '';
151
+ // phpcs:disable WordPress.Security.NonceVerification
152
+ if ( isset( $_GET['wc-api'] ) && 'WC_Gateway_PayPal_Express_AngellEYE' === $_GET['wc-api'] ) {
153
  $gateway = 'paypal_express'; // PayPal for WooCommerce (By Angell EYE).
154
  } elseif (
155
+ ( isset( $_GET['wc-ajax'] ) && 'wc_ppec_generate_cart' === $_GET['wc-ajax'] ) ||
156
+ ( isset( $_GET['startcheckout'] ) && 'true' === $_GET['startcheckout'] )
157
  ) {
158
  $gateway = 'ppec_paypal'; // WooCommerce PayPal Express Checkout Payment Gateway (By WooCommerce).
159
  } else {
160
  $gateway = WC()->session->get( 'chosen_payment_method' );
161
  }
162
+ // phpcs:enable WordPress.Security.NonceVerification
163
 
164
  // Pre-sets the default available payment gateway on cart and checkout pages.
165
  if (
includes/class-wcj-payment-gateways.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Module - Custom Gateways
4
  *
5
- * @version 5.6.7
6
  * @author Pluggabl LLC.
7
  * @package Booster_For_WooCommerce/includes
8
  */
@@ -20,7 +20,7 @@ if ( ! class_exists( 'WCJ_Payment_Gateways' ) ) :
20
  /**
21
  * Constructor.
22
  *
23
- * @version 5.6.2
24
  */
25
  public function __construct() {
26
 
@@ -32,7 +32,7 @@ if ( ! class_exists( 'WCJ_Payment_Gateways' ) ) :
32
  parent::__construct();
33
 
34
  if ( $this->is_enabled() ) {
35
- include_once 'gateways/class-wc-gateway-wcj-custom.php';
36
  add_action( 'woocommerce_after_checkout_validation', array( $this, 'check_required_wcj_input_fields' ), PHP_INT_MAX, 2 );
37
  add_action( 'woocommerce_checkout_update_order_meta', array( $this, 'update_custom_payment_gateways_fields_order_meta' ), PHP_INT_MAX, 2 );
38
  add_action( 'add_meta_boxes', array( $this, 'add_custom_payment_gateways_fields_admin_order_meta_box' ) );
@@ -43,14 +43,15 @@ if ( ! class_exists( 'WCJ_Payment_Gateways' ) ) :
43
  /**
44
  * Maybe_delete_payment_gateway_input_fields.
45
  *
46
- * @version 5.6.2
47
  * @since 3.3.0
48
  */
49
  public function maybe_delete_payment_gateway_input_fields() {
50
- if ( isset( $_GET['wcj_delete_payment_gateway_input_fields'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification
51
- $order_id = sanitize_text_field( wp_unslash( $_GET['wcj_delete_payment_gateway_input_fields'] ) ); // phpcs:ignore WordPress.Security.NonceVerification
 
52
  delete_post_meta( $order_id, '_wcj_custom_payment_gateway_input_fields' );
53
- wp_safe_redirect( esc_url( remove_query_arg( 'wcj_delete_payment_gateway_input_fields' ) ) );
54
  exit;
55
  }
56
  }
@@ -111,7 +112,7 @@ if ( ! class_exists( 'WCJ_Payment_Gateways' ) ) :
111
  /**
112
  * Create_custom_payment_gateways_fields_admin_order_meta_box.
113
  *
114
- * @version 5.5.9
115
  * @since 2.5.2
116
  */
117
  public function create_custom_payment_gateways_fields_admin_order_meta_box() {
@@ -130,7 +131,7 @@ if ( ! class_exists( 'WCJ_Payment_Gateways' ) ) :
130
  )
131
  );
132
  if ( 'yes' === wcj_get_option( 'wcj_custom_payment_gateways_input_fields_delete_button', 'no' ) ) {
133
- $html .= '<p><a style="color:#a00;" href="' . esc_url( add_query_arg( 'wcj_delete_payment_gateway_input_fields', $order_id ) ) . '"' . wcj_get_js_confirmation() . '>' .
134
  __( 'Delete', 'woocommerce-jetpack' ) . '</a></p>';
135
  }
136
  echo wp_kses_post( $html );
2
  /**
3
  * Booster for WooCommerce - Module - Custom Gateways
4
  *
5
+ * @version 5.6.8
6
  * @author Pluggabl LLC.
7
  * @package Booster_For_WooCommerce/includes
8
  */
20
  /**
21
  * Constructor.
22
  *
23
+ * @version 5.6.8
24
  */
25
  public function __construct() {
26
 
32
  parent::__construct();
33
 
34
  if ( $this->is_enabled() ) {
35
+ include_once 'gateways/class-wc-gateway-wcj-custom-template.php';
36
  add_action( 'woocommerce_after_checkout_validation', array( $this, 'check_required_wcj_input_fields' ), PHP_INT_MAX, 2 );
37
  add_action( 'woocommerce_checkout_update_order_meta', array( $this, 'update_custom_payment_gateways_fields_order_meta' ), PHP_INT_MAX, 2 );
38
  add_action( 'add_meta_boxes', array( $this, 'add_custom_payment_gateways_fields_admin_order_meta_box' ) );
43
  /**
44
  * Maybe_delete_payment_gateway_input_fields.
45
  *
46
+ * @version 5.6.8
47
  * @since 3.3.0
48
  */
49
  public function maybe_delete_payment_gateway_input_fields() {
50
+ $wpnonce = isset( $_GET['_wpnonce'] ) ? wp_verify_nonce( sanitize_key( $_GET['_wpnonce'] ), 'wcj_delete_payment_gateway_input_fields' ) : false;
51
+ if ( $wpnonce && isset( $_GET['wcj_delete_payment_gateway_input_fields'] ) ) {
52
+ $order_id = sanitize_text_field( wp_unslash( $_GET['wcj_delete_payment_gateway_input_fields'] ) );
53
  delete_post_meta( $order_id, '_wcj_custom_payment_gateway_input_fields' );
54
+ wp_safe_redirect( esc_url_raw( remove_query_arg( array( 'wcj_delete_payment_gateway_input_fields', '_wpnonce' ) ) ) );
55
  exit;
56
  }
57
  }
112
  /**
113
  * Create_custom_payment_gateways_fields_admin_order_meta_box.
114
  *
115
+ * @version 5.6.8
116
  * @since 2.5.2
117
  */
118
  public function create_custom_payment_gateways_fields_admin_order_meta_box() {
131
  )
132
  );
133
  if ( 'yes' === wcj_get_option( 'wcj_custom_payment_gateways_input_fields_delete_button', 'no' ) ) {
134
+ $html .= '<p><a style="color:#a00;" href="' . esc_url( wp_nonce_url( add_query_arg( 'wcj_delete_payment_gateway_input_fields', $order_id ), 'wcj_delete_payment_gateway_input_fields' ) ) . '"' . wcj_get_js_confirmation() . '>' .
135
  __( 'Delete', 'woocommerce-jetpack' ) . '</a></p>';
136
  }
137
  echo wp_kses_post( $html );
includes/class-wcj-pdf-invoicing.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Module - PDF Invoicing
4
  *
5
- * @version 5.6.7
6
  * @author Pluggabl LLC.
7
  * @package Booster_For_WooCommerce/includes
8
  */
@@ -114,13 +114,13 @@ if ( ! class_exists( 'WCJ_PDF_Invoicing' ) ) :
114
  /**
115
  * Bulk_actions_pdfs_notices.
116
  *
117
- * @version 5.6.2
118
  * @since 2.5.7
119
  */
120
  public function bulk_actions_pdfs_notices() {
121
  global $post_type, $pagenow;
122
  if ( 'edit.php' === $pagenow && 'shop_order' === $post_type ) {
123
- $wpnonce = isset( $_REQUEST['_wpnonce'] ) ? wp_verify_nonce( sanitize_key( isset( $_REQUEST['_wpnonce'] ) ? $_REQUEST['_wpnonce'] : '' ) ) : true;
124
  if ( $wpnonce && isset( $_REQUEST['generated'] ) && (int) $_REQUEST['generated'] ) {
125
  /* translators: %s: translation added */
126
  $message = sprintf( wp_kses_post( 'Document generated.', '%s documents generated.', sanitize_text_field( wp_unslash( $_REQUEST['generated'] ) ) ), number_format_i18n( sanitize_text_field( wp_unslash( $_REQUEST['generated'] ) ) ) );
@@ -167,7 +167,7 @@ if ( ! class_exists( 'WCJ_PDF_Invoicing' ) ) :
167
  /**
168
  * Processes the PDF bulk actions.
169
  *
170
- * @version 5.6.2
171
  * @since 2.5.7
172
  * @todo on `generate` (and maybe other actions) validate user permissions/capabilities - `if ( ! current_user_can( $post_type_object->cap->export_post, $post_id ) ) { wp_die( __( 'You are not allowed to export this post.' ) ); }`
173
  *
@@ -206,14 +206,15 @@ if ( ! class_exists( 'WCJ_PDF_Invoicing' ) ) :
206
  }
207
  }
208
  // Build the redirect url.
209
- $redirect_to = esc_url(
210
  add_query_arg(
211
  array(
212
- 'generated' => $generated,
213
- 'generated_type' => $the_type,
214
  'generated_' . $the_type => 1,
215
- 'ids' => join( ',', $invoice_num ),
216
- 'post_status' => isset( $_GET['post_status'] ) ? sanitize_text_field( wp_unslash( $_GET['post_status'] ) ) : '',
 
217
  ),
218
  $redirect_to
219
  )
@@ -226,7 +227,7 @@ if ( ! class_exists( 'WCJ_PDF_Invoicing' ) ) :
226
  }
227
  }
228
  // Build the redirect url.
229
- $redirect_to = esc_url(
230
  add_query_arg(
231
  array(
232
  'generated' => $generated,
@@ -234,6 +235,7 @@ if ( ! class_exists( 'WCJ_PDF_Invoicing' ) ) :
234
  'generated_' . $the_type => 1,
235
  'ids' => join( ',', $post_ids ),
236
  'post_status' => isset( $_GET['post_status'] ) ? sanitize_text_field( wp_unslash( $_GET['post_status'] ) ) : '',
 
237
  ),
238
  $redirect_to
239
  )
2
  /**
3
  * Booster for WooCommerce - Module - PDF Invoicing
4
  *
5
+ * @version 5.6.8
6
  * @author Pluggabl LLC.
7
  * @package Booster_For_WooCommerce/includes
8
  */
114
  /**
115
  * Bulk_actions_pdfs_notices.
116
  *
117
+ * @version 5.6.8
118
  * @since 2.5.7
119
  */
120
  public function bulk_actions_pdfs_notices() {
121
  global $post_type, $pagenow;
122
  if ( 'edit.php' === $pagenow && 'shop_order' === $post_type ) {
123
+ $wpnonce = isset( $_REQUEST['pdf-generated-nonce'] ) ? wp_verify_nonce( sanitize_key( $_REQUEST['pdf-generated-nonce'] ), 'pdf-generated' ) : false;
124
  if ( $wpnonce && isset( $_REQUEST['generated'] ) && (int) $_REQUEST['generated'] ) {
125
  /* translators: %s: translation added */
126
  $message = sprintf( wp_kses_post( 'Document generated.', '%s documents generated.', sanitize_text_field( wp_unslash( $_REQUEST['generated'] ) ) ), number_format_i18n( sanitize_text_field( wp_unslash( $_REQUEST['generated'] ) ) ) );
167
  /**
168
  * Processes the PDF bulk actions.
169
  *
170
+ * @version 5.6.8
171
  * @since 2.5.7
172
  * @todo on `generate` (and maybe other actions) validate user permissions/capabilities - `if ( ! current_user_can( $post_type_object->cap->export_post, $post_id ) ) { wp_die( __( 'You are not allowed to export this post.' ) ); }`
173
  *
206
  }
207
  }
208
  // Build the redirect url.
209
+ $redirect_to = esc_url_raw(
210
  add_query_arg(
211
  array(
212
+ 'generated' => $generated,
213
+ 'generated_type' => $the_type,
214
  'generated_' . $the_type => 1,
215
+ 'ids' => join( ',', $invoice_num ),
216
+ 'post_status' => isset( $_GET['post_status'] ) ? sanitize_text_field( wp_unslash( $_GET['post_status'] ) ) : '',
217
+ 'pdf-generated-nonce' => wp_create_nonce( 'pdf-generated' ),
218
  ),
219
  $redirect_to
220
  )
227
  }
228
  }
229
  // Build the redirect url.
230
+ $redirect_to = esc_url_raw(
231
  add_query_arg(
232
  array(
233
  'generated' => $generated,
235
  'generated_' . $the_type => 1,
236
  'ids' => join( ',', $post_ids ),
237
  'post_status' => isset( $_GET['post_status'] ) ? sanitize_text_field( wp_unslash( $_GET['post_status'] ) ) : '',
238
+ 'pdf-generated-nonce' => wp_create_nonce( 'pdf-generated' ),
239
  ),
240
  $redirect_to
241
  )
includes/class-wcj-price-by-user-role.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Module - Price based on User Role
4
  *
5
- * @version 5.6.7
6
  * @since 2.5.0
7
  * @author Pluggabl LLC.
8
  * @todo Fix "Make Empty Price" option for variable products
@@ -194,7 +194,7 @@ if ( ! class_exists( 'WCJ_Price_By_User_Role' ) ) :
194
  /**
195
  * Save_meta_box_value.
196
  *
197
- * @version 2.5.0
198
  * @since 2.5.0
199
  * @param string $option_value defines the option_value.
200
  * @param string $option_name defines the option_name.
@@ -212,8 +212,8 @@ if ( ! class_exists( 'WCJ_Price_By_User_Role' ) ) :
212
  'post_type' => 'product',
213
  'post_status' => 'any',
214
  'posts_per_page' => 1,
215
- 'meta_key' => '_wcj_price_by_user_role_per_product_settings_enabled', // phpcs:ignore
216
- 'meta_value' => 'yes', // phpcs:ignore
217
  'post__not_in' => array( get_the_ID() ),
218
  );
219
  $loop = new WP_Query( $args );
2
  /**
3
  * Booster for WooCommerce - Module - Price based on User Role
4
  *
5
+ * @version 5.6.8
6
  * @since 2.5.0
7
  * @author Pluggabl LLC.
8
  * @todo Fix "Make Empty Price" option for variable products
194
  /**
195
  * Save_meta_box_value.
196
  *
197
+ * @version 5.6.8
198
  * @since 2.5.0
199
  * @param string $option_value defines the option_value.
200
  * @param string $option_name defines the option_name.
212
  'post_type' => 'product',
213
  'post_status' => 'any',
214
  'posts_per_page' => 1,
215
+ 'meta_key' => '_wcj_price_by_user_role_per_product_settings_enabled', // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_key
216
+ 'meta_value' => 'yes', // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_value
217
  'post__not_in' => array( get_the_ID() ),
218
  );
219
  $loop = new WP_Query( $args );
includes/class-wcj-price-labels.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Module - Custom Price Labels
4
  *
5
- * @version 5.6.7
6
  * @author Pluggabl LLC.
7
  * @package Booster_For_WooCommerce/includes
8
  */
@@ -153,14 +153,14 @@ if ( ! class_exists( 'WCJ_Price_Labels' ) ) :
153
  /**
154
  * Create_price_label_meta_box - back end.
155
  *
156
- * @version 2.4.8
157
  */
158
  public function create_price_label_meta_box() {
159
  $current_post_id = get_the_ID();
160
  echo '<table style="width:100%;">';
161
  echo '<tr>';
162
  foreach ( $this->custom_tab_sections as $custom_tab_section ) {
163
- echo '<td style="width:25%;"><h4>' . wp_kses_post( $this->custom_tab_sections_titles[ $custom_tab_section ] ) . '</h4></td>';
164
  }
165
  echo '</tr>';
166
  echo '<tr>';
@@ -177,7 +177,7 @@ if ( ! class_exists( 'WCJ_Price_Labels' ) ) :
177
  }
178
  $label_text = get_post_meta( $current_post_id, '_' . $option_name, true );
179
  $label_text = str_replace( '"', '&quot;', $label_text );
180
- echo '<li>' . wp_kses_post( $this->custom_tab_section_variations_titles[ $custom_tab_section_variation ] ) . '<textarea style="width:95%;min-width:100px;height:100px;" ' . wp_kses_post( $disabled_if_no_plus ) . ' name="' . wp_kses_post( $option_name ) . '">' . wp_kses_post( $label_text ) . '</textarea></li>';
181
  } else {
182
  if ( '_home' === $custom_tab_section_variation ) {
183
  echo '<li><h5>Hide by page type</h5></li>';
@@ -190,8 +190,8 @@ if ( ! class_exists( 'WCJ_Price_Labels' ) ) :
190
  } else {
191
  $disabled_if_no_plus = '';
192
  }
193
- echo '<li><input class="checkbox" type="checkbox" ' . wp_kses_post( $disabled_if_no_plus ) . ' name="' . wp_kses_post( $option_name ) . '" id="' . wp_kses_post( $option_name ) . '" ' .
194
- checked( get_post_meta( $current_post_id, '_' . $option_name, true ), 'on', false ) . ' /> ' . wp_kses_post( $this->custom_tab_section_variations_titles[ $custom_tab_section_variation ] ) . '</li>';
195
  }
196
  }
197
  echo '</ul>';
2
  /**
3
  * Booster for WooCommerce - Module - Custom Price Labels
4
  *
5
+ * @version 5.6.8
6
  * @author Pluggabl LLC.
7
  * @package Booster_For_WooCommerce/includes
8
  */
153
  /**
154
  * Create_price_label_meta_box - back end.
155
  *
156
+ * @version 5.6.8
157
  */
158
  public function create_price_label_meta_box() {
159
  $current_post_id = get_the_ID();
160
  echo '<table style="width:100%;">';
161
  echo '<tr>';
162
  foreach ( $this->custom_tab_sections as $custom_tab_section ) {
163
+ echo '<td style="width:25%;"><h4>' . esc_html( $this->custom_tab_sections_titles[ $custom_tab_section ] ) . '</h4></td>';
164
  }
165
  echo '</tr>';
166
  echo '<tr>';
177
  }
178
  $label_text = get_post_meta( $current_post_id, '_' . $option_name, true );
179
  $label_text = str_replace( '"', '&quot;', $label_text );
180
+ echo '<li>' . wp_kses_post( $this->custom_tab_section_variations_titles[ $custom_tab_section_variation ] ) . '<textarea style="width:95%;min-width:100px;height:100px;" ' . esc_html( $disabled_if_no_plus ) . ' name="' . esc_html( $option_name ) . '">' . esc_html( $label_text ) . '</textarea></li>';
181
  } else {
182
  if ( '_home' === $custom_tab_section_variation ) {
183
  echo '<li><h5>Hide by page type</h5></li>';
190
  } else {
191
  $disabled_if_no_plus = '';
192
  }
193
+ echo '<li><input class="checkbox" type="checkbox" ' . esc_html( $disabled_if_no_plus ) . ' name="' . esc_html( $option_name ) . '" id="' . esc_html( $option_name ) . '" ' .
194
+ checked( get_post_meta( $current_post_id, '_' . $option_name, true ), 'on', false ) . ' /> ' . esc_html( $this->custom_tab_section_variations_titles[ $custom_tab_section_variation ] ) . '</li>';
195
  }
196
  }
197
  echo '</ul>';
includes/class-wcj-product-add-to-cart.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Module - Product Add To Cart
4
  *
5
- * @version 5.6.2
6
  * @since 2.2.0
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/includes
@@ -377,17 +377,13 @@ if ( ! class_exists( 'WCJ_Product_Add_To_Cart' ) ) :
377
  /**
378
  * Maybe_redirect_to_url.
379
  *
380
- * @version 5.6.2
381
  * @param string $url defines the url.
382
  * @param bool | int $product_id defines the product_id.
383
  */
384
  public function maybe_redirect_to_url( $url, $product_id = false ) {
385
- $wpnonce = true;
386
- if ( function_exists( 'wp_verify_nonce' ) ) {
387
- $wpnonce = isset( $_REQUEST['_wpnonce'] ) ? wp_verify_nonce( sanitize_key( isset( $_REQUEST['_wpnonce'] ) ? $_REQUEST['_wpnonce'] : '' ) ) : true;
388
- }
389
-
390
- if ( 'yes' === apply_filters( 'booster_option', 'no', wcj_get_option( 'wcj_add_to_cart_redirect_per_product_enabled', 'no' ) ) && ( $product_id || isset( $_REQUEST['add-to-cart'] ) ) && $wpnonce ) {
391
  if ( ! $product_id ) {
392
  $product_id = apply_filters( 'woocommerce_add_to_cart_product_id', absint( $_REQUEST['add-to-cart'] ) );
393
  }
@@ -399,6 +395,7 @@ if ( ! class_exists( 'WCJ_Product_Add_To_Cart' ) ) :
399
  return $redirect_url;
400
  }
401
  }
 
402
  if ( 'yes' === wcj_get_option( 'wcj_add_to_cart_redirect_enabled', 'no' ) ) {
403
  $redirect_url = wcj_get_option( 'wcj_add_to_cart_redirect_url', '' );
404
  if ( '' === $redirect_url ) {
2
  /**
3
  * Booster for WooCommerce - Module - Product Add To Cart
4
  *
5
+ * @version 5.6.8
6
  * @since 2.2.0
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/includes
377
  /**
378
  * Maybe_redirect_to_url.
379
  *
380
+ * @version 5.6.8
381
  * @param string $url defines the url.
382
  * @param bool | int $product_id defines the product_id.
383
  */
384
  public function maybe_redirect_to_url( $url, $product_id = false ) {
385
+ // phpcs:disable WordPress.Security.NonceVerification
386
+ if ( 'yes' === apply_filters( 'booster_option', 'no', wcj_get_option( 'wcj_add_to_cart_redirect_per_product_enabled', 'no' ) ) && ( $product_id || isset( $_REQUEST['add-to-cart'] ) ) ) {
 
 
 
 
387
  if ( ! $product_id ) {
388
  $product_id = apply_filters( 'woocommerce_add_to_cart_product_id', absint( $_REQUEST['add-to-cart'] ) );
389
  }
395
  return $redirect_url;
396
  }
397
  }
398
+ // phpcs:enable WordPress.Security.NonceVerification
399
  if ( 'yes' === wcj_get_option( 'wcj_add_to_cart_redirect_enabled', 'no' ) ) {
400
  $redirect_url = wcj_get_option( 'wcj_add_to_cart_redirect_url', '' );
401
  if ( '' === $redirect_url ) {
includes/class-wcj-product-addons.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Module - Product Addons
4
  *
5
- * @version 5.6.2
6
  * @since 2.5.3
7
  * @author Pluggabl LLC.
8
  * @todo admin order view (names)
@@ -273,14 +273,15 @@ if ( ! class_exists( 'WCJ_Product_Addons' ) ) :
273
  /**
274
  * Validate_on_add_to_cart.
275
  *
276
- * @version 5.6.2
277
  * @since 2.5.5
278
  * @param array | string $passed defines the passed.
279
  * @param int $product_id defines the product_id.
280
  * @param int $quantity defines the quantity.
281
  */
282
  public function validate_on_add_to_cart( $passed, $product_id, $quantity ) {
283
- $args = func_get_args();
 
284
  if ( 4 === count( $args ) ) {
285
  $variation_id = $args[3];
286
  }
@@ -295,12 +296,13 @@ if ( ! class_exists( 'WCJ_Product_Addons' ) ) :
295
  continue;
296
  }
297
  if ( 'yes' === $addon['is_required'] ) {
298
- if ( ! isset( $_POST[ $addon['checkbox_key'] ] ) && empty( $addon['default'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification
299
  wc_add_notice( __( 'Some of the required addons are not selected!', 'woocommerce-jetpack' ), 'error' );
300
  return false;
301
  }
302
  }
303
  }
 
304
  return $passed;
305
  }
306
 
@@ -360,30 +362,31 @@ if ( ! class_exists( 'WCJ_Product_Addons' ) ) :
360
  /**
361
  * Price_change_ajax.
362
  *
363
- * @version 5.6.2
364
  * @since 2.5.3
365
  * @param array | string $param defines the param.
366
  */
367
  public function price_change_ajax( $param ) {
368
- if ( ! isset( $_POST['product_id'] ) || 0 === $_POST['product_id'] ) { // phpcs:ignore WordPress.Security.NonceVerification
 
369
  die();
370
  }
371
- $product_id = sanitize_text_field( wp_unslash( $_POST['product_id'] ) ); // phpcs:ignore WordPress.Security.NonceVerification
372
  $the_product = wc_get_product( $product_id );
373
  $parent_product_id = ( $the_product->is_type( 'variation' ) ) ? wp_get_post_parent_id( $product_id ) : $product_id;
374
  $addons = $this->get_product_addons( $parent_product_id );
375
- $the_addons_price = 0;
376
  foreach ( $addons as $addon ) {
377
  $price_value = $this->replace_price_template_vars( $addon['price_value'], $product_id );
378
- if ( isset( $_POST[ $addon['checkbox_key'] ] ) ) { // phpcs:ignore WordPress.Security.NonceVerification
379
- if ( ( 'checkbox' === $addon['type'] || '' === $addon['type'] ) || ( 'text' === $addon['type'] && '' !== $_POST[ $addon['checkbox_key'] ] ) ) { // phpcs:ignore WordPress.Security.NonceVerification
380
  $the_addons_price += (float) $price_value;
381
  } elseif ( 'radio' === $addon['type'] || 'select' === $addon['type'] ) {
382
  $labels = $this->clean_and_explode( PHP_EOL, $addon['label_value'] );
383
  $prices = $this->clean_and_explode( PHP_EOL, $price_value );
384
  if ( count( $labels ) === count( $prices ) ) {
385
  foreach ( $labels as $i => $label ) {
386
- if ( sanitize_title( $label ) === $_POST[ $addon['checkbox_key'] ] ) { // phpcs:ignore WordPress.Security.NonceVerification
387
  $the_addons_price += (float) $prices[ $i ];
388
  break;
389
  }
@@ -392,7 +395,7 @@ if ( ! class_exists( 'WCJ_Product_Addons' ) ) :
392
  }
393
  }
394
  }
395
- if ( 0 > $the_addons_price ) {
396
  $the_price = $the_product->get_price();
397
  $the_display_price = wcj_get_product_display_price( $the_product, ( $the_price + $this->maybe_convert_currency( $the_addons_price, $the_product ) ) );
398
  echo wp_kses_post( wc_price( $the_display_price ) );
@@ -701,13 +704,17 @@ if ( ! class_exists( 'WCJ_Product_Addons' ) ) :
701
  /**
702
  * Add_addons_price_to_cart_item_data.
703
  *
704
- * @version 5.6.2
705
  * @since 2.5.3
706
  * @param array $cart_item_data defines the cart_item_data.
707
  * @param int $product_id defines the product_id.
708
  * @param int $variation_id defines the variation_id.
709
  */
710
  public function add_addons_price_to_cart_item_data( $cart_item_data, $product_id, $variation_id ) {
 
 
 
 
711
  $addons = $this->get_product_addons( $product_id );
712
  foreach ( $addons as $addon ) {
713
  // Prevents adding addons to cart if not in "enable by variation" option.
@@ -720,10 +727,10 @@ if ( ! class_exists( 'WCJ_Product_Addons' ) ) :
720
  }
721
  $price_value = $this->replace_price_template_vars( $addon['price_value'], $variation_id ? $variation_id : $product_id );
722
  if (
723
- isset( $_POST[ $addon['checkbox_key'] ] ) || // phpcs:ignore WordPress.Security.NonceVerification
724
  ! empty( $addon['default'] )
725
  ) {
726
- $checkbox_key = isset( $_POST[ $addon['checkbox_key'] ] ) ? sanitize_text_field( wp_unslash( $_POST[ $addon['checkbox_key'] ] ) ) : ( ! empty( $addon['default'] ) ? sanitize_text_field( wp_unslash( $addon['default'] ) ) : null ); // phpcs:ignore WordPress.Security.NonceVerification
727
  if ( ( 'checkbox' === $addon['type'] || '' === $addon['type'] ) || ( 'text' === $addon['type'] && '' !== $checkbox_key ) ) {
728
  $cart_item_data[ $addon['price_key'] ] = $price_value;
729
  $cart_item_data[ $addon['label_key'] ] = $addon['label_value'];
@@ -751,13 +758,14 @@ if ( ! class_exists( 'WCJ_Product_Addons' ) ) :
751
  /**
752
  * Add_addons_to_frontend.
753
  *
754
- * @version 5.6.2
755
  * @since 2.5.3
756
  */
757
  public function add_addons_to_frontend() {
758
  if ( isset( $this->are_addons_displayed ) && 'yes' === wcj_get_option( 'wcj_product_addons_check_for_outputted_data', 'yes' ) ) {
759
  return;
760
  }
 
761
  $html = '';
762
  $addons = $this->get_product_addons( get_the_ID() );
763
  $_product = wc_get_product( get_the_ID() );
@@ -774,7 +782,7 @@ if ( ! class_exists( 'WCJ_Product_Addons' ) ) :
774
  $is_required = ( 'yes' === $addon['is_required'] ) ? ' required' : '';
775
  if ( 'checkbox' === $addon['type'] || '' === $addon['type'] ) {
776
  $is_checked = '';
777
- if ( isset( $_POST[ $addon['checkbox_key'] ] ) ) { // phpcs:ignore WordPress.Security.NonceVerification
778
  $is_checked = ' checked';
779
  } elseif ( 'checked' === $addon['default'] ) {
780
  $is_checked = ' checked';
@@ -796,7 +804,7 @@ if ( ! class_exists( 'WCJ_Product_Addons' ) ) :
796
  )
797
  );
798
  } elseif ( 'text' === $addon['type'] ) {
799
- $default_value = ( isset( $_POST[ $addon['checkbox_key'] ] ) ? sanitize_text_field( wp_unslash( $_POST[ $addon['checkbox_key'] ] ) ) : $addon['default'] ); // phpcs:ignore WordPress.Security.NonceVerification
800
  $maybe_tooltip = ( '' !== $addon['tooltip'] ) ?
801
  ' <img style="display:inline;" class="wcj-question-icon" src="' . wcj_plugin_url() . '/assets/images/question-icon.png" title="' . $addon['tooltip'] . '">' :
802
  '';
@@ -827,8 +835,8 @@ if ( ! class_exists( 'WCJ_Product_Addons' ) ) :
827
  $label = sanitize_title( $label );
828
  $is_checked = '';
829
  $checked_or_selected = ( 'radio' === $addon['type'] ? ' checked' : ' selected' );
830
- if ( isset( $_POST[ $addon['checkbox_key'] ] ) ) { // phpcs:ignore WordPress.Security.NonceVerification
831
- $is_checked = ( $label === $_POST[ $addon['checkbox_key'] ] ) ? $checked_or_selected : ''; // phpcs:ignore WordPress.Security.NonceVerification
832
  } elseif ( '' !== $addon['default'] ) {
833
  $is_checked = ( sanitize_title( $addon['default'] ) === $label ) ? $checked_or_selected : '';
834
  }
@@ -878,6 +886,7 @@ if ( ! class_exists( 'WCJ_Product_Addons' ) ) :
878
  }
879
  }
880
  }
 
881
  // Output.
882
  if ( ! empty( $html ) ) {
883
  $html = wcj_handle_replacements(
2
  /**
3
  * Booster for WooCommerce - Module - Product Addons
4
  *
5
+ * @version 5.6.8
6
  * @since 2.5.3
7
  * @author Pluggabl LLC.
8
  * @todo admin order view (names)
273
  /**
274
  * Validate_on_add_to_cart.
275
  *
276
+ * @version 5.6.8
277
  * @since 2.5.5
278
  * @param array | string $passed defines the passed.
279
  * @param int $product_id defines the product_id.
280
  * @param int $quantity defines the quantity.
281
  */
282
  public function validate_on_add_to_cart( $passed, $product_id, $quantity ) {
283
+ $wpnonce = isset( $_POST['wcj_product_addons-nonce'] ) ? wp_verify_nonce( sanitize_key( $_POST['wcj_product_addons-nonce'] ), 'wcj_product_addons' ) : false;
284
+ $args = func_get_args();
285
  if ( 4 === count( $args ) ) {
286
  $variation_id = $args[3];
287
  }
296
  continue;
297
  }
298
  if ( 'yes' === $addon['is_required'] ) {
299
+ if ( ! $wpnonce && ! isset( $_POST[ $addon['checkbox_key'] ] ) && empty( $addon['default'] ) ) {
300
  wc_add_notice( __( 'Some of the required addons are not selected!', 'woocommerce-jetpack' ), 'error' );
301
  return false;
302
  }
303
  }
304
  }
305
+
306
  return $passed;
307
  }
308
 
362
  /**
363
  * Price_change_ajax.
364
  *
365
+ * @version 5.6.8
366
  * @since 2.5.3
367
  * @param array | string $param defines the param.
368
  */
369
  public function price_change_ajax( $param ) {
370
+ $wpnonce = isset( $_POST['wpnonce'] ) ? wp_verify_nonce( sanitize_key( $_POST['wpnonce'] ), 'wcj_product_addons' ) : false;
371
+ if ( ! $wpnonce || ! isset( $_POST['product_id'] ) || 0 === $_POST['product_id'] ) {
372
  die();
373
  }
374
+ $product_id = sanitize_text_field( wp_unslash( $_POST['product_id'] ) );
375
  $the_product = wc_get_product( $product_id );
376
  $parent_product_id = ( $the_product->is_type( 'variation' ) ) ? wp_get_post_parent_id( $product_id ) : $product_id;
377
  $addons = $this->get_product_addons( $parent_product_id );
378
+ $the_addons_price = (float) 0;
379
  foreach ( $addons as $addon ) {
380
  $price_value = $this->replace_price_template_vars( $addon['price_value'], $product_id );
381
+ if ( isset( $_POST[ $addon['checkbox_key'] ] ) ) {
382
+ if ( ( 'checkbox' === $addon['type'] || '' === $addon['type'] ) || ( 'text' === $addon['type'] && '' !== $_POST[ $addon['checkbox_key'] ] ) ) {
383
  $the_addons_price += (float) $price_value;
384
  } elseif ( 'radio' === $addon['type'] || 'select' === $addon['type'] ) {
385
  $labels = $this->clean_and_explode( PHP_EOL, $addon['label_value'] );
386
  $prices = $this->clean_and_explode( PHP_EOL, $price_value );
387
  if ( count( $labels ) === count( $prices ) ) {
388
  foreach ( $labels as $i => $label ) {
389
+ if ( sanitize_title( $label ) === $_POST[ $addon['checkbox_key'] ] ) {
390
  $the_addons_price += (float) $prices[ $i ];
391
  break;
392
  }
395
  }
396
  }
397
  }
398
+ if ( (float) 0 !== $the_addons_price ) {
399
  $the_price = $the_product->get_price();
400
  $the_display_price = wcj_get_product_display_price( $the_product, ( $the_price + $this->maybe_convert_currency( $the_addons_price, $the_product ) ) );
401
  echo wp_kses_post( wc_price( $the_display_price ) );
704
  /**
705
  * Add_addons_price_to_cart_item_data.
706
  *
707
+ * @version 5.6.8
708
  * @since 2.5.3
709
  * @param array $cart_item_data defines the cart_item_data.
710
  * @param int $product_id defines the product_id.
711
  * @param int $variation_id defines the variation_id.
712
  */
713
  public function add_addons_price_to_cart_item_data( $cart_item_data, $product_id, $variation_id ) {
714
+ $wpnonce = isset( $_POST['wcj_product_addons-nonce'] ) ? wp_verify_nonce( sanitize_key( $_POST['wcj_product_addons-nonce'] ), 'wcj_product_addons' ) : false;
715
+ if ( ! $wpnonce ) {
716
+ return $cart_item_data;
717
+ }
718
  $addons = $this->get_product_addons( $product_id );
719
  foreach ( $addons as $addon ) {
720
  // Prevents adding addons to cart if not in "enable by variation" option.
727
  }
728
  $price_value = $this->replace_price_template_vars( $addon['price_value'], $variation_id ? $variation_id : $product_id );
729
  if (
730
+ isset( $_POST[ $addon['checkbox_key'] ] ) ||
731
  ! empty( $addon['default'] )
732
  ) {
733
+ $checkbox_key = isset( $_POST[ $addon['checkbox_key'] ] ) ? sanitize_text_field( wp_unslash( $_POST[ $addon['checkbox_key'] ] ) ) : ( ! empty( $addon['default'] ) ? sanitize_text_field( wp_unslash( $addon['default'] ) ) : null );
734
  if ( ( 'checkbox' === $addon['type'] || '' === $addon['type'] ) || ( 'text' === $addon['type'] && '' !== $checkbox_key ) ) {
735
  $cart_item_data[ $addon['price_key'] ] = $price_value;
736
  $cart_item_data[ $addon['label_key'] ] = $addon['label_value'];
758
  /**
759
  * Add_addons_to_frontend.
760
  *
761
+ * @version 5.6.8
762
  * @since 2.5.3
763
  */
764
  public function add_addons_to_frontend() {
765
  if ( isset( $this->are_addons_displayed ) && 'yes' === wcj_get_option( 'wcj_product_addons_check_for_outputted_data', 'yes' ) ) {
766
  return;
767
  }
768
+ $wpnonce = isset( $_POST['wcj_product_addons-nonce'] ) ? wp_verify_nonce( sanitize_key( $_POST['wcj_product_addons-nonce'] ), 'wcj_product_addons' ) : false;
769
  $html = '';
770
  $addons = $this->get_product_addons( get_the_ID() );
771
  $_product = wc_get_product( get_the_ID() );
782
  $is_required = ( 'yes' === $addon['is_required'] ) ? ' required' : '';
783
  if ( 'checkbox' === $addon['type'] || '' === $addon['type'] ) {
784
  $is_checked = '';
785
+ if ( $wpnonce && isset( $_POST[ $addon['checkbox_key'] ] ) ) {
786
  $is_checked = ' checked';
787
  } elseif ( 'checked' === $addon['default'] ) {
788
  $is_checked = ' checked';
804
  )
805
  );
806
  } elseif ( 'text' === $addon['type'] ) {
807
+ $default_value = ( $wpnonce && isset( $_POST[ $addon['checkbox_key'] ] ) ? sanitize_text_field( wp_unslash( $_POST[ $addon['checkbox_key'] ] ) ) : $addon['default'] );
808
  $maybe_tooltip = ( '' !== $addon['tooltip'] ) ?
809
  ' <img style="display:inline;" class="wcj-question-icon" src="' . wcj_plugin_url() . '/assets/images/question-icon.png" title="' . $addon['tooltip'] . '">' :
810
  '';
835
  $label = sanitize_title( $label );
836
  $is_checked = '';
837
  $checked_or_selected = ( 'radio' === $addon['type'] ? ' checked' : ' selected' );
838
+ if ( $wpnonce && isset( $_POST[ $addon['checkbox_key'] ] ) ) {
839
+ $is_checked = ( $label === $_POST[ $addon['checkbox_key'] ] ) ? $checked_or_selected : '';
840
  } elseif ( '' !== $addon['default'] ) {
841
  $is_checked = ( sanitize_title( $addon['default'] ) === $label ) ? $checked_or_selected : '';
842
  }
886
  }
887
  }
888
  }
889
+ $html .= '<input type="hidden" name="wcj_product_addons-nonce" value="' . wp_create_nonce( 'wcj_product_addons' ) . '" />';
890
  // Output.
891
  if ( ! empty( $html ) ) {
892
  $html = wcj_handle_replacements(
includes/class-wcj-product-bookings.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Module - Bookings
4
  *
5
- * @version 5.6.3
6
  * @since 2.5.0
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/includes
@@ -110,14 +110,12 @@ if ( ! class_exists( 'WCJ_Product_Bookings' ) ) :
110
  /**
111
  * Price_change_ajax.
112
  *
113
- * @version 5.6.2
114
  * @since 2.5.0
115
  * @param string | array $param defines the param.
116
  */
117
  public function price_change_ajax( $param ) {
118
- if ( function_exists( 'wp_verify_nonce' ) ) {
119
- $wpnonce = isset( $_REQUEST['_wpnonce'] ) ? wp_verify_nonce( sanitize_key( isset( $_REQUEST['_wpnonce'] ) ? $_REQUEST['_wpnonce'] : '' ), 'woocommerce-settings' ) : true;
120
- }
121
  if ( $wpnonce && isset( $_POST['date_from'] ) && '' !== $_POST['date_from'] && isset( $_POST['date_to'] ) && '' !== $_POST['date_to'] && isset( $_POST['product_id'] ) && '' !== $_POST['product_id'] ) {
122
  $date_to = strtotime( sanitize_text_field( wp_unslash( $_POST['date_to'] ) ) );
123
  $date_from = strtotime( sanitize_text_field( wp_unslash( $_POST['date_from'] ) ) );
@@ -127,6 +125,8 @@ if ( ! class_exists( 'WCJ_Product_Bookings' ) ) :
127
  $price_per_day = wcj_get_product_display_price( $the_product );
128
  $the_price = $days_diff * $price_per_day;
129
  echo wp_kses_post( wc_price( $the_price ) );
 
 
130
  }
131
  die();
132
  }
@@ -264,7 +264,7 @@ if ( ! class_exists( 'WCJ_Product_Bookings' ) ) :
264
  /**
265
  * Validate_bookings_on_add_to_cart.
266
  *
267
- * @version 5.6.2
268
  * @since 2.5.0
269
  * @param string | array $passed defines the passed.
270
  * @param int $product_id defines the product_id.
@@ -272,9 +272,7 @@ if ( ! class_exists( 'WCJ_Product_Bookings' ) ) :
272
  public function validate_bookings_on_add_to_cart( $passed, $product_id ) {
273
  $the_product = wc_get_product( $product_id );
274
  if ( $this->is_bookings_product( $the_product ) ) {
275
- if ( function_exists( 'wp_verify_nonce' ) ) {
276
- $wpnonce = isset( $_REQUEST['_wpnonce'] ) ? wp_verify_nonce( sanitize_key( isset( $_REQUEST['_wpnonce'] ) ? $_REQUEST['_wpnonce'] : '' ), 'woocommerce-settings' ) : true;
277
- }
278
  if ( $wpnonce && ( ! isset( $_POST['wcj_product_bookings_date_from'] ) || '' === $_POST['wcj_product_bookings_date_from'] ) ) {
279
  wc_add_notice( wcj_get_option( 'wcj_product_bookings_message_no_date_from', __( '"Date from" must be set', 'woocommerce-jetpack' ) ), 'error' );
280
  return false;
@@ -319,9 +317,7 @@ if ( ! class_exists( 'WCJ_Product_Bookings' ) ) :
319
  * @param int $variation_id defines the variation_id.
320
  */
321
  public function add_bookings_price_to_cart_item_data( $cart_item_data, $product_id, $variation_id ) {
322
- if ( function_exists( 'wp_verify_nonce' ) ) {
323
- $wpnonce = isset( $_REQUEST['_wpnonce'] ) ? wp_verify_nonce( sanitize_key( isset( $_REQUEST['_wpnonce'] ) ? $_REQUEST['_wpnonce'] : '' ), 'woocommerce-settings' ) : true;
324
- }
325
  if ( $wpnonce && isset( $_POST['wcj_product_bookings_date_to'] ) && isset( $_POST['wcj_product_bookings_date_from'] ) ) {
326
  $the_product = wc_get_product( $product_id );
327
  if ( $this->is_bookings_product( $the_product ) ) {
@@ -398,7 +394,7 @@ if ( ! class_exists( 'WCJ_Product_Bookings' ) ) :
398
  /**
399
  * Add_input_fields_to_frontend.
400
  *
401
- * @version 5.6.2
402
  * @since 2.5.0
403
  * @todo more options: exclude days (1-31), exact availability dates, mindate, maxdate, firstday, dateformat etc.
404
  */
@@ -408,9 +404,7 @@ if ( ! class_exists( 'WCJ_Product_Bookings' ) ) :
408
  }
409
  if ( $this->is_bookings_product( wc_get_product() ) ) {
410
  $this->create_custom_style();
411
- if ( function_exists( 'wp_verify_nonce' ) ) {
412
- $wpnonce = isset( $_REQUEST['_wpnonce'] ) ? wp_verify_nonce( sanitize_key( isset( $_REQUEST['_wpnonce'] ) ? $_REQUEST['_wpnonce'] : '' ), 'woocommerce-settings' ) : true;
413
- }
414
  $data_table = array();
415
  $date_from_value = ( $wpnonce && isset( $_POST['wcj_product_bookings_date_from'] ) ) ? sanitize_text_field( wp_unslash( $_POST['wcj_product_bookings_date_from'] ) ) : '';
416
  $date_to_value = ( $wpnonce && isset( $_POST['wcj_product_bookings_date_to'] ) ) ? sanitize_text_field( wp_unslash( $_POST['wcj_product_bookings_date_to'] ) ) : '';
@@ -430,9 +424,10 @@ if ( ! class_exists( 'WCJ_Product_Bookings' ) ) :
430
  '<label for="wcj_product_bookings_date_to">' . wcj_get_option( 'wcj_product_bookings_label_date_to', __( 'Date to' ) ) . '</label>',
431
  '<input firstday="0"' . $date_to_exclude_days . $date_to_exclude_months . ' dateformat="mm/dd/yy" mindate="0" type="datepicker" display="date" id="wcj_product_bookings_date_to" name="wcj_product_bookings_date_to" placeholder="" value="' . $date_to_value . '">',
432
  );
433
- echo wcj_get_table_html( $data_table, array( 'table_heading_type' => 'none' ) ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
434
  echo '<div class="wcj-bookings-price-wrapper"><div class="wcj-value"></div><div class="wcj-loader"></div></div>';
435
  echo '<div style="display:none !important;" name="wcj_bookings_message"><p style="color:red;"></p></div>';
 
436
  $this->are_bookings_input_fields_displayed = true;
437
  }
438
  }
@@ -476,7 +471,7 @@ if ( ! class_exists( 'WCJ_Product_Bookings' ) ) :
476
  /**
477
  * Save_meta_box_value.
478
  *
479
- * @version 5.6.2
480
  * @since 2.5.0
481
  * @param string $option_value defines the option_value.
482
  * @param string $option_name defines the option_name.
@@ -494,8 +489,8 @@ if ( ! class_exists( 'WCJ_Product_Bookings' ) ) :
494
  'post_type' => 'product',
495
  'post_status' => 'any',
496
  'posts_per_page' => 1,
497
- 'meta_key' => '_wcj_product_bookings_enabled', //phpcs:ignore
498
- 'meta_value' => 'yes', //phpcs:ignore
499
  'post__not_in' => array( get_the_ID() ),
500
  );
501
  $loop = new WP_Query( $args );
@@ -511,23 +506,32 @@ if ( ! class_exists( 'WCJ_Product_Bookings' ) ) :
511
  /**
512
  * Add_notice_query_var.
513
  *
514
- * @version 5.6.3
515
  * @since 2.5.0
516
  * @param string $location defines the location.
517
  */
518
  public function add_notice_query_var( $location ) {
519
  remove_filter( 'redirect_post_location', array( $this, 'add_notice_query_var' ), 99 );
520
- return esc_url_raw( add_query_arg( array( 'wcj_product_bookings_admin_notice' => true ), $location ) );
 
 
 
 
 
 
 
 
521
  }
522
 
523
  /**
524
  * Admin_notices.
525
  *
526
- * @version 5.6.2
527
  * @since 2.5.0
528
  */
529
  public function admin_notices() {
530
- if ( ! isset( $_GET['wcj_product_bookings_admin_notice'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification
 
531
  return;
532
  }
533
  ?>
2
  /**
3
  * Booster for WooCommerce - Module - Bookings
4
  *
5
+ * @version 5.6.8
6
  * @since 2.5.0
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/includes
110
  /**
111
  * Price_change_ajax.
112
  *
113
+ * @version 5.6.8
114
  * @since 2.5.0
115
  * @param string | array $param defines the param.
116
  */
117
  public function price_change_ajax( $param ) {
118
+ $wpnonce = isset( $_REQUEST['_wpnonce'] ) ? wp_verify_nonce( sanitize_key( $_REQUEST['_wpnonce'] ), 'wcj_product_bookings' ) : false;
 
 
119
  if ( $wpnonce && isset( $_POST['date_from'] ) && '' !== $_POST['date_from'] && isset( $_POST['date_to'] ) && '' !== $_POST['date_to'] && isset( $_POST['product_id'] ) && '' !== $_POST['product_id'] ) {
120
  $date_to = strtotime( sanitize_text_field( wp_unslash( $_POST['date_to'] ) ) );
121
  $date_from = strtotime( sanitize_text_field( wp_unslash( $_POST['date_from'] ) ) );
125
  $price_per_day = wcj_get_product_display_price( $the_product );
126
  $the_price = $days_diff * $price_per_day;
127
  echo wp_kses_post( wc_price( $the_price ) );
128
+ } else {
129
+ echo esc_html__( 'Sorry, but something went wrong...', 'woocommerce-jetpack' );
130
  }
131
  die();
132
  }
264
  /**
265
  * Validate_bookings_on_add_to_cart.
266
  *
267
+ * @version 5.6.8
268
  * @since 2.5.0
269
  * @param string | array $passed defines the passed.
270
  * @param int $product_id defines the product_id.
272
  public function validate_bookings_on_add_to_cart( $passed, $product_id ) {
273
  $the_product = wc_get_product( $product_id );
274
  if ( $this->is_bookings_product( $the_product ) ) {
275
+ $wpnonce = isset( $_REQUEST['wcj_product_bookings-nonce'] ) ? wp_verify_nonce( sanitize_key( $_REQUEST['wcj_product_bookings-nonce'] ), 'wcj_product_bookings' ) : false;
 
 
276
  if ( $wpnonce && ( ! isset( $_POST['wcj_product_bookings_date_from'] ) || '' === $_POST['wcj_product_bookings_date_from'] ) ) {
277
  wc_add_notice( wcj_get_option( 'wcj_product_bookings_message_no_date_from', __( '"Date from" must be set', 'woocommerce-jetpack' ) ), 'error' );
278
  return false;
317
  * @param int $variation_id defines the variation_id.
318
  */
319
  public function add_bookings_price_to_cart_item_data( $cart_item_data, $product_id, $variation_id ) {
320
+ $wpnonce = isset( $_REQUEST['wcj_product_bookings-nonce'] ) ? wp_verify_nonce( sanitize_key( $_REQUEST['wcj_product_bookings-nonce'] ), 'wcj_product_bookings' ) : false;
 
 
321
  if ( $wpnonce && isset( $_POST['wcj_product_bookings_date_to'] ) && isset( $_POST['wcj_product_bookings_date_from'] ) ) {
322
  $the_product = wc_get_product( $product_id );
323
  if ( $this->is_bookings_product( $the_product ) ) {
394
  /**
395
  * Add_input_fields_to_frontend.
396
  *
397
+ * @version 5.6.8
398
  * @since 2.5.0
399
  * @todo more options: exclude days (1-31), exact availability dates, mindate, maxdate, firstday, dateformat etc.
400
  */
404
  }
405
  if ( $this->is_bookings_product( wc_get_product() ) ) {
406
  $this->create_custom_style();
407
+ $wpnonce = isset( $_REQUEST['wcj_product_bookings'] ) ? wp_verify_nonce( sanitize_key( $_REQUEST['wcj_product_bookings'] ), 'wcj_product_bookings' ) : false;
 
 
408
  $data_table = array();
409
  $date_from_value = ( $wpnonce && isset( $_POST['wcj_product_bookings_date_from'] ) ) ? sanitize_text_field( wp_unslash( $_POST['wcj_product_bookings_date_from'] ) ) : '';
410
  $date_to_value = ( $wpnonce && isset( $_POST['wcj_product_bookings_date_to'] ) ) ? sanitize_text_field( wp_unslash( $_POST['wcj_product_bookings_date_to'] ) ) : '';
424
  '<label for="wcj_product_bookings_date_to">' . wcj_get_option( 'wcj_product_bookings_label_date_to', __( 'Date to' ) ) . '</label>',
425
  '<input firstday="0"' . $date_to_exclude_days . $date_to_exclude_months . ' dateformat="mm/dd/yy" mindate="0" type="datepicker" display="date" id="wcj_product_bookings_date_to" name="wcj_product_bookings_date_to" placeholder="" value="' . $date_to_value . '">',
426
  );
427
+ echo wp_kses_post( wcj_get_table_html( $data_table, array( 'table_heading_type' => 'none' ) ) );
428
  echo '<div class="wcj-bookings-price-wrapper"><div class="wcj-value"></div><div class="wcj-loader"></div></div>';
429
  echo '<div style="display:none !important;" name="wcj_bookings_message"><p style="color:red;"></p></div>';
430
+ wp_nonce_field( 'wcj_product_bookings', 'wcj_product_bookings-nonce' );
431
  $this->are_bookings_input_fields_displayed = true;
432
  }
433
  }
471
  /**
472
  * Save_meta_box_value.
473
  *
474
+ * @version 5.6.8
475
  * @since 2.5.0
476
  * @param string $option_value defines the option_value.
477
  * @param string $option_name defines the option_name.
489
  'post_type' => 'product',
490
  'post_status' => 'any',
491
  'posts_per_page' => 1,
492
+ 'meta_key' => '_wcj_product_bookings_enabled', // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_key
493
+ 'meta_value' => 'yes', // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_value
494
  'post__not_in' => array( get_the_ID() ),
495
  );
496
  $loop = new WP_Query( $args );
506
  /**
507
  * Add_notice_query_var.
508
  *
509
+ * @version 5.6.8
510
  * @since 2.5.0
511
  * @param string $location defines the location.
512
  */
513
  public function add_notice_query_var( $location ) {
514
  remove_filter( 'redirect_post_location', array( $this, 'add_notice_query_var' ), 99 );
515
+ return esc_url_raw(
516
+ add_query_arg(
517
+ array(
518
+ 'wcj_product_bookings_admin_notice' => true,
519
+ 'wcjnonce' => wp_create_nonce( 'wcj_product_bookings_admin_notice' ),
520
+ ),
521
+ $location
522
+ )
523
+ );
524
  }
525
 
526
  /**
527
  * Admin_notices.
528
  *
529
+ * @version 5.6.8
530
  * @since 2.5.0
531
  */
532
  public function admin_notices() {
533
+ $wpnonce = isset( $_GET['wcjnonce'] ) ? wp_verify_nonce( sanitize_key( $_GET['wcjnonce'] ), 'wcj_product_bookings_admin_notice' ) : false;
534
+ if ( ! $wpnonce || ! isset( $_GET['wcj_product_bookings_admin_notice'] ) ) {
535
  return;
536
  }
537
  ?>
includes/class-wcj-product-bulk-meta-editor.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Module - Product Bulk Meta Editor
4
  *
5
- * @version 5.6.2
6
  * @since 2.8.0
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/includes
@@ -46,7 +46,7 @@ if ( ! class_exists( 'WCJ_Product_Bulk_Meta_Editor' ) ) :
46
  /**
47
  * Create_product_bulk_meta_editor_tool.
48
  *
49
- * @version 5.6.2
50
  * @since 2.8.0
51
  * @todo (maybe) real permalink instead of `/?p=`
52
  * @todo (maybe) `wc_add_notice`
@@ -64,19 +64,17 @@ if ( ! class_exists( 'WCJ_Product_Bulk_Meta_Editor' ) ) :
64
  $result = $this->perform_actions();
65
  // Preparing products data.
66
  $_products = wcj_get_products( array(), 'any', 512, ( 'yes' === apply_filters( 'booster_option', 'no', wcj_get_option( 'wcj_product_bulk_meta_editor_add_variations', 'no' ) ) ) );
67
- $wpnonce = true;
68
- if ( function_exists( 'wp_verify_nonce' ) ) {
69
- $wpnonce = isset( $_REQUEST['_wpnonce'] ) ? wp_verify_nonce( sanitize_key( isset( $_REQUEST['_wpnonce'] ) ? $_REQUEST['_wpnonce'] : '' ) ) : true;
70
- }
71
  $selected_products = $wpnonce && isset( $_POST['wcj_product_bulk_meta_editor_products'] ) ? array_map( 'sanitize_text_field', wp_unslash( $_POST['wcj_product_bulk_meta_editor_products'] ) ) : array();
72
  // Output.
73
- echo $this->get_tool_html( $result['meta_name'], $result['result_message'], $_products, $selected_products, $result['set_meta'] ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
74
  }
75
 
76
  /**
77
  * Perform_actions.
78
  *
79
- * @version 5.6.2
80
  * @since 2.8.0
81
  * @todo break this into separate functions
82
  */
@@ -84,11 +82,13 @@ if ( ! class_exists( 'WCJ_Product_Bulk_Meta_Editor' ) ) :
84
  $meta_name = '';
85
  $set_meta = '';
86
  $result_message = '';
87
- $wpnonce = true;
88
- if ( function_exists( 'wp_verify_nonce' ) ) {
89
- $wpnonce = isset( $_REQUEST['_wpnonce'] ) ? wp_verify_nonce( sanitize_key( isset( $_REQUEST['_wpnonce'] ) ? $_REQUEST['_wpnonce'] : '' ) ) : true;
90
- }
91
- if ( $wpnonce &&
 
 
92
  isset( $_POST['wcj_product_bulk_meta_editor_save_single'] ) && null !== $_POST['wcj_product_bulk_meta_editor_save_single'] && 0 !== $_POST['wcj_product_bulk_meta_editor_save_single'] &&
93
  isset( $_POST['wcj_product_bulk_meta_editor_meta'] ) && '' !== $_POST['wcj_product_bulk_meta_editor_meta']
94
  ) {
@@ -104,6 +104,7 @@ if ( ! class_exists( 'WCJ_Product_Bulk_Meta_Editor' ) ) :
104
  }
105
  $result_message = $this->get_result_message( $success, $fail );
106
  } elseif (
 
107
  isset( $_POST['wcj_product_bulk_meta_editor_delete_single'] ) && 0 > $_POST['wcj_product_bulk_meta_editor_delete_single'] &&
108
  isset( $_POST['wcj_product_bulk_meta_editor_meta'] ) && '' !== $_POST['wcj_product_bulk_meta_editor_meta']
109
  ) {
@@ -118,6 +119,7 @@ if ( ! class_exists( 'WCJ_Product_Bulk_Meta_Editor' ) ) :
118
  }
119
  $result_message = $this->get_result_message( $success, $fail );
120
  } elseif (
 
121
  isset( $_POST['wcj_product_bulk_meta_editor_save_all'] ) &&
122
  isset( $_POST['wcj_product_bulk_meta_editor_meta'] ) && '' !== $_POST['wcj_product_bulk_meta_editor_meta']
123
  ) {
@@ -137,6 +139,7 @@ if ( ! class_exists( 'WCJ_Product_Bulk_Meta_Editor' ) ) :
137
  }
138
  $result_message = $this->get_result_message( $success, $fail );
139
  } elseif (
 
140
  isset( $_POST['wcj_product_bulk_meta_editor_delete_all'] ) &&
141
  isset( $_POST['wcj_product_bulk_meta_editor_meta'] ) && '' !== $_POST['wcj_product_bulk_meta_editor_meta']
142
  ) {
@@ -156,6 +159,7 @@ if ( ! class_exists( 'WCJ_Product_Bulk_Meta_Editor' ) ) :
156
  }
157
  $result_message = $this->get_result_message( $success, $fail );
158
  } elseif (
 
159
  isset( $_POST['wcj_product_bulk_meta_editor_set'] ) &&
160
  isset( $_POST['wcj_product_bulk_meta_editor_set_meta'] ) &&
161
  isset( $_POST['wcj_product_bulk_meta_editor_meta'] ) && '' !== $_POST['wcj_product_bulk_meta_editor_meta']
@@ -176,7 +180,7 @@ if ( ! class_exists( 'WCJ_Product_Bulk_Meta_Editor' ) ) :
176
  }
177
  }
178
  $result_message = $this->get_result_message( $success, $fail );
179
- } elseif ( isset( $_POST['wcj_product_bulk_meta_editor_show'] ) ) {
180
  if ( isset( $_POST['wcj_product_bulk_meta_editor_show_meta'] ) && '' === $_POST['wcj_product_bulk_meta_editor_show_meta'] ) {
181
  $result_message = '<p><div class="error"><p>' . __( 'Please enter meta key.', 'woocommerce-jetpack' ) . '</p></div></p>';
182
  }
@@ -241,7 +245,7 @@ if ( ! class_exists( 'WCJ_Product_Bulk_Meta_Editor' ) ) :
241
  /**
242
  * Get_html_meta_key_input.
243
  *
244
- * @version 3.0.0
245
  * @since 2.8.0
246
  * @param string $meta_name defines the meta_name.
247
  */
@@ -258,6 +262,7 @@ if ( ! class_exists( 'WCJ_Product_Bulk_Meta_Editor' ) ) :
258
  $meta_html .= '<input required class="widefat" type="text" id="wcj_product_bulk_meta_editor_show_meta" name="wcj_product_bulk_meta_editor_show_meta" value="' . $meta_name . '">';
259
  $meta_html .= '</p>';
260
  $meta_html .= '<p>';
 
261
  $meta_html .= '<button class="button-primary" type="submit" name="wcj_product_bulk_meta_editor_show" value="show">' . __( 'Show', 'woocommerce-jetpack' ) . '</button>';
262
  $meta_html .= '</p>';
263
  $table_data = array();
@@ -322,7 +327,7 @@ if ( ! class_exists( 'WCJ_Product_Bulk_Meta_Editor' ) ) :
322
  /**
323
  * Get_html_meta_table_set_single_value.
324
  *
325
- * @version 3.0.0
326
  * @since 2.8.0
327
  * @param string $set_meta defines the set_meta.
328
  * @param string $js_confirmation defines the js_confirmation.
@@ -333,6 +338,7 @@ if ( ! class_exists( 'WCJ_Product_Bulk_Meta_Editor' ) ) :
333
  '<input type="text" class="widefat" id="wcj_product_bulk_meta_editor_set_meta" name="wcj_product_bulk_meta_editor_set_meta" value="' . $set_meta . '">' .
334
  '</p>' .
335
  '<p>' .
 
336
  '<button class="button-primary" type="submit" name="wcj_product_bulk_meta_editor_set" value="set"' . $js_confirmation . '>' .
337
  __( 'Set', 'woocommerce-jetpack' ) . '</button>' .
338
  '</p>';
@@ -349,7 +355,7 @@ if ( ! class_exists( 'WCJ_Product_Bulk_Meta_Editor' ) ) :
349
  /**
350
  * Get_html_meta_table_buttons.
351
  *
352
- * @version 2.8.0
353
  * @since 2.8.0
354
  * @param string $meta_name defines the meta_name.
355
  * @param string $js_confirmation defines the js_confirmation.
@@ -357,6 +363,7 @@ if ( ! class_exists( 'WCJ_Product_Bulk_Meta_Editor' ) ) :
357
  public function get_html_meta_table_buttons( $meta_name, $js_confirmation ) {
358
  $html = '';
359
  $html .= '<p>';
 
360
  $html .= '<input class="button-primary" type="submit" name="wcj_product_bulk_meta_editor_save_all" value="' . __( 'Save all', 'woocommerce-jetpack' ) . '"' .
361
  $js_confirmation . '>';
362
  $html .= ' ';
@@ -370,7 +377,7 @@ if ( ! class_exists( 'WCJ_Product_Bulk_Meta_Editor' ) ) :
370
  /**
371
  * Get_html_meta_table_content.
372
  *
373
- * @version 5.6.2
374
  * @since 2.8.0
375
  * @param string $meta_name defines the meta_name.
376
  * @param array $_products defines the _products.
@@ -398,7 +405,7 @@ if ( ! class_exists( 'WCJ_Product_Bulk_Meta_Editor' ) ) :
398
  } else {
399
  $_post_meta = get_post_meta( $product_id, $meta_name, true );
400
  if ( is_array( $_post_meta ) || is_object( $_post_meta ) ) {
401
- $_post_meta = print_r( $_post_meta, true ); // phpcs:ignore
402
  } else {
403
  $placeholder = ( ! metadata_exists( 'post', $product_id, $meta_name ) ? ' placeholder="N/A"' : '' );
404
  $_post_meta = '<input' . $placeholder . ' style="width:100%;" type="text" name="wcj_product_bulk_meta_editor_id_' . $product_id . '" value="' .
@@ -418,7 +425,9 @@ if ( ! class_exists( 'WCJ_Product_Bulk_Meta_Editor' ) ) :
418
  $row = $this->maybe_add_additional_columns_content( $row, $additional_columns, $product_id );
419
  $table_data[] = $row;
420
  }
421
- return '<p>' . wcj_get_table_html( $table_data, array( 'table_class' => 'widefat striped' ) ) . '</p>';
 
 
422
  }
423
 
424
  /**
2
  /**
3
  * Booster for WooCommerce - Module - Product Bulk Meta Editor
4
  *
5
+ * @version 5.6.8
6
  * @since 2.8.0
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/includes
46
  /**
47
  * Create_product_bulk_meta_editor_tool.
48
  *
49
+ * @version 5.6.8
50
  * @since 2.8.0
51
  * @todo (maybe) real permalink instead of `/?p=`
52
  * @todo (maybe) `wc_add_notice`
64
  $result = $this->perform_actions();
65
  // Preparing products data.
66
  $_products = wcj_get_products( array(), 'any', 512, ( 'yes' === apply_filters( 'booster_option', 'no', wcj_get_option( 'wcj_product_bulk_meta_editor_add_variations', 'no' ) ) ) );
67
+
68
+ $wpnonce = isset( $_REQUEST['wcj_tools_nonce'] ) ? wp_verify_nonce( sanitize_key( $_REQUEST['wcj_tools_nonce'] ), 'wcj_tools' ) : false;
 
 
69
  $selected_products = $wpnonce && isset( $_POST['wcj_product_bulk_meta_editor_products'] ) ? array_map( 'sanitize_text_field', wp_unslash( $_POST['wcj_product_bulk_meta_editor_products'] ) ) : array();
70
  // Output.
71
+ echo wp_kses_post( $this->get_tool_html( $result['meta_name'], $result['result_message'], $_products, $selected_products, $result['set_meta'] ) );
72
  }
73
 
74
  /**
75
  * Perform_actions.
76
  *
77
+ * @version 5.6.8
78
  * @since 2.8.0
79
  * @todo break this into separate functions
80
  */
82
  $meta_name = '';
83
  $set_meta = '';
84
  $result_message = '';
85
+
86
+ $show_wpnonce = isset( $_REQUEST['wcj_product_bulk_meta_editor_show-nonce'] ) ? wp_verify_nonce( sanitize_key( $_REQUEST['wcj_product_bulk_meta_editor_show-nonce'] ), 'wcj_product_bulk_meta_editor_show' ) : false;
87
+ $set_wpnonce = isset( $_REQUEST['wcj_product_bulk_meta_editor_set-nonce'] ) ? wp_verify_nonce( sanitize_key( $_REQUEST['wcj_product_bulk_meta_editor_set-nonce'] ), 'wcj_product_bulk_meta_editor_set' ) : false;
88
+ $save_delete_all_wpnonce = isset( $_REQUEST['wcj_product_bulk_meta_editor_save_delete_all-nonce'] ) ? wp_verify_nonce( sanitize_key( $_REQUEST['wcj_product_bulk_meta_editor_save_delete_all-nonce'] ), 'wcj_product_bulk_meta_editor_save_delete_all' ) : false;
89
+ $save_delete_wpnonce = isset( $_REQUEST['wcj_product_bulk_meta_editor_save_delete_single-nonce'] ) ? wp_verify_nonce( sanitize_key( $_REQUEST['wcj_product_bulk_meta_editor_save_delete_single-nonce'] ), 'wcj_product_bulk_meta_editor_save_delete_single' ) : false;
90
+
91
+ if ( $save_delete_wpnonce &&
92
  isset( $_POST['wcj_product_bulk_meta_editor_save_single'] ) && null !== $_POST['wcj_product_bulk_meta_editor_save_single'] && 0 !== $_POST['wcj_product_bulk_meta_editor_save_single'] &&
93
  isset( $_POST['wcj_product_bulk_meta_editor_meta'] ) && '' !== $_POST['wcj_product_bulk_meta_editor_meta']
94
  ) {
104
  }
105
  $result_message = $this->get_result_message( $success, $fail );
106
  } elseif (
107
+ $save_delete_wpnonce &&
108
  isset( $_POST['wcj_product_bulk_meta_editor_delete_single'] ) && 0 > $_POST['wcj_product_bulk_meta_editor_delete_single'] &&
109
  isset( $_POST['wcj_product_bulk_meta_editor_meta'] ) && '' !== $_POST['wcj_product_bulk_meta_editor_meta']
110
  ) {
119
  }
120
  $result_message = $this->get_result_message( $success, $fail );
121
  } elseif (
122
+ $save_delete_all_wpnonce &&
123
  isset( $_POST['wcj_product_bulk_meta_editor_save_all'] ) &&
124
  isset( $_POST['wcj_product_bulk_meta_editor_meta'] ) && '' !== $_POST['wcj_product_bulk_meta_editor_meta']
125
  ) {
139
  }
140
  $result_message = $this->get_result_message( $success, $fail );
141
  } elseif (
142
+ $save_delete_all_wpnonce &&
143
  isset( $_POST['wcj_product_bulk_meta_editor_delete_all'] ) &&
144
  isset( $_POST['wcj_product_bulk_meta_editor_meta'] ) && '' !== $_POST['wcj_product_bulk_meta_editor_meta']
145
  ) {
159
  }
160
  $result_message = $this->get_result_message( $success, $fail );
161
  } elseif (
162
+ $set_wpnonce &&
163
  isset( $_POST['wcj_product_bulk_meta_editor_set'] ) &&
164
  isset( $_POST['wcj_product_bulk_meta_editor_set_meta'] ) &&
165
  isset( $_POST['wcj_product_bulk_meta_editor_meta'] ) && '' !== $_POST['wcj_product_bulk_meta_editor_meta']
180
  }
181
  }
182
  $result_message = $this->get_result_message( $success, $fail );
183
+ } elseif ( $show_wpnonce && isset( $_POST['wcj_product_bulk_meta_editor_show'] ) ) {
184
  if ( isset( $_POST['wcj_product_bulk_meta_editor_show_meta'] ) && '' === $_POST['wcj_product_bulk_meta_editor_show_meta'] ) {
185
  $result_message = '<p><div class="error"><p>' . __( 'Please enter meta key.', 'woocommerce-jetpack' ) . '</p></div></p>';
186
  }
245
  /**
246
  * Get_html_meta_key_input.
247
  *
248
+ * @version 5.6.8
249
  * @since 2.8.0
250
  * @param string $meta_name defines the meta_name.
251
  */
262
  $meta_html .= '<input required class="widefat" type="text" id="wcj_product_bulk_meta_editor_show_meta" name="wcj_product_bulk_meta_editor_show_meta" value="' . $meta_name . '">';
263
  $meta_html .= '</p>';
264
  $meta_html .= '<p>';
265
+ $meta_html .= wp_nonce_field( 'wcj_product_bulk_meta_editor_show', 'wcj_product_bulk_meta_editor_show-nonce' );
266
  $meta_html .= '<button class="button-primary" type="submit" name="wcj_product_bulk_meta_editor_show" value="show">' . __( 'Show', 'woocommerce-jetpack' ) . '</button>';
267
  $meta_html .= '</p>';
268
  $table_data = array();
327
  /**
328
  * Get_html_meta_table_set_single_value.
329
  *
330
+ * @version 5.6.8
331
  * @since 2.8.0
332
  * @param string $set_meta defines the set_meta.
333
  * @param string $js_confirmation defines the js_confirmation.
338
  '<input type="text" class="widefat" id="wcj_product_bulk_meta_editor_set_meta" name="wcj_product_bulk_meta_editor_set_meta" value="' . $set_meta . '">' .
339
  '</p>' .
340
  '<p>' .
341
+ wp_nonce_field( 'wcj_product_bulk_meta_editor_set', 'wcj_product_bulk_meta_editor_set-nonce' ) .
342
  '<button class="button-primary" type="submit" name="wcj_product_bulk_meta_editor_set" value="set"' . $js_confirmation . '>' .
343
  __( 'Set', 'woocommerce-jetpack' ) . '</button>' .
344
  '</p>';
355
  /**
356
  * Get_html_meta_table_buttons.
357
  *
358
+ * @version 5.6.8
359
  * @since 2.8.0
360
  * @param string $meta_name defines the meta_name.
361
  * @param string $js_confirmation defines the js_confirmation.
363
  public function get_html_meta_table_buttons( $meta_name, $js_confirmation ) {
364
  $html = '';
365
  $html .= '<p>';
366
+ $html .= wp_nonce_field( 'wcj_product_bulk_meta_editor_save_delete_all', 'wcj_product_bulk_meta_editor_save_delete_all-nonce' );
367
  $html .= '<input class="button-primary" type="submit" name="wcj_product_bulk_meta_editor_save_all" value="' . __( 'Save all', 'woocommerce-jetpack' ) . '"' .
368
  $js_confirmation . '>';
369
  $html .= ' ';
377
  /**
378
  * Get_html_meta_table_content.
379
  *
380
+ * @version 5.6.8
381
  * @since 2.8.0
382
  * @param string $meta_name defines the meta_name.
383
  * @param array $_products defines the _products.
405
  } else {
406
  $_post_meta = get_post_meta( $product_id, $meta_name, true );
407
  if ( is_array( $_post_meta ) || is_object( $_post_meta ) ) {
408
+ $_post_meta = wp_json_encode( $_post_meta );
409
  } else {
410
  $placeholder = ( ! metadata_exists( 'post', $product_id, $meta_name ) ? ' placeholder="N/A"' : '' );
411
  $_post_meta = '<input' . $placeholder . ' style="width:100%;" type="text" name="wcj_product_bulk_meta_editor_id_' . $product_id . '" value="' .
425
  $row = $this->maybe_add_additional_columns_content( $row, $additional_columns, $product_id );
426
  $table_data[] = $row;
427
  }
428
+
429
+ return '<p>' . wcj_get_table_html( $table_data, array( 'table_class' => 'widefat striped' ) ) .
430
+ wp_nonce_field( 'wcj_product_bulk_meta_editor_save_delete_single', 'wcj_product_bulk_meta_editor_save_delete_single-nonce' ) . '</p>';
431
  }
432
 
433
  /**
includes/class-wcj-product-bulk-price-converter.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Module - Bulk Price Converter
4
  *
5
- * @version 5.6.2
6
  * @author Pluggabl LLC.
7
  * @package Booster_For_WooCommerce/includes
8
  */
@@ -43,7 +43,7 @@ if ( ! class_exists( 'WCJ_Product_Bulk_Price_Converter' ) ) :
43
  /**
44
  * Change_price_by_type.
45
  *
46
- * @version 5.6.2
47
  * @param int $product_id defines the product_id.
48
  * @param string $multiply_price_by defines the multiply_price_by.
49
  * @param string $price_type defines the price_type.
@@ -55,10 +55,7 @@ if ( ! class_exists( 'WCJ_Product_Bulk_Price_Converter' ) ) :
55
  public function change_price_by_type( $product_id, $multiply_price_by, $price_type, $is_preview, $parent_product_id, $min_price = 0, $max_price = 0 ) {
56
  $the_price = get_post_meta( $product_id, '_' . $price_type, true );
57
  $the_modified_price = $the_price;
58
- $wpnonce = true;
59
- if ( function_exists( 'wp_verify_nonce' ) ) {
60
- $wpnonce = isset( $_REQUEST['_wpnonce'] ) ? wp_verify_nonce( sanitize_key( isset( $_REQUEST['_wpnonce'] ) ? $_REQUEST['_wpnonce'] : '' ) ) : true;
61
- }
62
  if ( '' !== $the_price && 0 !== $the_price ) {
63
  $precision = wcj_get_option( 'woocommerce_price_num_decimals', 2 );
64
  $the_modified_price = round( $the_price * $multiply_price_by, $precision );
@@ -100,17 +97,14 @@ if ( ! class_exists( 'WCJ_Product_Bulk_Price_Converter' ) ) :
100
  /**
101
  * Change_price_all_types.
102
  *
103
- * @version 5.6.2
104
  * @param int $product_id defines the product_id.
105
  * @param int $multiply_price_by defines the multiply_price_by.
106
  * @param string | bool $is_preview defines the is_preview.
107
  * @param int $parent_product_id defines the parent_product_id.
108
  */
109
  public function change_price_all_types( $product_id, $multiply_price_by, $is_preview, $parent_product_id ) {
110
- $wpnonce = true;
111
- if ( function_exists( 'wp_verify_nonce' ) ) {
112
- $wpnonce = isset( $_REQUEST['_wpnonce'] ) ? wp_verify_nonce( sanitize_key( isset( $_REQUEST['_wpnonce'] ) ? $_REQUEST['_wpnonce'] : '' ) ) : true;
113
- }
114
  $what_prices_to_modify = ( $wpnonce && isset( $_POST['wcj_price_types'] ) ) ? sanitize_text_field( wp_unslash( $_POST['wcj_price_types'] ) ) : 'wcj_both';
115
  if ( 'wcj_both' === $what_prices_to_modify ) {
116
  $this->change_price_by_type( $product_id, $multiply_price_by, 'price', $is_preview, $parent_product_id );
@@ -189,7 +183,7 @@ if ( ! class_exists( 'WCJ_Product_Bulk_Price_Converter' ) ) :
189
  /**
190
  * Change_all_products_prices.
191
  *
192
- * @version 5.6.2
193
  * @todo (dev) clear products transients after converting prices
194
  * @param int $multiply_prices_by defines the multiply_prices_by.
195
  * @param string | bool $is_preview defines the is_preview.
@@ -200,10 +194,7 @@ if ( ! class_exists( 'WCJ_Product_Bulk_Price_Converter' ) ) :
200
  return;
201
  }
202
 
203
- $wpnonce = true;
204
- if ( function_exists( 'wp_verify_nonce' ) ) {
205
- $wpnonce = isset( $_REQUEST['_wpnonce'] ) ? wp_verify_nonce( sanitize_key( isset( $_REQUEST['_wpnonce'] ) ? $_REQUEST['_wpnonce'] : '' ) ) : true;
206
- }
207
 
208
  ob_start();
209
 
@@ -229,7 +220,7 @@ if ( ! class_exists( 'WCJ_Product_Bulk_Price_Converter' ) ) :
229
  'fields' => 'ids',
230
  );
231
  if ( $wpnonce && isset( $_POST['wcj_product_cat'] ) && 'wcj_any' !== $_POST['wcj_product_cat'] && 'any' !== apply_filters( 'booster_option', 'any', '' ) ) {
232
- $args['tax_query'] = array(// phpcs:ignore
233
  array(
234
  'taxonomy' => 'product_cat',
235
  'field' => 'slug',
@@ -256,14 +247,11 @@ if ( ! class_exists( 'WCJ_Product_Bulk_Price_Converter' ) ) :
256
  /**
257
  * Create_bulk_price_converter_tool.
258
  *
259
- * @version 5.6.2
260
  */
261
  public function create_bulk_price_converter_tool() {
262
- $result_message = '';
263
- $wpnonce = true;
264
- if ( function_exists( 'wp_verify_nonce' ) ) {
265
- $wpnonce = isset( $_REQUEST['_wpnonce'] ) ? wp_verify_nonce( sanitize_key( isset( $_REQUEST['_wpnonce'] ) ? $_REQUEST['_wpnonce'] : '' ) ) : true;
266
- }
267
  $multiply_prices_by = $wpnonce && isset( $_POST['multiply_prices_by'] ) ? sanitize_text_field( wp_unslash( $_POST['multiply_prices_by'] ) ) : 1;
268
  $is_preview = isset( $_POST['bulk_change_prices_preview'] );
269
 
@@ -338,8 +326,8 @@ if ( ! class_exists( 'WCJ_Product_Bulk_Price_Converter' ) ) :
338
  __( 'Otherwise - all prices below "threshold" will end with 0,99 and all prices above or equal to "threshold" will end with 9,00.', 'woocommerce-jetpack' ) . ' ' .
339
  __( 'E.g.: if you set "threshold" to 100, then all prices below 100 will be like 45,99 and all other prices will be like 109,00.', 'woocommerce-jetpack' )
340
  ),
341
- '<input style="width:100%;" class="" type="number" step="0.000001" min="0" name="make_pretty_prices_threshold" id="make_pretty_prices_threshold" value="' .
342
- $make_pretty_prices_threshold . '"' . apply_filters( 'booster_option', 'disabled', '' ) . '>',
343
  '<em>' . apply_filters( 'booster_message', '', 'desc' ) . '</em>',
344
  );
345
  $data_table[] = array(
@@ -356,13 +344,20 @@ if ( ! class_exists( 'WCJ_Product_Bulk_Price_Converter' ) ) :
356
  '',
357
  );
358
  }
 
 
 
 
 
359
  echo (
360
- wcj_get_table_html( // phpcs:ignore WordPress.Security.EscapeOutput
361
- $data_table,
362
- array(
363
- 'table_heading_type' => 'none',
364
- 'table_class' => 'widefat striped',
365
- 'table_style' => 'width:50%;min-width:300px;',
 
 
366
  )
367
  )
368
  );
@@ -377,7 +372,7 @@ if ( ! class_exists( 'WCJ_Product_Bulk_Price_Converter' ) ) :
377
  /**
378
  * Make_pretty_price.
379
  *
380
- * @version 5.6.2
381
  * @since 2.4.4
382
  * @param int $price defines the price.
383
  */
@@ -385,10 +380,7 @@ if ( ! class_exists( 'WCJ_Product_Bulk_Price_Converter' ) ) :
385
  if ( 0 === $price ) {
386
  return $price;
387
  }
388
- $wpnonce = true;
389
- if ( function_exists( 'wp_verify_nonce' ) ) {
390
- $wpnonce = isset( $_REQUEST['_wpnonce'] ) ? wp_verify_nonce( sanitize_key( isset( $_REQUEST['_wpnonce'] ) ? $_REQUEST['_wpnonce'] : '' ) ) : true;
391
- }
392
  $the_modified_price = round( $price );
393
  if ( $wpnonce && isset( $_POST['make_pretty_prices_threshold'] ) && $price < $_POST['make_pretty_prices_threshold'] ) {
394
  $the_modified_price -= 0.01; // E.g. 49.49 -> 48.99 and 49.50 -> 49.99.
2
  /**
3
  * Booster for WooCommerce - Module - Bulk Price Converter
4
  *
5
+ * @version 5.6.8
6
  * @author Pluggabl LLC.
7
  * @package Booster_For_WooCommerce/includes
8
  */
43
  /**
44
  * Change_price_by_type.
45
  *
46
+ * @version 5.6.8
47
  * @param int $product_id defines the product_id.
48
  * @param string $multiply_price_by defines the multiply_price_by.
49
  * @param string $price_type defines the price_type.
55
  public function change_price_by_type( $product_id, $multiply_price_by, $price_type, $is_preview, $parent_product_id, $min_price = 0, $max_price = 0 ) {
56
  $the_price = get_post_meta( $product_id, '_' . $price_type, true );
57
  $the_modified_price = $the_price;
58
+ $wpnonce = isset( $_REQUEST['bulk_change_prices-nonce'] ) ? wp_verify_nonce( sanitize_key( $_REQUEST['bulk_change_prices-nonce'] ), 'bulk_change_prices' ) : false;
 
 
 
59
  if ( '' !== $the_price && 0 !== $the_price ) {
60
  $precision = wcj_get_option( 'woocommerce_price_num_decimals', 2 );
61
  $the_modified_price = round( $the_price * $multiply_price_by, $precision );
97
  /**
98
  * Change_price_all_types.
99
  *
100
+ * @version 5.6.8
101
  * @param int $product_id defines the product_id.
102
  * @param int $multiply_price_by defines the multiply_price_by.
103
  * @param string | bool $is_preview defines the is_preview.
104
  * @param int $parent_product_id defines the parent_product_id.
105
  */
106
  public function change_price_all_types( $product_id, $multiply_price_by, $is_preview, $parent_product_id ) {
107
+ $wpnonce = isset( $_REQUEST['bulk_change_prices-nonce'] ) ? wp_verify_nonce( sanitize_key( $_REQUEST['bulk_change_prices-nonce'] ), 'bulk_change_prices' ) : false;
 
 
 
108
  $what_prices_to_modify = ( $wpnonce && isset( $_POST['wcj_price_types'] ) ) ? sanitize_text_field( wp_unslash( $_POST['wcj_price_types'] ) ) : 'wcj_both';
109
  if ( 'wcj_both' === $what_prices_to_modify ) {
110
  $this->change_price_by_type( $product_id, $multiply_price_by, 'price', $is_preview, $parent_product_id );
183
  /**
184
  * Change_all_products_prices.
185
  *
186
+ * @version 5.6.8
187
  * @todo (dev) clear products transients after converting prices
188
  * @param int $multiply_prices_by defines the multiply_prices_by.
189
  * @param string | bool $is_preview defines the is_preview.
194
  return;
195
  }
196
 
197
+ $wpnonce = isset( $_REQUEST['bulk_change_prices-nonce'] ) ? wp_verify_nonce( sanitize_key( $_REQUEST['bulk_change_prices-nonce'] ), 'bulk_change_prices' ) : false;
 
 
 
198
 
199
  ob_start();
200
 
220
  'fields' => 'ids',
221
  );
222
  if ( $wpnonce && isset( $_POST['wcj_product_cat'] ) && 'wcj_any' !== $_POST['wcj_product_cat'] && 'any' !== apply_filters( 'booster_option', 'any', '' ) ) {
223
+ $args['tax_query'] = array( // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_tax_query
224
  array(
225
  'taxonomy' => 'product_cat',
226
  'field' => 'slug',
247
  /**
248
  * Create_bulk_price_converter_tool.
249
  *
250
+ * @version 5.6.8
251
  */
252
  public function create_bulk_price_converter_tool() {
253
+ $result_message = '';
254
+ $wpnonce = isset( $_REQUEST['bulk_change_prices-nonce'] ) ? wp_verify_nonce( sanitize_key( $_REQUEST['bulk_change_prices-nonce'] ), 'bulk_change_prices' ) : false;
 
 
 
255
  $multiply_prices_by = $wpnonce && isset( $_POST['multiply_prices_by'] ) ? sanitize_text_field( wp_unslash( $_POST['multiply_prices_by'] ) ) : 1;
256
  $is_preview = isset( $_POST['bulk_change_prices_preview'] );
257
 
326
  __( 'Otherwise - all prices below "threshold" will end with 0,99 and all prices above or equal to "threshold" will end with 9,00.', 'woocommerce-jetpack' ) . ' ' .
327
  __( 'E.g.: if you set "threshold" to 100, then all prices below 100 will be like 45,99 and all other prices will be like 109,00.', 'woocommerce-jetpack' )
328
  ),
329
+ '<input style="width:100%;" class="" type="number" step="0.000001" min="0" name="make_pretty_prices_threshold" id="make_pretty_prices_threshold" ' . apply_filters( 'booster_option', 'disabled', '' ) . ' value="' .
330
+ $make_pretty_prices_threshold . '">',
331
  '<em>' . apply_filters( 'booster_message', '', 'desc' ) . '</em>',
332
  );
333
  $data_table[] = array(
344
  '',
345
  );
346
  }
347
+ $data_table[] = array(
348
+ wp_nonce_field( 'bulk_change_prices', 'bulk_change_prices-nonce' ),
349
+ '',
350
+ '',
351
+ );
352
  echo (
353
+ wp_kses_post(
354
+ wcj_get_table_html(
355
+ $data_table,
356
+ array(
357
+ 'table_heading_type' => 'none',
358
+ 'table_class' => 'widefat striped',
359
+ 'table_style' => 'width:50%;min-width:300px;',
360
+ )
361
  )
362
  )
363
  );
372
  /**
373
  * Make_pretty_price.
374
  *
375
+ * @version 5.6.8
376
  * @since 2.4.4
377
  * @param int $price defines the price.
378
  */
380
  if ( 0 === $price ) {
381
  return $price;
382
  }
383
+ $wpnonce = isset( $_REQUEST['bulk_change_prices-nonce'] ) ? wp_verify_nonce( sanitize_key( $_REQUEST['bulk_change_prices-nonce'] ), 'bulk_change_prices' ) : false;
 
 
 
384
  $the_modified_price = round( $price );
385
  if ( $wpnonce && isset( $_POST['make_pretty_prices_threshold'] ) && $price < $_POST['make_pretty_prices_threshold'] ) {
386
  $the_modified_price -= 0.01; // E.g. 49.49 -> 48.99 and 49.50 -> 49.99.
includes/class-wcj-product-by-country.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Module - Product Visibility by Country
4
  *
5
- * @version 5.6.2
6
  * @since 2.5.0
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/includes
@@ -115,16 +115,18 @@ if ( ! class_exists( 'WCJ_Product_By_Country' ) ) :
115
  /**
116
  * Save_country_in_session.
117
  *
118
- * @version 5.6.2
119
  * @since 3.1.0
120
  */
121
  public function save_country_in_session() {
122
  wcj_session_maybe_start();
123
- if ( isset( $_REQUEST['wcj_country_selector'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification
124
- wcj_session_set( 'wcj_selected_country', sanitize_text_field( wp_unslash( $_REQUEST['wcj_country_selector'] ) ) ); // phpcs:ignore WordPress.Security.NonceVerification
 
 
125
  }
126
- if ( isset( $_REQUEST['wcj-country'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification
127
- wcj_session_set( 'wcj_selected_country', sanitize_text_field( wp_unslash( $_REQUEST['wcj-country'] ) ) ); // phpcs:ignore WordPress.Security.NonceVerification
128
  }
129
  }
130
 
2
  /**
3
  * Booster for WooCommerce - Module - Product Visibility by Country
4
  *
5
+ * @version 5.6.8
6
  * @since 2.5.0
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/includes
115
  /**
116
  * Save_country_in_session.
117
  *
118
+ * @version 5.6.8
119
  * @since 3.1.0
120
  */
121
  public function save_country_in_session() {
122
  wcj_session_maybe_start();
123
+ $country_selector_wpnonce = isset( $_REQUEST['wcj_country_selector-nonce'] ) ? wp_verify_nonce( sanitize_key( $_REQUEST['wcj_country_selector-nonce'] ), 'wcj_country_selector' ) : false;
124
+ $country_wpnonce = isset( $_REQUEST['wcj-country-nonce'] ) ? wp_verify_nonce( sanitize_key( $_REQUEST['wcj-country-nonce'] ), 'wcj-country' ) : false;
125
+ if ( $country_selector_wpnonce && isset( $_REQUEST['wcj_country_selector'] ) ) {
126
+ wcj_session_set( 'wcj_selected_country', sanitize_text_field( wp_unslash( $_REQUEST['wcj_country_selector'] ) ) );
127
  }
128
+ if ( $country_wpnonce && isset( $_REQUEST['wcj-country'] ) ) {
129
+ wcj_session_set( 'wcj_selected_country', sanitize_text_field( wp_unslash( $_REQUEST['wcj-country'] ) ) );
130
  }
131
  }
132
 
includes/class-wcj-product-by-date.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Module - Product Availability by Date
4
  *
5
- * @version 5.6.2
6
  * @since 2.9.1
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/includes
@@ -21,7 +21,7 @@ if ( ! class_exists( 'WCJ_Product_By_Date' ) ) :
21
  /**
22
  * Constructor.
23
  *
24
- * @version 5.6.2
25
  * @since 2.9.1
26
  * @todo per category
27
  * @todo per tag
@@ -36,7 +36,7 @@ if ( ! class_exists( 'WCJ_Product_By_Date' ) ) :
36
  $this->desc_pro = __( 'Set product availability by date.', 'woocommerce-jetpack' );
37
  $this->link_slug = 'woocommerce-product-availability-by-date';
38
  parent::__construct();
39
- $this->time_now = (int) gmdate( 'U' );
40
 
41
  if ( $this->is_enabled() ) {
42
  // Per product meta box.
2
  /**
3
  * Booster for WooCommerce - Module - Product Availability by Date
4
  *
5
+ * @version 5.6.8
6
  * @since 2.9.1
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/includes
21
  /**
22
  * Constructor.
23
  *
24
+ * @version 5.6.8
25
  * @since 2.9.1
26
  * @todo per category
27
  * @todo per tag
36
  $this->desc_pro = __( 'Set product availability by date.', 'woocommerce-jetpack' );
37
  $this->link_slug = 'woocommerce-product-availability-by-date';
38
  parent::__construct();
39
+ $this->time_now = wcj_get_timestamp_date_from_gmt();
40
 
41
  if ( $this->is_enabled() ) {
42
  // Per product meta box.
includes/class-wcj-product-by-time.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Module - Product Availability by Time
4
  *
5
- * @version 5.6.2
6
  * @since 2.8.0
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/includes
@@ -21,7 +21,7 @@ if ( ! class_exists( 'WCJ_Product_By_Time' ) ) :
21
  /**
22
  * Constructor.
23
  *
24
- * @version 5.6.2
25
  * @since 2.8.0
26
  * @todo per category
27
  * @todo per tag
@@ -36,8 +36,7 @@ if ( ! class_exists( 'WCJ_Product_By_Time' ) ) :
36
  $this->desc_pro = __( 'Set product availability by time.', 'woocommerce-jetpack' );
37
  $this->link_slug = 'woocommerce-product-availability-by-time';
38
  parent::__construct();
39
- $this->time_now = (int) gmdate( 'U' );
40
-
41
  if ( $this->is_enabled() ) {
42
  // Per product meta box.
43
  if ( 'yes' === wcj_get_option( 'wcj_product_by_time_per_product_enabled', 'no' ) ) {
2
  /**
3
  * Booster for WooCommerce - Module - Product Availability by Time
4
  *
5
+ * @version 5.6.8
6
  * @since 2.8.0
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/includes
21
  /**
22
  * Constructor.
23
  *
24
+ * @version 5.6.8
25
  * @since 2.8.0
26
  * @todo per category
27
  * @todo per tag
36
  $this->desc_pro = __( 'Set product availability by time.', 'woocommerce-jetpack' );
37
  $this->link_slug = 'woocommerce-product-availability-by-time';
38
  parent::__construct();
39
+ $this->time_now = wcj_get_timestamp_date_from_gmt();
 
40
  if ( $this->is_enabled() ) {
41
  // Per product meta box.
42
  if ( 'yes' === wcj_get_option( 'wcj_product_by_time_per_product_enabled', 'no' ) ) {
includes/class-wcj-product-by-user-role.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Module - Product Visibility by User Role
4
  *
5
- * @version 5.6.2
6
  * @since 2.5.5
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/includes
@@ -42,7 +42,7 @@ if ( ! class_exists( 'WCJ_Product_By_User_Role' ) ) :
42
  /**
43
  * Maybe_add_extra_settings.
44
  *
45
- * @version 5.6.2
46
  * @since 4.9.0
47
  *
48
  * @return array
@@ -58,7 +58,7 @@ if ( ! class_exists( 'WCJ_Product_By_User_Role' ) ) :
58
  array(
59
  'title' => __( 'Skip Editable Roles Filter', 'woocommerce-jetpack' ),
60
  /* translators: %s: translation added */
61
- 'desc_tip' => __( 'Ignores <code>editable_roles</code> filter on admin.', 'woocommerce-jetpack' ) . '<br />' . sprintf( __( 'Enable this option for example if the shop manager can\'t see some role but only if you\'ve already tried the <strong>Shop Manager Editable Roles</strong> on <a href="%s">Admin Tools</a> module.', 'woocommerce-jetpack' ), admin_url( 'admin.php?page=wc-settings&tab=jetpack&wcj-cat=emails_and_misc&section=admin_tools' ) ),
62
  'desc' => empty( $message ) ? __( 'Enable', 'woocommerce-jetpack' ) : $message,
63
  'custom_attributes' => apply_filters( 'booster_message', '', 'disabled' ),
64
  'id' => 'wcj_' . $this->id . '_user_options_skip_editable_roles',
2
  /**
3
  * Booster for WooCommerce - Module - Product Visibility by User Role
4
  *
5
+ * @version 5.6.8
6
  * @since 2.5.5
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/includes
42
  /**
43
  * Maybe_add_extra_settings.
44
  *
45
+ * @version 5.6.8
46
  * @since 4.9.0
47
  *
48
  * @return array
58
  array(
59
  'title' => __( 'Skip Editable Roles Filter', 'woocommerce-jetpack' ),
60
  /* translators: %s: translation added */
61
+ 'desc_tip' => __( 'Ignores <code>editable_roles</code> filter on admin.', 'woocommerce-jetpack' ) . '<br />' . sprintf( __( 'Enable this option for example if the shop manager can\'t see some role but only if you\'ve already tried the <strong>Shop Manager Editable Roles</strong> on <a href="%s">Admin Tools</a> module.', 'woocommerce-jetpack' ), admin_url( wcj_admin_tab_url() . '&wcj-cat=emails_and_misc&section=admin_tools' ) ),
62
  'desc' => empty( $message ) ? __( 'Enable', 'woocommerce-jetpack' ) : $message,
63
  'custom_attributes' => apply_filters( 'booster_message', '', 'disabled' ),
64
  'id' => 'wcj_' . $this->id . '_user_options_skip_editable_roles',
includes/class-wcj-product-by-user.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Module - Product by User
4
  *
5
- * @version 5.6.2
6
  * @since 2.5.2
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/includes
@@ -217,7 +217,7 @@ if ( ! class_exists( 'WCJ_Product_By_User' ) ) :
217
  /**
218
  * Add_my_products_content_my_account_page.
219
  *
220
- * @version 5.6.2
221
  * @since 2.5.2
222
  */
223
  public function add_my_products_content_my_account_page() {
@@ -225,11 +225,9 @@ if ( ! class_exists( 'WCJ_Product_By_User' ) ) :
225
  if ( 0 === $user_ID ) {
226
  return;
227
  }
228
- $wpnonce = true;
229
- if ( function_exists( 'wp_verify_nonce' ) ) {
230
- $wpnonce = isset( $_REQUEST['_wpnonce'] ) ? wp_verify_nonce( sanitize_key( isset( $_REQUEST['_wpnonce'] ) ? $_REQUEST['_wpnonce'] : '' ) ) : true;
231
- }
232
- if ( $wpnonce && isset( $_GET['wcj_delete_product'] ) ) {
233
  $product_id = sanitize_text_field( wp_unslash( $_GET['wcj_delete_product'] ) );
234
  $post_author_id = get_post_field( 'post_author', $product_id );
235
  if ( (string) $user_ID !== $post_author_id ) {
@@ -238,7 +236,7 @@ if ( ! class_exists( 'WCJ_Product_By_User' ) ) :
238
  wp_delete_post( $product_id, true );
239
  }
240
  }
241
- if ( $wpnonce && isset( $_GET['wcj_edit_product'] ) ) {
242
  $product_id = sanitize_text_field( wp_unslash( $_GET['wcj_edit_product'] ) );
243
  $post_author_id = get_post_field( 'post_author', $product_id );
244
  if ( (string) $user_ID !== $post_author_id ) {
@@ -283,11 +281,27 @@ if ( ! class_exists( 'WCJ_Product_By_User' ) ) :
283
  /* $i . ' [' . $_product_id . ']' . */ get_the_post_thumbnail( $_product_id, array( 25, 25 ) ),
284
  '<code>' . $_product_data['status'] . '</code>',
285
  $_product_data['title'],
286
- '<a class="button" href="' . esc_url( add_query_arg( 'wcj_edit_product', $_product_id, remove_query_arg( array( 'wcj_edit_product_image_delete', 'wcj_delete_product' ) ) ) ) . '">' . __( 'Edit', 'woocommerce-jetpack' ) . '</a>
287
- <a class="button" href="' . esc_url( add_query_arg( 'wcj_delete_product', $_product_id, remove_query_arg( array( 'wcj_edit_product_image_delete', 'wcj_edit_product' ) ) ) ) . '" onclick="return confirm(\'' . __( 'Are you sure?', 'woocommerce-jetpack' ) . '\')">' . __( 'Delete', 'woocommerce-jetpack' ) . '</a>',
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
288
  );
289
  }
290
- echo wcj_get_table_html( $table_data, array( 'table_class' => 'shop_table shop_table_responsive my_account_orders' ) ); //phpcs:ignore
291
  }
292
  }
293
 
2
  /**
3
  * Booster for WooCommerce - Module - Product by User
4
  *
5
+ * @version 5.6.8
6
  * @since 2.5.2
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/includes
217
  /**
218
  * Add_my_products_content_my_account_page.
219
  *
220
+ * @version 5.6.8
221
  * @since 2.5.2
222
  */
223
  public function add_my_products_content_my_account_page() {
225
  if ( 0 === $user_ID ) {
226
  return;
227
  }
228
+ $edit_wpnonce = isset( $_REQUEST['wcj_edit_product-nonce'] ) ? wp_verify_nonce( sanitize_key( $_REQUEST['wcj_edit_product-nonce'] ), 'wcj_edit_product' ) : false;
229
+ $delete_wpnonce = isset( $_REQUEST['wcj_delete_product-nonce'] ) ? wp_verify_nonce( sanitize_key( $_REQUEST['wcj_delete_product-nonce'] ), 'wcj_delete_product' ) : false;
230
+ if ( $delete_wpnonce && isset( $_GET['wcj_delete_product'] ) ) {
 
 
231
  $product_id = sanitize_text_field( wp_unslash( $_GET['wcj_delete_product'] ) );
232
  $post_author_id = get_post_field( 'post_author', $product_id );
233
  if ( (string) $user_ID !== $post_author_id ) {
236
  wp_delete_post( $product_id, true );
237
  }
238
  }
239
+ if ( $edit_wpnonce && isset( $_GET['wcj_edit_product'] ) ) {
240
  $product_id = sanitize_text_field( wp_unslash( $_GET['wcj_edit_product'] ) );
241
  $post_author_id = get_post_field( 'post_author', $product_id );
242
  if ( (string) $user_ID !== $post_author_id ) {
281
  /* $i . ' [' . $_product_id . ']' . */ get_the_post_thumbnail( $_product_id, array( 25, 25 ) ),
282
  '<code>' . $_product_data['status'] . '</code>',
283
  $_product_data['title'],
284
+ '<a class="button" href="' . esc_url(
285
+ add_query_arg(
286
+ array(
287
+ 'wcj_edit_product' => $_product_id,
288
+ 'wcj_edit_product-nonce' => wp_create_nonce( 'wcj_edit_product' ),
289
+ ),
290
+ remove_query_arg( array( 'wcj_edit_product_image_delete', 'wcj_delete_product', 'wcj_delete_product-nonce' ) )
291
+ )
292
+ ) . '">' . __( 'Edit', 'woocommerce-jetpack' ) . '</a>
293
+ <a class="button" href="' . esc_url(
294
+ add_query_arg(
295
+ array(
296
+ 'wcj_delete_product' => $_product_id,
297
+ 'wcj_delete_product-nonce' => wp_create_nonce( 'wcj_delete_product' ),
298
+ ),
299
+ remove_query_arg( array( 'wcj_edit_product_image_delete', 'wcj_edit_product', 'wcj_edit_product-nonce' ) )
300
+ )
301
+ ) . '" onclick="return confirm(\'' . __( 'Are you sure?', 'woocommerce-jetpack' ) . '\')">' . __( 'Delete', 'woocommerce-jetpack' ) . '</a>',
302
  );
303
  }
304
+ echo wp_kses_post( wcj_get_table_html( $table_data, array( 'table_class' => 'shop_table shop_table_responsive my_account_orders' ) ) );
305
  }
306
  }
307
 
includes/class-wcj-product-custom-visibility.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Module - Product Custom Visibility
4
  *
5
- * @version 5.6.2
6
  * @since 3.2.4
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/includes
@@ -78,14 +78,11 @@ if ( ! class_exists( 'WCJ_Product_Custom_Visibility' ) ) :
78
  /**
79
  * Save_selection_in_session.
80
  *
81
- * @version 5.6.2
82
  * @since 3.2.4
83
  */
84
  public function save_selection_in_session() {
85
- $wpnonce = true;
86
- if ( function_exists( 'wp_verify_nonce' ) ) {
87
- $wpnonce = isset( $_REQUEST['_wpnonce'] ) ? wp_verify_nonce( sanitize_key( isset( $_REQUEST['_wpnonce'] ) ? $_REQUEST['_wpnonce'] : '' ) ) : true;
88
- }
89
 
90
  wcj_session_maybe_start();
91
  if ( isset( $_REQUEST['wcj_product_custom_visibility_selector'] ) && $wpnonce ) {
2
  /**
3
  * Booster for WooCommerce - Module - Product Custom Visibility
4
  *
5
+ * @version 5.6.8
6
  * @since 3.2.4
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/includes
78
  /**
79
  * Save_selection_in_session.
80
  *
81
+ * @version 5.6.8
82
  * @since 3.2.4
83
  */
84
  public function save_selection_in_session() {
85
+ $wpnonce = isset( $_REQUEST['wcj_product_custom_visibility_selector-nonce'] ) ? wp_verify_nonce( sanitize_key( $_REQUEST['wcj_product_custom_visibility_selector-nonce'] ), 'wcj_product_custom_visibility_selector' ) : false;
 
 
 
86
 
87
  wcj_session_maybe_start();
88
  if ( isset( $_REQUEST['wcj_product_custom_visibility_selector'] ) && $wpnonce ) {
includes/class-wcj-product-msrp.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Module - Product MSRP
4
  *
5
- * @version 5.6.2
6
  * @since 3.6.0
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/includes
@@ -141,14 +141,15 @@ if ( ! class_exists( 'WCJ_Product_MSRP' ) ) :
141
  /**
142
  * Save_msrp_input_variable.
143
  *
144
- * @version 5.6.2
145
  * @since 3.6.0
146
  * @param int $variation_id defines the variation_id.
147
  * @param int $i defines the i.
148
  */
149
  public function save_msrp_input_variable( $variation_id, $i ) {
150
- if ( isset( $_POST['variable_wcj_msrp'][ $i ] ) ) { // phpcs:ignore WordPress.Security.NonceVerification
151
- update_post_meta( $variation_id, '_wcj_msrp', wc_clean( sanitize_text_field( wp_unslash( $_POST['variable_wcj_msrp'][ $i ] ) ) ) ); // phpcs:ignore WordPress.Security.NonceVerification
 
152
  }
153
  }
154
 
@@ -174,14 +175,14 @@ if ( ! class_exists( 'WCJ_Product_MSRP' ) ) :
174
  /**
175
  * Save_msrp_input.
176
  *
177
- * @version 5.6.2
178
  * @since 3.6.0
179
  * @param int $post_id defines the post_id.
180
  * @param string | array $__post defines the __post.
181
  */
182
  public function save_msrp_input( $post_id, $__post ) {
183
- $nonce = wp_verify_nonce( wp_unslash( isset( $_POST['woocommerce_meta_nonce'] ) ? sanitize_text_field( wp_unslash( $_POST['woocommerce_meta_nonce'] ) ) : '' ), 'woocommerce_save_data' );
184
- if ( isset( $_POST['_wcj_msrp'] ) && $nonce ) {
185
  update_post_meta( $post_id, '_wcj_msrp', sanitize_text_field( wp_unslash( $_POST['_wcj_msrp'] ) ) );
186
  }
187
  }
2
  /**
3
  * Booster for WooCommerce - Module - Product MSRP
4
  *
5
+ * @version 5.6.8
6
  * @since 3.6.0
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/includes
141
  /**
142
  * Save_msrp_input_variable.
143
  *
144
+ * @version 5.6.8
145
  * @since 3.6.0
146
  * @param int $variation_id defines the variation_id.
147
  * @param int $i defines the i.
148
  */
149
  public function save_msrp_input_variable( $variation_id, $i ) {
150
+ $wpnonce = isset( $_REQUEST['security'] ) ? wp_verify_nonce( sanitize_key( $_REQUEST['security'] ), 'save-variations' ) : false;
151
+ if ( $wpnonce && isset( $_POST['variable_wcj_msrp'][ $i ] ) ) {
152
+ update_post_meta( $variation_id, '_wcj_msrp', wc_clean( sanitize_text_field( wp_unslash( $_POST['variable_wcj_msrp'][ $i ] ) ) ) );
153
  }
154
  }
155
 
175
  /**
176
  * Save_msrp_input.
177
  *
178
+ * @version 5.6.8
179
  * @since 3.6.0
180
  * @param int $post_id defines the post_id.
181
  * @param string | array $__post defines the __post.
182
  */
183
  public function save_msrp_input( $post_id, $__post ) {
184
+ $wpnonce = isset( $_POST['woocommerce_meta_nonce'] ) ? wp_verify_nonce( wp_unslash( sanitize_text_field( wp_unslash( $_POST['woocommerce_meta_nonce'] ) ) ), 'woocommerce_save_data' ) : false;
185
+ if ( isset( $_POST['_wcj_msrp'] ) && $wpnonce ) {
186
  update_post_meta( $post_id, '_wcj_msrp', sanitize_text_field( wp_unslash( $_POST['_wcj_msrp'] ) ) );
187
  }
188
  }
includes/class-wcj-product-open-pricing.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Module - Product Open Pricing
4
  *
5
- * @version 5.6.3
6
  * @since 2.4.8
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/includes
@@ -186,7 +186,7 @@ if ( ! class_exists( 'WCJ_Product_Open_Pricing' ) ) :
186
  /**
187
  * Save_meta_box_value.
188
  *
189
- * @version 5.6.2
190
  * @since 2.4.8
191
  * @param string $option_value defines the option_value.
192
  * @param string $option_name defines the option_name.
@@ -204,8 +204,8 @@ if ( ! class_exists( 'WCJ_Product_Open_Pricing' ) ) :
204
  'post_type' => 'product',
205
  'post_status' => 'any',
206
  'posts_per_page' => 1,
207
- 'meta_key' => '_wcj_product_open_price_enabled', //phpcs:ignore
208
- 'meta_value' => 'yes', //phpcs:ignore
209
  'post__not_in' => array( get_the_ID() ),
210
  );
211
  $loop = new WP_Query( $args );
@@ -221,13 +221,21 @@ if ( ! class_exists( 'WCJ_Product_Open_Pricing' ) ) :
221
  /**
222
  * Add_notice_query_var.
223
  *
224
- * @version 5.6.3
225
  * @since 2.4.8
226
  * @param string $location defines the location.
227
  */
228
  public function add_notice_query_var( $location ) {
229
  remove_filter( 'redirect_post_location', array( $this, 'add_notice_query_var' ), 99 );
230
- return esc_url_raw( add_query_arg( array( 'wcj_product_open_price_admin_notice' => true ), $location ) );
 
 
 
 
 
 
 
 
231
  }
232
 
233
  /**
@@ -237,10 +245,7 @@ if ( ! class_exists( 'WCJ_Product_Open_Pricing' ) ) :
237
  * @since 2.4.8
238
  */
239
  public function admin_notices() {
240
- $wpnonce = true;
241
- if ( function_exists( 'wp_verify_nonce' ) ) {
242
- $wpnonce = isset( $_REQUEST['_wpnonce'] ) ? wp_verify_nonce( sanitize_key( isset( $_REQUEST['_wpnonce'] ) ? $_REQUEST['_wpnonce'] : '' ) ) : true;
243
- }
244
  if ( ! $wpnonce || ! isset( $_GET['wcj_product_open_price_admin_notice'] ) ) {
245
  return;
246
  }
@@ -363,16 +368,13 @@ if ( ! class_exists( 'WCJ_Product_Open_Pricing' ) ) :
363
  /**
364
  * Validate_open_price_on_add_to_cart.
365
  *
366
- * @version 5.6.2
367
  * @since 2.4.8
368
  * @param string $passed defines the passed.
369
  * @param int $product_id defines the product_id.
370
  */
371
  public function validate_open_price_on_add_to_cart( $passed, $product_id ) {
372
- $wpnonce = true;
373
- if ( function_exists( 'wp_verify_nonce' ) ) {
374
- $wpnonce = isset( $_REQUEST['_wpnonce'] ) ? wp_verify_nonce( sanitize_key( isset( $_REQUEST['_wpnonce'] ) ? $_REQUEST['_wpnonce'] : '' ) ) : true;
375
- }
376
  $the_product = wc_get_product( $product_id );
377
  if ( $this->is_open_price_product( $the_product ) ) {
378
  // Empty price.
@@ -433,7 +435,7 @@ if ( ! class_exists( 'WCJ_Product_Open_Pricing' ) ) :
433
  /**
434
  * Add_open_price_to_cart_item_data.
435
  *
436
- * @version 5.6.2
437
  * @since 2.4.8
438
  * @todo [dev] (maybe) better conversion for Currency Switcher module (i.e. include rounding)
439
  * @param array $cart_item_data defines the cart_item_data.
@@ -441,10 +443,7 @@ if ( ! class_exists( 'WCJ_Product_Open_Pricing' ) ) :
441
  * @param int $variation_id defines the variation_id.
442
  */
443
  public function add_open_price_to_cart_item_data( $cart_item_data, $product_id, $variation_id ) {
444
- $wpnonce = true;
445
- if ( function_exists( 'wp_verify_nonce' ) ) {
446
- $wpnonce = isset( $_REQUEST['_wpnonce'] ) ? wp_verify_nonce( sanitize_key( isset( $_REQUEST['_wpnonce'] ) ? $_REQUEST['_wpnonce'] : '' ) ) : true;
447
- }
448
  if ( $wpnonce && isset( $_POST['wcj_open_price'] ) ) {
449
  $cart_item_data['wcj_open_price'] = sanitize_text_field( wp_unslash( $_POST['wcj_open_price'] ) );
450
  $product_bundles_divide = wcj_get_option( 'wcj_product_open_price_woosb_product_bundles_divide', 'no' );
@@ -506,7 +505,7 @@ if ( ! class_exists( 'WCJ_Product_Open_Pricing' ) ) :
506
  /**
507
  * Add_open_price_input_field_to_frontend.
508
  *
509
- * @version 5.6.2
510
  * @since 2.4.8
511
  */
512
  public function add_open_price_input_field_to_frontend() {
@@ -515,10 +514,7 @@ if ( ! class_exists( 'WCJ_Product_Open_Pricing' ) ) :
515
  }
516
  $the_product = wc_get_product();
517
  if ( $this->is_open_price_product( $the_product ) ) {
518
- $wpnonce = true;
519
- if ( function_exists( 'wp_verify_nonce' ) ) {
520
- $wpnonce = isset( $_REQUEST['_wpnonce'] ) ? wp_verify_nonce( sanitize_key( isset( $_REQUEST['_wpnonce'] ) ? $_REQUEST['_wpnonce'] : '' ) ) : true;
521
- }
522
  // Title.
523
  $title = wcj_get_option( 'wcj_product_open_price_label_frontend', __( 'Name Your Price', 'woocommerce-jetpack' ) );
524
  // Prices.
@@ -565,6 +561,7 @@ if ( ! class_exists( 'WCJ_Product_Open_Pricing' ) ) :
565
  get_option( 'wcj_product_open_price_frontend_template', '<label for="wcj_open_price">%frontend_label%</label> %open_price_input% %currency_symbol%' )
566
  )
567
  );
 
568
  $this->is_open_price_input_field_displayed = true;
569
  }
570
  }
2
  /**
3
  * Booster for WooCommerce - Module - Product Open Pricing
4
  *
5
+ * @version 5.6.8
6
  * @since 2.4.8
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/includes
186
  /**
187
  * Save_meta_box_value.
188
  *
189
+ * @version 5.6.8
190
  * @since 2.4.8
191
  * @param string $option_value defines the option_value.
192
  * @param string $option_name defines the option_name.
204
  'post_type' => 'product',
205
  'post_status' => 'any',
206
  'posts_per_page' => 1,
207
+ 'meta_key' => '_wcj_product_open_price_enabled', // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_key
208
+ 'meta_value' => 'yes', // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_value
209
  'post__not_in' => array( get_the_ID() ),
210
  );
211
  $loop = new WP_Query( $args );
221
  /**
222
  * Add_notice_query_var.
223
  *
224
+ * @version 5.6.8
225
  * @since 2.4.8
226
  * @param string $location defines the location.
227
  */
228
  public function add_notice_query_var( $location ) {
229
  remove_filter( 'redirect_post_location', array( $this, 'add_notice_query_var' ), 99 );
230
+ return esc_url_raw(
231
+ add_query_arg(
232
+ array(
233
+ 'wcj_product_open_price_admin_notice' => true,
234
+ 'wcj_product_open_price_admin_notice-nonce' => wp_create_nonce( 'wcj_product_open_price_admin_notice' ),
235
+ ),
236
+ $location
237
+ )
238
+ );
239
  }
240
 
241
  /**
245
  * @since 2.4.8
246
  */
247
  public function admin_notices() {
248
+ $wpnonce = isset( $_REQUEST['wcj_product_open_price_admin_notice-nonce'] ) ? wp_verify_nonce( sanitize_key( $_REQUEST['wcj_product_open_price_admin_notice-nonce'] ), 'wcj_product_open_price_admin_notice' ) : false;
 
 
 
249
  if ( ! $wpnonce || ! isset( $_GET['wcj_product_open_price_admin_notice'] ) ) {
250
  return;
251
  }
368
  /**
369
  * Validate_open_price_on_add_to_cart.
370
  *
371
+ * @version 5.6.8
372
  * @since 2.4.8
373
  * @param string $passed defines the passed.
374
  * @param int $product_id defines the product_id.
375
  */
376
  public function validate_open_price_on_add_to_cart( $passed, $product_id ) {
377
+ $wpnonce = isset( $_REQUEST['wcj_open_price-nonce'] ) ? wp_verify_nonce( sanitize_key( $_REQUEST['wcj_open_price-nonce'] ), 'wcj_open_price' ) : false;
 
 
 
378
  $the_product = wc_get_product( $product_id );
379
  if ( $this->is_open_price_product( $the_product ) ) {
380
  // Empty price.
435
  /**
436
  * Add_open_price_to_cart_item_data.
437
  *
438
+ * @version 5.6.8
439
  * @since 2.4.8
440
  * @todo [dev] (maybe) better conversion for Currency Switcher module (i.e. include rounding)
441
  * @param array $cart_item_data defines the cart_item_data.
443
  * @param int $variation_id defines the variation_id.
444
  */
445
  public function add_open_price_to_cart_item_data( $cart_item_data, $product_id, $variation_id ) {
446
+ $wpnonce = isset( $_REQUEST['wcj_open_price-nonce'] ) ? wp_verify_nonce( sanitize_key( $_REQUEST['wcj_open_price-nonce'] ), 'wcj_open_price' ) : false;
 
 
 
447
  if ( $wpnonce && isset( $_POST['wcj_open_price'] ) ) {
448
  $cart_item_data['wcj_open_price'] = sanitize_text_field( wp_unslash( $_POST['wcj_open_price'] ) );
449
  $product_bundles_divide = wcj_get_option( 'wcj_product_open_price_woosb_product_bundles_divide', 'no' );
505
  /**
506
  * Add_open_price_input_field_to_frontend.
507
  *
508
+ * @version 5.6.8
509
  * @since 2.4.8
510
  */
511
  public function add_open_price_input_field_to_frontend() {
514
  }
515
  $the_product = wc_get_product();
516
  if ( $this->is_open_price_product( $the_product ) ) {
517
+ $wpnonce = isset( $_REQUEST['wcj_open_price-nonce'] ) ? wp_verify_nonce( sanitize_key( $_REQUEST['wcj_open_price-nonce'] ), 'wcj_open_price' ) : false;
 
 
 
518
  // Title.
519
  $title = wcj_get_option( 'wcj_product_open_price_label_frontend', __( 'Name Your Price', 'woocommerce-jetpack' ) );
520
  // Prices.
561
  get_option( 'wcj_product_open_price_frontend_template', '<label for="wcj_open_price">%frontend_label%</label> %open_price_input% %currency_symbol%' )
562
  )
563
  );
564
+ wp_nonce_field( 'wcj_open_price', 'wcj_open_price-nonce' );
565
  $this->is_open_price_input_field_displayed = true;
566
  }
567
  }
includes/class-wcj-product-price-by-formula.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Module - Product Price by Formula
4
  *
5
- * @version 5.6.2
6
  * @since 2.5.1
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/includes
@@ -21,7 +21,7 @@ if ( ! class_exists( 'WCJ_Product_Price_By_Formula' ) ) :
21
  /**
22
  * Constructor.
23
  *
24
- * @version 5.6.2
25
  * @since 2.5.1
26
  * @todo use WC math library instead of `PHPMathParser`
27
  */
@@ -39,10 +39,12 @@ if ( ! class_exists( 'WCJ_Product_Price_By_Formula' ) ) :
39
 
40
  add_action( 'add_meta_boxes', array( $this, 'add_meta_box' ) );
41
  add_action( 'save_post_product', array( $this, 'save_meta_box' ), PHP_INT_MAX, 2 );
 
42
  if (
 
43
  ( wcj_is_frontend() && 'yes' === wcj_get_option( 'wcj_product_price_by_formula_admin_scope', 'yes' ) ) ||
44
  ( 'no' === wcj_get_option( 'wcj_product_price_by_formula_admin_scope', 'yes' ) && ( wcj_is_frontend() || is_admin() ) ) ||
45
- isset( $_GET['wcj_create_products_xml'] ) // phpcs:ignore WordPress.Security.NonceVerification
46
  ) {
47
  wcj_add_change_price_hooks( $this, wcj_get_module_price_hooks_priority( 'product_price_by_formula' ), false );
48
  }
@@ -184,15 +186,17 @@ if ( ! class_exists( 'WCJ_Product_Price_By_Formula' ) ) :
184
  /**
185
  * Reset_settings.
186
  *
187
- * @version 5.6.2
188
  * @since 5.3.0
189
  */
190
  public function reset_settings() {
 
191
  if (
192
- isset( $_GET['wcj_reset_settings'] ) // phpcs:ignore WordPress.Security.NonceVerification
193
- && $this->id === $_GET['wcj_reset_settings'] // phpcs:ignore WordPress.Security.NonceVerification
 
194
  && wcj_is_user_role( 'administrator' )
195
- && ! isset( $_POST['save'] ) // phpcs:ignore WordPress.Security.NonceVerification
196
  && 'yes' === wcj_get_option( 'wcj_product_price_by_formula_reset_products', 'no' )
197
  ) {
198
  global $wpdb;
@@ -392,7 +396,7 @@ if ( ! class_exists( 'WCJ_Product_Price_By_Formula' ) ) :
392
  /**
393
  * Save_meta_box_value.
394
  *
395
- * @version 5.6.2
396
  * @since 2.5.0
397
  * @param string $option_value defines the option_value.
398
  * @param string $option_name defines the option_name.
@@ -410,8 +414,8 @@ if ( ! class_exists( 'WCJ_Product_Price_By_Formula' ) ) :
410
  'post_type' => 'product',
411
  'post_status' => 'any',
412
  'posts_per_page' => 1,
413
- 'meta_key' => '_wcj_product_price_by_formula_enabled', //phpcs:ignore
414
- 'meta_value' => 'yes', //phpcs:ignore
415
  'post__not_in' => array( get_the_ID() ),
416
  );
417
  $loop = new WP_Query( $args );
@@ -427,23 +431,28 @@ if ( ! class_exists( 'WCJ_Product_Price_By_Formula' ) ) :
427
  /**
428
  * Add_notice_query_var.
429
  *
430
- * @version 5.5.9
431
  * @since 2.5.0
432
  * @param string $location defines the location.
433
  */
434
  public function add_notice_query_var( $location ) {
435
  remove_filter( 'redirect_post_location', array( $this, 'add_notice_query_var' ), 99 );
436
- return esc_url_raw( add_query_arg( array( 'wcj_product_price_by_formula_admin_notice' => true ), $location ) );
 
 
 
 
437
  }
438
 
439
  /**
440
  * Admin_notices.
441
  *
442
- * @version 5.6.2
443
  * @since 2.5.0
444
  */
445
  public function admin_notices() {
446
- if ( ! isset( $_GET['wcj_product_price_by_formula_admin_notice'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification
 
447
  return;
448
  }
449
  ?><div class="error"><p>
2
  /**
3
  * Booster for WooCommerce - Module - Product Price by Formula
4
  *
5
+ * @version 5.6.8
6
  * @since 2.5.1
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/includes
21
  /**
22
  * Constructor.
23
  *
24
+ * @version 5.6.8
25
  * @since 2.5.1
26
  * @todo use WC math library instead of `PHPMathParser`
27
  */
39
 
40
  add_action( 'add_meta_boxes', array( $this, 'add_meta_box' ) );
41
  add_action( 'save_post_product', array( $this, 'save_meta_box' ), PHP_INT_MAX, 2 );
42
+ $wpnonce = isset( $_REQUEST['wcj-cat-nonce'] ) ? wp_verify_nonce( sanitize_key( $_REQUEST['wcj-cat-nonce'] ), 'wcj-cat-nonce' ) : false;
43
  if (
44
+ $wpnonce &&
45
  ( wcj_is_frontend() && 'yes' === wcj_get_option( 'wcj_product_price_by_formula_admin_scope', 'yes' ) ) ||
46
  ( 'no' === wcj_get_option( 'wcj_product_price_by_formula_admin_scope', 'yes' ) && ( wcj_is_frontend() || is_admin() ) ) ||
47
+ isset( $_GET['wcj_create_products_xml'] )
48
  ) {
49
  wcj_add_change_price_hooks( $this, wcj_get_module_price_hooks_priority( 'product_price_by_formula' ), false );
50
  }
186
  /**
187
  * Reset_settings.
188
  *
189
+ * @version 5.6.8
190
  * @since 5.3.0
191
  */
192
  public function reset_settings() {
193
+ $wpnonce = isset( $_GET['wcj_reset_settings-product_price_by_formula-nonce'] ) ? wp_verify_nonce( sanitize_key( $_GET['wcj_reset_settings-product_price_by_formula-nonce'] ), 'wcj_reset_settings' ) : false;
194
  if (
195
+ $wpnonce
196
+ && isset( $_GET['wcj_reset_settings'] )
197
+ && $this->id === $_GET['wcj_reset_settings']
198
  && wcj_is_user_role( 'administrator' )
199
+ && ! isset( $_POST['save'] )
200
  && 'yes' === wcj_get_option( 'wcj_product_price_by_formula_reset_products', 'no' )
201
  ) {
202
  global $wpdb;
396
  /**
397
  * Save_meta_box_value.
398
  *
399
+ * @version 5.6.8
400
  * @since 2.5.0
401
  * @param string $option_value defines the option_value.
402
  * @param string $option_name defines the option_name.
414
  'post_type' => 'product',
415
  'post_status' => 'any',
416
  'posts_per_page' => 1,
417
+ 'meta_key' => '_wcj_product_price_by_formula_enabled', // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_key
418
+ 'meta_value' => 'yes', // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_value
419
  'post__not_in' => array( get_the_ID() ),
420
  );
421
  $loop = new WP_Query( $args );
431
  /**
432
  * Add_notice_query_var.
433
  *
434
+ * @version 5.6.8
435
  * @since 2.5.0
436
  * @param string $location defines the location.
437
  */
438
  public function add_notice_query_var( $location ) {
439
  remove_filter( 'redirect_post_location', array( $this, 'add_notice_query_var' ), 99 );
440
+ $query_arg = array(
441
+ 'wcj_product_price_by_formula_admin_notice' => true,
442
+ 'wcj_product_price_by_formula_admin_notice-nonce' => wp_create_nonce( 'wcj_product_price_by_formula_admin_notice' ),
443
+ );
444
+ return esc_url_raw( add_query_arg( $query_arg, $location ) );
445
  }
446
 
447
  /**
448
  * Admin_notices.
449
  *
450
+ * @version 5.6.8
451
  * @since 2.5.0
452
  */
453
  public function admin_notices() {
454
+ $wpnonce = isset( $_REQUEST['wcj_product_price_by_formula_admin_notice-nonce'] ) ? wp_verify_nonce( sanitize_key( $_REQUEST['wcj_product_price_by_formula_admin_notice-nonce'] ), 'wcj_product_price_by_formula_admin_notice' ) : false;
455
+ if ( ! $wpnonce || ! isset( $_GET['wcj_product_price_by_formula_admin_notice'] ) ) {
456
  return;
457
  }
458
  ?><div class="error"><p>
includes/class-wcj-product-tabs.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Module - Product Tabs
4
  *
5
- * @version 5.6.3
6
  * @author Pluggabl LLC.
7
  * @package Booster_For_WooCommerce/includes
8
  */
@@ -544,30 +544,30 @@ if ( ! class_exists( 'WCJ_Product_Tabs' ) ) :
544
  /**
545
  * Create_new_custom_product_tab_local.
546
  *
547
- * @version 5.6.2
548
  * @param string $key defines the key.
549
  * @param string $tab defines the tab.
550
  */
551
  public function create_new_custom_product_tab_local( $key, $tab ) {
552
- echo $this->get_tab_output( get_post_meta( wcj_maybe_get_product_id_wpml( get_the_ID() ), '_wcj_custom_product_tabs_content_' . $this->tab_option_keys['local'][ $key ], true ) ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
553
  }
554
 
555
  /**
556
  * Create_new_custom_product_tab_global.
557
  *
558
- * @version 5.6.2
559
  * @param string $key defines the key.
560
  * @param string $tab defines the tab.
561
  */
562
  public function create_new_custom_product_tab_global( $key, $tab ) {
563
- echo $this->get_tab_output( wcj_get_option( 'wcj_custom_product_tabs_content_' . $this->tab_option_keys['global'][ $key ] ) ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
564
  }
565
 
566
 
567
  /**
568
  * Save_custom_tabs_meta_box.
569
  *
570
- * @version 5.6.3
571
  * @todo rewrite as standard `WCJ_Module` function
572
  * @param int $post_id defines the post_id.
573
  * @param string | array $post defines the post.
@@ -591,7 +591,7 @@ if ( ! class_exists( 'WCJ_Product_Tabs' ) ) :
591
  $default_total_custom_tabs = apply_filters( 'booster_option', 1, wcj_get_option( 'wcj_custom_product_tabs_local_total_number_default', 1 ) );
592
  $total_custom_tabs_before_saving = get_post_meta( $post_id, '_wcj_custom_product_tabs_local_total_number', true );
593
  $total_custom_tabs_before_saving = ( '' !== $total_custom_tabs_before_saving && null !== $total_custom_tabs_before_saving && '' !== $total_custom_tabs_before_saving ) ? $total_custom_tabs_before_saving : $default_total_custom_tabs;
594
- $wpnonce = wp_verify_nonce( wp_unslash( isset( $_POST['woocommerce_meta_nonce'] ) ? sanitize_text_field( wp_unslash( $_POST['woocommerce_meta_nonce'] ) ) : '' ), 'woocommerce_save_data' );
595
 
596
  for ( $i = 1; $i <= $total_custom_tabs_before_saving; $i++ ) {
597
  if ( $this->is_local_tab_visible( $i, $post_id ) ) {
@@ -627,7 +627,7 @@ if ( ! class_exists( 'WCJ_Product_Tabs' ) ) :
627
  /**
628
  * Create_custom_tabs_meta_box.
629
  *
630
- * @version 5.6.2
631
  */
632
  public function create_custom_tabs_meta_box() {
633
  $current_post_id = wcj_maybe_get_product_id_wpml( get_the_ID() );
@@ -740,7 +740,7 @@ if ( ! class_exists( 'WCJ_Product_Tabs' ) ) :
740
  break;
741
  }
742
  if ( '' !== $the_field ) {
743
- if ( isset( $option['desc_tip'] ) && '' !== $option['desc_tip'] && null !== $option['desc_tip'] ) {
744
  $option['title'] .= '<span class="woocommerce-help-tip" data-tip="' . $option['desc_tip'] . '"></span>';
745
  }
746
  $data[] = array( $option['title'], $the_field );
@@ -756,7 +756,7 @@ if ( ! class_exists( 'WCJ_Product_Tabs' ) ) :
756
  )
757
  );
758
  }
759
- echo $html; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
760
  }
761
  $html = '<input type="hidden" name="woojetpack_custom_tabs_save_post" value="woojetpack_custom_tabs_save_post">';
762
  echo wp_kses_post( $html );
2
  /**
3
  * Booster for WooCommerce - Module - Product Tabs
4
  *
5
+ * @version 5.6.8
6
  * @author Pluggabl LLC.
7
  * @package Booster_For_WooCommerce/includes
8
  */
544
  /**
545
  * Create_new_custom_product_tab_local.
546
  *
547
+ * @version 5.6.8
548
  * @param string $key defines the key.
549
  * @param string $tab defines the tab.
550
  */
551
  public function create_new_custom_product_tab_local( $key, $tab ) {
552
+ echo wp_kses_post( $this->get_tab_output( get_post_meta( wcj_maybe_get_product_id_wpml( get_the_ID() ), '_wcj_custom_product_tabs_content_' . $this->tab_option_keys['local'][ $key ], true ) ) );
553
  }
554
 
555
  /**
556
  * Create_new_custom_product_tab_global.
557
  *
558
+ * @version 5.6.8
559
  * @param string $key defines the key.
560
  * @param string $tab defines the tab.
561
  */
562
  public function create_new_custom_product_tab_global( $key, $tab ) {
563
+ echo wp_kses_post( $this->get_tab_output( wcj_get_option( 'wcj_custom_product_tabs_content_' . $this->tab_option_keys['global'][ $key ] ) ) );
564
  }
565
 
566
 
567
  /**
568
  * Save_custom_tabs_meta_box.
569
  *
570
+ * @version 5.6.8
571
  * @todo rewrite as standard `WCJ_Module` function
572
  * @param int $post_id defines the post_id.
573
  * @param string | array $post defines the post.
591
  $default_total_custom_tabs = apply_filters( 'booster_option', 1, wcj_get_option( 'wcj_custom_product_tabs_local_total_number_default', 1 ) );
592
  $total_custom_tabs_before_saving = get_post_meta( $post_id, '_wcj_custom_product_tabs_local_total_number', true );
593
  $total_custom_tabs_before_saving = ( '' !== $total_custom_tabs_before_saving && null !== $total_custom_tabs_before_saving && '' !== $total_custom_tabs_before_saving ) ? $total_custom_tabs_before_saving : $default_total_custom_tabs;
594
+ $wpnonce = isset( $_POST['woocommerce_meta_nonce'] ) ? wp_verify_nonce( wp_unslash( sanitize_text_field( wp_unslash( $_POST['woocommerce_meta_nonce'] ) ) ), 'woocommerce_save_data' ) : false;
595
 
596
  for ( $i = 1; $i <= $total_custom_tabs_before_saving; $i++ ) {
597
  if ( $this->is_local_tab_visible( $i, $post_id ) ) {
627
  /**
628
  * Create_custom_tabs_meta_box.
629
  *
630
+ * @version 5.6.8
631
  */
632
  public function create_custom_tabs_meta_box() {
633
  $current_post_id = wcj_maybe_get_product_id_wpml( get_the_ID() );
740
  break;
741
  }
742
  if ( '' !== $the_field ) {
743
+ if ( isset( $option['desc_tip'] ) && $option['desc_tip'] && '' !== $option['desc_tip'] && null !== $option['desc_tip'] ) {
744
  $option['title'] .= '<span class="woocommerce-help-tip" data-tip="' . $option['desc_tip'] . '"></span>';
745
  }
746
  $data[] = array( $option['title'], $the_field );
756
  )
757
  );
758
  }
759
+ echo wp_kses_post( $html );
760
  }
761
  $html = '<input type="hidden" name="woojetpack_custom_tabs_save_post" value="woojetpack_custom_tabs_save_post">';
762
  echo wp_kses_post( $html );
includes/class-wcj-products-xml.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Module - Products XML
4
  *
5
- * @version 5.6.2
6
  * @since 2.5.7
7
  * @author Pluggabl LLC.
8
  * @todo create all files at once (manually and synchronize update)
@@ -111,18 +111,19 @@ if ( ! class_exists( 'WCJ_Products_XML' ) ) :
111
  /**
112
  * Admin_notices.
113
  *
114
- * @version 5.6.2
115
  * @since 2.5.7
116
  */
117
  public function admin_notices() {
118
- if ( isset( $_GET['wcj_create_products_xml_result'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification
119
- if ( 0 === (int) $_GET['wcj_create_products_xml_result'] ) { // phpcs:ignore WordPress.Security.NonceVerification
 
120
  $class = 'notice notice-error';
121
  $message = __( 'An error has occurred while creating products XML file.', 'woocommerce-jetpack' );
122
  } else {
123
  $class = 'notice notice-success is-dismissible';
124
  /* translators: %s: translation added */
125
- $message = sprintf( __( 'Products XML file #%s created successfully.', 'woocommerce-jetpack' ), sanitize_text_field( wp_unslash( $_GET['wcj_create_products_xml_result'] ) ) ); // phpcs:ignore WordPress.Security.NonceVerification
126
  }
127
  echo '<div class="' . wp_kses_post( $class ) . '"><p>' . wp_kses_post( $message ) . '</p></div>';
128
  }
@@ -131,15 +132,16 @@ if ( ! class_exists( 'WCJ_Products_XML' ) ) :
131
  /**
132
  * Wcj_create_products_xml.
133
  *
134
- * @version 5.6.2
135
  * @since 2.5.7
136
  */
137
  public function wcj_create_products_xml() {
138
- if ( isset( $_GET['wcj_create_products_xml'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification
139
- $file_num = sanitize_text_field( wp_unslash( $_GET['wcj_create_products_xml'] ) ); // phpcs:ignore WordPress.Security.NonceVerification
 
140
  $result = $this->create_products_xml( $file_num );
141
  if ( false !== $result ) {
142
- update_option( 'wcj_products_time_file_created_' . $file_num, gmdate( 'U' ) );
143
  }
144
  wp_safe_redirect( add_query_arg( 'wcj_create_products_xml_result', ( false === $result ? 0 : $file_num ), remove_query_arg( 'wcj_create_products_xml' ) ) );
145
  exit;
@@ -149,7 +151,7 @@ if ( ! class_exists( 'WCJ_Products_XML' ) ) :
149
  /**
150
  * Create_products_xml_cron.
151
  *
152
- * @version 5.6.2
153
  * @since 2.5.7
154
  * @param string $interval defines the interval.
155
  * @param int $file_num defines the file_num.
@@ -157,7 +159,7 @@ if ( ! class_exists( 'WCJ_Products_XML' ) ) :
157
  public function create_products_xml_cron( $interval, $file_num ) {
158
  $result = $this->create_products_xml( $file_num );
159
  if ( false !== $result ) {
160
- update_option( 'wcj_products_time_file_created_' . $file_num, gmdate( 'U' ) );
161
  }
162
  die();
163
  }
@@ -165,7 +167,7 @@ if ( ! class_exists( 'WCJ_Products_XML' ) ) :
165
  /**
166
  * Process_shortcode.
167
  *
168
- * @version 3.9.0
169
  * @since 3.9.0
170
  * @todo [dev] (maybe) re-think `str_replace( '&', '&amp;', $content )`
171
  * @param string $content defines the content.
@@ -209,7 +211,7 @@ if ( ! class_exists( 'WCJ_Products_XML' ) ) :
209
  'offset' => $offset,
210
  );
211
  if ( 'all' !== $products_scope ) {
212
- $args['meta_query'] = WC()->query->get_meta_query(); //phpcs:ignore
213
  switch ( $products_scope ) {
214
  case 'sale_only':
215
  $args['post__in'] = array_merge( array( 0 ), wc_get_product_ids_on_sale() );
@@ -233,7 +235,7 @@ if ( ! class_exists( 'WCJ_Products_XML' ) ) :
233
  }
234
  if ( ! empty( $products_cats_in_ids ) ) {
235
  if ( ! isset( $args['tax_query'] ) ) {
236
- $args['tax_query'] = array(); //phpcs:ignore
237
  }
238
  $args['tax_query'][] = array(
239
  'taxonomy' => 'product_cat',
@@ -244,7 +246,7 @@ if ( ! class_exists( 'WCJ_Products_XML' ) ) :
244
  }
245
  if ( ! empty( $products_cats_ex_ids ) ) {
246
  if ( ! isset( $args['tax_query'] ) ) {
247
- $args['tax_query'] = array(); //phpcs:ignore
248
  }
249
  $args['tax_query'][] = array(
250
  'taxonomy' => 'product_cat',
@@ -255,7 +257,7 @@ if ( ! class_exists( 'WCJ_Products_XML' ) ) :
255
  }
256
  if ( ! empty( $products_tags_in_ids ) ) {
257
  if ( ! isset( $args['tax_query'] ) ) {
258
- $args['tax_query'] = array(); //phpcs:ignore
259
  }
260
  $args['tax_query'][] = array(
261
  'taxonomy' => 'product_tag',
@@ -266,7 +268,7 @@ if ( ! class_exists( 'WCJ_Products_XML' ) ) :
266
  }
267
  if ( ! empty( $products_tags_ex_ids ) ) {
268
  if ( ! isset( $args['tax_query'] ) ) {
269
- $args['tax_query'] = array(); //phpcs:ignore
270
  }
271
  $args['tax_query'][] = array(
272
  'taxonomy' => 'product_tag',
@@ -293,7 +295,7 @@ if ( ! class_exists( 'WCJ_Products_XML' ) ) :
293
  }
294
  }
295
  wp_reset_postdata();
296
- return file_put_contents( //phpcs:ignore
297
  ABSPATH . wcj_get_option( 'wcj_products_xml_file_path_' . $file_num, ( ( '1' === $file_num ) ? 'products.xml' : 'products_' . $file_num . '.xml' ) ),
298
  $this->process_shortcode( $xml_header_template ) . $xml_items . $this->process_shortcode( $xml_footer_template )
299
  );
2
  /**
3
  * Booster for WooCommerce - Module - Products XML
4
  *
5
+ * @version 5.6.8
6
  * @since 2.5.7
7
  * @author Pluggabl LLC.
8
  * @todo create all files at once (manually and synchronize update)
111
  /**
112
  * Admin_notices.
113
  *
114
+ * @version 5.6.8
115
  * @since 2.5.7
116
  */
117
  public function admin_notices() {
118
+ $wpnonce = isset( $_REQUEST['wcj-cat-nonce'] ) ? wp_verify_nonce( sanitize_key( $_REQUEST['wcj-cat-nonce'] ), 'wcj-cat-nonce' ) : false;
119
+ if ( $wpnonce && isset( $_GET['wcj_create_products_xml_result'] ) ) {
120
+ if ( 0 === (int) $_GET['wcj_create_products_xml_result'] ) {
121
  $class = 'notice notice-error';
122
  $message = __( 'An error has occurred while creating products XML file.', 'woocommerce-jetpack' );
123
  } else {
124
  $class = 'notice notice-success is-dismissible';
125
  /* translators: %s: translation added */
126
+ $message = sprintf( __( 'Products XML file #%s created successfully.', 'woocommerce-jetpack' ), sanitize_text_field( wp_unslash( $_GET['wcj_create_products_xml_result'] ) ) );
127
  }
128
  echo '<div class="' . wp_kses_post( $class ) . '"><p>' . wp_kses_post( $message ) . '</p></div>';
129
  }
132
  /**
133
  * Wcj_create_products_xml.
134
  *
135
+ * @version 5.6.8
136
  * @since 2.5.7
137
  */
138
  public function wcj_create_products_xml() {
139
+ $wpnonce = isset( $_REQUEST['wcj-cat-nonce'] ) ? wp_verify_nonce( sanitize_key( $_REQUEST['wcj-cat-nonce'] ), 'wcj-cat-nonce' ) : false;
140
+ if ( $wpnonce && isset( $_GET['wcj_create_products_xml'] ) ) {
141
+ $file_num = sanitize_text_field( wp_unslash( $_GET['wcj_create_products_xml'] ) );
142
  $result = $this->create_products_xml( $file_num );
143
  if ( false !== $result ) {
144
+ update_option( 'wcj_products_time_file_created_' . $file_num, wcj_get_timestamp_date_from_gmt() );
145
  }
146
  wp_safe_redirect( add_query_arg( 'wcj_create_products_xml_result', ( false === $result ? 0 : $file_num ), remove_query_arg( 'wcj_create_products_xml' ) ) );
147
  exit;
151
  /**
152
  * Create_products_xml_cron.
153
  *
154
+ * @version 5.6.8
155
  * @since 2.5.7
156
  * @param string $interval defines the interval.
157
  * @param int $file_num defines the file_num.
159
  public function create_products_xml_cron( $interval, $file_num ) {
160
  $result = $this->create_products_xml( $file_num );
161
  if ( false !== $result ) {
162
+ update_option( 'wcj_products_time_file_created_' . $file_num, wcj_get_timestamp_date_from_gmt() );
163
  }
164
  die();
165
  }
167
  /**
168
  * Process_shortcode.
169
  *
170
+ * @version 5.6.8
171
  * @since 3.9.0
172
  * @todo [dev] (maybe) re-think `str_replace( '&', '&amp;', $content )`
173
  * @param string $content defines the content.
211
  'offset' => $offset,
212
  );
213
  if ( 'all' !== $products_scope ) {
214
+ $args['meta_query'] = WC()->query->get_meta_query(); // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_query
215
  switch ( $products_scope ) {
216
  case 'sale_only':
217
  $args['post__in'] = array_merge( array( 0 ), wc_get_product_ids_on_sale() );
235
  }
236
  if ( ! empty( $products_cats_in_ids ) ) {
237
  if ( ! isset( $args['tax_query'] ) ) {
238
+ $args['tax_query'] = array(); // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_tax_query
239
  }
240
  $args['tax_query'][] = array(
241
  'taxonomy' => 'product_cat',
246
  }
247
  if ( ! empty( $products_cats_ex_ids ) ) {
248
  if ( ! isset( $args['tax_query'] ) ) {
249
+ $args['tax_query'] = array(); // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_tax_query
250
  }
251
  $args['tax_query'][] = array(
252
  'taxonomy' => 'product_cat',
257
  }
258
  if ( ! empty( $products_tags_in_ids ) ) {
259
  if ( ! isset( $args['tax_query'] ) ) {
260
+ $args['tax_query'] = array(); // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_tax_query
261
  }
262
  $args['tax_query'][] = array(
263
  'taxonomy' => 'product_tag',
268
  }
269
  if ( ! empty( $products_tags_ex_ids ) ) {
270
  if ( ! isset( $args['tax_query'] ) ) {
271
+ $args['tax_query'] = array(); // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_tax_query
272
  }
273
  $args['tax_query'][] = array(
274
  'taxonomy' => 'product_tag',
295
  }
296
  }
297
  wp_reset_postdata();
298
+ return file_put_contents(
299
  ABSPATH . wcj_get_option( 'wcj_products_xml_file_path_' . $file_num, ( ( '1' === $file_num ) ? 'products.xml' : 'products_' . $file_num . '.xml' ) ),
300
  $this->process_shortcode( $xml_header_template ) . $xml_items . $this->process_shortcode( $xml_footer_template )
301
  );
includes/class-wcj-purchase-data.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Module - Cost of Goods (formerly Product Cost Price)
4
  *
5
- * @version 5.6.3
6
  * @since 2.2.0
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/includes
@@ -93,15 +93,12 @@ if ( ! class_exists( 'WCJ_Purchase_Data' ) ) :
93
  /**
94
  * Create_import_from_wc_cog_tool.
95
  *
96
- * @version 5.6.2
97
  * @since 2.9.0
98
  */
99
  public function create_import_from_wc_cog_tool() {
100
  // Action and Products list.
101
- $wpnonce = true;
102
- if ( function_exists( 'wp_verify_nonce' ) ) {
103
- $wpnonce = isset( $_REQUEST['_wpnonce'] ) ? wp_verify_nonce( sanitize_key( isset( $_REQUEST['_wpnonce'] ) ? $_REQUEST['_wpnonce'] : '' ) ) : true;
104
- }
105
  $perform_import = ( $wpnonce && isset( $_POST['wcj_import_from_wc_cog'] ) );
106
  $table_data = array();
107
  $table_data[] = array(
@@ -123,6 +120,7 @@ if ( ! class_exists( 'WCJ_Purchase_Data' ) ) :
123
  $button_form .= '<form method="post" action="">';
124
  $button_form .= '<input type="submit" name="wcj_import_from_wc_cog" class="button-primary" value="' . __( 'Import', 'woocommerce-jetpack' ) . '"' .
125
  ' onclick="return confirm(\'' . __( 'Are you sure?', 'woocommerce-jetpack' ) . '\')">';
 
126
  $button_form .= '</form>';
127
  // Output.
128
  $html = '';
2
  /**
3
  * Booster for WooCommerce - Module - Cost of Goods (formerly Product Cost Price)
4
  *
5
+ * @version 5.6.8
6
  * @since 2.2.0
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/includes
93
  /**
94
  * Create_import_from_wc_cog_tool.
95
  *
96
+ * @version 5.6.8
97
  * @since 2.9.0
98
  */
99
  public function create_import_from_wc_cog_tool() {
100
  // Action and Products list.
101
+ $wpnonce = isset( $_REQUEST['wcj_import_from_wc_cog-nonce'] ) ? wp_verify_nonce( sanitize_key( $_REQUEST['wcj_import_from_wc_cog-nonce'] ), 'wcj_import_from_wc_cog' ) : false;
 
 
 
102
  $perform_import = ( $wpnonce && isset( $_POST['wcj_import_from_wc_cog'] ) );
103
  $table_data = array();
104
  $table_data[] = array(
120
  $button_form .= '<form method="post" action="">';
121
  $button_form .= '<input type="submit" name="wcj_import_from_wc_cog" class="button-primary" value="' . __( 'Import', 'woocommerce-jetpack' ) . '"' .
122
  ' onclick="return confirm(\'' . __( 'Are you sure?', 'woocommerce-jetpack' ) . '\')">';
123
+ $button_form .= wp_nonce_field( 'wcj_import_from_wc_cog', 'wcj_import_from_wc_cog-nonce' );
124
  $button_form .= '</form>';
125
  // Output.
126
  $html = '';
includes/class-wcj-related-products.php CHANGED
@@ -1,8 +1,8 @@
1
- <?php //phpcs:ignore
2
  /**
3
  * Booster for WooCommerce - Module - Related Products
4
  *
5
- * @version 5.6.2
6
  * @author Pluggabl LLC.
7
  * @package Booster_For_WooCommerce/includes
8
  */
@@ -11,35 +11,13 @@ if ( ! defined( 'ABSPATH' ) ) {
11
  exit;
12
  }
13
 
14
- if ( ! class_exists( 'WCJ_Dummy_Term' ) ) {
15
- /**
16
- * WCJ_Dummy_Term class.
17
- *
18
- * @version 2.6.0
19
- * @since 2.6.0
20
- */
21
- class WCJ_Dummy_Term {
22
- /**
23
- * Term_id class.
24
- *
25
- * @var term_id.
26
- */
27
-
28
- public $term_id;
29
- /**
30
- * Constructor.
31
- */
32
- public function __construct() {
33
- $this->term_id = 0;
34
- }
35
- }
36
- }
37
 
38
  if ( ! class_exists( 'WCJ_Related_Products' ) ) :
39
  /**
40
  * WCJ_Related_Products.
41
  */
42
- class WCJ_Related_Products extends WCJ_Module { //phpcs:ignore
43
 
44
 
45
  /**
@@ -194,7 +172,7 @@ if ( ! class_exists( 'WCJ_Related_Products' ) ) :
194
  /**
195
  * Get_related_products_ids_wc3.
196
  *
197
- * @version 5.6.2
198
  * @since 2.8.0
199
  * @param int $product_id defines the product_id.
200
  */
@@ -222,7 +200,7 @@ if ( ! class_exists( 'WCJ_Related_Products' ) ) :
222
  if ( 'global' === wcj_get_option( 'wcj_product_info_related_products_by_attribute_attribute_type', 'global' ) ) {
223
  // Relate by Global Attributes.
224
  // http://snippet.fm/snippets/query-for-woocommerce-products-by-global-product-attributes/.
225
- $args['tax_query'] = array( //phpcs:ignore
226
  array(
227
  'taxonomy' => 'pa_' . $attribute_name,
228
  'field' => 'name',
@@ -232,9 +210,9 @@ if ( ! class_exists( 'WCJ_Related_Products' ) ) :
232
  } else {
233
  // Relate by Local Product Attributes.
234
  // http://snippet.fm/snippets/query-woocommerce-products-product-specific-custom-attribute/.
235
- $serialized_value = serialize( 'name' ) . serialize( $attribute_name ) . serialize( 'value' ) . serialize( $attribute_value ); //phpcs:ignore
236
  // extended version: $serialized_value = serialize( $attribute_name ) . 'a:6:{' . serialize( 'name' ) . serialize( $attribute_name ) . serialize( 'value' ) . serialize( $attribute_value ) . serialize( 'position' );.
237
- $args['meta_query'] = array( //phpcs:ignore
238
  array(
239
  'key' => '_product_attributes',
240
  'value' => $serialized_value,
@@ -385,11 +363,12 @@ if ( ! class_exists( 'WCJ_Related_Products' ) ) :
385
  /**
386
  * Maybe_delete_product_transients.
387
  *
388
- * @since 5.6.2
389
  * @version 2.6.0
390
  */
391
  public function maybe_delete_product_transients() {
392
- if ( isset( $_GET['wcj_clear_all_products_transients'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification
 
393
  $offset = 0;
394
  $block_size = 256;
395
  while ( true ) {
@@ -419,7 +398,7 @@ if ( ! class_exists( 'WCJ_Related_Products' ) ) :
419
  /**
420
  * Related_products_args.
421
  *
422
- * @version 5.6.2
423
  * @todo save custom results as product transient (for < WC3)
424
  * @param array $args defines the args.
425
  */
@@ -434,7 +413,7 @@ if ( ! class_exists( 'WCJ_Related_Products' ) ) :
434
  $orderby = wcj_get_option( 'wcj_product_info_related_products_orderby', 'rand' );
435
  $args['orderby'] = $orderby;
436
  if ( 'meta_value' === $orderby || 'meta_value_num' === $orderby ) {
437
- $args['meta_key'] = wcj_get_option( 'wcj_product_info_related_products_orderby_meta_value_meta_key', '' ); //phpcs:ignore
438
  }
439
  // Order.
440
  if ( 'rand' !== $orderby ) {
@@ -459,7 +438,7 @@ if ( ! class_exists( 'WCJ_Related_Products' ) ) :
459
  if ( 'global' === wcj_get_option( 'wcj_product_info_related_products_by_attribute_attribute_type', 'global' ) ) {
460
  // Relate by Global Attributes.
461
  // http://snippet.fm/snippets/query-for-woocommerce-products-by-global-product-attributes/.
462
- $args['tax_query'] = array( //phpcs:ignore
463
  array(
464
  'taxonomy' => 'pa_' . $attribute_name,
465
  'field' => 'name',
@@ -469,9 +448,9 @@ if ( ! class_exists( 'WCJ_Related_Products' ) ) :
469
  } else {
470
  // Relate by Local Product Attributes.
471
  // http://snippet.fm/snippets/query-woocommerce-products-product-specific-custom-attribute/.
472
- $serialized_value = serialize( 'name' ) . serialize( $attribute_name ) . serialize( 'value' ) . serialize( $attribute_value ); //phpcs:ignore
473
  // extended version: $serialized_value = serialize( $attribute_name ) . 'a:6:{' . serialize( 'name' ) . serialize( $attribute_name ) . serialize( 'value' ) . serialize( $attribute_value ) . serialize( 'position' );.
474
- $args['meta_query'] = array( //phpcs:ignore
475
  array(
476
  'key' => '_product_attributes',
477
  'value' => $serialized_value,
1
+ <?php
2
  /**
3
  * Booster for WooCommerce - Module - Related Products
4
  *
5
+ * @version 5.6.8
6
  * @author Pluggabl LLC.
7
  * @package Booster_For_WooCommerce/includes
8
  */
11
  exit;
12
  }
13
 
14
+ require_once 'classes/class-wcj-dummy-term.php';
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
15
 
16
  if ( ! class_exists( 'WCJ_Related_Products' ) ) :
17
  /**
18
  * WCJ_Related_Products.
19
  */
20
+ class WCJ_Related_Products extends WCJ_Module {
21
 
22
 
23
  /**
172
  /**
173
  * Get_related_products_ids_wc3.
174
  *
175
+ * @version 5.6.8
176
  * @since 2.8.0
177
  * @param int $product_id defines the product_id.
178
  */
200
  if ( 'global' === wcj_get_option( 'wcj_product_info_related_products_by_attribute_attribute_type', 'global' ) ) {
201
  // Relate by Global Attributes.
202
  // http://snippet.fm/snippets/query-for-woocommerce-products-by-global-product-attributes/.
203
+ $args['tax_query'] = array( // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_tax_query
204
  array(
205
  'taxonomy' => 'pa_' . $attribute_name,
206
  'field' => 'name',
210
  } else {
211
  // Relate by Local Product Attributes.
212
  // http://snippet.fm/snippets/query-woocommerce-products-product-specific-custom-attribute/.
213
+ $serialized_value = serialize( 'name' ) . serialize( $attribute_name ) . serialize( 'value' ) . serialize( $attribute_value ); // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions.serialize_serialize
214
  // extended version: $serialized_value = serialize( $attribute_name ) . 'a:6:{' . serialize( 'name' ) . serialize( $attribute_name ) . serialize( 'value' ) . serialize( $attribute_value ) . serialize( 'position' );.
215
+ $args['meta_query'] = array( // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_query
216
  array(
217
  'key' => '_product_attributes',
218
  'value' => $serialized_value,
363
  /**
364
  * Maybe_delete_product_transients.
365
  *
366
+ * @since 5.6.8
367
  * @version 2.6.0
368
  */
369
  public function maybe_delete_product_transients() {
370
+ $wpnonce = isset( $_REQUEST['wcj-cat-nonce'] ) ? wp_verify_nonce( sanitize_key( $_REQUEST['wcj-cat-nonce'] ), 'wcj-cat-nonce' ) : false;
371
+ if ( $wpnonce && isset( $_GET['wcj_clear_all_products_transients'] ) ) {
372
  $offset = 0;
373
  $block_size = 256;
374
  while ( true ) {
398
  /**
399
  * Related_products_args.
400
  *
401
+ * @version 5.6.8
402
  * @todo save custom results as product transient (for < WC3)
403
  * @param array $args defines the args.
404
  */
413
  $orderby = wcj_get_option( 'wcj_product_info_related_products_orderby', 'rand' );
414
  $args['orderby'] = $orderby;
415
  if ( 'meta_value' === $orderby || 'meta_value_num' === $orderby ) {
416
+ $args['meta_key'] = wcj_get_option( 'wcj_product_info_related_products_orderby_meta_value_meta_key', '' ); // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_key
417
  }
418
  // Order.
419
  if ( 'rand' !== $orderby ) {
438
  if ( 'global' === wcj_get_option( 'wcj_product_info_related_products_by_attribute_attribute_type', 'global' ) ) {
439
  // Relate by Global Attributes.
440
  // http://snippet.fm/snippets/query-for-woocommerce-products-by-global-product-attributes/.
441
+ $args['tax_query'] = array( // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_tax_query
442
  array(
443
  'taxonomy' => 'pa_' . $attribute_name,
444
  'field' => 'name',
448
  } else {
449
  // Relate by Local Product Attributes.
450
  // http://snippet.fm/snippets/query-woocommerce-products-product-specific-custom-attribute/.
451
+ $serialized_value = serialize( 'name' ) . serialize( $attribute_name ) . serialize( 'value' ) . serialize( $attribute_value ); // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions.serialize_serialize
452
  // extended version: $serialized_value = serialize( $attribute_name ) . 'a:6:{' . serialize( 'name' ) . serialize( $attribute_name ) . serialize( 'value' ) . serialize( $attribute_value ) . serialize( 'position' );.
453
+ $args['meta_query'] = array( // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_query
454
  array(
455
  'key' => '_product_attributes',
456
  'value' => $serialized_value,
includes/class-wcj-reports.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Module - Reports
4
  *
5
- * @version 5.6.2
6
  * @author Pluggabl LLC.
7
  * @package Booster_For_WooCommerce/includes
8
  */
@@ -41,7 +41,7 @@ if ( ! class_exists( 'WCJ_Reports' ) ) :
41
  /**
42
  * Constructor.
43
  *
44
- * @version 3.6.0
45
  * @todo "orders report by meta" abstract class (see `WCJ_Reports_Product_Sales_Gateways`): by referer (`_wcj_track_users_http_referer`); by shipping (stored as item); by country (`_billing_country` or `_shipping_country`) etc.
46
  */
47
  public function __construct() {
@@ -63,7 +63,7 @@ if ( ! class_exists( 'WCJ_Reports' ) ) :
63
  include_once 'reports/class-wcj-reports-customers.php';
64
  include_once 'reports/class-wcj-reports-stock.php';
65
  include_once 'reports/class-wcj-reports-product-sales-daily.php';
66
- include_once 'reports/wcj-class-reports-sales-gateways.php';
67
  include_once 'reports/class-wcj-reports-sales.php';
68
  include_once 'reports/class-wcj-reports-monthly-sales.php';
69
 
@@ -76,14 +76,15 @@ if ( ! class_exists( 'WCJ_Reports' ) ) :
76
  /**
77
  * Add_custom_order_reports_ranges_by_month_to_admin_bar.
78
  *
79
- * @version 5.6.2
80
  * @since 2.2.4
81
  * @param string | array $wp_admin_bar defines the wp_admin_bar.
82
  */
83
  public function add_custom_order_reports_ranges_by_month_to_admin_bar( $wp_admin_bar ) {
 
84
  $is_reports = ( isset( $_GET['page'] ) && 'wc-reports' === $_GET['page'] );
85
  $is_orders_reports = ( isset( $_GET['tab'] ) && 'orders' === $_GET['tab'] || ! isset( $_GET['tab'] ) );
86
- $wpnonce = isset( $_REQUEST['_wpnonce'] ) ? wp_verify_nonce( sanitize_key( isset( $_REQUEST['_wpnonce'] ) ? $_REQUEST['_wpnonce'] : '' ) ) : true;
87
  if ( $is_reports && $is_orders_reports ) {
88
 
89
  $parent = 'reports_orders_more_ranges_months';
@@ -97,7 +98,7 @@ if ( ! class_exists( 'WCJ_Reports' ) ) :
97
  $wp_admin_bar->add_node( $args );
98
 
99
  $custom_range_nonce = wp_create_nonce( 'custom_range' );
100
- $current_time = (int) gmdate( 'U' );
101
  for ( $i = 1; $i <= 12; $i++ ) {
102
  $month_start_date = strtotime( gmdate( 'Y-m-01', $current_time ) . " -$i months" );
103
  $month_num = gmdate( 'm', $month_start_date );
@@ -128,13 +129,14 @@ if ( ! class_exists( 'WCJ_Reports' ) ) :
128
  /**
129
  * Add_custom_order_reports_ranges_to_admin_bar.
130
  *
131
- * @version 5.6.2
132
  * @param string | array $wp_admin_bar defines the wp_admin_bar.
133
  */
134
  public function add_custom_order_reports_ranges_to_admin_bar( $wp_admin_bar ) {
135
- $wpnonce = isset( $_REQUEST['_wpnonce'] ) ? wp_verify_nonce( sanitize_key( isset( $_REQUEST['_wpnonce'] ) ? $_REQUEST['_wpnonce'] : '' ) ) : true;
136
- $is_reports = ( $wpnonce && isset( $_GET['page'] ) && 'wc-reports' === $_GET['page'] );
137
- $is_orders_reports = ( $wpnonce && isset( $_GET['tab'] ) && 'orders' === $_GET['tab'] || ! isset( $_GET['tab'] ) );
 
138
  if ( $is_reports && $is_orders_reports ) {
139
 
140
  $parent = 'reports_orders_more_ranges';
@@ -174,10 +176,11 @@ if ( ! class_exists( 'WCJ_Reports' ) ) :
174
  * Catch_arguments.
175
  */
176
  public function catch_arguments() {
177
- $wpnonce = isset( $_REQUEST['_wpnonce'] ) ? wp_verify_nonce( sanitize_key( isset( $_REQUEST['_wpnonce'] ) ? $_REQUEST['_wpnonce'] : '' ) ) : true;
178
- $this->report_id = ( $wpnonce && isset( $_GET['report'] ) ) ? sanitize_text_field( wp_unslash( $_GET['report'] ) ) : 'on_stock';
179
- $this->range_days = $wpnonce && isset( $_GET['period'] ) ? sanitize_text_field( wp_unslash( $_GET['period'] ) ) : 30;
180
  $this->group_countries = ( 'customers_by_country_sets' === $this->report_id ) ? 'yes' : 'no';
 
181
  }
182
 
183
  /**
@@ -185,40 +188,40 @@ if ( ! class_exists( 'WCJ_Reports' ) ) :
185
  */
186
  public function get_report_sales() {
187
  $report = new WCJ_Reports_Sales();
188
- echo $report->get_report(); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
189
  }
190
 
191
  /**
192
  * Get_report_products_sales_daily.
193
  *
194
- * @version 5.6.2
195
  * @since 2.9.0
196
  */
197
  public function get_report_products_sales_daily() {
198
  $report = new WCJ_Reports_Product_Sales_Daily();
199
- echo $report->get_report(); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
200
  }
201
 
202
  /**
203
  * Get_report_monthly_sales.
204
  *
205
- * @version 5.6.2
206
  * @since 2.4.7
207
  */
208
  public function get_report_monthly_sales() {
209
  $report = new WCJ_Reports_Monthly_Sales();
210
- echo $report->get_report(); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
211
  }
212
 
213
  /**
214
  * Get_report_orders_gateways.
215
  *
216
- * @version 5.6.2
217
  * @since 3.6.0
218
  */
219
  public function get_report_orders_gateways() {
220
- $report = new WCJ_Reports_Product_Sales_Gateways();
221
- echo $report->get_report(); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
222
  }
223
 
224
  /**
@@ -231,7 +234,7 @@ if ( ! class_exists( 'WCJ_Reports' ) ) :
231
  'range_days' => $this->range_days,
232
  )
233
  );
234
- echo $report->get_report_html(); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
235
  }
236
 
237
  /**
@@ -239,7 +242,7 @@ if ( ! class_exists( 'WCJ_Reports' ) ) :
239
  */
240
  public function get_report_customers() {
241
  $report = new WCJ_Reports_Customers( array( 'group_countries' => $this->group_countries ) );
242
- echo $report->get_report(); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
243
  }
244
 
245
  /**
2
  /**
3
  * Booster for WooCommerce - Module - Reports
4
  *
5
+ * @version 5.6.8
6
  * @author Pluggabl LLC.
7
  * @package Booster_For_WooCommerce/includes
8
  */
41
  /**
42
  * Constructor.
43
  *
44
+ * @version 5.6.8
45
  * @todo "orders report by meta" abstract class (see `WCJ_Reports_Product_Sales_Gateways`): by referer (`_wcj_track_users_http_referer`); by shipping (stored as item); by country (`_billing_country` or `_shipping_country`) etc.
46
  */
47
  public function __construct() {
63
  include_once 'reports/class-wcj-reports-customers.php';
64
  include_once 'reports/class-wcj-reports-stock.php';
65
  include_once 'reports/class-wcj-reports-product-sales-daily.php';
66
+ include_once 'reports/class-wcj-reports-sales-gateways.php';
67
  include_once 'reports/class-wcj-reports-sales.php';
68
  include_once 'reports/class-wcj-reports-monthly-sales.php';
69
 
76
  /**
77
  * Add_custom_order_reports_ranges_by_month_to_admin_bar.
78
  *
79
+ * @version 5.6.8
80
  * @since 2.2.4
81
  * @param string | array $wp_admin_bar defines the wp_admin_bar.
82
  */
83
  public function add_custom_order_reports_ranges_by_month_to_admin_bar( $wp_admin_bar ) {
84
+ // phpcs:disable WordPress.Security.NonceVerification
85
  $is_reports = ( isset( $_GET['page'] ) && 'wc-reports' === $_GET['page'] );
86
  $is_orders_reports = ( isset( $_GET['tab'] ) && 'orders' === $_GET['tab'] || ! isset( $_GET['tab'] ) );
87
+ // phpcs:enable WordPress.Security.NonceVerification
88
  if ( $is_reports && $is_orders_reports ) {
89
 
90
  $parent = 'reports_orders_more_ranges_months';
98
  $wp_admin_bar->add_node( $args );
99
 
100
  $custom_range_nonce = wp_create_nonce( 'custom_range' );
101
+ $current_time = wcj_get_timestamp_date_from_gmt();
102
  for ( $i = 1; $i <= 12; $i++ ) {
103
  $month_start_date = strtotime( gmdate( 'Y-m-01', $current_time ) . " -$i months" );
104
  $month_num = gmdate( 'm', $month_start_date );
129
  /**
130
  * Add_custom_order_reports_ranges_to_admin_bar.
131
  *
132
+ * @version 5.6.8
133
  * @param string | array $wp_admin_bar defines the wp_admin_bar.
134
  */
135
  public function add_custom_order_reports_ranges_to_admin_bar( $wp_admin_bar ) {
136
+ // phpcs:disable WordPress.Security.NonceVerification
137
+ $is_reports = ( isset( $_GET['page'] ) && 'wc-reports' === $_GET['page'] );
138
+ $is_orders_reports = ( isset( $_GET['tab'] ) && 'orders' === $_GET['tab'] || ! isset( $_GET['tab'] ) );
139
+ // phpcs:enable WordPress.Security.NonceVerification
140
  if ( $is_reports && $is_orders_reports ) {
141
 
142
  $parent = 'reports_orders_more_ranges';
176
  * Catch_arguments.
177
  */
178
  public function catch_arguments() {
179
+ // phpcs:disable WordPress.Security.NonceVerification
180
+ $this->report_id = ( isset( $_GET['report'] ) ) ? sanitize_text_field( wp_unslash( $_GET['report'] ) ) : 'on_stock';
181
+ $this->range_days = isset( $_GET['period'] ) ? sanitize_text_field( wp_unslash( $_GET['period'] ) ) : 30;
182
  $this->group_countries = ( 'customers_by_country_sets' === $this->report_id ) ? 'yes' : 'no';
183
+ // phpcs:enable WordPress.Security.NonceVerification
184
  }
185
 
186
  /**
188
  */
189
  public function get_report_sales() {
190
  $report = new WCJ_Reports_Sales();
191
+ echo wp_kses_post( $report->get_report() );
192
  }
193
 
194
  /**
195
  * Get_report_products_sales_daily.
196
  *
197
+ * @version 5.6.8
198
  * @since 2.9.0
199
  */
200
  public function get_report_products_sales_daily() {
201
  $report = new WCJ_Reports_Product_Sales_Daily();
202
+ echo wp_kses_post( $report->get_report() );
203
  }
204
 
205
  /**
206
  * Get_report_monthly_sales.
207
  *
208
+ * @version 5.6.8
209
  * @since 2.4.7
210
  */
211
  public function get_report_monthly_sales() {
212
  $report = new WCJ_Reports_Monthly_Sales();
213
+ echo wp_kses_post( $report->get_report() );
214
  }
215
 
216
  /**
217
  * Get_report_orders_gateways.
218
  *
219
+ * @version 5.6.8
220
  * @since 3.6.0
221
  */
222
  public function get_report_orders_gateways() {
223
+ $report = new WCJ_Reports_Sales_Gateways();
224
+ echo wp_kses_post( $report->get_report() );
225
  }
226
 
227
  /**
234
  'range_days' => $this->range_days,
235
  )
236
  );
237
+ echo wp_kses_post( $report->get_report_html() );
238
  }
239
 
240
  /**
242
  */
243
  public function get_report_customers() {
244
  $report = new WCJ_Reports_Customers( array( 'group_countries' => $this->group_countries ) );
245
+ echo wp_kses_post( $report->get_report() );
246
  }
247
 
248
  /**
includes/class-wcj-shipping-by-cities.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Module - Shipping by Cities
4
  *
5
- * @version 5.6.2
6
  * @since 3.6.0
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/includes
@@ -60,7 +60,7 @@ if ( ! class_exists( 'WCJ_Shipping_By_Cities' ) ) :
60
  /**
61
  * Check.
62
  *
63
- * @version 5.6.2
64
  * @since 3.6.0
65
  * @todo `$_REQUEST['city']` (i.e. billing city)
66
  * @todo `get_base_city()` - do we really need this?
@@ -72,9 +72,12 @@ if ( ! class_exists( 'WCJ_Shipping_By_Cities' ) ) :
72
  public function check( $options_id, $values, $include_or_exclude, $package ) {
73
  switch ( $options_id ) {
74
  case 'cities':
75
- $wpnonce = true;
76
- if ( function_exists( 'wp_verify_nonce' ) ) {
77
- $wpnonce = isset( $_REQUEST['_wpnonce'] ) ? wp_verify_nonce( sanitize_key( isset( $_REQUEST['_wpnonce'] ) ? $_REQUEST['_wpnonce'] : '' ) ) : true;
 
 
 
78
  }
79
 
80
  $user_city = WC()->customer->get_shipping_city();
@@ -83,9 +86,12 @@ if ( ! class_exists( 'WCJ_Shipping_By_Cities' ) ) :
83
 
84
  return in_array( $customer_city, $values, true );
85
  case 'postcodes':
86
- $wpnonce = true;
87
- if ( function_exists( 'wp_verify_nonce' ) ) {
88
- $wpnonce = isset( $_REQUEST['_wpnonce'] ) ? wp_verify_nonce( sanitize_key( isset( $_REQUEST['_wpnonce'] ) ? $_REQUEST['_wpnonce'] : '' ) ) : true;
 
 
 
89
  }
90
  $customer_shipping_postcode = WC()->customer->get_shipping_postcode();
91
  $customer_postcode = strtoupper( ( isset( $_REQUEST['s_postcode'] ) && $wpnonce ) ? sanitize_text_field( wp_unslash( $_REQUEST['s_postcode'] ) ) : ( ! empty( $customer_shipping_postcode ) ? $customer_shipping_postcode : WC()->countries->get_base_postcode() ) );
2
  /**
3
  * Booster for WooCommerce - Module - Shipping by Cities
4
  *
5
+ * @version 5.6.8
6
  * @since 3.6.0
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/includes
60
  /**
61
  * Check.
62
  *
63
+ * @version 5.6.8
64
  * @since 3.6.0
65
  * @todo `$_REQUEST['city']` (i.e. billing city)
66
  * @todo `get_base_city()` - do we really need this?
72
  public function check( $options_id, $values, $include_or_exclude, $package ) {
73
  switch ( $options_id ) {
74
  case 'cities':
75
+ $post_data = array();
76
+ if ( isset( $_REQUEST['post_data'] ) ) {
77
+ parse_str( sanitize_text_field( wp_unslash( $_REQUEST['post_data'] ) ), $post_data );
78
+ $wpnonce = isset( $post_data['woocommerce-process-checkout-nonce'] ) ? wp_verify_nonce( sanitize_key( $post_data['woocommerce-process-checkout-nonce'] ), 'woocommerce-process_checkout' ) : false;
79
+ } else {
80
+ $wpnonce = false;
81
  }
82
 
83
  $user_city = WC()->customer->get_shipping_city();
86
 
87
  return in_array( $customer_city, $values, true );
88
  case 'postcodes':
89
+ $post_data = array();
90
+ if ( isset( $_REQUEST['post_data'] ) ) {
91
+ parse_str( sanitize_text_field( wp_unslash( $_REQUEST['post_data'] ) ), $post_data );
92
+ $wpnonce = isset( $post_data['woocommerce-process-checkout-nonce'] ) ? wp_verify_nonce( sanitize_key( $post_data['woocommerce-process-checkout-nonce'] ), 'woocommerce-process_checkout' ) : false;
93
+ } else {
94
+ $wpnonce = false;
95
  }
96
  $customer_shipping_postcode = WC()->customer->get_shipping_postcode();
97
  $customer_postcode = strtoupper( ( isset( $_REQUEST['s_postcode'] ) && $wpnonce ) ? sanitize_text_field( wp_unslash( $_REQUEST['s_postcode'] ) ) : ( ! empty( $customer_shipping_postcode ) ? $customer_shipping_postcode : WC()->countries->get_base_postcode() ) );
includes/class-wcj-shipping-by-time.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Module - Shipping by Time
4
  *
5
- * @version 5.6.2
6
  * @since 4.0.0
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/includes
@@ -99,7 +99,7 @@ if ( ! class_exists( 'WCJ_Shipping_By_Time' ) ) :
99
  /**
100
  * Check.
101
  *
102
- * @version 5.6.2
103
  * @since 4.0.0
104
  * @param string $options_id defines the options_id.
105
  * @param array $values defines the values.
@@ -111,7 +111,7 @@ if ( ! class_exists( 'WCJ_Shipping_By_Time' ) ) :
111
  case 'time':
112
  $parsed_time = $this->parse_time( $values );
113
  if ( $parsed_time ) {
114
- $current_time = (int) gmdate( 'U' );
115
  return ( $current_time >= $parsed_time['time_from'] && $current_time <= $parsed_time['time_to'] );
116
  }
117
  return ( 'include' === $include_or_exclude ); // not parsable time input - leaving shipping method enabled.
2
  /**
3
  * Booster for WooCommerce - Module - Shipping by Time
4
  *
5
+ * @version 5.6.8
6
  * @since 4.0.0
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/includes
99
  /**
100
  * Check.
101
  *
102
+ * @version 5.6.8
103
  * @since 4.0.0
104
  * @param string $options_id defines the options_id.
105
  * @param array $values defines the values.
111
  case 'time':
112
  $parsed_time = $this->parse_time( $values );
113
  if ( $parsed_time ) {
114
+ $current_time = wcj_get_timestamp_date_from_gmt();
115
  return ( $current_time >= $parsed_time['time_from'] && $current_time <= $parsed_time['time_to'] );
116
  }
117
  return ( 'include' === $include_or_exclude ); // not parsable time input - leaving shipping method enabled.
includes/class-wcj-shipping-by-user-role.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Module - Shipping by User Role
4
  *
5
- * @version 5.6.2
6
  * @since 5.2.0
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/includes
@@ -24,7 +24,7 @@ if ( ! class_exists( 'WCJ_Shipping_By_User_Role' ) ) :
24
  /**
25
  * Constructor.
26
  *
27
- * @version 5.2.0
28
  * @since 2.8.0
29
  */
30
  public function __construct() {
@@ -41,7 +41,7 @@ if ( ! class_exists( 'WCJ_Shipping_By_User_Role' ) ) :
41
  'desc' => sprintf(
42
  /* translators: %s: translators Added */
43
  __( 'Custom roles can be added via "Add/Manage Custom Roles" tool in Booster\'s <a href="%s">General</a> module.', 'woocommerce-jetpack' ),
44
- admin_url( 'admin.php?page=wc-settings&tab=jetpack&wcj-cat=emails_and_misc&section=general' )
45
  ),
46
  ),
47
  'user_id' => array(
2
  /**
3
  * Booster for WooCommerce - Module - Shipping by User Role
4
  *
5
+ * @version 5.6.8
6
  * @since 5.2.0
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/includes
24
  /**
25
  * Constructor.
26
  *
27
+ * @version 5.6.8
28
  * @since 2.8.0
29
  */
30
  public function __construct() {
41
  'desc' => sprintf(
42
  /* translators: %s: translators Added */
43
  __( 'Custom roles can be added via "Add/Manage Custom Roles" tool in Booster\'s <a href="%s">General</a> module.', 'woocommerce-jetpack' ),
44
+ admin_url( wcj_admin_tab_url() . '&wcj-cat=emails_and_misc&section=general' )
45
  ),
46
  ),
47
  'user_id' => array(
includes/class-wcj-shipping.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Module - Custom Shipping
4
  *
5
- * @version 5.6.2
6
  * @author Pluggabl LLC.
7
  * @package Booster_For_WooCommerce/includes
8
  */
@@ -89,15 +89,15 @@ if ( ! class_exists( 'WCJ_Shipping' ) ) :
89
  /**
90
  * Add_wc_shipping_wcj_custom_w_zones_class.
91
  *
92
- * @version 4.7.1
93
  * @since 2.5.6
94
  * @param String $methods Get methods.
95
  */
96
  public function add_wc_shipping_wcj_custom_w_zones_class( $methods ) {
97
- if ( ! class_exists( 'WC_Shipping_WCJ_Custom_W_Zones' ) ) {
98
  $this->init_shipping_zones_class();
99
  }
100
- $methods['booster_custom_shipping_w_zones'] = 'WC_Shipping_WCJ_Custom_W_Zones';
101
  return $methods;
102
  }
103
 
2
  /**
3
  * Booster for WooCommerce - Module - Custom Shipping
4
  *
5
+ * @version 5.6.8
6
  * @author Pluggabl LLC.
7
  * @package Booster_For_WooCommerce/includes
8
  */
89
  /**
90
  * Add_wc_shipping_wcj_custom_w_zones_class.
91
  *
92
+ * @version 5.6.8
93
  * @since 2.5.6
94
  * @param String $methods Get methods.
95
  */
96
  public function add_wc_shipping_wcj_custom_w_zones_class( $methods ) {
97
+ if ( ! class_exists( 'WC_Shipping_WCJ_Custom_With_Shipping_Zones' ) ) {
98
  $this->init_shipping_zones_class();
99
  }
100
+ $methods['booster_custom_shipping_w_zones'] = 'WC_Shipping_WCJ_Custom_With_Shipping_Zones';
101
  return $methods;
102
  }
103
 
includes/class-wcj-sku.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Module - SKU
4
  *
5
- * @version 5.6.2
6
  * @author Pluggabl LLC.
7
  * @package Booster_For_WooCommerce/includes
8
  */
@@ -82,14 +82,11 @@ if ( ! class_exists( 'WCJ_SKU' ) ) :
82
  /**
83
  * Generate_default_hashids_salt.
84
  *
85
- * @version 5.6.2
86
  * @since 4.7.0
87
  */
88
  public function generate_default_hashids_salt() {
89
- $wpnonce = true;
90
- if ( function_exists( 'wp_verify_nonce' ) ) {
91
- $wpnonce = isset( $_REQUEST['_wpnonce'] ) ? wp_verify_nonce( sanitize_key( isset( $_REQUEST['_wpnonce'] ) ? $_REQUEST['_wpnonce'] : '' ) ) : true;
92
- }
93
  if ( $wpnonce && isset( $_GET['page'] ) && 'wc-settings' === $_GET['page'] &&
94
  isset( $_GET['tab'] ) && 'jetpack' === $_GET['tab'] &&
95
  isset( $_GET['wcj-cat'] ) && 'products' === $_GET['wcj-cat'] &&
@@ -160,7 +157,7 @@ if ( ! class_exists( 'WCJ_SKU' ) ) :
160
  /**
161
  * Add_search_by_sku_to_frontend_posts_search.
162
  *
163
- * @version 5.6.2
164
  * @since 3.4.0
165
  * @see https://plugins.svn.wordpress.org/search-by-sku-for-woocommerce/
166
  * @param string $where defines the where.
@@ -182,8 +179,8 @@ if ( ! class_exists( 'WCJ_SKU' ) ) :
182
  if ( is_admin() && is_numeric( $term ) ) {
183
  $search_ids[] = $term;
184
  }
185
- $sku_to_parent_id = $wpdb->get_col( $wpdb->prepare( 'SELECT p.post_parent as post_id FROM {$wpdb->posts} as p join {$wpdb->postmeta} pm on p.ID = pm.post_id and pm.meta_key="_sku" and pm.meta_value LIKE %s where p.post_parent <> 0 group by p.post_parent', $wpdb->esc_like( wc_clean( '%' . $term . '%' ) ) ) ); // WPCS: db call ok and cache ok.
186
- $sku_to_id = $wpdb->get_col( $wpdb->prepare( "SELECT post_id FROM {$wpdb->postmeta} WHERE meta_key='_sku' AND meta_value LIKE %s;", $wpdb->esc_like( '%' . wc_clean( $term ) . '%' ) ) ); // WPCS: db call ok and cache ok.
187
  $search_ids = array_merge( $search_ids, $sku_to_id, $sku_to_parent_id );
188
  }
189
  $search_ids = array_filter( array_map( 'absint', $search_ids ) );
2
  /**
3
  * Booster for WooCommerce - Module - SKU
4
  *
5
+ * @version 5.6.8
6
  * @author Pluggabl LLC.
7
  * @package Booster_For_WooCommerce/includes
8
  */
82
  /**
83
  * Generate_default_hashids_salt.
84
  *
85
+ * @version 5.6.8
86
  * @since 4.7.0
87
  */
88
  public function generate_default_hashids_salt() {
89
+ $wpnonce = isset( $_REQUEST['wcj-cat-nonce'] ) ? wp_verify_nonce( sanitize_key( $_REQUEST['wcj-cat-nonce'] ), 'wcj-cat-nonce' ) : false;
 
 
 
90
  if ( $wpnonce && isset( $_GET['page'] ) && 'wc-settings' === $_GET['page'] &&
91
  isset( $_GET['tab'] ) && 'jetpack' === $_GET['tab'] &&
92
  isset( $_GET['wcj-cat'] ) && 'products' === $_GET['wcj-cat'] &&
157
  /**
158
  * Add_search_by_sku_to_frontend_posts_search.
159
  *
160
+ * @version 5.6.8
161
  * @since 3.4.0
162
  * @see https://plugins.svn.wordpress.org/search-by-sku-for-woocommerce/
163
  * @param string $where defines the where.
179
  if ( is_admin() && is_numeric( $term ) ) {
180
  $search_ids[] = $term;
181
  }
182
+ $sku_to_parent_id = $wpdb->get_col( $wpdb->prepare( 'SELECT p.post_parent as post_id FROM {$wpdb->posts} as p join {$wpdb->postmeta} pm on p.ID = pm.post_id and pm.meta_key="_sku" and pm.meta_value LIKE %s where p.post_parent <> 0 group by p.post_parent', $wpdb->esc_like( wc_clean( '%' . $term . '%' ) ) ) ); // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching
183
+ $sku_to_id = $wpdb->get_col( $wpdb->prepare( "SELECT post_id FROM {$wpdb->postmeta} WHERE meta_key='_sku' AND meta_value LIKE %s;", $wpdb->esc_like( '%' . wc_clean( $term ) . '%' ) ) ); // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching
184
  $search_ids = array_merge( $search_ids, $sku_to_id, $sku_to_parent_id );
185
  }
186
  $search_ids = array_filter( array_map( 'absint', $search_ids ) );
includes/class-wcj-sorting.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Module - Sorting
4
  *
5
- * @version 5.6.7
6
  * @author Pluggabl LLC.
7
  * @package Booster_For_WooCommerce/includes
8
  */
@@ -298,7 +298,7 @@ if ( ! class_exists( 'WCJ_Sorting' ) ) :
298
  * Add new sorting options to WooCommerce sorting.
299
  *
300
  * @param array $args Get args.
301
- * @version 5.6.7
302
  */
303
  public function custom_woocommerce_get_catalog_ordering_args( $args ) {
304
  // Get ordering from query string.
@@ -325,34 +325,34 @@ if ( ! class_exists( 'WCJ_Sorting' ) ) :
325
  case 'title_asc':
326
  $args['orderby'] = 'title';
327
  $args['order'] = 'asc';
328
- $args['meta_key'] = ''; //phpcs:ignore
329
  break;
330
  case 'title_desc':
331
  $args['orderby'] = 'title';
332
  $args['order'] = 'desc';
333
- $args['meta_key'] = ''; //phpcs:ignore
334
  break;
335
  case 'sku_asc':
336
  $args['orderby'] = ( 'no' === apply_filters( 'booster_option', 'no', wcj_get_option( 'wcj_sorting_by_sku_num_enabled', 'no' ) ) ) ?
337
  'meta_value' : 'meta_value_num';
338
  $args['order'] = 'asc';
339
- $args['meta_key'] = '_sku'; //phpcs:ignore
340
  break;
341
  case 'sku_desc':
342
  $args['orderby'] = ( 'no' === apply_filters( 'booster_option', 'no', wcj_get_option( 'wcj_sorting_by_sku_num_enabled', 'no' ) ) ) ?
343
  'meta_value' : 'meta_value_num';
344
  $args['order'] = 'desc';
345
- $args['meta_key'] = '_sku'; //phpcs:ignore
346
  break;
347
  case 'stock_quantity_asc':
348
  $args['orderby'] = 'meta_value_num';
349
  $args['order'] = 'asc';
350
- $args['meta_key'] = '_stock'; //phpcs:ignore
351
  break;
352
  case 'stock_quantity_desc':
353
  $args['orderby'] = 'meta_value_num';
354
  $args['order'] = 'desc';
355
- $args['meta_key'] = '_stock'; //phpcs:ignore
356
  break;
357
  endswitch;
358
 
2
  /**
3
  * Booster for WooCommerce - Module - Sorting
4
  *
5
+ * @version 5.6.8
6
  * @author Pluggabl LLC.
7
  * @package Booster_For_WooCommerce/includes
8
  */
298
  * Add new sorting options to WooCommerce sorting.
299
  *
300
  * @param array $args Get args.
301
+ * @version 5.6.8
302
  */
303
  public function custom_woocommerce_get_catalog_ordering_args( $args ) {
304
  // Get ordering from query string.
325
  case 'title_asc':
326
  $args['orderby'] = 'title';
327
  $args['order'] = 'asc';
328
+ $args['meta_key'] = ''; // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_key
329
  break;
330
  case 'title_desc':
331
  $args['orderby'] = 'title';
332
  $args['order'] = 'desc';
333
+ $args['meta_key'] = ''; // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_key
334
  break;
335
  case 'sku_asc':
336
  $args['orderby'] = ( 'no' === apply_filters( 'booster_option', 'no', wcj_get_option( 'wcj_sorting_by_sku_num_enabled', 'no' ) ) ) ?
337
  'meta_value' : 'meta_value_num';
338
  $args['order'] = 'asc';
339
+ $args['meta_key'] = '_sku'; // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_key
340
  break;
341
  case 'sku_desc':
342
  $args['orderby'] = ( 'no' === apply_filters( 'booster_option', 'no', wcj_get_option( 'wcj_sorting_by_sku_num_enabled', 'no' ) ) ) ?
343
  'meta_value' : 'meta_value_num';
344
  $args['order'] = 'desc';
345
+ $args['meta_key'] = '_sku'; // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_key
346
  break;
347
  case 'stock_quantity_asc':
348
  $args['orderby'] = 'meta_value_num';
349
  $args['order'] = 'asc';
350
+ $args['meta_key'] = '_stock'; // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_key
351
  break;
352
  case 'stock_quantity_desc':
353
  $args['orderby'] = 'meta_value_num';
354
  $args['order'] = 'desc';
355
+ $args['meta_key'] = '_stock'; // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_key
356
  break;
357
  endswitch;
358
 
includes/class-wcj-template-editor.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Module - Template Editor
4
  *
5
- * @version 5.6.2
6
  * @since 3.9.0
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/includes
@@ -47,7 +47,7 @@ if ( ! class_exists( 'WCJ_Template_Editor' ) ) :
47
  /**
48
  * Create_templates.
49
  *
50
- * @version 5.6.2
51
  * @since 3.9.0
52
  * @todo [dev] also delete on "Reset settings"
53
  * @param string | array $sections defines the sections.
@@ -55,6 +55,9 @@ if ( ! class_exists( 'WCJ_Template_Editor' ) ) :
55
  */
56
  public function create_templates( $sections, $current_section ) {
57
  if ( $this->id === $current_section ) {
 
 
 
58
  $this->delete_dir( wcj_get_wcj_uploads_dir( 'templates' ) );
59
  $templates_content = wcj_get_option( 'wcj_template_editor_templates_content', array() );
60
  foreach ( wcj_get_option( 'wcj_template_editor_templates_to_edit', array() ) as $template ) {
@@ -63,7 +66,7 @@ if ( ! class_exists( 'WCJ_Template_Editor' ) ) :
63
  $_template_file = $_template[ count( $_template ) - 1 ];
64
  $_template_dirs = str_replace( $_template_file, '', $template );
65
  $_template_path = wcj_get_wcj_uploads_dir( 'templates' . DIRECTORY_SEPARATOR . $_template_dirs ) . DIRECTORY_SEPARATOR . $_template_file;
66
- file_put_contents( $_template_path, $templates_content[ $template ] ); //phpcs:ignore
67
  }
68
  }
69
  }
2
  /**
3
  * Booster for WooCommerce - Module - Template Editor
4
  *
5
+ * @version 5.6.8
6
  * @since 3.9.0
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/includes
47
  /**
48
  * Create_templates.
49
  *
50
+ * @version 5.6.8
51
  * @since 3.9.0
52
  * @todo [dev] also delete on "Reset settings"
53
  * @param string | array $sections defines the sections.
55
  */
56
  public function create_templates( $sections, $current_section ) {
57
  if ( $this->id === $current_section ) {
58
+ require_once ABSPATH . '/wp-admin/includes/file.php';
59
+ global $wp_filesystem;
60
+ WP_Filesystem();
61
  $this->delete_dir( wcj_get_wcj_uploads_dir( 'templates' ) );
62
  $templates_content = wcj_get_option( 'wcj_template_editor_templates_content', array() );
63
  foreach ( wcj_get_option( 'wcj_template_editor_templates_to_edit', array() ) as $template ) {
66
  $_template_file = $_template[ count( $_template ) - 1 ];
67
  $_template_dirs = str_replace( $_template_file, '', $template );
68
  $_template_path = wcj_get_wcj_uploads_dir( 'templates' . DIRECTORY_SEPARATOR . $_template_dirs ) . DIRECTORY_SEPARATOR . $_template_file;
69
+ $wp_filesystem->put_contents( $_template_path, $templates_content[ $template ], FS_CHMOD_FILE );
70
  }
71
  }
72
  }
includes/class-wcj-track-users.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Module - User Tracking
4
  *
5
- * @version 5.6.2
6
  * @since 3.1.3
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/includes
@@ -118,14 +118,15 @@ if ( ! class_exists( 'WCJ_Track_Users' ) ) :
118
  /**
119
  * Track_users_update_county_stats.
120
  *
121
- * @version 5.6.2
122
  * @since 2.9.1
123
  * @todo (maybe) `wp_nonce`
124
  */
125
  public function track_users_update_county_stats() {
126
- if ( isset( $_GET['wcj_track_users_update_county_stats'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification
 
127
  $this->track_users_generate_stats_cron( 'manual' );
128
- wp_safe_redirect( esc_url( remove_query_arg( 'wcj_track_users_update_county_stats' ) ) );
129
  exit;
130
  }
131
  }
@@ -215,7 +216,7 @@ if ( ! class_exists( 'WCJ_Track_Users' ) ) :
215
  /**
216
  * Add_http_referer_to_order.
217
  *
218
- * @version 5.6.2
219
  * @since 2.9.1
220
  * @todo add "all orders by referer type" stats
221
  * @param int $order_id defines the order_id.
@@ -224,7 +225,7 @@ if ( ! class_exists( 'WCJ_Track_Users' ) ) :
224
  global $wpdb;
225
  $table_name = $wpdb->prefix . 'wcj_track_users';
226
  $http_referer = 'N/A';
227
- if ( $wpdb->get_var( "SHOW TABLES LIKE '$table_name'" ) === $table_name ) {// phpcs:ignore
228
  $user_ip = ( class_exists( 'WC_Geolocation' ) ? WC_Geolocation::get_ip_address() : wcj_get_the_ip() );
229
  $result = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM {$wpdb->prefix}wcj_track_users WHERE ip = %s ORDER BY time DESC", $user_ip ) ); // WPCS: db call ok and cache ok.
230
  if ( $result ) {
@@ -237,18 +238,18 @@ if ( ! class_exists( 'WCJ_Track_Users' ) ) :
237
  /**
238
  * Maybe_delete_track_users_stats.
239
  *
240
- * @version 5.6.2
241
  * @since 2.9.1
242
  * @todo (maybe) wp_nonce
243
  */
244
  public function maybe_delete_track_users_stats() {
245
- if ( isset( $_GET['wcj_delete_track_users_stats'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification
 
246
  global $wpdb;
247
- $table_name = $wpdb->prefix . 'wcj_track_users';
248
- $wpdb->query( "DROP TABLE IF EXISTS {$wpdb->prefix}wcj_track_users" ); //phpcs:ignore.
249
  delete_option( 'wcj_track_users_stats_by_country' );
250
  delete_option( 'wcj_track_users_cron_time_last_run' );
251
- wp_safe_redirect( remove_query_arg( 'wcj_delete_track_users_stats' ) );
252
  exit;
253
  }
254
  }
@@ -286,7 +287,7 @@ if ( ! class_exists( 'WCJ_Track_Users' ) ) :
286
  /**
287
  * Generate_track_users_stats_by_country.
288
  *
289
- * @version 5.6.2
290
  * @since 2.9.1
291
  * @param string | int $scope defines the scope.
292
  */
@@ -295,16 +296,15 @@ if ( ! class_exists( 'WCJ_Track_Users' ) ) :
295
  $table_name = $wpdb->prefix . 'wcj_track_users';
296
  switch ( $scope ) {
297
  case 'all_time':
298
- $select_query = "SELECT * FROM $table_name";
299
  break;
300
  default:
301
- $time_expired = gmdate( 'Y-m-d H:i:s', ( gmdate( 'U' ) - $scope * 24 * 60 * 60 ) );
302
- $select_query = "SELECT * FROM $table_name WHERE time > '" . $time_expired . "'";
303
  break;
304
  }
305
- $totals = array();
306
- $results = $wpdb->get_results( $select_query ); // phpcs:ignore
307
- if ( $wpdb->get_var( "SHOW TABLES LIKE '$table_name'" ) === $table_name && ( $results ) ) { // phpcs:ignore
308
  foreach ( $results as $result ) {
309
  if ( ! isset( $totals[ $result->country ] ) ) {
310
  $totals[ $result->country ] = 1;
@@ -320,7 +320,7 @@ if ( ! class_exists( 'WCJ_Track_Users' ) ) :
320
  /**
321
  * Track_users_by_country_dashboard_widget.
322
  *
323
- * @version 5.6.2
324
  * @since 2.9.1
325
  * @todo (maybe) display all info (IP, referer etc.) on country click
326
  * @todo (maybe) display stats by day and/or month
@@ -360,7 +360,14 @@ if ( ! class_exists( 'WCJ_Track_Users' ) ) :
360
  }
361
  }
362
  echo '<p>' .
363
- '<a class="button-primary" href="' . esc_url( add_query_arg( 'wcj_delete_track_users_stats', '1' ) ) . '" ' .
 
 
 
 
 
 
 
364
  'onclick="return confirm(\'' . wp_kses_post( 'Are you sure?', 'woocommerce-jetpack' ) . '\')"' .
365
  '>' . wp_kses_post( 'Delete all tracking data', 'woocommerce-jetpack' ) . '</a>' .
366
  '</p>';
@@ -371,14 +378,21 @@ if ( ! class_exists( 'WCJ_Track_Users' ) ) :
371
  echo '<p>' .
372
  /* translators: %1$s, %2$s translators Added */
373
  sprintf( esc_html__( 'Stats generated at %1$s. Next update is scheduled at %2$s.', 'woocommerce-jetpack' ), esc_html( $cron_last_run ), esc_html( $cron_next_schedule ) ) . ' ' .
374
- '<a href="' . esc_url( add_query_arg( 'wcj_track_users_update_county_stats', '1' ) ) . '">' . esc_html__( 'Update now', 'woocommerce-jetpack' ) . '</a>.' .
 
 
 
 
 
 
 
375
  '</p>';
376
  }
377
 
378
  /**
379
  * Enqueue_track_users_script.
380
  *
381
- * @version 5.6.2
382
  * @since 2.9.1
383
  */
384
  public function enqueue_track_users_script() {
@@ -389,6 +403,7 @@ if ( ! class_exists( 'WCJ_Track_Users' ) ) :
389
  array(
390
  'ajax_url' => admin_url( 'admin-ajax.php' ),
391
  'http_referer' => ( isset( $_SERVER['HTTP_REFERER'] ) ? sanitize_text_field( wp_unslash( $_SERVER['HTTP_REFERER'] ) ) : 'N/A' ),
 
392
  'user_ip' => ( class_exists( 'WC_Geolocation' ) ? WC_Geolocation::get_ip_address() : wcj_get_the_ip() ),
393
  )
394
  );
@@ -397,19 +412,20 @@ if ( ! class_exists( 'WCJ_Track_Users' ) ) :
397
  /**
398
  * Track_users.
399
  *
400
- * @version 5.6.2
401
  * @since 2.9.1
402
  * @todo (maybe) customizable `$time_expired`
403
  * @todo (maybe) optionally do not track selected user roles (e.g. admin)
404
  */
405
  public function track_users() {
406
- if ( ! isset( $_POST['wcj_user_ip'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification
 
407
  die();
408
  }
409
- $user_ip = sanitize_text_field( wp_unslash( $_POST['wcj_user_ip'] ) ); // phpcs:ignore WordPress.Security.NonceVerification
410
  global $wpdb;
411
  $table_name = $wpdb->prefix . 'wcj_track_users';
412
- if ( $wpdb->get_var( "SHOW TABLES LIKE '$table_name'" ) !== $table_name ) { //phpcs:ignore
413
  // Create DB table.
414
  $charset_collate = $wpdb->get_charset_collate();
415
  $sql = "CREATE TABLE $table_name (
@@ -425,8 +441,8 @@ if ( ! class_exists( 'WCJ_Track_Users' ) ) :
425
  dbDelta( $sql );
426
  } else {
427
  // Check if already tracked recently.
428
- $time_expired = gmdate( 'Y-m-d H:i:s', strtotime( '-1 day', gmdate( 'U' ) ) );
429
- $result = $wpdb->get_row( "SELECT * FROM $table_name WHERE ip = '$user_ip' AND time > '$time_expired'" ); //phpcs:ignore
430
  if ( $result ) {
431
  return;
432
  }
@@ -437,7 +453,7 @@ if ( ! class_exists( 'WCJ_Track_Users' ) ) :
437
  'state' => '',
438
  ) );
439
  // HTTP referrer.
440
- $http_referer = ( isset( $_POST['wcj_http_referer'] ) ? sanitize_text_field( wp_unslash( $_POST['wcj_http_referer'] ) ) : 'N/A' ); // phpcs:ignore WordPress.Security.NonceVerification
441
  // Add row to DB table.
442
  $wpdb->insert(
443
  $table_name,
2
  /**
3
  * Booster for WooCommerce - Module - User Tracking
4
  *
5
+ * @version 5.6.8
6
  * @since 3.1.3
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/includes
118
  /**
119
  * Track_users_update_county_stats.
120
  *
121
+ * @version 5.6.8
122
  * @since 2.9.1
123
  * @todo (maybe) `wp_nonce`
124
  */
125
  public function track_users_update_county_stats() {
126
+ $wpnonce = isset( $_REQUEST['_wpnonce'] ) ? wp_verify_nonce( sanitize_key( $_REQUEST['_wpnonce'] ), 'wcj_track_users_update_county_stats' ) : false;
127
+ if ( $wpnonce && isset( $_GET['wcj_track_users_update_county_stats'] ) ) {
128
  $this->track_users_generate_stats_cron( 'manual' );
129
+ wp_safe_redirect( esc_url( remove_query_arg( array( 'wcj_track_users_update_county_stats', '_wpnonce' ) ) ) );
130
  exit;
131
  }
132
  }
216
  /**
217
  * Add_http_referer_to_order.
218
  *
219
+ * @version 5.6.8
220
  * @since 2.9.1
221
  * @todo add "all orders by referer type" stats
222
  * @param int $order_id defines the order_id.
225
  global $wpdb;
226
  $table_name = $wpdb->prefix . 'wcj_track_users';
227
  $http_referer = 'N/A';
228
+ if ( $wpdb->get_var( $wpdb->prepare( 'SHOW TABLES LIKE %s', $table_name ) ) === $table_name ) {// phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching
229
  $user_ip = ( class_exists( 'WC_Geolocation' ) ? WC_Geolocation::get_ip_address() : wcj_get_the_ip() );
230
  $result = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM {$wpdb->prefix}wcj_track_users WHERE ip = %s ORDER BY time DESC", $user_ip ) ); // WPCS: db call ok and cache ok.
231
  if ( $result ) {
238
  /**
239
  * Maybe_delete_track_users_stats.
240
  *
241
+ * @version 5.6.8
242
  * @since 2.9.1
243
  * @todo (maybe) wp_nonce
244
  */
245
  public function maybe_delete_track_users_stats() {
246
+ $wpnonce = isset( $_REQUEST['_wpnonce'] ) ? wp_verify_nonce( sanitize_key( $_REQUEST['_wpnonce'] ), 'wcj_delete_track_users_stats' ) : false;
247
+ if ( $wpnonce && isset( $_GET['wcj_delete_track_users_stats'] ) ) {
248
  global $wpdb;
249
+ $wpdb->query( "DROP TABLE IF EXISTS {$wpdb->prefix}wcj_track_users" );// phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange
 
250
  delete_option( 'wcj_track_users_stats_by_country' );
251
  delete_option( 'wcj_track_users_cron_time_last_run' );
252
+ wp_safe_redirect( remove_query_arg( array( 'wcj_delete_track_users_stats', '_wpnonce' ) ) );
253
  exit;
254
  }
255
  }
287
  /**
288
  * Generate_track_users_stats_by_country.
289
  *
290
+ * @version 5.6.8
291
  * @since 2.9.1
292
  * @param string | int $scope defines the scope.
293
  */
296
  $table_name = $wpdb->prefix . 'wcj_track_users';
297
  switch ( $scope ) {
298
  case 'all_time':
299
+ $results = $wpdb->get_results( "SELECT * FROM {$wpdb->prefix}wcj_track_users" );// phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching
300
  break;
301
  default:
302
+ $time_expired = gmdate( 'Y-m-d H:i:s', ( wcj_get_timestamp_date_from_gmt() - $scope * 24 * 60 * 60 ) );
303
+ $results = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM {$wpdb->prefix}wcj_track_users WHERE time > %s", $time_expired ) );// phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching
304
  break;
305
  }
306
+ $totals = array();
307
+ if ( $wpdb->get_var( $wpdb->prepare( 'SHOW TABLES LIKE %s', $table_name ) ) === $table_name && ( $results ) ) {// phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching
 
308
  foreach ( $results as $result ) {
309
  if ( ! isset( $totals[ $result->country ] ) ) {
310
  $totals[ $result->country ] = 1;
320
  /**
321
  * Track_users_by_country_dashboard_widget.
322
  *
323
+ * @version 5.6.8
324
  * @since 2.9.1
325
  * @todo (maybe) display all info (IP, referer etc.) on country click
326
  * @todo (maybe) display stats by day and/or month
360
  }
361
  }
362
  echo '<p>' .
363
+ '<a class="button-primary" href="' . esc_url(
364
+ add_query_arg(
365
+ array(
366
+ 'wcj_delete_track_users_stats' => '1',
367
+ '_wpnonce' => wp_create_nonce( 'wcj_delete_track_users_stats' ),
368
+ )
369
+ )
370
+ ) . '" ' .
371
  'onclick="return confirm(\'' . wp_kses_post( 'Are you sure?', 'woocommerce-jetpack' ) . '\')"' .
372
  '>' . wp_kses_post( 'Delete all tracking data', 'woocommerce-jetpack' ) . '</a>' .
373
  '</p>';
378
  echo '<p>' .
379
  /* translators: %1$s, %2$s translators Added */
380
  sprintf( esc_html__( 'Stats generated at %1$s. Next update is scheduled at %2$s.', 'woocommerce-jetpack' ), esc_html( $cron_last_run ), esc_html( $cron_next_schedule ) ) . ' ' .
381
+ '<a href="' . esc_url(
382
+ add_query_arg(
383
+ array(
384
+ 'wcj_track_users_update_county_stats' => '1',
385
+ '_wpnonce' => wp_create_nonce( 'wcj_track_users_update_county_stats' ),
386
+ )
387
+ )
388
+ ) . '">' . esc_html__( 'Update now', 'woocommerce-jetpack' ) . '</a>.' .
389
  '</p>';
390
  }
391
 
392
  /**
393
  * Enqueue_track_users_script.
394
  *
395
+ * @version 5.6.8
396
  * @since 2.9.1
397
  */
398
  public function enqueue_track_users_script() {
403
  array(
404
  'ajax_url' => admin_url( 'admin-ajax.php' ),
405
  'http_referer' => ( isset( $_SERVER['HTTP_REFERER'] ) ? sanitize_text_field( wp_unslash( $_SERVER['HTTP_REFERER'] ) ) : 'N/A' ),
406
+ 'wpnonce' => wp_create_nonce( 'wcj-track-users' ),
407
  'user_ip' => ( class_exists( 'WC_Geolocation' ) ? WC_Geolocation::get_ip_address() : wcj_get_the_ip() ),
408
  )
409
  );
412
  /**
413
  * Track_users.
414
  *
415
+ * @version 5.6.8
416
  * @since 2.9.1
417
  * @todo (maybe) customizable `$time_expired`
418
  * @todo (maybe) optionally do not track selected user roles (e.g. admin)
419
  */
420
  public function track_users() {
421
+ $wpnonce = isset( $_REQUEST['wpnonce'] ) ? wp_verify_nonce( sanitize_key( $_REQUEST['wpnonce'] ), 'wcj-track-users' ) : false;
422
+ if ( ! $wpnonce || ! isset( $_POST['wcj_user_ip'] ) ) {
423
  die();
424
  }
425
+ $user_ip = sanitize_text_field( wp_unslash( $_POST['wcj_user_ip'] ) );
426
  global $wpdb;
427
  $table_name = $wpdb->prefix . 'wcj_track_users';
428
+ if ( $wpdb->get_var( $wpdb->prepare( 'SHOW TABLES LIKE %s', $table_name ) ) !== $table_name ) {// phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching
429
  // Create DB table.
430
  $charset_collate = $wpdb->get_charset_collate();
431
  $sql = "CREATE TABLE $table_name (
441
  dbDelta( $sql );
442
  } else {
443
  // Check if already tracked recently.
444
+ $time_expired = gmdate( 'Y-m-d H:i:s', strtotime( '-1 day', wcj_get_timestamp_date_from_gmt() ) );
445
+ $result = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM {$wpdb->prefix}wcj_track_users WHERE ip = %s AND time > %s", $user_ip, $time_expired ) );// phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching
446
  if ( $result ) {
447
  return;
448
  }
453
  'state' => '',
454
  ) );
455
  // HTTP referrer.
456
+ $http_referer = ( isset( $_POST['wcj_http_referer'] ) ? sanitize_text_field( wp_unslash( $_POST['wcj_http_referer'] ) ) : 'N/A' );
457
  // Add row to DB table.
458
  $wpdb->insert(
459
  $table_name,
includes/class-wcj-wpml.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Module - WPML
4
  *
5
- * @version 5.6.2
6
  * @since 2.2.0
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/includes
@@ -191,14 +191,15 @@ if ( ! class_exists( 'WCJ_WPML' ) ) :
191
  /**
192
  * Create_wpml_xml_file.
193
  *
194
- * @version 5.6.2
195
  * @since 2.4.1
196
  */
197
  public function create_wpml_xml_file_tool() {
198
- if ( ! isset( $_GET['create_wpml_xml_file'] ) || ! wcj_is_user_role( 'administrator' ) ) { // phpcs:ignore WordPress.Security.NonceVerification
 
199
  return;
200
  }
201
- if ( ! isset( $_GET['section'] ) || 'wpml' !== $_GET['section'] ) { // phpcs:ignore WordPress.Security.NonceVerification
202
  return;
203
  }
204
  $this->create_wpml_xml_file();
2
  /**
3
  * Booster for WooCommerce - Module - WPML
4
  *
5
+ * @version 5.6.8
6
  * @since 2.2.0
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/includes
191
  /**
192
  * Create_wpml_xml_file.
193
  *
194
+ * @version 5.6.8
195
  * @since 2.4.1
196
  */
197
  public function create_wpml_xml_file_tool() {
198
+ $wpnonce = isset( $_REQUEST['wcj-cat-nonce'] ) ? wp_verify_nonce( sanitize_key( $_REQUEST['wcj-cat-nonce'] ), 'wcj-cat-nonce' ) : false;
199
+ if ( ! $wpnonce || ! isset( $_GET['create_wpml_xml_file'] ) || ! wcj_is_user_role( 'administrator' ) ) {
200
  return;
201
  }
202
+ if ( ! isset( $_GET['section'] ) || 'wpml' !== $_GET['section'] ) {
203
  return;
204
  }
205
  $this->create_wpml_xml_file();
includes/classes/class-wcj-dummy-term.php ADDED
@@ -0,0 +1,37 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Booster for WooCommerce - Dummy Term
4
+ *
5
+ * @version 5.6.8
6
+ * @since 2.6.0
7
+ * @author Pluggabl LLC.
8
+ * @package Booster_For_WooCommerce/classes
9
+ */
10
+
11
+ if ( ! defined( 'ABSPATH' ) ) {
12
+ exit;
13
+ }
14
+
15
+ if ( ! class_exists( 'WCJ_Dummy_Term' ) ) {
16
+ /**
17
+ * WCJ_Dummy_Term class.
18
+ *
19
+ * @version 5.6.8
20
+ * @since 2.6.0
21
+ */
22
+ class WCJ_Dummy_Term {
23
+ /**
24
+ * Term_id class.
25
+ *
26
+ * @var term_id.
27
+ */
28
+
29
+ public $term_id;
30
+ /**
31
+ * Constructor.
32
+ */
33
+ public function __construct() {
34
+ $this->term_id = 0;
35
+ }
36
+ }
37
+ }
includes/classes/class-wcj-invoice.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce Invoice
4
  *
5
- * @version 5.6.2
6
  * @author Pluggabl LLC.
7
  * @package Booster_For_WooCommerce/classes
8
  */
@@ -68,7 +68,7 @@ if ( ! class_exists( 'WCJ_Invoice' ) ) :
68
  /**
69
  * Create.
70
  *
71
- * @version 5.6.2
72
  * @todo use mysql transaction enabled (as in "wcj_order_number_use_mysql_transaction_enabled")
73
  * @todo used get_option instead wcj_get_option to get current numbering_counter.
74
  * @param number $date get date.
@@ -89,7 +89,7 @@ if ( ! class_exists( 'WCJ_Invoice' ) ) :
89
  } else {
90
  $the_invoice_number = $order_id;
91
  }
92
- $the_date = ( '' === $date ) ? (string) gmdate( 'U' ) : $date;
93
  update_post_meta( $order_id, '_wcj_invoicing_' . $invoice_type . '_number_id', $the_invoice_number );
94
  update_post_meta( $order_id, '_wcj_invoicing_' . $invoice_type . '_date', $the_date );
95
  }
2
  /**
3
  * Booster for WooCommerce Invoice
4
  *
5
+ * @version 5.6.8
6
  * @author Pluggabl LLC.
7
  * @package Booster_For_WooCommerce/classes
8
  */
68
  /**
69
  * Create.
70
  *
71
+ * @version 5.6.8
72
  * @todo use mysql transaction enabled (as in "wcj_order_number_use_mysql_transaction_enabled")
73
  * @todo used get_option instead wcj_get_option to get current numbering_counter.
74
  * @param number $date get date.
89
  } else {
90
  $the_invoice_number = $order_id;
91
  }
92
+ $the_date = ( '' === $date ) ? (string) wcj_get_timestamp_date_from_gmt() : $date;
93
  update_post_meta( $order_id, '_wcj_invoicing_' . $invoice_type . '_number_id', $the_invoice_number );
94
  update_post_meta( $order_id, '_wcj_invoicing_' . $invoice_type . '_date', $the_date );
95
  }
includes/classes/class-wcj-module.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce Module
4
  *
5
- * @version 5.6.7
6
  * @since 2.2.0
7
  * @author Pluggabl LLC.
8
  * @todo [dev] maybe should be `abstract` ?
@@ -505,15 +505,13 @@ if ( ! class_exists( 'WCJ_Module' ) ) :
505
  /**
506
  * Admin_notices.
507
  *
508
- * @version 5.6.2
509
  * @since 2.5.3
510
  */
511
  public function admin_notices() {
512
- $wpnonce = true;
513
- if ( function_exists( 'wp_verify_nonce' ) ) {
514
- $wpnonce = isset( $_REQUEST['_wpnonce'] ) ? wp_verify_nonce( sanitize_key( isset( $_REQUEST['_wpnonce'] ) ? $_REQUEST['_wpnonce'] : 'woocommerce-settings' ) ) : true;
515
- }
516
- if ( ! $wpnonce || ! isset( $_GET[ 'wcj_' . $this->id . '_admin_notice' ] ) ) {
517
  return;
518
  }
519
  echo '<div class="error"><p><div class="message">' . wp_kses_post( $this->get_the_notice() ) . '</div></p></div>';
@@ -834,12 +832,12 @@ if ( ! class_exists( 'WCJ_Module' ) ) :
834
  /**
835
  * Get_back_to_settings_link_html.
836
  *
837
- * @version 2.3.10
838
  * @since 2.2.3
839
  */
840
  public function get_back_to_settings_link_html() {
841
  $cat_id = $this->get_cat_by_section( $this->id );
842
- $the_link = admin_url( 'admin.php?page=wc-settings&tab=jetpack&wcj-cat=' . $cat_id . '&section=' . $this->id );
843
  return '<a href="' . $the_link . '"><< ' . __( 'Back to Module Settings', 'woocommerce-jetpack' ) . '</a>';
844
  }
845
 
2
  /**
3
  * Booster for WooCommerce Module
4
  *
5
+ * @version 5.6.8
6
  * @since 2.2.0
7
  * @author Pluggabl LLC.
8
  * @todo [dev] maybe should be `abstract` ?
505
  /**
506
  * Admin_notices.
507
  *
508
+ * @version 5.6.8
509
  * @since 2.5.3
510
  */
511
  public function admin_notices() {
512
+ $_get = array();
513
+ parse_str( isset( $_SERVER['QUERY_STRING'] ) ? sanitize_text_field( wp_unslash( $_SERVER['QUERY_STRING'] ) ) : '', $_get );
514
+ if ( ! $wpnonce || ! isset( $_get[ 'wcj_' . $this->id . '_admin_notice' ] ) ) {
 
 
515
  return;
516
  }
517
  echo '<div class="error"><p><div class="message">' . wp_kses_post( $this->get_the_notice() ) . '</div></p></div>';
832
  /**
833
  * Get_back_to_settings_link_html.
834
  *
835
+ * @version 5.6.8
836
  * @since 2.2.3
837
  */
838
  public function get_back_to_settings_link_html() {
839
  $cat_id = $this->get_cat_by_section( $this->id );
840
+ $the_link = admin_url( wcj_admin_tab_url() . '&wcj-cat=' . $cat_id . '&section=' . $this->id );
841
  return '<a href="' . $the_link . '"><< ' . __( 'Back to Module Settings', 'woocommerce-jetpack' ) . '</a>';
842
  }
843
 
includes/core/class-wcj-admin.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Core - Admin
4
  *
5
- * @version 5.6.7
6
  * @since 3.2.4
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/core
@@ -84,13 +84,13 @@ if ( ! class_exists( 'WCJ_Admin' ) ) :
84
  /**
85
  * Admin_footer_text
86
  *
87
- * @version 5.6.7
88
  * @param string $footer_text get admin footer texts.
89
  */
90
  public function admin_footer_text( $footer_text ) {
91
- $wpnonce = isset( $_REQUEST['_wpnonce'] ) ? wp_verify_nonce( sanitize_key( $_REQUEST['_wpnonce'] ) ) : true;
92
- if ( isset( $_GET['page'] ) && $wpnonce ) {
93
- if ( 'wcj-tools' === $_GET['page'] || ( 'wc-settings' === $_GET['page'] && isset( $_GET['tab'] ) && 'jetpack' === $_GET['tab'] ) ) {
94
  ?>
95
  <div class="wclj_tl_foot">
96
  <div class="wcj-footer">
@@ -116,7 +116,7 @@ if ( ! class_exists( 'WCJ_Admin' ) ) :
116
  /**
117
  * Add menu item
118
  *
119
- * @version 3.5.3
120
  */
121
  public function booster_menu() {
122
  add_submenu_page(
@@ -124,7 +124,7 @@ if ( ! class_exists( 'WCJ_Admin' ) ) :
124
  __( 'Booster for WooCommerce', 'woocommerce-jetpack' ),
125
  __( 'Booster Settings', 'woocommerce-jetpack' ),
126
  ( 'yes' === wcj_get_option( 'wcj_admin_tools_enabled', 'no' ) && 'yes' === wcj_get_option( 'wcj_admin_tools_show_menus_to_admin_only', 'no' ) ? 'manage_options' : 'manage_woocommerce' ),
127
- 'admin.php?page=wc-settings&tab=jetpack'
128
  );
129
  }
130
 
@@ -137,7 +137,7 @@ if ( ! class_exists( 'WCJ_Admin' ) ) :
137
  */
138
  public function action_links( $links ) {
139
  $custom_links = array(
140
- '<a href="' . admin_url( 'admin.php?page=wc-settings&tab=jetpack' ) . '">' . __( 'Settings', 'woocommerce' ) . '</a>',
141
  '<a href="' . esc_url( 'https://booster.io/' ) . '">' . __( 'Docs', 'woocommerce-jetpack' ) . '</a>',
142
  );
143
  if ( 'woocommerce-jetpack.php' === basename( WCJ_FREE_PLUGIN_FILE ) ) {
2
  /**
3
  * Booster for WooCommerce - Core - Admin
4
  *
5
+ * @version 5.6.8
6
  * @since 3.2.4
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/core
84
  /**
85
  * Admin_footer_text
86
  *
87
+ * @version 5.6.8
88
  * @param string $footer_text get admin footer texts.
89
  */
90
  public function admin_footer_text( $footer_text ) {
91
+ if ( isset( $_GET['page'] ) ) {
92
+ $wpnonce = isset( $_REQUEST['wcj-cat-nonce'] ) ? wp_verify_nonce( sanitize_key( $_REQUEST['wcj-cat-nonce'] ), 'wcj-cat-nonce' ) : false;
93
+ if ( 'wcj-tools' === $_GET['page'] || ( $wpnonce && 'wc-settings' === $_GET['page'] && isset( $_GET['tab'] ) && 'jetpack' === $_GET['tab'] ) ) {
94
  ?>
95
  <div class="wclj_tl_foot">
96
  <div class="wcj-footer">
116
  /**
117
  * Add menu item
118
  *
119
+ * @version 5.6.8
120
  */
121
  public function booster_menu() {
122
  add_submenu_page(
124
  __( 'Booster for WooCommerce', 'woocommerce-jetpack' ),
125
  __( 'Booster Settings', 'woocommerce-jetpack' ),
126
  ( 'yes' === wcj_get_option( 'wcj_admin_tools_enabled', 'no' ) && 'yes' === wcj_get_option( 'wcj_admin_tools_show_menus_to_admin_only', 'no' ) ? 'manage_options' : 'manage_woocommerce' ),
127
+ wcj_admin_tab_url()
128
  );
129
  }
130
 
137
  */
138
  public function action_links( $links ) {
139
  $custom_links = array(
140
+ '<a href="' . admin_url( wcj_admin_tab_url() ) . '">' . __( 'Settings', 'woocommerce' ) . '</a>',
141
  '<a href="' . esc_url( 'https://booster.io/' ) . '">' . __( 'Docs', 'woocommerce-jetpack' ) . '</a>',
142
  );
143
  if ( 'woocommerce-jetpack.php' === basename( WCJ_FREE_PLUGIN_FILE ) ) {
includes/css/wcj-admin.css CHANGED
@@ -1,7 +1,7 @@
1
  /**
2
  * wcj-admin.
3
  *
4
- * @version 5.6.1
5
  * @since 2.5.3
6
  */
7
 
@@ -318,3 +318,7 @@ img.wcj-rocket-icon:hover {
318
  #order_data .order_data_column p {
319
  word-break: break-word;
320
  }
 
 
 
 
1
  /**
2
  * wcj-admin.
3
  *
4
+ * @version 5.6.8
5
  * @since 2.5.3
6
  */
7
 
318
  #order_data .order_data_column p {
319
  word-break: break-word;
320
  }
321
+
322
+ .wcj-row td {
323
+ line-break: anywhere;
324
+ }
includes/exchange-rates/class-wcj-exchange-rates.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce Exchange Rates
4
  *
5
- * @version 5.6.2
6
  * @author Pluggabl LLC.
7
  * @package Booster_For_WooCommerce/includes
8
  */
@@ -52,7 +52,7 @@ if ( ! class_exists( 'WCJ_Exchange_Rates' ) ) :
52
  /**
53
  * Register_script.
54
  *
55
- * @version 5.6.2
56
  */
57
  public function register_script() {
58
  if (
@@ -77,6 +77,7 @@ if ( ! class_exists( 'WCJ_Exchange_Rates' ) ) :
77
  'ajax_object',
78
  array(
79
  'ajax_url' => admin_url( 'admin-ajax.php' ),
 
80
  )
81
  );
82
  }
2
  /**
3
  * Booster for WooCommerce Exchange Rates
4
  *
5
+ * @version 5.6.8
6
  * @author Pluggabl LLC.
7
  * @package Booster_For_WooCommerce/includes
8
  */
52
  /**
53
  * Register_script.
54
  *
55
+ * @version 5.6.8
56
  */
57
  public function register_script() {
58
  if (
77
  'ajax_object',
78
  array(
79
  'ajax_url' => admin_url( 'admin-ajax.php' ),
80
+ 'wpnonce' => wp_create_nonce( 'ajax-nonce' ),
81
  )
82
  );
83
  }
includes/export/class-wcj-exporter-orders.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce Exporter Orders
4
  *
5
- * @version 5.6.2
6
  * @since 2.5.9
7
  * @author Pluggabl LLC.
8
  * @todo filter export by date
@@ -218,17 +218,14 @@ if ( ! class_exists( 'WCJ_Exporter_Orders' ) ) :
218
  /**
219
  * Export_orders.
220
  *
221
- * @version 5.6.2
222
  * @since 2.4.8
223
  * @param object $fields_helper defines the fields helper.
224
  *
225
  * @todo (maybe) metainfo as separate column
226
  */
227
  public function export_orders( $fields_helper ) {
228
- $wpnonce = true;
229
- if ( function_exists( 'wp_verify_nonce' ) ) {
230
- $wpnonce = isset( $_REQUEST['_wpnonce'] ) ? wp_verify_nonce( sanitize_key( isset( $_REQUEST['_wpnonce'] ) ? $_REQUEST['_wpnonce'] : '' ) ) : true;
231
- }
232
  // Standard Fields.
233
  $all_fields = $fields_helper->get_order_export_fields();
234
  $fields_ids = wcj_get_option( 'wcj_export_orders_fields', $fields_helper->get_order_export_default_fields_ids() );
@@ -341,15 +338,12 @@ if ( ! class_exists( 'WCJ_Exporter_Orders' ) ) :
341
  /**
342
  * Export_orders_items.
343
  *
344
- * @version 5.6.2
345
  * @since 2.5.9
346
  * @param object $fields_helper defines the fields helper.
347
  */
348
  public function export_orders_items( $fields_helper ) {
349
- $wpnonce = true;
350
- if ( function_exists( 'wp_verify_nonce' ) ) {
351
- $wpnonce = isset( $_REQUEST['_wpnonce'] ) ? wp_verify_nonce( sanitize_key( isset( $_REQUEST['_wpnonce'] ) ? $_REQUEST['_wpnonce'] : '' ) ) : true;
352
- }
353
  // Standard Fields.
354
  $all_fields = $fields_helper->get_order_items_export_fields();
355
  $fields_ids = apply_filters( 'wcj_export_orders_items_fields', wcj_get_option( 'wcj_export_orders_items_fields', $fields_helper->get_order_items_export_default_fields_ids() ) );
2
  /**
3
  * Booster for WooCommerce Exporter Orders
4
  *
5
+ * @version 5.6.8
6
  * @since 2.5.9
7
  * @author Pluggabl LLC.
8
  * @todo filter export by date
218
  /**
219
  * Export_orders.
220
  *
221
+ * @version 5.6.8
222
  * @since 2.4.8
223
  * @param object $fields_helper defines the fields helper.
224
  *
225
  * @todo (maybe) metainfo as separate column
226
  */
227
  public function export_orders( $fields_helper ) {
228
+ $wpnonce = isset( $_REQUEST['wcj_tools_nonce'] ) ? wp_verify_nonce( sanitize_key( $_REQUEST['wcj_tools_nonce'] ), 'wcj_tools' ) : false;
 
 
 
229
  // Standard Fields.
230
  $all_fields = $fields_helper->get_order_export_fields();
231
  $fields_ids = wcj_get_option( 'wcj_export_orders_fields', $fields_helper->get_order_export_default_fields_ids() );
338
  /**
339
  * Export_orders_items.
340
  *
341
+ * @version 5.6.8
342
  * @since 2.5.9
343
  * @param object $fields_helper defines the fields helper.
344
  */
345
  public function export_orders_items( $fields_helper ) {
346
+ $wpnonce = isset( $_REQUEST['wcj_tools_nonce'] ) ? wp_verify_nonce( sanitize_key( $_REQUEST['wcj_tools_nonce'] ), 'wcj_tools' ) : false;
 
 
 
347
  // Standard Fields.
348
  $all_fields = $fields_helper->get_order_items_export_fields();
349
  $fields_ids = apply_filters( 'wcj_export_orders_items_fields', wcj_get_option( 'wcj_export_orders_items_fields', $fields_helper->get_order_items_export_default_fields_ids() ) );
includes/functions/wcj-functions-admin.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Functions - Admin
4
  *
5
- * @version 5.6.2
6
  * @since 2.9.0
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/functions
@@ -22,7 +22,7 @@ if ( ! function_exists( 'wcj_get_module_settings_admin_url' ) ) {
22
  * @param int $module_id defines the module_id.
23
  */
24
  function wcj_get_module_settings_admin_url( $module_id ) {
25
- return admin_url( 'admin.php?page=wc-settings&tab=jetpack&wcj-cat=' . wcj_get_module_category( $module_id ) . '&section=' . $module_id );
26
  }
27
  }
28
 
@@ -91,24 +91,22 @@ if ( ! function_exists( 'wcj_is_admin_product_edit_page' ) ) {
91
  /**
92
  * Wcj_is_admin_product_edit_page.
93
  *
94
- * @version 5.6.2
95
  * @since 3.2.4
96
  * @todo use where appropriate
97
  * @todo (maybe) move to `wcj-functions-conditional.php`
98
  */
99
  function wcj_is_admin_product_edit_page() {
100
  global $pagenow;
101
- $wpnonce = true;
102
- if ( function_exists( 'wp_verify_nonce' ) ) {
103
- $wpnonce = isset( $_REQUEST['_wpnonce'] ) ? wp_verify_nonce( sanitize_key( isset( $_REQUEST['_wpnonce'] ) ? $_REQUEST['_wpnonce'] : '' ) ) : true;
104
- }
105
- if ( $wpnonce && is_admin() && 'post.php' === $pagenow && isset( $_GET['action'] ) && 'edit' === $_GET['action'] && 'product' === get_post_type() ) {
106
  return true;
107
  } elseif ( is_admin() && defined( 'DOING_AJAX' ) && DOING_AJAX && isset( $_REQUEST['action'] ) && 'woocommerce_load_variations' === $_REQUEST['action'] ) {
108
  return true;
109
  } else {
110
  return false;
111
  }
 
112
  }
113
  }
114
 
2
  /**
3
  * Booster for WooCommerce - Functions - Admin
4
  *
5
+ * @version 5.6.8
6
  * @since 2.9.0
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/functions
22
  * @param int $module_id defines the module_id.
23
  */
24
  function wcj_get_module_settings_admin_url( $module_id ) {
25
+ return admin_url( wcj_admin_tab_url() . '&wcj-cat=' . wcj_get_module_category( $module_id ) . '&section=' . $module_id );
26
  }
27
  }
28
 
91
  /**
92
  * Wcj_is_admin_product_edit_page.
93
  *
94
+ * @version 5.6.8
95
  * @since 3.2.4
96
  * @todo use where appropriate
97
  * @todo (maybe) move to `wcj-functions-conditional.php`
98
  */
99
  function wcj_is_admin_product_edit_page() {
100
  global $pagenow;
101
+ // phpcs:disable WordPress.Security.NonceVerification
102
+ if ( is_admin() && 'post.php' === $pagenow && isset( $_GET['action'] ) && 'edit' === $_GET['action'] && 'product' === get_post_type() ) {
 
 
 
103
  return true;
104
  } elseif ( is_admin() && defined( 'DOING_AJAX' ) && DOING_AJAX && isset( $_REQUEST['action'] ) && 'woocommerce_load_variations' === $_REQUEST['action'] ) {
105
  return true;
106
  } else {
107
  return false;
108
  }
109
+ // phpcs:enable WordPress.Security.NonceVerification
110
  }
111
  }
112
 
includes/functions/wcj-functions-date-time.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Functions - Date and Time
4
  *
5
- * @version 5.6.2
6
  * @since 2.9.0
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/functions
@@ -81,7 +81,7 @@ if ( ! function_exists( 'wcj_check_date' ) ) {
81
  /**
82
  * Wcj_check_date.
83
  *
84
- * @version 5.6.2
85
  * @since 2.9.1
86
  * @param string $_date defines the _date.
87
  * @param array $args defines the args.
@@ -89,7 +89,7 @@ if ( ! function_exists( 'wcj_check_date' ) ) {
89
  function wcj_check_date( $_date, $args = array() ) {
90
 
91
  if ( empty( $args ) ) {
92
- $time_now = (int) gmdate( 'U' );
93
  $args['day_now'] = intval( gmdate( 'j', $time_now ) );
94
  }
95
  $_date = explode( ',', $_date );
@@ -173,14 +173,14 @@ if ( ! function_exists( 'wcj_check_time' ) ) {
173
  /**
174
  * Wcj_check_time.
175
  *
176
- * @version 5.6.2
177
  * @since 2.8.0
178
  * @param string $_time defines the _time.
179
  * @param array $args defines the args.
180
  */
181
  function wcj_check_time( $_time, $args = array() ) {
182
  if ( empty( $args ) ) {
183
- $time_now = (int) gmdate( 'U' );
184
  $args['hours_now'] = intval( gmdate( 'H', $time_now ) );
185
  $args['minutes_now'] = intval( gmdate( 'i', $time_now ) );
186
  }
@@ -318,3 +318,35 @@ if ( ! function_exists( 'wcj_pretty_utc_date' ) ) {
318
  return date_i18n( $format, $seconds_since_local_1_jan_1970 );
319
  }
320
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2
  /**
3
  * Booster for WooCommerce - Functions - Date and Time
4
  *
5
+ * @version 5.6.8
6
  * @since 2.9.0
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/functions
81
  /**
82
  * Wcj_check_date.
83
  *
84
+ * @version 5.6.8
85
  * @since 2.9.1
86
  * @param string $_date defines the _date.
87
  * @param array $args defines the args.
89
  function wcj_check_date( $_date, $args = array() ) {
90
 
91
  if ( empty( $args ) ) {
92
+ $time_now = wcj_get_timestamp_date_from_gmt();
93
  $args['day_now'] = intval( gmdate( 'j', $time_now ) );
94
  }
95
  $_date = explode( ',', $_date );
173
  /**
174
  * Wcj_check_time.
175
  *
176
+ * @version 5.6.8
177
  * @since 2.8.0
178
  * @param string $_time defines the _time.
179
  * @param array $args defines the args.
180
  */
181
  function wcj_check_time( $_time, $args = array() ) {
182
  if ( empty( $args ) ) {
183
+ $time_now = wcj_get_timestamp_date_from_gmt();
184
  $args['hours_now'] = intval( gmdate( 'H', $time_now ) );
185
  $args['minutes_now'] = intval( gmdate( 'i', $time_now ) );
186
  }
318
  return date_i18n( $format, $seconds_since_local_1_jan_1970 );
319
  }
320
  }
321
+
322
+ if ( ! function_exists( 'wcj_get_date_from_gmt' ) ) {
323
+ /**
324
+ * Get date from gmt time.
325
+ *
326
+ * @version 5.6.8
327
+ * @since 5.6.8
328
+ *
329
+ * @param string $format get date from gmt.
330
+ * @return string
331
+ */
332
+ function wcj_get_date_from_gmt( $format = 'Y-m-d H:i:s' ) {
333
+ return get_date_from_gmt( gmdate( $format ), $format );
334
+ }
335
+ }
336
+
337
+
338
+
339
+ if ( ! function_exists( 'wcj_get_timestamp_date_from_gmt' ) ) {
340
+ /**
341
+ * Get timestamp date from gmt time.
342
+ *
343
+ * @version 5.6.8
344
+ * @since 5.6.8
345
+ *
346
+ * @param string $format get date from gmt.
347
+ * @return string
348
+ */
349
+ function wcj_get_timestamp_date_from_gmt( $format = 'Y-m-d H:i:s' ) {
350
+ return strtotime( wcj_get_date_from_gmt() );
351
+ }
352
+ }
includes/functions/wcj-functions-eu-vat.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Functions - EU VAT
4
  *
5
- * @version 5.6.2
6
  * @since 2.9.0
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/functions
@@ -16,7 +16,7 @@ if ( ! function_exists( 'wcj_validate_vat_no_soap' ) ) {
16
  /**
17
  * Wcj_validate_vat_no_soap.
18
  *
19
- * @version 5.6.2
20
  * @since 2.5.7
21
  * @return mixed: bool on successful checking (can be true or false), null otherwise
22
  * @param string $country_code defines the country_code.
@@ -25,20 +25,22 @@ if ( ! function_exists( 'wcj_validate_vat_no_soap' ) ) {
25
  */
26
  function wcj_validate_vat_no_soap( $country_code, $vat_number, $method ) {
27
  $country_code = strtoupper( $country_code );
28
- $api_url = esc_url(
29
  add_query_arg(
30
  array(
31
- 'ms' => $country_code,
32
- 'vat' => $vat_number,
33
- 'locale' => 'en',
34
  ),
35
- 'http://ec.europa.eu/taxation_customs/vies/viesquer.do'
36
  )
37
  );
38
  switch ( $method ) {
39
  case 'file_get_contents':
40
  if ( ini_get( 'allow_url_fopen' ) ) {
41
- $response = file_get_contents( $api_url ); //phpcs:ignore
 
 
 
42
  } else {
43
  return null;
44
  }
@@ -55,7 +57,13 @@ if ( ! function_exists( 'wcj_validate_vat_no_soap' ) ) {
55
  if ( false === $response ) {
56
  return null;
57
  }
58
- return ( false !== strpos( $response, '="validStyle"' ) );
 
 
 
 
 
 
59
  }
60
  }
61
 
2
  /**
3
  * Booster for WooCommerce - Functions - EU VAT
4
  *
5
+ * @version 5.6.8
6
  * @since 2.9.0
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/functions
16
  /**
17
  * Wcj_validate_vat_no_soap.
18
  *
19
+ * @version 5.6.8
20
  * @since 2.5.7
21
  * @return mixed: bool on successful checking (can be true or false), null otherwise
22
  * @param string $country_code defines the country_code.
25
  */
26
  function wcj_validate_vat_no_soap( $country_code, $vat_number, $method ) {
27
  $country_code = strtoupper( $country_code );
28
+ $api_url = esc_url_raw(
29
  add_query_arg(
30
  array(
31
+ 'requesterMemberStateCode' => $country_code,
32
+ 'requesterNumber' => $vat_number,
 
33
  ),
34
+ 'https://ec.europa.eu/taxation_customs/vies/rest-api/ms/' . $country_code . '/vat/' . $vat_number
35
  )
36
  );
37
  switch ( $method ) {
38
  case 'file_get_contents':
39
  if ( ini_get( 'allow_url_fopen' ) ) {
40
+ require_once ABSPATH . '/wp-admin/includes/file.php';
41
+ global $wp_filesystem;
42
+ WP_Filesystem();
43
+ $response = $wp_filesystem->get_contents( $api_url );
44
  } else {
45
  return null;
46
  }
57
  if ( false === $response ) {
58
  return null;
59
  }
60
+ $response = json_decode( $response );
61
+ $is_valid = 'isValid';
62
+ if ( $response->$is_valid ) {
63
+ return true;
64
+ } else {
65
+ return null;
66
+ }
67
  }
68
  }
69
 
includes/functions/wcj-functions-general.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Functions - General
4
  *
5
- * @version 5.6.3
6
  * @author Pluggabl LLC.
7
  * @todo add `wcj_add_actions()` and `wcj_add_filters()`
8
  * @package Booster_For_WooCommerce/functions
@@ -436,15 +436,12 @@ if ( ! function_exists( 'wcj_maybe_add_date_query' ) ) {
436
  /**
437
  * Wcj_maybe_add_date_query.
438
  *
439
- * @version 5.6.2
440
  * @since 3.0.0
441
  * @param array $args defines the args.
442
  */
443
  function wcj_maybe_add_date_query( $args ) {
444
- $wpnonce = true;
445
- if ( function_exists( 'wp_verify_nonce' ) ) {
446
- $wpnonce = isset( $_REQUEST['_wpnonce'] ) ? wp_verify_nonce( sanitize_key( isset( $_REQUEST['_wpnonce'] ) ? $_REQUEST['_wpnonce'] : '' ), 'woocommerce-settings' ) : true;
447
- }
448
  if ( ( $wpnonce && isset( $_GET['start_date'] ) && '' !== $_GET['start_date'] ) || ( isset( $_GET['end_date'] ) && '' !== $_GET['end_date'] ) ) {
449
  $date_query = array();
450
  $date_query['inclusive'] = true;
@@ -1035,7 +1032,7 @@ if ( ! function_exists( 'wcj_add_allowed_html' ) ) {
1035
  /**
1036
  * Wcj_add_allowed_html.
1037
  *
1038
- * @version 5.6.3
1039
  * @since 5.6.0
1040
  * @param array $allowed_html to get default allowed html.
1041
  * @param string $context to get default context.
@@ -1077,15 +1074,16 @@ if ( ! function_exists( 'wcj_add_allowed_html' ) ) {
1077
  'data-*' => true,
1078
  ),
1079
  'textarea' => array(
1080
- 'name' => true,
1081
- 'value' => true,
1082
- 'id' => true,
1083
- 'class' => true,
1084
- 'style' => true,
1085
- 'placeholder' => true,
1086
- 'required' => true,
1087
- 'disabled' => true,
1088
- 'onchange' => true,
 
1089
  ),
1090
  'select' => array(
1091
  'multiple' => true,
@@ -1096,6 +1094,7 @@ if ( ! function_exists( 'wcj_add_allowed_html' ) ) {
1096
  'size' => true,
1097
  'disabled' => true,
1098
  'onchange' => true,
 
1099
  ),
1100
  'option' => array(
1101
  'value' => true,
@@ -1161,6 +1160,12 @@ if ( ! function_exists( 'wcj_add_allowed_html' ) ) {
1161
  'onchange' => true,
1162
  'target' => true,
1163
  'wcj-copy-data' => true,
 
 
 
 
 
 
1164
  ),
1165
  'details' => array(
1166
  'open' => true,
@@ -1173,3 +1178,15 @@ if ( ! function_exists( 'wcj_add_allowed_html' ) ) {
1173
  }
1174
  add_filter( 'wp_kses_allowed_html', 'wcj_add_allowed_html', PHP_INT_MAX, 2 );
1175
  }
 
 
 
 
 
 
 
 
 
 
 
 
2
  /**
3
  * Booster for WooCommerce - Functions - General
4
  *
5
+ * @version 5.6.8
6
  * @author Pluggabl LLC.
7
  * @todo add `wcj_add_actions()` and `wcj_add_filters()`
8
  * @package Booster_For_WooCommerce/functions
436
  /**
437
  * Wcj_maybe_add_date_query.
438
  *
439
+ * @version 5.6.8
440
  * @since 3.0.0
441
  * @param array $args defines the args.
442
  */
443
  function wcj_maybe_add_date_query( $args ) {
444
+ $wpnonce = isset( $_REQUEST['wcj_tools_nonce'] ) ? wp_verify_nonce( sanitize_key( $_REQUEST['wcj_tools_nonce'] ), 'wcj_tools' ) : false;
 
 
 
445
  if ( ( $wpnonce && isset( $_GET['start_date'] ) && '' !== $_GET['start_date'] ) || ( isset( $_GET['end_date'] ) && '' !== $_GET['end_date'] ) ) {
446
  $date_query = array();
447
  $date_query['inclusive'] = true;
1032
  /**
1033
  * Wcj_add_allowed_html.
1034
  *
1035
+ * @version 5.6.8
1036
  * @since 5.6.0
1037
  * @param array $allowed_html to get default allowed html.
1038
  * @param string $context to get default context.
1074
  'data-*' => true,
1075
  ),
1076
  'textarea' => array(
1077
+ 'name' => true,
1078
+ 'value' => true,
1079
+ 'id' => true,
1080
+ 'class' => true,
1081
+ 'style' => true,
1082
+ 'placeholder' => true,
1083
+ 'required' => true,
1084
+ 'disabled' => true,
1085
+ 'onchange' => true,
1086
+ 'autocomplete' => true,
1087
  ),
1088
  'select' => array(
1089
  'multiple' => true,
1094
  'size' => true,
1095
  'disabled' => true,
1096
  'onchange' => true,
1097
+ 'type' => true,
1098
  ),
1099
  'option' => array(
1100
  'value' => true,
1160
  'onchange' => true,
1161
  'target' => true,
1162
  'wcj-copy-data' => true,
1163
+ 'currency_from' => true,
1164
+ 'currency_to' => true,
1165
+ 'start_date' => true,
1166
+ 'end_date' => true,
1167
+ 'input_id' => true,
1168
+ 'start_date' => true,
1169
  ),
1170
  'details' => array(
1171
  'open' => true,
1178
  }
1179
  add_filter( 'wp_kses_allowed_html', 'wcj_add_allowed_html', PHP_INT_MAX, 2 );
1180
  }
1181
+
1182
+ if ( ! function_exists( 'wcj_admin_tab_url' ) ) {
1183
+ /**
1184
+ * Wcj_admin_tab_url.
1185
+ *
1186
+ * @version 5.6.8
1187
+ * @since 5.6.8
1188
+ */
1189
+ function wcj_admin_tab_url() {
1190
+ return 'admin.php?page=wc-settings&tab=jetpack&wcj-cat-nonce=' . wp_create_nonce( 'wcj-cat-nonce' );
1191
+ }
1192
+ }
includes/functions/wcj-functions-html.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Functions - HTML Functions
4
  *
5
- * @version 5.6.7
6
  * @author Pluggabl LLC.
7
  * @package Booster_For_WooCommerce/functions
8
  */
@@ -15,7 +15,7 @@ if ( ! function_exists( 'wcj_get_table_html' ) ) {
15
  /**
16
  * Wcj_get_table_html.
17
  *
18
- * @version 5.6.2
19
  * @param array $data defines the data.
20
  * @param array $args defines the args.
21
  */
@@ -29,7 +29,14 @@ if ( ! function_exists( 'wcj_get_table_html' ) ) {
29
  'columns_styles' => array(),
30
  );
31
  $args = array_merge( $defaults, $args );
32
- extract( $args ); // phpcs:ignore
 
 
 
 
 
 
 
33
  $table_class = ( '' === $table_class ) ? '' : ' class="' . $table_class . '"';
34
  $table_style = ( '' === $table_style ) ? '' : ' style="' . $table_style . '"';
35
  $row_styles = ( '' === $row_styles ) ? '' : ' style="' . $row_styles . '"';
2
  /**
3
  * Booster for WooCommerce - Functions - HTML Functions
4
  *
5
+ * @version 5.6.8
6
  * @author Pluggabl LLC.
7
  * @package Booster_For_WooCommerce/functions
8
  */
15
  /**
16
  * Wcj_get_table_html.
17
  *
18
+ * @version 5.6.8
19
  * @param array $data defines the data.
20
  * @param array $args defines the args.
21
  */
29
  'columns_styles' => array(),
30
  );
31
  $args = array_merge( $defaults, $args );
32
+
33
+ $table_class = $args['table_class'];
34
+ $table_style = $args['table_style'];
35
+ $row_styles = $args['row_styles'];
36
+ $table_heading_type = $args['table_heading_type'];
37
+ $columns_classes = $args['columns_classes'];
38
+ $columns_styles = $args['columns_styles'];
39
+
40
  $table_class = ( '' === $table_class ) ? '' : ' class="' . $table_class . '"';
41
  $table_style = ( '' === $table_style ) ? '' : ' style="' . $table_style . '"';
42
  $row_styles = ( '' === $row_styles ) ? '' : ' style="' . $row_styles . '"';
includes/functions/wcj-functions-invoicing.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Functions - Invoicing
4
  *
5
- * @version 5.6.2
6
  * @author Pluggabl LLC.
7
  * @package Booster_For_WooCommerce/functions
8
  */
@@ -49,7 +49,7 @@ if ( ! function_exists( 'wcj_get_invoicing_default_images_directory' ) ) {
49
  /**
50
  * Wcj_get_invoicing_default_images_directory.
51
  *
52
- * @version 5.6.2
53
  * @since 3.4.2
54
  */
55
  function wcj_get_invoicing_default_images_directory() {
@@ -57,7 +57,7 @@ if ( ! function_exists( 'wcj_get_invoicing_default_images_directory' ) ) {
57
  case 'empty':
58
  return '';
59
  case 'document_root':
60
- return $_SERVER['DOCUMENT_ROOT']; //phpcs:ignore
61
  case 'abspath':
62
  return ABSPATH;
63
  default: // tcpdf_default.
@@ -206,13 +206,16 @@ if ( ! function_exists( 'wcj_check_and_maybe_download_tcpdf_fonts' ) ) {
206
  /**
207
  * Wcj_check_and_maybe_download_tcpdf_fonts.
208
  *
209
- * @version 5.6.2
210
  * @since 2.9.0
211
  * @todo (maybe) check file size > 0 or even for exact size (not only if file exists in directory)
212
  * @todo (maybe) use `download_url()` instead of `file_get_contents()` or `curl` (in all Booster files)
213
  * @param bool $force_download defines the force_download.
214
  */
215
  function wcj_check_and_maybe_download_tcpdf_fonts( $force_download = false ) {
 
 
 
216
  if ( 'yes' === wcj_get_option( 'wcj_invoicing_fonts_manager_do_not_download', 'no' ) ) {
217
  return false;
218
  }
@@ -220,11 +223,11 @@ if ( ! function_exists( 'wcj_check_and_maybe_download_tcpdf_fonts' ) ) {
220
  if ( wcj_check_tcpdf_fonts_version( true ) ) {
221
  return true;
222
  }
223
- if ( ( (int) gmdate( 'U' ) - wcj_get_option( 'wcj_invoicing_fonts_version_timestamp', null ) ) < 60 * 60 ) {
224
  return false;
225
  }
226
  }
227
- update_option( 'wcj_invoicing_fonts_version_timestamp', (int) gmdate( 'U' ) );
228
  $tcpdf_fonts_dir = wcj_get_wcj_uploads_dir( 'tcpdf_fonts' ) . '/';
229
  if ( ! file_exists( $tcpdf_fonts_dir ) ) {
230
  mkdir( $tcpdf_fonts_dir );
@@ -240,9 +243,9 @@ if ( ! function_exists( 'wcj_check_and_maybe_download_tcpdf_fonts' ) ) {
240
  }
241
  $response_file_name = download_url( $url );
242
  if ( ! is_wp_error( $response_file_name ) ) {
243
- $response = file_get_contents( $response_file_name ); //phpcs:ignore
244
  if ( $response ) {
245
- if ( ! file_put_contents( $tcpdf_fonts_dir . $tcpdf_fonts_file, $response ) ) { //phpcs:ignore
246
  return false;
247
  }
248
  } else {
@@ -256,7 +259,7 @@ if ( ! function_exists( 'wcj_check_and_maybe_download_tcpdf_fonts' ) ) {
256
  }
257
  if (
258
  update_option( 'wcj_invoicing_fonts_version', wcj_get_tcpdf_fonts_version() ) &&
259
- update_option( 'wcj_invoicing_fonts_version_timestamp', (int) gmdate( 'U' ) )
260
  ) {
261
  return true;
262
  }
2
  /**
3
  * Booster for WooCommerce - Functions - Invoicing
4
  *
5
+ * @version 5.6.8
6
  * @author Pluggabl LLC.
7
  * @package Booster_For_WooCommerce/functions
8
  */
49
  /**
50
  * Wcj_get_invoicing_default_images_directory.
51
  *
52
+ * @version 5.6.8
53
  * @since 3.4.2
54
  */
55
  function wcj_get_invoicing_default_images_directory() {
57
  case 'empty':
58
  return '';
59
  case 'document_root':
60
+ return getenv( 'DOCUMENT_ROOT' );
61
  case 'abspath':
62
  return ABSPATH;
63
  default: // tcpdf_default.
206
  /**
207
  * Wcj_check_and_maybe_download_tcpdf_fonts.
208
  *
209
+ * @version 5.6.8
210
  * @since 2.9.0
211
  * @todo (maybe) check file size > 0 or even for exact size (not only if file exists in directory)
212
  * @todo (maybe) use `download_url()` instead of `file_get_contents()` or `curl` (in all Booster files)
213
  * @param bool $force_download defines the force_download.
214
  */
215
  function wcj_check_and_maybe_download_tcpdf_fonts( $force_download = false ) {
216
+ require_once ABSPATH . '/wp-admin/includes/file.php';
217
+ global $wp_filesystem;
218
+ WP_Filesystem();
219
  if ( 'yes' === wcj_get_option( 'wcj_invoicing_fonts_manager_do_not_download', 'no' ) ) {
220
  return false;
221
  }
223
  if ( wcj_check_tcpdf_fonts_version( true ) ) {
224
  return true;
225
  }
226
+ if ( ( wcj_get_timestamp_date_from_gmt() - wcj_get_option( 'wcj_invoicing_fonts_version_timestamp', null ) ) < 60 * 60 ) {
227
  return false;
228
  }
229
  }
230
+ update_option( 'wcj_invoicing_fonts_version_timestamp', wcj_get_timestamp_date_from_gmt() );
231
  $tcpdf_fonts_dir = wcj_get_wcj_uploads_dir( 'tcpdf_fonts' ) . '/';
232
  if ( ! file_exists( $tcpdf_fonts_dir ) ) {
233
  mkdir( $tcpdf_fonts_dir );
243
  }
244
  $response_file_name = download_url( $url );
245
  if ( ! is_wp_error( $response_file_name ) ) {
246
+ $response = $wp_filesystem->get_contents( $response_file_name );
247
  if ( $response ) {
248
+ if ( ! $wp_filesystem->put_contents( $tcpdf_fonts_dir . $tcpdf_fonts_file, $response, FS_CHMOD_FILE ) ) {
249
  return false;
250
  }
251
  } else {
259
  }
260
  if (
261
  update_option( 'wcj_invoicing_fonts_version', wcj_get_tcpdf_fonts_version() ) &&
262
+ update_option( 'wcj_invoicing_fonts_version_timestamp', wcj_get_timestamp_date_from_gmt() )
263
  ) {
264
  return true;
265
  }
includes/functions/wcj-functions-reports.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Functions - Reports
4
  *
5
- * @version 5.6.2
6
  * @since 2.9.0
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/functions
@@ -40,11 +40,11 @@ if ( ! function_exists( 'wcj_get_reports_standard_ranges' ) ) {
40
  /**
41
  * Wcj_get_reports_standard_ranges.
42
  *
43
- * @version 5.6.2
44
  * @since 2.9.0
45
  */
46
  function wcj_get_reports_standard_ranges() {
47
- $current_time = (int) gmdate( 'U' );
48
  return array(
49
  'year' => array(
50
  'title' => __( 'Year', 'woocommerce' ),
@@ -74,12 +74,12 @@ if ( ! function_exists( 'wcj_get_reports_custom_ranges' ) ) {
74
  /**
75
  * Wcj_get_reports_custom_ranges.
76
  *
77
- * @version 5.6.2
78
  * @since 2.9.0
79
  * @todo fix `-1 month` - sometimes it produces the wrong result (e.g. on current gmdate = "2018.03.30")
80
  */
81
  function wcj_get_reports_custom_ranges() {
82
- $current_time = (int) gmdate( 'U' );
83
  return array(
84
  'last_14_days' => array(
85
  'title' => __( 'Last 14 days', 'woocommerce-jetpack' ),
2
  /**
3
  * Booster for WooCommerce - Functions - Reports
4
  *
5
+ * @version 5.6.8
6
  * @since 2.9.0
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/functions
40
  /**
41
  * Wcj_get_reports_standard_ranges.
42
  *
43
+ * @version 5.6.8
44
  * @since 2.9.0
45
  */
46
  function wcj_get_reports_standard_ranges() {
47
+ $current_time = wcj_get_timestamp_date_from_gmt();
48
  return array(
49
  'year' => array(
50
  'title' => __( 'Year', 'woocommerce' ),
74
  /**
75
  * Wcj_get_reports_custom_ranges.
76
  *
77
+ * @version 5.6.8
78
  * @since 2.9.0
79
  * @todo fix `-1 month` - sometimes it produces the wrong result (e.g. on current gmdate = "2018.03.30")
80
  */
81
  function wcj_get_reports_custom_ranges() {
82
+ $current_time = wcj_get_timestamp_date_from_gmt();
83
  return array(
84
  'last_14_days' => array(
85
  'title' => __( 'Last 14 days', 'woocommerce-jetpack' ),
includes/gateways/{class-wc-gateway-wcj-custom.php → class-wc-gateway-wcj-custom-template.php} RENAMED
@@ -1,20 +1,20 @@
1
- <?php //phpcs:ignore
2
  /**
3
  * Booster for WooCommerce - Custom Payment Gateway
4
  *
5
- * @version 5.6.2
6
  * @author Pluggabl LLC.
7
  * @package Booster_For_WooCommerce/includes
8
  */
9
 
10
- if ( ! function_exists( 'init_wc_gateway_wcj_custom_class' ) ) {
11
 
12
  /**
13
- * Init_wc_gateway_wcj_custom_class class.
14
  *
15
  * @version 5.3.4
16
  */
17
- function init_wc_gateway_wcj_custom_class() {
18
 
19
  if ( class_exists( 'WC_Payment_Gateway' ) ) {
20
 
@@ -417,7 +417,7 @@ if ( ! function_exists( 'init_wc_gateway_wcj_custom_class' ) ) {
417
  }
418
 
419
  if ( 'no' === wcj_get_option( 'wcj_load_modules_on_init', 'no' ) ) {
420
- add_action( 'plugins_loaded', 'init_wc_gateway_wcj_custom_class', PHP_INT_MAX );
421
  } else {
422
- init_wc_gateway_wcj_custom_class();
423
  }
1
+ <?php
2
  /**
3
  * Booster for WooCommerce - Custom Payment Gateway
4
  *
5
+ * @version 5.6.8
6
  * @author Pluggabl LLC.
7
  * @package Booster_For_WooCommerce/includes
8
  */
9
 
10
+ if ( ! function_exists( 'init_wc_gateway_wcj_custom' ) ) {
11
 
12
  /**
13
+ * Init_wc_gateway_wcj_custom class.
14
  *
15
  * @version 5.3.4
16
  */
17
+ function init_wc_gateway_wcj_custom() {
18
 
19
  if ( class_exists( 'WC_Payment_Gateway' ) ) {
20
 
417
  }
418
 
419
  if ( 'no' === wcj_get_option( 'wcj_load_modules_on_init', 'no' ) ) {
420
+ add_action( 'plugins_loaded', 'init_wc_gateway_wcj_custom', PHP_INT_MAX );
421
  } else {
422
+ init_wc_gateway_wcj_custom();
423
  }
includes/input-fields/class-wcj-product-input-fields-core.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Product Input Fields - Core
4
  *
5
- * @version 5.6.7
6
  * @author Pluggabl LLC.
7
  * @package Booster_For_WooCommerce/includes
8
  */
@@ -489,15 +489,12 @@ if ( ! class_exists( 'WCJ_Product_Input_Fields_Core' ) ) :
489
  /**
490
  * Validate_product_input_fields_on_add_to_cart.
491
  *
492
- * @version 5.6.2
493
  * @param bool $passed define passed value.
494
  * @param int $product_id Get product id.
495
  */
496
  public function validate_product_input_fields_on_add_to_cart( $passed, $product_id ) {
497
- $wpnonce = true;
498
- if ( function_exists( 'wp_verify_nonce' ) ) {
499
- $wpnonce = isset( $_REQUEST['_wpnonce'] ) ? wp_verify_nonce( sanitize_key( isset( $_REQUEST['_wpnonce'] ) ? $_REQUEST['_wpnonce'] : '' ), 'woocommerce-settings' ) : true;
500
- }
501
  if ( ! $wpnonce ) {
502
  return $passed;
503
  }
@@ -607,7 +604,7 @@ if ( ! class_exists( 'WCJ_Product_Input_Fields_Core' ) ) :
607
  /**
608
  * Add_product_input_fields_to_frontend.
609
  *
610
- * @version 5.6.2
611
  * @todo `$set_value` - add "default" option for all other types except checkbox
612
  * @todo `$set_value` - 'file' type
613
  * @todo add `required` attributes
@@ -620,13 +617,7 @@ if ( ! class_exists( 'WCJ_Product_Input_Fields_Core' ) ) :
620
  if ( ! $product ) {
621
  return;
622
  }
623
- $wpnonce = true;
624
- if ( function_exists( 'wp_verify_nonce' ) ) {
625
- $wpnonce = isset( $_REQUEST['_wpnonce'] ) ? wp_verify_nonce( sanitize_key( isset( $_REQUEST['_wpnonce'] ) ? $_REQUEST['_wpnonce'] : '' ), 'woocommerce-settings' ) : true;
626
- }
627
- if ( ! $wpnonce ) {
628
- return;
629
- }
630
  $_product_id = wcj_get_product_id_or_variation_parent_id( $product );
631
  $this->maybe_update_local_input_fields( $_product_id );
632
  $fields = array();
@@ -675,7 +666,8 @@ if ( ! class_exists( 'WCJ_Product_Input_Fields_Core' ) ) :
675
 
676
  if ( $this->is_enabled( $i, $_product_id ) ) {
677
 
678
- $set_value = ( isset( $_POST[ $field_name ] ) ?
 
679
  $this->maybe_stripslashes( sanitize_text_field( wp_unslash( $_POST[ $field_name ] ) ) ) :
680
  ( 'checkbox' === $type ?
681
  ( 'yes' === $this->get_value( 'wcj_product_input_fields_type_checkbox_default_' . $this->scope . '_' . $i, $_product_id, 'no' ) ? 'on' : 'off' ) :
@@ -788,7 +780,7 @@ if ( ! class_exists( 'WCJ_Product_Input_Fields_Core' ) ) :
788
  $field = '<select name="' . $field_name . '" id="' . $field_name . '" class="country_to_state country_select wcj_product_input_fields' . $class . '">' .
789
  '<option value="">' . __( 'Select a country&hellip;', 'woocommerce' ) . '</option>';
790
  foreach ( $countries as $ckey => $cvalue ) {
791
- $field .= '<option value="' . esc_attr( $ckey ) . '" ' . selected( $value, $ckey, false ) . '>' . __( $cvalue, 'woocommerce' ) . '</option>'; //phpcs:ignore
792
  }
793
  $field .= '</select>';
794
  $html = $field;
@@ -823,7 +815,7 @@ if ( ! class_exists( 'WCJ_Product_Input_Fields_Core' ) ) :
823
  }
824
  ksort( $fields );
825
  if ( ! empty( $fields ) ) {
826
- echo wcj_get_option( 'wcj_product_input_fields_start_template', '' ) . wp_kses_post( implode( $fields ) ) . wcj_get_option( 'wcj_product_input_fields_end_template', '' ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
827
  $this->are_product_input_fields_displayed = true;
828
  }
829
  }
@@ -833,16 +825,13 @@ if ( ! class_exists( 'WCJ_Product_Input_Fields_Core' ) ) :
833
  *
834
  * From `$_POST` to `$cart_item_data`
835
  *
836
- * @version 5.6.2
837
  * @param Array $cart_item_data Get cart items.
838
  * @param int $product_id Get product id.
839
  * @param int $variation_id Get variation id.
840
  */
841
  public function add_product_input_fields_to_cart_item_data( $cart_item_data, $product_id, $variation_id ) {
842
- $wpnonce = true;
843
- if ( function_exists( 'wp_verify_nonce' ) ) {
844
- $wpnonce = isset( $_REQUEST['_wpnonce'] ) ? wp_verify_nonce( sanitize_key( isset( $_REQUEST['_wpnonce'] ) ? $_REQUEST['_wpnonce'] : '' ), 'woocommerce-settings' ) : true;
845
- }
846
  if ( ! $wpnonce ) {
847
  return $cart_item_data;
848
  }
@@ -1035,7 +1024,7 @@ if ( ! class_exists( 'WCJ_Product_Input_Fields_Core' ) ) :
1035
  /**
1036
  * Add_input_fields_to_order_item_meta.
1037
  *
1038
- * @version 5.6.2
1039
  * @since 3.4.0
1040
  * @param Array $item Get items.
1041
  * @param int $item_id Get item id.
@@ -1045,6 +1034,9 @@ if ( ! class_exists( 'WCJ_Product_Input_Fields_Core' ) ) :
1045
  * @throws Exception Exception.
1046
  */
1047
  public function add_input_fields_to_order_item_meta( $item, $item_id, $values, $cart_item_key ) {
 
 
 
1048
  $total_number = apply_filters( 'booster_option', 1, $this->get_value( 'wcj_product_input_fields_' . $this->scope . '_total_number', $values['product_id'], 1 ) );
1049
  for ( $i = 1; $i <= $total_number; $i ++ ) {
1050
  if ( array_key_exists( 'wcj_product_input_fields_' . $this->scope . '_' . $i, $values ) ) {
@@ -1060,8 +1052,8 @@ if ( ! class_exists( 'WCJ_Product_Input_Fields_Core' ) ) :
1060
  mkdir( $upload_dir, 0755, true );
1061
  }
1062
  $upload_dir_and_name = $upload_dir . '/' . $name;
1063
- $file_data = file_get_contents( $tmp_name ); //phpcs:ignore
1064
- file_put_contents( $upload_dir_and_name, $file_data ); //phpcs:ignore
1065
  unlink( $tmp_name );
1066
  $input_field_value['tmp_name'] = addslashes( $upload_dir_and_name );
1067
  $input_field_value['wcj_type'] = 'file';
2
  /**
3
  * Booster for WooCommerce - Product Input Fields - Core
4
  *
5
+ * @version 5.6.8
6
  * @author Pluggabl LLC.
7
  * @package Booster_For_WooCommerce/includes
8
  */
489
  /**
490
  * Validate_product_input_fields_on_add_to_cart.
491
  *
492
+ * @version 5.6.8
493
  * @param bool $passed define passed value.
494
  * @param int $product_id Get product id.
495
  */
496
  public function validate_product_input_fields_on_add_to_cart( $passed, $product_id ) {
497
+ $wpnonce = isset( $_REQUEST['wcj_product_input_fields-nonce'] ) ? wp_verify_nonce( sanitize_key( $_REQUEST['wcj_product_input_fields-nonce'] ), 'wcj_product_input_fields' ) : false;
 
 
 
498
  if ( ! $wpnonce ) {
499
  return $passed;
500
  }
604
  /**
605
  * Add_product_input_fields_to_frontend.
606
  *
607
+ * @version 5.6.8
608
  * @todo `$set_value` - add "default" option for all other types except checkbox
609
  * @todo `$set_value` - 'file' type
610
  * @todo add `required` attributes
617
  if ( ! $product ) {
618
  return;
619
  }
620
+
 
 
 
 
 
 
621
  $_product_id = wcj_get_product_id_or_variation_parent_id( $product );
622
  $this->maybe_update_local_input_fields( $_product_id );
623
  $fields = array();
666
 
667
  if ( $this->is_enabled( $i, $_product_id ) ) {
668
 
669
+ $wpnonce = isset( $_REQUEST['wcj_product_input_fields-nonce'] ) ? wp_verify_nonce( sanitize_key( $_REQUEST['wcj_product_input_fields-nonce'] ), 'wcj_product_input_fields' ) : false;
670
+ $set_value = ( $wpnonce && isset( $_POST[ $field_name ] ) ?
671
  $this->maybe_stripslashes( sanitize_text_field( wp_unslash( $_POST[ $field_name ] ) ) ) :
672
  ( 'checkbox' === $type ?
673
  ( 'yes' === $this->get_value( 'wcj_product_input_fields_type_checkbox_default_' . $this->scope . '_' . $i, $_product_id, 'no' ) ? 'on' : 'off' ) :
780
  $field = '<select name="' . $field_name . '" id="' . $field_name . '" class="country_to_state country_select wcj_product_input_fields' . $class . '">' .
781
  '<option value="">' . __( 'Select a country&hellip;', 'woocommerce' ) . '</option>';
782
  foreach ( $countries as $ckey => $cvalue ) {
783
+ $field .= '<option value="' . esc_attr( $ckey ) . '" ' . selected( $value, $ckey, false ) . '>' . $cvalue . '</option>';
784
  }
785
  $field .= '</select>';
786
  $html = $field;
815
  }
816
  ksort( $fields );
817
  if ( ! empty( $fields ) ) {
818
+ echo wp_kses_post( wcj_get_option( 'wcj_product_input_fields_start_template', '' ) . implode( $fields ) . wp_nonce_field( 'wcj_product_input_fields', 'wcj_product_input_fields-nonce' ) . wcj_get_option( 'wcj_product_input_fields_end_template', '' ) );
819
  $this->are_product_input_fields_displayed = true;
820
  }
821
  }
825
  *
826
  * From `$_POST` to `$cart_item_data`
827
  *
828
+ * @version 5.6.8
829
  * @param Array $cart_item_data Get cart items.
830
  * @param int $product_id Get product id.
831
  * @param int $variation_id Get variation id.
832
  */
833
  public function add_product_input_fields_to_cart_item_data( $cart_item_data, $product_id, $variation_id ) {
834
+ $wpnonce = isset( $_REQUEST['wcj_product_input_fields-nonce'] ) ? wp_verify_nonce( sanitize_key( $_REQUEST['wcj_product_input_fields-nonce'] ), 'wcj_product_input_fields' ) : false;
 
 
 
835
  if ( ! $wpnonce ) {
836
  return $cart_item_data;
837
  }
1024
  /**
1025
  * Add_input_fields_to_order_item_meta.
1026
  *
1027
+ * @version 5.6.8
1028
  * @since 3.4.0
1029
  * @param Array $item Get items.
1030
  * @param int $item_id Get item id.
1034
  * @throws Exception Exception.
1035
  */
1036
  public function add_input_fields_to_order_item_meta( $item, $item_id, $values, $cart_item_key ) {
1037
+ require_once ABSPATH . '/wp-admin/includes/file.php';
1038
+ global $wp_filesystem;
1039
+ WP_Filesystem();
1040
  $total_number = apply_filters( 'booster_option', 1, $this->get_value( 'wcj_product_input_fields_' . $this->scope . '_total_number', $values['product_id'], 1 ) );
1041
  for ( $i = 1; $i <= $total_number; $i ++ ) {
1042
  if ( array_key_exists( 'wcj_product_input_fields_' . $this->scope . '_' . $i, $values ) ) {
1052
  mkdir( $upload_dir, 0755, true );
1053
  }
1054
  $upload_dir_and_name = $upload_dir . '/' . $name;
1055
+ $file_data = $wp_filesystem->get_contents( $tmp_name );
1056
+ $wp_filesystem->put_contents( $upload_dir_and_name, $file_data, FS_CHMOD_FILE );
1057
  unlink( $tmp_name );
1058
  $input_field_value['tmp_name'] = addslashes( $upload_dir_and_name );
1059
  $input_field_value['wcj_type'] = 'file';
includes/js/wcj-ajax-exchange-rates.js CHANGED
@@ -1,7 +1,7 @@
1
  /**
2
  * Wcj-ajax-exchange-rates.js
3
  *
4
- * @version 5.6.2
5
  * @package Booster_For_WooCommerce/includes/JS
6
  */
7
 
@@ -13,7 +13,8 @@ jQuery( document ).ready(
13
  var data = {
14
  'action': 'wcj_ajax_get_exchange_rates',
15
  'wcj_currency_from': this.getAttribute( 'currency_from' ),
16
- 'wcj_currency_to': this.getAttribute( 'currency_to' )
 
17
  };
18
  jQuery.ajax(
19
  {
1
  /**
2
  * Wcj-ajax-exchange-rates.js
3
  *
4
+ * @version 5.6.8
5
  * @package Booster_For_WooCommerce/includes/JS
6
  */
7
 
13
  var data = {
14
  'action': 'wcj_ajax_get_exchange_rates',
15
  'wcj_currency_from': this.getAttribute( 'currency_from' ),
16
+ 'wcj_currency_to': this.getAttribute( 'currency_to' ),
17
+ 'wpnonce': ajax_object.wpnonce,
18
  };
19
  jQuery.ajax(
20
  {
includes/js/wcj-bookings.js CHANGED
@@ -1,7 +1,7 @@
1
  /**
2
  * Wcj-bookings.
3
  *
4
- * @version 5.6.2
5
  * @since 2.5.0
6
  *
7
  * @package Booster_For_WooCommerce/includes/JS
@@ -20,6 +20,7 @@ function wcj_show_loader(){
20
  function change_price() {
21
  var date_from = jQuery( "input[name='wcj_product_bookings_date_from']" ).val();
22
  var date_to = jQuery( "input[name='wcj_product_bookings_date_to']" ).val();
 
23
  var is_variation_ok = true;
24
  if ( jQuery( ".variations select" ).length ) {
25
  if ( jQuery( ".variations select" ).find( ":selected" ).val() == '' ) {
@@ -40,7 +41,8 @@ function change_price() {
40
  'action': 'price_change',
41
  'product_id': product_id,
42
  'date_from': date_from,
43
- 'date_to': date_to
 
44
  };
45
  wcj_show_loader();
46
  jQuery( '.wcj-bookings-price-wrapper .wcj-value' ).html( '' );
1
  /**
2
  * Wcj-bookings.
3
  *
4
+ * @version 5.6.8
5
  * @since 2.5.0
6
  *
7
  * @package Booster_For_WooCommerce/includes/JS
20
  function change_price() {
21
  var date_from = jQuery( "input[name='wcj_product_bookings_date_from']" ).val();
22
  var date_to = jQuery( "input[name='wcj_product_bookings_date_to']" ).val();
23
+ var wpnonce = jQuery( "input[name='wcj_product_bookings-nonce']" ).val();
24
  var is_variation_ok = true;
25
  if ( jQuery( ".variations select" ).length ) {
26
  if ( jQuery( ".variations select" ).find( ":selected" ).val() == '' ) {
41
  'action': 'price_change',
42
  'product_id': product_id,
43
  'date_from': date_from,
44
+ 'date_to': date_to,
45
+ '_wpnonce': wpnonce
46
  };
47
  wcj_show_loader();
48
  jQuery( '.wcj-bookings-price-wrapper .wcj-value' ).html( '' );
includes/js/wcj-eu-vat-number.js CHANGED
@@ -1,7 +1,7 @@
1
  /**
2
  * Wu-vat-number.
3
  *
4
- * @version 5.6.2
5
  * @package Booster_For_WooCommerce/includes/JS
6
  */
7
 
@@ -50,6 +50,7 @@ jQuery(
50
  var data = {
51
  'action': 'wcj_validate_eu_vat_number',
52
  'wcj_eu_vat_number_to_check': vatNumberToCheck,
 
53
  };
54
  $.ajax(
55
  {
1
  /**
2
  * Wu-vat-number.
3
  *
4
+ * @version 5.6.8
5
  * @package Booster_For_WooCommerce/includes/JS
6
  */
7
 
50
  var data = {
51
  'action': 'wcj_validate_eu_vat_number',
52
  'wcj_eu_vat_number_to_check': vatNumberToCheck,
53
+ '_wpnonce': _ajax_object._wpnonce,
54
  };
55
  $.ajax(
56
  {
includes/js/wcj-product-addons.js CHANGED
@@ -1,7 +1,7 @@
1
  /**
2
  * Wcj-product-addons.
3
  *
4
- * @version 5.6.2
5
  * @since 2.5.3
6
  * @todo `text` type - update price not only on change, but on each pressed key
7
  * @todo fix the issue with custom price labels module
@@ -19,6 +19,7 @@ function change_price() {
19
  }
20
  if ( is_variation_ok ) {
21
  var product_id = jQuery( "input[type='hidden'][name='variation_id']" ).val();
 
22
  var is_variable;
23
  if ( ! product_id ) {
24
  is_variable = false;
@@ -33,6 +34,7 @@ function change_price() {
33
  var data = {
34
  'action': 'product_addons_price_change',
35
  'product_id': product_id,
 
36
  };
37
  jQuery( "input[name^='wcj_product_all_products_addons_'], input[name^='wcj_product_per_product_addons_']" ).each(
38
  function () {
1
  /**
2
  * Wcj-product-addons.
3
  *
4
+ * @version 5.6.8
5
  * @since 2.5.3
6
  * @todo `text` type - update price not only on change, but on each pressed key
7
  * @todo fix the issue with custom price labels module
19
  }
20
  if ( is_variation_ok ) {
21
  var product_id = jQuery( "input[type='hidden'][name='variation_id']" ).val();
22
+ var wpnonce = jQuery( "input[type='hidden'][name='wcj_product_addons-nonce']" ).val();
23
  var is_variable;
24
  if ( ! product_id ) {
25
  is_variable = false;
34
  var data = {
35
  'action': 'product_addons_price_change',
36
  'product_id': product_id,
37
+ 'wpnonce': wpnonce,
38
  };
39
  jQuery( "input[name^='wcj_product_all_products_addons_'], input[name^='wcj_product_per_product_addons_']" ).each(
40
  function () {
includes/js/wcj-track-users.js CHANGED
@@ -1,7 +1,7 @@
1
  /**
2
  * Wcj-track-users.js
3
  *
4
- * @version 5.6.2
5
  *
6
  * @package Booster_For_WooCommerce/includes/JS
7
  */
@@ -11,6 +11,7 @@ jQuery( document ).ready(
11
  var data = {
12
  'action': 'wcj_track_users',
13
  'wcj_http_referer': track_users_ajax_object.http_referer,
 
14
  'wcj_user_ip': track_users_ajax_object.user_ip
15
  };
16
  jQuery.ajax(
1
  /**
2
  * Wcj-track-users.js
3
  *
4
+ * @version 5.6.8
5
  *
6
  * @package Booster_For_WooCommerce/includes/JS
7
  */
11
  var data = {
12
  'action': 'wcj_track_users',
13
  'wcj_http_referer': track_users_ajax_object.http_referer,
14
+ 'wpnonce': track_users_ajax_object.wpnonce,
15
  'wcj_user_ip': track_users_ajax_object.user_ip
16
  };
17
  jQuery.ajax(
includes/pdf-invoices/class-wcj-pdf-invoicing-renumerate-tool.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - PDF Invoicing - Renumerate Tool
4
  *
5
- * @version 5.6.2
6
  * @author Pluggabl LLC.
7
  * @package Booster_For_WooCommerce/includes
8
  */
@@ -51,13 +51,13 @@ if ( ! class_exists( 'WCJ_PDF_Invoicing_Renumerate_Tool' ) ) :
51
  /**
52
  * Add Renumerate Invoices tool to WooCommerce menu (the content).
53
  *
54
- * @version 5.6.2
55
  */
56
  public function create_renumerate_invoices_tool() {
57
 
58
  $result_message = '';
59
  $renumerate_result = '';
60
- $wpnonce = isset( $_REQUEST['_wpnonce'] ) ? wp_verify_nonce( sanitize_key( isset( $_REQUEST['_wpnonce'] ) ? $_REQUEST['_wpnonce'] : 'woocommerce-settings' ) ) : true;
61
  $the_invoice_type = ( ! empty( $_POST['invoice_type'] ) ) ? sanitize_text_field( wp_unslash( $_POST['invoice_type'] ) ) : 'invoice';
62
  $the_start_number = ( ! empty( $_POST['start_number'] ) ) ? sanitize_text_field( wp_unslash( $_POST['start_number'] ) ) : 0;
63
  $the_start_date = ( ! empty( $_POST['start_date'] ) ) ? sanitize_text_field( wp_unslash( $_POST['start_date'] ) ) : '';
@@ -65,7 +65,11 @@ if ( ! class_exists( 'WCJ_PDF_Invoicing_Renumerate_Tool' ) ) :
65
  $the_order_statuses = ( ! empty( $_POST['order_statuses'] ) ) ? array_map( 'sanitize_text_field', wp_unslash( $_POST['order_statuses'] ) ) : array();
66
  $the_delete_all = ( isset( $_POST['delete_all'] ) );
67
 
68
- if ( $wpnonce && isset( $_POST['renumerate_invoices'] ) ) {
 
 
 
 
69
  if ( ! empty( $the_order_statuses ) ) {
70
  $renumerate_result = $this->renumerate_invoices( $the_invoice_type, $the_start_number, $the_start_date, $the_end_date, $the_order_statuses, $the_delete_all );
71
  $result_message = '<div class="updated"><p><strong>' . __( 'Invoices successfully renumerated!', 'woocommerce-jetpack' ) . '</strong></p></div>';
2
  /**
3
  * Booster for WooCommerce - PDF Invoicing - Renumerate Tool
4
  *
5
+ * @version 5.6.8
6
  * @author Pluggabl LLC.
7
  * @package Booster_For_WooCommerce/includes
8
  */
51
  /**
52
  * Add Renumerate Invoices tool to WooCommerce menu (the content).
53
  *
54
+ * @version 5.6.8
55
  */
56
  public function create_renumerate_invoices_tool() {
57
 
58
  $result_message = '';
59
  $renumerate_result = '';
60
+ $wpnonce = isset( $_REQUEST['wcj_tools_nonce'] ) ? wp_verify_nonce( sanitize_key( $_REQUEST['wcj_tools_nonce'] ), 'wcj_tools' ) : false;
61
  $the_invoice_type = ( ! empty( $_POST['invoice_type'] ) ) ? sanitize_text_field( wp_unslash( $_POST['invoice_type'] ) ) : 'invoice';
62
  $the_start_number = ( ! empty( $_POST['start_number'] ) ) ? sanitize_text_field( wp_unslash( $_POST['start_number'] ) ) : 0;
63
  $the_start_date = ( ! empty( $_POST['start_date'] ) ) ? sanitize_text_field( wp_unslash( $_POST['start_date'] ) ) : '';
65
  $the_order_statuses = ( ! empty( $_POST['order_statuses'] ) ) ? array_map( 'sanitize_text_field', wp_unslash( $_POST['order_statuses'] ) ) : array();
66
  $the_delete_all = ( isset( $_POST['delete_all'] ) );
67
 
68
+ if ( ! $wpnonce ) {
69
+ wp_safe_redirect( admin_url( 'admin.php?page=wcj-tools' ) );
70
+ exit;
71
+ }
72
+ if ( isset( $_POST['renumerate_invoices'] ) ) {
73
  if ( ! empty( $the_order_statuses ) ) {
74
  $renumerate_result = $this->renumerate_invoices( $the_invoice_type, $the_start_number, $the_start_date, $the_end_date, $the_order_statuses, $the_delete_all );
75
  $result_message = '<div class="updated"><p><strong>' . __( 'Invoices successfully renumerated!', 'woocommerce-jetpack' ) . '</strong></p></div>';
includes/pdf-invoices/class-wcj-pdf-invoicing-report-tool.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - PDF Invoicing - Report Tool
4
  *
5
- * @version 5.6.3
6
  * @since 2.2.1
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/includes
@@ -75,17 +75,17 @@ if ( ! class_exists( 'WCJ_PDF_Invoicing_Report_Tool' ) ) :
75
  /**
76
  * Generate_report_zip.
77
  *
78
- * @version 5.6.2
79
  * @since 2.3.10
80
  */
81
  public function generate_report_zip() {
82
- $wpnonce = isset( $_REQUEST['_wpnonce'] ) ? wp_verify_nonce( sanitize_key( isset( $_REQUEST['_wpnonce'] ) ? $_REQUEST['_wpnonce'] : '' ) ) : true;
83
  if ( $wpnonce && isset( $_POST['get_invoices_report_zip'] ) ) {
84
  if ( 'yes' === wcj_get_option( 'wcj_general_advanced_disable_save_sys_temp_dir', 'no' ) ) {
85
  $this->notice = '<div class="error"><p><strong>' . sprintf(
86
  /* translators: %s: search term */
87
  __( 'This option is disabled with "Disable Saving PDFs in PHP directory for temporary files" checkbox in <a href="%s" target="_blank">WooCommerce > Settings > Booster > PDF Invoicing & Packing Slips > Advanced</a>.', 'woocommerce-jetpack' ),
88
- admin_url( 'admin.php?page=wc-settings&tab=jetpack&wcj-cat=pdf_invoicing&section=pdf_invoicing_advanced' )
89
  ) .
90
  '</strong></p></div>';
91
  } else {
@@ -111,10 +111,10 @@ if ( ! class_exists( 'WCJ_PDF_Invoicing_Report_Tool' ) ) :
111
  /**
112
  * Add Invoices Report tool to WooCommerce menu (the content).
113
  *
114
- * @version 5.6.2
115
  */
116
  public function create_invoices_report_tool() {
117
- $wpnonce = isset( $_REQUEST['_wpnonce'] ) ? wp_verify_nonce( sanitize_key( isset( $_REQUEST['_wpnonce'] ) ? $_REQUEST['_wpnonce'] : '' ) ) : true;
118
  $result_message = '';
119
  $result_message .= $this->notice;
120
  $the_year = ( $wpnonce && ! empty( $_POST['report_year'] ) ) ? sanitize_text_field( wp_unslash( $_POST['report_year'] ) ) : gmdate( 'Y' );
@@ -299,11 +299,11 @@ if ( ! class_exists( 'WCJ_PDF_Invoicing_Report_Tool' ) ) :
299
  /**
300
  * Export_csv.
301
  *
302
- * @version 3.1.0
303
  * @since 2.5.7
304
  */
305
  public function export_csv() {
306
- $wpnonce = isset( $_REQUEST['_wpnonce'] ) ? wp_verify_nonce( sanitize_key( isset( $_REQUEST['_wpnonce'] ) ? $_REQUEST['_wpnonce'] : '' ) ) : true;
307
  $_year = ( $wpnonce && ! empty( $_POST['report_year'] ) ) ? sanitize_text_field( wp_unslash( $_POST['report_year'] ) ) : gmdate( 'Y' );
308
  $_month = ( $wpnonce && ! empty( $_POST['report_month'] ) ) ? sanitize_text_field( wp_unslash( $_POST['report_month'] ) ) : gmdate( 'm' );
309
  $_invoice_type = ( $wpnonce && ! empty( $_POST['invoice_type'] ) ) ? sanitize_text_field( wp_unslash( $_POST['invoice_type'] ) ) : 'invoice';
2
  /**
3
  * Booster for WooCommerce - PDF Invoicing - Report Tool
4
  *
5
+ * @version 5.6.8
6
  * @since 2.2.1
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/includes
75
  /**
76
  * Generate_report_zip.
77
  *
78
+ * @version 5.6.8
79
  * @since 2.3.10
80
  */
81
  public function generate_report_zip() {
82
+ $wpnonce = isset( $_REQUEST['wcj_tools_nonce'] ) ? wp_verify_nonce( sanitize_key( $_REQUEST['wcj_tools_nonce'] ), 'wcj_tools' ) : false;
83
  if ( $wpnonce && isset( $_POST['get_invoices_report_zip'] ) ) {
84
  if ( 'yes' === wcj_get_option( 'wcj_general_advanced_disable_save_sys_temp_dir', 'no' ) ) {
85
  $this->notice = '<div class="error"><p><strong>' . sprintf(
86
  /* translators: %s: search term */
87
  __( 'This option is disabled with "Disable Saving PDFs in PHP directory for temporary files" checkbox in <a href="%s" target="_blank">WooCommerce > Settings > Booster > PDF Invoicing & Packing Slips > Advanced</a>.', 'woocommerce-jetpack' ),
88
+ admin_url( wcj_admin_tab_url() . '&wcj-cat=pdf_invoicing&section=pdf_invoicing_advanced' )
89
  ) .
90
  '</strong></p></div>';
91
  } else {
111
  /**
112
  * Add Invoices Report tool to WooCommerce menu (the content).
113
  *
114
+ * @version 5.6.8
115
  */
116
  public function create_invoices_report_tool() {
117
+ $wpnonce = isset( $_REQUEST['wcj_tools_nonce'] ) ? wp_verify_nonce( sanitize_key( $_REQUEST['wcj_tools_nonce'] ), 'wcj_tools' ) : false;
118
  $result_message = '';
119
  $result_message .= $this->notice;
120
  $the_year = ( $wpnonce && ! empty( $_POST['report_year'] ) ) ? sanitize_text_field( wp_unslash( $_POST['report_year'] ) ) : gmdate( 'Y' );
299
  /**
300
  * Export_csv.
301
  *
302
+ * @version 5.6.8
303
  * @since 2.5.7
304
  */
305
  public function export_csv() {
306
+ $wpnonce = isset( $_REQUEST['wcj_tools_nonce'] ) ? wp_verify_nonce( sanitize_key( $_REQUEST['wcj_tools_nonce'] ), 'wcj_tools' ) : false;
307
  $_year = ( $wpnonce && ! empty( $_POST['report_year'] ) ) ? sanitize_text_field( wp_unslash( $_POST['report_year'] ) ) : gmdate( 'Y' );
308
  $_month = ( $wpnonce && ! empty( $_POST['report_month'] ) ) ? sanitize_text_field( wp_unslash( $_POST['report_month'] ) ) : gmdate( 'm' );
309
  $_invoice_type = ( $wpnonce && ! empty( $_POST['invoice_type'] ) ) ? sanitize_text_field( wp_unslash( $_POST['invoice_type'] ) ) : 'invoice';
includes/pdf-invoices/submodules/class-wcj-pdf-invoicing-styling.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - PDF Invoicing - Styling
4
  *
5
- * @version 5.6.2
6
  * @author Pluggabl LLC.
7
  * @package Booster_For_WooCommerce/includes
8
  */
@@ -81,32 +81,29 @@ if ( ! class_exists( 'WCJ_PDF_Invoicing_Styling' ) ) :
81
  /**
82
  * Download_fonts.
83
  *
84
- * @version 5.6.2
85
  * @version 2.9.0
86
  * @param int $interval Get time interval.
87
  */
88
  public function download_fonts( $interval ) {
89
- update_option( 'wcj_download_tcpdf_fonts_hook_timestamp', (int) gmdate( 'U' ) );
90
  wcj_check_and_maybe_download_tcpdf_fonts( true );
91
  }
92
 
93
  /**
94
  * Manually_download_fonts.
95
  *
96
- * @version 5.6.2
97
  * @version 2.9.0
98
  * @todo add success/error message
99
  */
100
  public function manually_download_fonts() {
101
- $wpnonce = true;
102
- if ( function_exists( 'wp_verify_nonce' ) ) {
103
- $wpnonce = isset( $_REQUEST['_wpnonce'] ) ? wp_verify_nonce( sanitize_key( isset( $_REQUEST['_wpnonce'] ) ? $_REQUEST['_wpnonce'] : '' ) ) : true;
104
- }
105
  if ( isset( $_GET['wcj_download_fonts'] ) && $wpnonce ) {
106
  delete_option( 'wcj_invoicing_fonts_version' );
107
  delete_option( 'wcj_invoicing_fonts_version_timestamp' );
108
  wcj_check_and_maybe_download_tcpdf_fonts();
109
- wp_safe_redirect( esc_url( remove_query_arg( 'wcj_download_fonts' ) ) );
110
  exit;
111
  }
112
  }
2
  /**
3
  * Booster for WooCommerce - PDF Invoicing - Styling
4
  *
5
+ * @version 5.6.8
6
  * @author Pluggabl LLC.
7
  * @package Booster_For_WooCommerce/includes
8
  */
81
  /**
82
  * Download_fonts.
83
  *
84
+ * @version 5.6.8
85
  * @version 2.9.0
86
  * @param int $interval Get time interval.
87
  */
88
  public function download_fonts( $interval ) {
89
+ update_option( 'wcj_download_tcpdf_fonts_hook_timestamp', wcj_get_timestamp_date_from_gmt() );
90
  wcj_check_and_maybe_download_tcpdf_fonts( true );
91
  }
92
 
93
  /**
94
  * Manually_download_fonts.
95
  *
96
+ * @version 5.6.8
97
  * @version 2.9.0
98
  * @todo add success/error message
99
  */
100
  public function manually_download_fonts() {
101
+ $wpnonce = isset( $_REQUEST['wcj_download_fonts-nonce'] ) ? wp_verify_nonce( sanitize_key( $_REQUEST['wcj_download_fonts-nonce'] ), 'wcj_download_fonts' ) : false;
 
 
 
102
  if ( isset( $_GET['wcj_download_fonts'] ) && $wpnonce ) {
103
  delete_option( 'wcj_invoicing_fonts_version' );
104
  delete_option( 'wcj_invoicing_fonts_version_timestamp' );
105
  wcj_check_and_maybe_download_tcpdf_fonts();
106
+ wp_safe_redirect( esc_url_raw( remove_query_arg( array( 'wcj_download_fonts', 'wcj_download_fonts-nonce' ) ) ) );
107
  exit;
108
  }
109
  }
includes/pdf-invoices/submodules/class-wcj-pdf-invoicing-templates.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - PDF Invoicing - Templates
4
  *
5
- * @version 5.6.1
6
  * @author Pluggabl LLC.
7
  * @package Booster_For_WooCommerce/includes
8
  */
@@ -35,14 +35,14 @@ if ( ! class_exists( 'WCJ_PDF_Invoicing_Templates' ) ) :
35
  /**
36
  * Get_default_template.
37
  *
38
- * @version 5.6.1
39
  * @since 3.1.0
40
  * @param int $invoice_type_id Get invoice ID.
41
  */
42
  public function get_default_template( $invoice_type_id ) {
43
  if ( ! isset( $this->default_template[ $invoice_type_id ] ) ) {
44
  $default_template_filename = ( false === strpos( $invoice_type_id, 'custom_doc_' ) ? $invoice_type_id : 'custom_doc' );
45
- $default_template_filename = wcj_free_plugin_path() . '/includes/settings/pdf-invoicing/wcj-content-template-' . $default_template_filename . '.php';
46
  if ( file_exists( $default_template_filename ) ) {
47
  ob_start();
48
  include $default_template_filename;
2
  /**
3
  * Booster for WooCommerce - PDF Invoicing - Templates
4
  *
5
+ * @version 5.6.8
6
  * @author Pluggabl LLC.
7
  * @package Booster_For_WooCommerce/includes
8
  */
35
  /**
36
  * Get_default_template.
37
  *
38
+ * @version 5.6.8
39
  * @since 3.1.0
40
  * @param int $invoice_type_id Get invoice ID.
41
  */
42
  public function get_default_template( $invoice_type_id ) {
43
  if ( ! isset( $this->default_template[ $invoice_type_id ] ) ) {
44
  $default_template_filename = ( false === strpos( $invoice_type_id, 'custom_doc_' ) ? $invoice_type_id : 'custom_doc' );
45
+ $default_template_filename = wcj_free_plugin_path() . '/includes/settings/pdf-invoicing/wcj-content-template-' . $default_template_filename . '.html';
46
  if ( file_exists( $default_template_filename ) ) {
47
  ob_start();
48
  include $default_template_filename;
includes/price-by-country/class-wcj-price-by-country-core.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Price by Country - Core
4
  *
5
- * @version 5.6.2
6
  * @author Pluggabl LLC.
7
  * @package Booster_For_WooCommerce/includes/Price_By_Country
8
  */
@@ -51,15 +51,12 @@ if ( ! class_exists( 'WCJ_Price_By_Country_Core' ) ) :
51
  /**
52
  * Init.
53
  *
54
- * @version 5.6.2
55
  * @since 2.9.0
56
  */
57
  public function init() {
58
  wcj_session_maybe_start();
59
- $wpnonce = true;
60
- if ( function_exists( 'wp_verify_nonce' ) ) {
61
- $wpnonce = isset( $_REQUEST['_wpnonce'] ) ? wp_verify_nonce( sanitize_key( isset( $_REQUEST['_wpnonce'] ) ? $_REQUEST['_wpnonce'] : '' ) ) : true;
62
- }
63
  $country = isset( $_REQUEST['wcj-country'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['wcj-country'] ) ) : '';
64
  $req_country = null;
65
  if ( $wpnonce && ! empty( $country ) ) {
@@ -194,7 +191,7 @@ if ( ! class_exists( 'WCJ_Price_By_Country_Core' ) ) :
194
  /**
195
  * Set_default_checkout_country.
196
  *
197
- * @version 5.6.2
198
  * @since 5.3.0
199
  *
200
  * @param string $default_country defins the default country.
@@ -202,9 +199,10 @@ if ( ! class_exists( 'WCJ_Price_By_Country_Core' ) ) :
202
  * @return array|null|string
203
  */
204
  public function set_default_checkout_country( $default_country ) {
 
205
  if (
206
  'yes' !== get_option( 'wcj_price_by_country_set_dft_checkout_billing_country', 'no' ) ||
207
- empty( $country = null !== ( $country = wcj_session_get( 'wcj-country' ) ) ? $country : ( $country = $this->get_customer_country_by_ip() ) ) //phpcs:ignore
208
  ) {
209
  return $default_country;
210
  }
@@ -337,7 +335,7 @@ if ( ! class_exists( 'WCJ_Price_By_Country_Core' ) ) :
337
  /**
338
  * Price_filter_post_clauses.
339
  *
340
- * @version 5.6.2
341
  * @since 5.1.0
342
  *
343
  * @see WC_Query::price_filter_post_clauses()
@@ -349,14 +347,15 @@ if ( ! class_exists( 'WCJ_Price_By_Country_Core' ) ) :
349
  */
350
  public function price_filter_post_clauses( $args, $wp_query ) {
351
  global $wpdb;
352
- $wpnonce = wp_verify_nonce( sanitize_key( isset( $_REQUEST['_wpnonce'] ) ? $_REQUEST['_wpnonce'] : '' ) );
353
  $group_id = $this->get_customer_country_group_id();
354
  $country_exchange_rate = get_option( 'wcj_price_by_country_exchange_rate_group_' . $group_id, 1 );
355
- if ( ! $wpnonce || ! $wp_query->is_main_query() || ( ! isset( $_GET['max_price'] ) && ! isset( $_GET['min_price'] ) ) || empty( $group_id ) || (float) 1 === (float) $country_exchange_rate ) {
356
  return $args;
357
  }
358
  $current_min_price = isset( $_GET['min_price'] ) ? floatval( wp_unslash( $_GET['min_price'] ) ) : 0;
359
  $current_max_price = isset( $_GET['max_price'] ) ? floatval( wp_unslash( $_GET['max_price'] ) ) : PHP_INT_MAX;
 
360
  if ( wc_tax_enabled() && 'incl' === get_option( 'woocommerce_tax_display_shop' ) && ! wc_prices_include_tax() ) {
361
  $tax_class = apply_filters( 'woocommerce_price_filter_widget_tax_class', '' );
362
  $tax_rates = WC_Tax::get_rates( $tax_class );
@@ -671,7 +670,7 @@ if ( ! class_exists( 'WCJ_Price_By_Country_Core' ) ) :
671
  /**
672
  * Get_customer_country_group_id.
673
  *
674
- * @version 5.6.2
675
  * @todo [feature] (maybe) `( 'cart_and_checkout' === get_option( 'wcj_price_by_country_override_scope', 'all' ) && ( is_cart() || is_checkout() ) ) ||`
676
  */
677
  public function get_customer_country_group_id() {
@@ -689,14 +688,10 @@ if ( ! class_exists( 'WCJ_Price_By_Country_Core' ) ) :
689
  return $this->customer_country_group_id;
690
  }
691
 
692
- $wpnonce = true;
693
- if ( function_exists( 'wp_verify_nonce' ) ) {
694
- $wpnonce = isset( $_REQUEST['_wpnonce'] ) ? wp_verify_nonce( sanitize_key( isset( $_REQUEST['_wpnonce'] ) ? $_REQUEST['_wpnonce'] : '' ) ) : true;
695
- }
696
-
697
  // Get the country.
 
698
  $override_option = get_option( 'wcj_price_by_country_override_on_checkout_with_billing_country', 'no' );
699
- if ( $wpnonce && isset( $_GET['country'] ) && '' !== $_GET['country'] && wcj_is_user_role( 'administrator' ) ) {
700
  $country = sanitize_text_field( wp_unslash( $_GET['country'] ) );
701
  } elseif ( 'no' !== $override_option && (
702
  ( 'all' === get_option( 'wcj_price_by_country_override_scope', 'all' ) ) ||
@@ -718,6 +713,7 @@ if ( ! class_exists( 'WCJ_Price_By_Country_Core' ) ) :
718
  $country = ( defined( 'ICL_LANGUAGE_CODE' ) ? ICL_LANGUAGE_CODE : null );
719
  }
720
  }
 
721
 
722
  if ( null === $country ) {
723
  $this->customer_country_group_id = -1;
@@ -811,21 +807,19 @@ if ( ! class_exists( 'WCJ_Price_By_Country_Core' ) ) :
811
  /**
812
  * Change_price.
813
  *
814
- * @version 5.6.2
815
  * @param string $price defines the price for conversion.
816
  * @param object $product Product Object.
817
  */
818
  public function change_price( $price, $product ) {
819
  $group_id = $this->get_customer_country_group_id();
820
  if ( null !== $group_id && '' !== $group_id ) {
821
- $product_generated_cart_id = WC()->cart->generate_cart_id( wcj_get_product_id( $product ) );
822
  if ( 'yes' === get_option( 'wcj_price_by_country_compatibility_woo_discount_rules', 'no' ) ) {
823
  global $flycart_woo_discount_rules;
824
  if (
825
  ! empty( $flycart_woo_discount_rules ) &&
826
- ! has_action( 'woocommerce_before_calculate_totals', array( $flycart_woo_discount_rules, 'applyDiscountRules' ) )
827
- && ( $product_cart_id = $product_generated_cart_id ) && //phpcs:ignore
828
- WC()->cart->find_product_in_cart( $product_cart_id )
829
  ) {
830
  return $price;
831
  }
2
  /**
3
  * Booster for WooCommerce - Price by Country - Core
4
  *
5
+ * @version 5.6.8
6
  * @author Pluggabl LLC.
7
  * @package Booster_For_WooCommerce/includes/Price_By_Country
8
  */
51
  /**
52
  * Init.
53
  *
54
+ * @version 5.6.8
55
  * @since 2.9.0
56
  */
57
  public function init() {
58
  wcj_session_maybe_start();
59
+ $wpnonce = isset( $_REQUEST['wcj-country-nonce'] ) ? wp_verify_nonce( sanitize_key( $_REQUEST['wcj-country-nonce'] ), 'wcj-country' ) : false;
 
 
 
60
  $country = isset( $_REQUEST['wcj-country'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['wcj-country'] ) ) : '';
61
  $req_country = null;
62
  if ( $wpnonce && ! empty( $country ) ) {
191
  /**
192
  * Set_default_checkout_country.
193
  *
194
+ * @version 5.6.8
195
  * @since 5.3.0
196
  *
197
  * @param string $default_country defins the default country.
199
  * @return array|null|string
200
  */
201
  public function set_default_checkout_country( $default_country ) {
202
+ $country = null !== wcj_session_get( 'wcj-country' ) ? wcj_session_get( 'wcj-country' ) : $this->get_customer_country_by_ip();
203
  if (
204
  'yes' !== get_option( 'wcj_price_by_country_set_dft_checkout_billing_country', 'no' ) ||
205
+ empty( $country )
206
  ) {
207
  return $default_country;
208
  }
335
  /**
336
  * Price_filter_post_clauses.
337
  *
338
+ * @version 5.6.8
339
  * @since 5.1.0
340
  *
341
  * @see WC_Query::price_filter_post_clauses()
347
  */
348
  public function price_filter_post_clauses( $args, $wp_query ) {
349
  global $wpdb;
350
+ // phpcs:disable WordPress.Security.NonceVerification
351
  $group_id = $this->get_customer_country_group_id();
352
  $country_exchange_rate = get_option( 'wcj_price_by_country_exchange_rate_group_' . $group_id, 1 );
353
+ if ( ! $wp_query->is_main_query() || ( ! isset( $_GET['max_price'] ) && ! isset( $_GET['min_price'] ) ) || empty( $group_id ) || (float) 1 === (float) $country_exchange_rate ) {
354
  return $args;
355
  }
356
  $current_min_price = isset( $_GET['min_price'] ) ? floatval( wp_unslash( $_GET['min_price'] ) ) : 0;
357
  $current_max_price = isset( $_GET['max_price'] ) ? floatval( wp_unslash( $_GET['max_price'] ) ) : PHP_INT_MAX;
358
+ // phpcs:enable WordPress.Security.NonceVerification
359
  if ( wc_tax_enabled() && 'incl' === get_option( 'woocommerce_tax_display_shop' ) && ! wc_prices_include_tax() ) {
360
  $tax_class = apply_filters( 'woocommerce_price_filter_widget_tax_class', '' );
361
  $tax_rates = WC_Tax::get_rates( $tax_class );
670
  /**
671
  * Get_customer_country_group_id.
672
  *
673
+ * @version 5.6.8
674
  * @todo [feature] (maybe) `( 'cart_and_checkout' === get_option( 'wcj_price_by_country_override_scope', 'all' ) && ( is_cart() || is_checkout() ) ) ||`
675
  */
676
  public function get_customer_country_group_id() {
688
  return $this->customer_country_group_id;
689
  }
690
 
 
 
 
 
 
691
  // Get the country.
692
+ // phpcs:disable WordPress.Security.NonceVerification
693
  $override_option = get_option( 'wcj_price_by_country_override_on_checkout_with_billing_country', 'no' );
694
+ if ( isset( $_GET['country'] ) && '' !== $_GET['country'] && wcj_is_user_role( 'administrator' ) ) {
695
  $country = sanitize_text_field( wp_unslash( $_GET['country'] ) );
696
  } elseif ( 'no' !== $override_option && (
697
  ( 'all' === get_option( 'wcj_price_by_country_override_scope', 'all' ) ) ||
713
  $country = ( defined( 'ICL_LANGUAGE_CODE' ) ? ICL_LANGUAGE_CODE : null );
714
  }
715
  }
716
+ // phpcs:enable WordPress.Security.NonceVerification
717
 
718
  if ( null === $country ) {
719
  $this->customer_country_group_id = -1;
807
  /**
808
  * Change_price.
809
  *
810
+ * @version 5.6.8
811
  * @param string $price defines the price for conversion.
812
  * @param object $product Product Object.
813
  */
814
  public function change_price( $price, $product ) {
815
  $group_id = $this->get_customer_country_group_id();
816
  if ( null !== $group_id && '' !== $group_id ) {
 
817
  if ( 'yes' === get_option( 'wcj_price_by_country_compatibility_woo_discount_rules', 'no' ) ) {
818
  global $flycart_woo_discount_rules;
819
  if (
820
  ! empty( $flycart_woo_discount_rules ) &&
821
+ ! has_action( 'woocommerce_before_calculate_totals', array( $flycart_woo_discount_rules, 'applyDiscountRules' ) ) &&
822
+ WC()->cart->find_product_in_cart( WC()->cart->generate_cart_id( wcj_get_product_id( $product ) ) )
 
823
  ) {
824
  return $price;
825
  }
includes/price-by-country/class-wcj-price-by-country-group-generator.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Price By Country - Group Generator
4
  *
5
- * @version 5.6.2
6
  * @author Pluggabl LLC.
7
  * @package Booster_For_WooCommerce/includes/Price_By_Country
8
  */
@@ -36,10 +36,7 @@ if ( ! class_exists( 'WCJ_Price_By_Country_Group_Generator' ) ) :
36
  * @since 3.9.0
37
  */
38
  public function create_all_countries_groups_notices() {
39
- $wpnonce = true;
40
- if ( function_exists( 'wp_verify_nonce' ) ) {
41
- $wpnonce = isset( $_REQUEST['_wpnonce'] ) ? wp_verify_nonce( sanitize_key( isset( $_REQUEST['_wpnonce'] ) ? $_REQUEST['_wpnonce'] : '' ), 'woocommerce-settings' ) : true;
42
- }
43
  if ( $wpnonce && isset( $_GET['wcj_generate_country_groups_finished'] ) ) {
44
  echo '<div class="notice notice-success is-dismissible"><p>' . esc_html__( 'Country groups successfully generated.', 'woocommerce-jetpack' ) . '</p></div>';
45
  }
@@ -76,19 +73,19 @@ if ( ! class_exists( 'WCJ_Price_By_Country_Group_Generator' ) ) :
76
  /**
77
  * Create_all_countries_groups.
78
  *
79
- * @version 5.6.2
80
  * @todo add nonce verification
81
  */
82
  public function create_all_countries_groups() {
83
- $wpnonce = true;
84
- if ( function_exists( 'wp_verify_nonce' ) ) {
85
- $wpnonce = isset( $_REQUEST['_wpnonce'] ) ? wp_verify_nonce( sanitize_key( isset( $_REQUEST['_wpnonce'] ) ? $_REQUEST['_wpnonce'] : '' ), 'woocommerce-settings' ) : true;
86
- }
87
  // Verification.
88
- if ( ! $wpnonce || ! isset( $_GET['wcj_generate_country_groups'] ) ) {
 
 
 
89
  return;
90
  }
91
- if ( $wpnonce && isset( $_POST['save'] ) ) {
92
  return;
93
  }
94
  if ( ! wcj_is_user_role( 'administrator' ) || 1 === apply_filters( 'booster_option', 1, '' ) ) {
2
  /**
3
  * Booster for WooCommerce - Price By Country - Group Generator
4
  *
5
+ * @version 5.6.8
6
  * @author Pluggabl LLC.
7
  * @package Booster_For_WooCommerce/includes/Price_By_Country
8
  */
36
  * @since 3.9.0
37
  */
38
  public function create_all_countries_groups_notices() {
39
+ $wpnonce = isset( $_REQUEST['wcj_generate_country_groups-nonce'] ) ? wp_verify_nonce( sanitize_key( $_REQUEST['wcj_generate_country_groups-nonce'] ), 'wcj_generate_country_groups' ) : false;
 
 
 
40
  if ( $wpnonce && isset( $_GET['wcj_generate_country_groups_finished'] ) ) {
41
  echo '<div class="notice notice-success is-dismissible"><p>' . esc_html__( 'Country groups successfully generated.', 'woocommerce-jetpack' ) . '</p></div>';
42
  }
73
  /**
74
  * Create_all_countries_groups.
75
  *
76
+ * @version 5.6.8
77
  * @todo add nonce verification
78
  */
79
  public function create_all_countries_groups() {
80
+ $wpnonce = isset( $_GET['wcj_generate_country_groups-nonce'] ) ? wp_verify_nonce( sanitize_key( $_GET['wcj_generate_country_groups-nonce'] ), 'wcj_generate_country_groups' ) : false;
 
 
 
81
  // Verification.
82
+ if ( ! isset( $_GET['wcj_generate_country_groups'] ) ) {
83
+ return;
84
+ }
85
+ if ( isset( $_POST['save'] ) ) {
86
  return;
87
  }
88
+ if ( ! $wpnonce ) {
89
  return;
90
  }
91
  if ( ! wcj_is_user_role( 'administrator' ) || 1 === apply_filters( 'booster_option', 1, '' ) ) {
includes/price-by-country/class-wcj-price-by-country-local.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Price by Country - Local
4
  *
5
- * @version 5.6.2
6
  * @author Pluggabl LLC.
7
  * @todo (maybe) remove this and leave only standard meta box option (i.e. only `'meta_box' === wcj_get_option( 'wcj_price_by_country_local_options_style', 'inline' )`)
8
  * @package Booster_For_WooCommerce/includes/Price_By_Country
@@ -77,7 +77,7 @@ if ( ! class_exists( 'WCJ_Price_By_Country_Local' ) ) :
77
  }
78
 
79
  // Output.
80
- echo $html; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
81
  }
82
 
83
  /**
2
  /**
3
  * Booster for WooCommerce - Price by Country - Local
4
  *
5
+ * @version 5.6.8
6
  * @author Pluggabl LLC.
7
  * @todo (maybe) remove this and leave only standard meta box option (i.e. only `'meta_box' === wcj_get_option( 'wcj_price_by_country_local_options_style', 'inline' )`)
8
  * @package Booster_For_WooCommerce/includes/Price_By_Country
77
  }
78
 
79
  // Output.
80
+ echo wp_kses_post( $html );
81
  }
82
 
83
  /**
includes/reports/class-wcj-currency-reports.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Reports - Currency
4
  *
5
- * @version 5.6.2
6
  * @author Pluggabl LLC.
7
  * @package Booster_For_WooCommerce/includes
8
  */
@@ -29,12 +29,12 @@ if ( ! class_exists( 'WCJ_Currency_Reports' ) ) :
29
  /**
30
  * Add_reports_currency_to_admin_bar.
31
  *
32
- * @version 5.6.2
33
  * @param int | string $wp_admin_bar Difine admin_bar.
34
  */
35
  public function add_reports_currency_to_admin_bar( $wp_admin_bar ) {
36
- $wpnonce = isset( $_REQUEST['_wpnonce'] ) ? wp_verify_nonce( sanitize_key( isset( $_REQUEST['_wpnonce'] ) ? $_REQUEST['_wpnonce'] : '' ) ) : true;
37
- if ( $wpnonce && isset( $_GET['page'] ) && 'wc-reports' === $_GET['page'] ) {
38
 
39
  $the_current_code = isset( $_GET['currency'] ) ? sanitize_text_field( wp_unslash( $_GET['currency'] ) ) : get_woocommerce_currency();
40
  $parent = 'reports_currency_select';
@@ -88,18 +88,19 @@ if ( ! class_exists( 'WCJ_Currency_Reports' ) ) :
88
  $wp_admin_bar->add_node( $args );
89
  }
90
  }
 
91
  }
92
 
93
  /**
94
  * Change_currency_symbol_reports.
95
  *
96
- * @version 5.6.2
97
  * @param string $currency_symbol Get currency symbol.
98
  * @param string $currency Get currency.
99
  */
100
  public function change_currency_symbol_reports( $currency_symbol, $currency ) {
101
- $wpnonce = isset( $_REQUEST['_wpnonce'] ) ? wp_verify_nonce( sanitize_key( isset( $_REQUEST['_wpnonce'] ) ? $_REQUEST['_wpnonce'] : '' ) ) : true;
102
- if ( $wpnonce && isset( $_GET['page'] ) && 'wc-reports' === $_GET['page'] ) {
103
  if ( isset( $_GET['currency'] ) ) {
104
  if ( 'merge' === $_GET['currency'] ) {
105
  return '';
@@ -111,29 +112,31 @@ if ( ! class_exists( 'WCJ_Currency_Reports' ) ) :
111
  }
112
  }
113
  }
 
114
  return $currency_symbol;
115
  }
116
 
117
  /**
118
  * Filter_reports.
119
  *
120
- * @version 5.6.2
121
  * @param Array $args Get args.
122
  */
123
  public function filter_reports( $args ) {
124
- $wpnonce = isset( $_REQUEST['_wpnonce'] ) ? wp_verify_nonce( sanitize_key( isset( $_REQUEST['_wpnonce'] ) ? $_REQUEST['_wpnonce'] : '' ) ) : true;
125
- if ( $wpnonce && isset( $_GET['page'] ) && 'wc-reports' === $_GET['page'] ) {
126
  if ( isset( $_GET['currency'] ) && 'merge' === $_GET['currency'] ) {
127
  return $args;
128
  }
129
  $args['where_meta'] = array(
130
  array(
131
- 'meta_key' => '_order_currency', //phpcs:ignore
132
- 'meta_value' => isset( $_GET['currency'] ) ? sanitize_text_field( wp_unslash( $_GET['currency'] ) ) : get_woocommerce_currency(), //phpcs:ignore
133
  'operator' => '=',
134
  ),
135
  );
136
  }
 
137
  return $args;
138
  }
139
  }
2
  /**
3
  * Booster for WooCommerce - Reports - Currency
4
  *
5
+ * @version 5.6.8
6
  * @author Pluggabl LLC.
7
  * @package Booster_For_WooCommerce/includes
8
  */
29
  /**
30
  * Add_reports_currency_to_admin_bar.
31
  *
32
+ * @version 5.6.8
33
  * @param int | string $wp_admin_bar Difine admin_bar.
34
  */
35
  public function add_reports_currency_to_admin_bar( $wp_admin_bar ) {
36
+ // phpcs:disable WordPress.Security.NonceVerification
37
+ if ( isset( $_GET['page'] ) && 'wc-reports' === $_GET['page'] ) {
38
 
39
  $the_current_code = isset( $_GET['currency'] ) ? sanitize_text_field( wp_unslash( $_GET['currency'] ) ) : get_woocommerce_currency();
40
  $parent = 'reports_currency_select';
88
  $wp_admin_bar->add_node( $args );
89
  }
90
  }
91
+ // phpcs:enable WordPress.Security.NonceVerification
92
  }
93
 
94
  /**
95
  * Change_currency_symbol_reports.
96
  *
97
+ * @version 5.6.8
98
  * @param string $currency_symbol Get currency symbol.
99
  * @param string $currency Get currency.
100
  */
101
  public function change_currency_symbol_reports( $currency_symbol, $currency ) {
102
+ // phpcs:disable WordPress.Security.NonceVerification
103
+ if ( isset( $_GET['page'] ) && 'wc-reports' === $_GET['page'] ) {
104
  if ( isset( $_GET['currency'] ) ) {
105
  if ( 'merge' === $_GET['currency'] ) {
106
  return '';
112
  }
113
  }
114
  }
115
+ // phpcs:enable WordPress.Security.NonceVerification
116
  return $currency_symbol;
117
  }
118
 
119
  /**
120
  * Filter_reports.
121
  *
122
+ * @version 5.6.8
123
  * @param Array $args Get args.
124
  */
125
  public function filter_reports( $args ) {
126
+ // phpcs:disable WordPress.Security.NonceVerification
127
+ if ( isset( $_GET['page'] ) && 'wc-reports' === $_GET['page'] ) {
128
  if ( isset( $_GET['currency'] ) && 'merge' === $_GET['currency'] ) {
129
  return $args;
130
  }
131
  $args['where_meta'] = array(
132
  array(
133
+ 'meta_key' => '_order_currency', // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_key
134
+ 'meta_value' => isset( $_GET['currency'] ) ? sanitize_text_field( wp_unslash( $_GET['currency'] ) ) : get_woocommerce_currency(), // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_value
135
  'operator' => '=',
136
  ),
137
  );
138
  }
139
+ // phpcs:enable WordPress.Security.NonceVerification
140
  return $args;
141
  }
142
  }
includes/reports/class-wcj-reports-monthly-sales.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Reports - Monthly Sales (with Currency Conversion)
4
  *
5
- * @version 5.6.7
6
  * @since 2.4.7
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/includes
@@ -86,7 +86,7 @@ if ( ! class_exists( 'WCJ_Reports_Monthly_Sales' ) ) :
86
  /**
87
  * Get_monthly_sales_report.
88
  *
89
- * @version 5.6.7
90
  * @since 2.4.7
91
  * @todo (maybe) visible rows selection by admin (as option)
92
  * @todo (maybe) take not monthly average, but "Close" of closest day (probably create new "Daily Sales (with Currency Conversion)" report)
@@ -113,11 +113,8 @@ if ( ! class_exists( 'WCJ_Reports_Monthly_Sales' ) ) :
113
 
114
  $order_currencies_array = array();
115
  $order_currencies_array_totals = array();
116
- $wpnonce = true;
117
- if ( function_exists( 'wp_verify_nonce' ) ) {
118
- $wpnonce = isset( $_REQUEST['_wpnonce'] ) ? wp_verify_nonce( sanitize_key( isset( $_REQUEST['_wpnonce'] ) ? $_REQUEST['_wpnonce'] : '' ) ) : true;
119
- }
120
- $report_currency = ( $wpnonce && isset( $_GET['currency'] ) && 'merge' !== isset( $_GET['currency'] ) ) ? sanitize_text_field( wp_unslash( $_GET['currency'] ) ) : get_woocommerce_currency();
121
  $block_size = 256;
122
  $table_data = array();
123
  $do_forecast = ( 'yes' === wcj_get_option( 'wcj_reports_orders_monthly_sales_forecast', 'no' ) );
2
  /**
3
  * Booster for WooCommerce - Reports - Monthly Sales (with Currency Conversion)
4
  *
5
+ * @version 5.6.8
6
  * @since 2.4.7
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/includes
86
  /**
87
  * Get_monthly_sales_report.
88
  *
89
+ * @version 5.6.8
90
  * @since 2.4.7
91
  * @todo (maybe) visible rows selection by admin (as option)
92
  * @todo (maybe) take not monthly average, but "Close" of closest day (probably create new "Daily Sales (with Currency Conversion)" report)
113
 
114
  $order_currencies_array = array();
115
  $order_currencies_array_totals = array();
116
+
117
+ $report_currency = ( isset( $_GET['currency'] ) && 'merge' !== isset( $_GET['currency'] ) ) ? sanitize_text_field( wp_unslash( $_GET['currency'] ) ) : get_woocommerce_currency(); // phpcs:ignore WordPress.Security.NonceVerification
 
 
 
118
  $block_size = 256;
119
  $table_data = array();
120
  $do_forecast = ( 'yes' === wcj_get_option( 'wcj_reports_orders_monthly_sales_forecast', 'no' ) );
includes/reports/class-wcj-reports-product-sales-daily.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Reports - Product Sales (Daily)
4
  *
5
- * @version 5.6.7
6
  * @since 2.9.0
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/includes
@@ -47,11 +47,11 @@ if ( ! class_exists( 'WCJ_Reports_Product_Sales_Daily' ) ) :
47
  /**
48
  * Get_report_args.
49
  *
50
- * @version 5.6.7
51
  * @since 2.9.0
52
  */
53
  public function get_report_args() {
54
- $current_time = (int) gmdate( 'U' );
55
  $wpnonce = isset( $_REQUEST['booster_products_sales_daily_filter-nonce'] ) ? wp_verify_nonce( sanitize_key( $_REQUEST['booster_products_sales_daily_filter-nonce'] ), 'booster_products_sales_daily_filter' ) : false;
56
  $this->start_date = $wpnonce && isset( $_GET['start_date'] ) ? sanitize_text_field( wp_unslash( $_GET['start_date'] ) ) : gmdate( 'Y-m-d', strtotime( '-7 days', $current_time ) );
57
  $this->end_date = isset( $_GET['end_date'] ) ? sanitize_text_field( wp_unslash( $_GET['end_date'] ) ) : gmdate( 'Y-m-d', $current_time );
@@ -171,12 +171,12 @@ if ( ! class_exists( 'WCJ_Reports_Product_Sales_Daily' ) ) :
171
  /**
172
  * Output_report_header.
173
  *
174
- * @version 5.6.7
175
  * @since 2.9.0
176
  */
177
  public function output_report_header() {
178
  // Settings link and dates menu.
179
- $settings_link = '<a href="' . admin_url( 'admin.php?page=wc-settings&tab=jetpack&wcj-cat=emails_and_misc&section=reports' ) . '">' .
180
  '<< ' . __( 'Reports Settings', 'woocommerce-jetpack' ) . '</a>';
181
  $menu = '';
182
  $menu .= '<ul class="subsubsub">';
@@ -196,15 +196,16 @@ if ( ! class_exists( 'WCJ_Reports_Product_Sales_Daily' ) ) :
196
  $menu .= '</ul>';
197
  $menu .= '<br class="clear">';
198
  // Product and date filter form.
199
- $wpnonce = isset( $_REQUEST['_wpnonce'] ) ? wp_verify_nonce( sanitize_key( $_REQUEST['_wpnonce'] ) ) : true;
200
- $pages = isset( $_GET['page'] ) ? sanitize_text_field( wp_unslash( $_GET['page'] ) ) : '';
201
- $tabs = isset( $_GET['tab'] ) ? sanitize_text_field( wp_unslash( $_GET['tab'] ) ) : '';
202
- $reports = isset( $_GET['report'] ) ? sanitize_text_field( wp_unslash( $_GET['report'] ) ) : '';
 
203
  $filter_form = '';
204
  $filter_form .= '<form method="get" action="">';
205
- $filter_form .= '<input type="hidden" name="page" value="' . $pages . '" />';
206
- $filter_form .= '<input type="hidden" name="tab" value="' . $tabs . '" />';
207
- $filter_form .= '<input type="hidden" name="report" value="' . $reports . '" />';
208
  $filter_form .= '<label style="font-style:italic;" for="start_date">' . __( 'From:', 'woocommerce-jetpack' ) . '</label> ' .
209
  '<input type="text" display="date" dateformat="' . wcj_date_format_php_to_js( 'Y-m-d' ) . '" name="start_date" title="" value="' . $this->start_date . '" />';
210
  $filter_form .= ' ';
2
  /**
3
  * Booster for WooCommerce - Reports - Product Sales (Daily)
4
  *
5
+ * @version 5.6.8
6
  * @since 2.9.0
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/includes
47
  /**
48
  * Get_report_args.
49
  *
50
+ * @version 5.6.8
51
  * @since 2.9.0
52
  */
53
  public function get_report_args() {
54
+ $current_time = wcj_get_timestamp_date_from_gmt();
55
  $wpnonce = isset( $_REQUEST['booster_products_sales_daily_filter-nonce'] ) ? wp_verify_nonce( sanitize_key( $_REQUEST['booster_products_sales_daily_filter-nonce'] ), 'booster_products_sales_daily_filter' ) : false;
56
  $this->start_date = $wpnonce && isset( $_GET['start_date'] ) ? sanitize_text_field( wp_unslash( $_GET['start_date'] ) ) : gmdate( 'Y-m-d', strtotime( '-7 days', $current_time ) );
57
  $this->end_date = isset( $_GET['end_date'] ) ? sanitize_text_field( wp_unslash( $_GET['end_date'] ) ) : gmdate( 'Y-m-d', $current_time );
171
  /**
172
  * Output_report_header.
173
  *
174
+ * @version 5.6.8
175
  * @since 2.9.0
176
  */
177
  public function output_report_header() {
178
  // Settings link and dates menu.
179
+ $settings_link = '<a href="' . admin_url( wcj_admin_tab_url() . '&wcj-cat=emails_and_misc&section=reports' ) . '">' .
180
  '<< ' . __( 'Reports Settings', 'woocommerce-jetpack' ) . '</a>';
181
  $menu = '';
182
  $menu .= '<ul class="subsubsub">';
196
  $menu .= '</ul>';
197
  $menu .= '<br class="clear">';
198
  // Product and date filter form.
199
+ // phpcs:disable WordPress.Security.NonceVerification
200
+ $pages = isset( $_GET['page'] ) ? sanitize_text_field( wp_unslash( $_GET['page'] ) ) : '';
201
+ $tabs = isset( $_GET['tab'] ) ? sanitize_text_field( wp_unslash( $_GET['tab'] ) ) : '';
202
+ $reports = isset( $_GET['report'] ) ? sanitize_text_field( wp_unslash( $_GET['report'] ) ) : '';
203
+ // phpcs:enable WordPress.Security.NonceVerification
204
  $filter_form = '';
205
  $filter_form .= '<form method="get" action="">';
206
+ $filter_form .= '<input type="hidden" name="page" value="' . esc_attr( $pages ) . '" />';
207
+ $filter_form .= '<input type="hidden" name="tab" value="' . esc_attr( $tabs ) . '" />';
208
+ $filter_form .= '<input type="hidden" name="report" value="' . esc_attr( $reports ) . '" />';
209
  $filter_form .= '<label style="font-style:italic;" for="start_date">' . __( 'From:', 'woocommerce-jetpack' ) . '</label> ' .
210
  '<input type="text" display="date" dateformat="' . wcj_date_format_php_to_js( 'Y-m-d' ) . '" name="start_date" title="" value="' . $this->start_date . '" />';
211
  $filter_form .= ' ';
includes/reports/{wcj-class-reports-sales-gateways.php → class-wcj-reports-sales-gateways.php} RENAMED
@@ -1,8 +1,8 @@
1
- <?php //phpcs:ignore
2
  /**
3
  * Booster for WooCommerce - Reports - Product Sales - Gateways
4
  *
5
- * @version 5.6.2
6
  * @since 3.6.0
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/includes
@@ -12,14 +12,14 @@ if ( ! defined( 'ABSPATH' ) ) {
12
  exit;
13
  }
14
 
15
- if ( ! class_exists( 'WCJ_Reports_Product_Sales_Gateways' ) ) :
16
  /**
17
- * WCJ_Reports_Product_Sales_Gateways.
18
  *
19
- * @version 3.6.0
20
  * @since 3.6.0
21
  */
22
- class WCJ_Reports_Product_Sales_Gateways {
23
 
24
  /**
25
  * Constructor.
@@ -51,11 +51,8 @@ if ( ! class_exists( 'WCJ_Reports_Product_Sales_Gateways' ) ) :
51
  * @since 3.6.0
52
  */
53
  public function get_report_args() {
54
- $wpnonce = true;
55
- if ( function_exists( 'wp_verify_nonce' ) ) {
56
- $wpnonce = isset( $_REQUEST['_wpnonce'] ) ? wp_verify_nonce( sanitize_key( isset( $_REQUEST['_wpnonce'] ) ? $_REQUEST['_wpnonce'] : '' ), 'woocommerce-settings' ) : true;
57
- }
58
- $current_time = (int) gmdate( 'U' );
59
  $this->start_date = $wpnonce && isset( $_GET['start_date'] ) ? sanitize_text_field( wp_unslash( $_GET['start_date'] ) ) : gmdate( 'Y-m-d', strtotime( '-7 days', $current_time ) );
60
  $this->end_date = $wpnonce && isset( $_GET['end_date'] ) ? sanitize_text_field( wp_unslash( $_GET['end_date'] ) ) : gmdate( 'Y-m-d', $current_time );
61
  }
@@ -124,7 +121,7 @@ if ( ! class_exists( 'WCJ_Reports_Product_Sales_Gateways' ) ) :
124
  */
125
  public function output_report_header() {
126
  // Settings link and dates menu.
127
- $settings_link = '<a href="' . admin_url( 'admin.php?page=wc-settings&tab=jetpack&wcj-cat=emails_and_misc&section=reports' ) . '">' .
128
  '<< ' . __( 'Reports Settings', 'woocommerce-jetpack' ) . '</a>';
129
  $menu = '';
130
  $menu .= '<ul class="subsubsub">';
@@ -141,28 +138,27 @@ if ( ! class_exists( 'WCJ_Reports_Product_Sales_Gateways' ) ) :
141
  'class="' . ( ( $this->start_date === $custom_range['start_date'] && $this->end_date === $custom_range['end_date'] ) ? 'current' : '' ) . '"' .
142
  '>' . $custom_range['title'] . '</a> | </li>';
143
  }
144
- $menu .= '</ul>';
145
- $menu .= '<br class="clear">';
146
- $wpnonce = true;
147
- if ( function_exists( 'wp_verify_nonce' ) ) {
148
- $wpnonce = isset( $_REQUEST['_wpnonce'] ) ? wp_verify_nonce( sanitize_key( isset( $_REQUEST['_wpnonce'] ) ? $_REQUEST['_wpnonce'] : '' ), 'woocommerce-settings' ) : true;
149
- }
150
- $page = $wpnonce && isset( $_GET['page'] ) ? sanitize_text_field( wp_unslash( $_GET['page'] ) ) : '';
151
- $tab = $wpnonce && isset( $_GET['tab'] ) ? sanitize_text_field( wp_unslash( $_GET['tab'] ) ) : '';
152
- $report = $wpnonce && isset( $_GET['report'] ) ? sanitize_text_field( wp_unslash( $_GET['report'] ) ) : '';
153
 
154
  // Date filter form.
155
  $filter_form = '';
156
  $filter_form .= '<form method="get" action="">';
157
- $filter_form .= '<input type="hidden" name="page" value="' . $page . '" />';
158
- $filter_form .= '<input type="hidden" name="tab" value="' . $tab . '" />';
159
- $filter_form .= '<input type="hidden" name="report" value="' . $report . '" />';
160
  $filter_form .= '<label style="font-style:italic;" for="start_date">' . __( 'From:', 'woocommerce-jetpack' ) . '</label> ' .
161
  '<input type="text" display="date" dateformat="' . wcj_date_format_php_to_js( 'Y-m-d' ) . '" name="start_date" title="" value="' . $this->start_date . '" />';
162
  $filter_form .= ' ';
163
  $filter_form .= '<label style="font-style:italic;" for="end_date">' . __( 'To:', 'woocommerce-jetpack' ) . '</label>' .
164
  '<input type="text" display="date" dateformat="' . wcj_date_format_php_to_js( 'Y-m-d' ) . '" name="end_date" title="" value="' . $this->end_date . '" />';
165
  $filter_form .= ' ';
 
166
  $filter_form .= '<input type="submit" value="' . __( 'Filter', 'woocommerce-jetpack' ) . '" />';
167
  $filter_form .= '</form>';
168
  // Final result.
1
+ <?php
2
  /**
3
  * Booster for WooCommerce - Reports - Product Sales - Gateways
4
  *
5
+ * @version 5.6.8
6
  * @since 3.6.0
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/includes
12
  exit;
13
  }
14
 
15
+ if ( ! class_exists( 'WCJ_Reports_Sales_Gateways' ) ) :
16
  /**
17
+ * WCJ_Reports_Sales_Gateways.
18
  *
19
+ * @version 5.6.8
20
  * @since 3.6.0
21
  */
22
+ class WCJ_Reports_Sales_Gateways {
23
 
24
  /**
25
  * Constructor.
51
  * @since 3.6.0
52
  */
53
  public function get_report_args() {
54
+ $wpnonce = isset( $_REQUEST['wcj-reports-sales-gateways-nonce'] ) ? wp_verify_nonce( sanitize_key( $_REQUEST['wcj-reports-sales-gateways-nonce'] ), 'wcj-reports-sales-gateways' ) : false;
55
+ $current_time = wcj_get_timestamp_date_from_gmt();
 
 
 
56
  $this->start_date = $wpnonce && isset( $_GET['start_date'] ) ? sanitize_text_field( wp_unslash( $_GET['start_date'] ) ) : gmdate( 'Y-m-d', strtotime( '-7 days', $current_time ) );
57
  $this->end_date = $wpnonce && isset( $_GET['end_date'] ) ? sanitize_text_field( wp_unslash( $_GET['end_date'] ) ) : gmdate( 'Y-m-d', $current_time );
58
  }
121
  */
122
  public function output_report_header() {
123
  // Settings link and dates menu.
124
+ $settings_link = '<a href="' . admin_url( wcj_admin_tab_url() . '&wcj-cat=emails_and_misc&section=reports' ) . '">' .
125
  '<< ' . __( 'Reports Settings', 'woocommerce-jetpack' ) . '</a>';
126
  $menu = '';
127
  $menu .= '<ul class="subsubsub">';
138
  'class="' . ( ( $this->start_date === $custom_range['start_date'] && $this->end_date === $custom_range['end_date'] ) ? 'current' : '' ) . '"' .
139
  '>' . $custom_range['title'] . '</a> | </li>';
140
  }
141
+ $menu .= '</ul>';
142
+ $menu .= '<br class="clear">';
143
+ // phpcs:disable WordPress.Security.NonceVerification
144
+ $page = isset( $_GET['page'] ) ? sanitize_text_field( wp_unslash( $_GET['page'] ) ) : '';
145
+ $tab = isset( $_GET['tab'] ) ? sanitize_text_field( wp_unslash( $_GET['tab'] ) ) : '';
146
+ $report = isset( $_GET['report'] ) ? sanitize_text_field( wp_unslash( $_GET['report'] ) ) : '';
147
+ // phpcs:enable WordPress.Security.NonceVerification
 
 
148
 
149
  // Date filter form.
150
  $filter_form = '';
151
  $filter_form .= '<form method="get" action="">';
152
+ $filter_form .= '<input type="hidden" name="page" value="' . esc_attr( $page ) . '" />';
153
+ $filter_form .= '<input type="hidden" name="tab" value="' . esc_attr( $tab ) . '" />';
154
+ $filter_form .= '<input type="hidden" name="report" value="' . esc_attr( $report ) . '" />';
155
  $filter_form .= '<label style="font-style:italic;" for="start_date">' . __( 'From:', 'woocommerce-jetpack' ) . '</label> ' .
156
  '<input type="text" display="date" dateformat="' . wcj_date_format_php_to_js( 'Y-m-d' ) . '" name="start_date" title="" value="' . $this->start_date . '" />';
157
  $filter_form .= ' ';
158
  $filter_form .= '<label style="font-style:italic;" for="end_date">' . __( 'To:', 'woocommerce-jetpack' ) . '</label>' .
159
  '<input type="text" display="date" dateformat="' . wcj_date_format_php_to_js( 'Y-m-d' ) . '" name="end_date" title="" value="' . $this->end_date . '" />';
160
  $filter_form .= ' ';
161
+ $filter_form .= '<input type="hidden" name="wcj-reports-sales-gateways-nonce" value="' . wp_create_nonce( 'wcj-reports-sales-gateways' ) . '" />';
162
  $filter_form .= '<input type="submit" value="' . __( 'Filter', 'woocommerce-jetpack' ) . '" />';
163
  $filter_form .= '</form>';
164
  // Final result.
includes/reports/class-wcj-reports-sales.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Reports - Sales
4
  *
5
- * @version 5.6.2
6
  * @author Pluggabl LLC.
7
  * @package Booster_For_WooCommerce/includes
8
  */
@@ -34,17 +34,15 @@ if ( ! class_exists( 'WCJ_Reports_Sales' ) ) :
34
  /**
35
  * Get_report.
36
  *
37
- * @version 5.6.2
38
  * @since 2.3.0
39
  */
40
  public function get_report() {
41
- $html = '';
42
- $wpnonce = true;
43
- if ( function_exists( 'wp_verify_nonce' ) ) {
44
- $wpnonce = isset( $_REQUEST['_wpnonce'] ) ? wp_verify_nonce( sanitize_key( isset( $_REQUEST['_wpnonce'] ) ? $_REQUEST['_wpnonce'] : '' ), 'woocommerce-settings' ) : true;
45
- }
46
- $this->year = $wpnonce && isset( $_GET['year'] ) ? sanitize_text_field( wp_unslash( $_GET['year'] ) ) : gmdate( 'Y' );
47
- $this->product_title = $wpnonce && isset( $_GET['product_title'] ) ? sanitize_text_field( wp_unslash( $_GET['product_title'] ) ) : '';
48
 
49
  $html .= $this->get_products_sales();
50
 
@@ -82,7 +80,7 @@ if ( ! class_exists( 'WCJ_Reports_Sales' ) ) :
82
  /**
83
  * Get_products_sales.
84
  *
85
- * @version 5.6.2
86
  * @since 2.3.0
87
  * @todo fix when variable and variations are all (wrongfully) counted in total sums
88
  * @todo display more info for "Parent product deleted" and "Product deleted"
@@ -363,7 +361,7 @@ if ( ! class_exists( 'WCJ_Reports_Sales' ) ) :
363
  );
364
  }
365
 
366
- $settings_link = '<a href="' . admin_url( 'admin.php?page=wc-settings&tab=jetpack&wcj-cat=emails_and_misc&section=reports' ) . '">' .
367
  '<< ' . __( 'Reports Settings', 'woocommerce-jetpack' ) . '</a>';
368
 
369
  $menu = '';
@@ -371,25 +369,23 @@ if ( ! class_exists( 'WCJ_Reports_Sales' ) ) :
371
  $menu .= '<li><a href="' . esc_url( add_query_arg( 'year', gmdate( 'Y' ) ) ) . '" class="' .
372
  ( ( gmdate( 'Y' ) === $this->year ) ? 'current' : '' ) . '">' . gmdate( 'Y' ) . '</a> | </li>';
373
  $menu .= '<li><a href="' . esc_url( add_query_arg( 'year', ( gmdate( 'Y' ) - 1 ) ) ) . '" class="' .
374
- ( ( ( gmdate( 'Y' ) - 1 ) === $this->year ) ? 'current' : '' ) . '">' . ( gmdate( 'Y' ) - 1 ) . '</a> | </li>';
375
  $menu .= '<li><a href="' . esc_url( add_query_arg( 'year', ( gmdate( 'Y' ) - 2 ) ) ) . '" class="' .
376
- ( ( ( gmdate( 'Y' ) - 2 ) === $this->year ) ? 'current' : '' ) . '">' . ( gmdate( 'Y' ) - 2 ) . '</a></li>';
377
  $menu .= '</ul>';
378
  $menu .= '<br class="clear">';
379
 
380
- $wpnonce = true;
381
- if ( function_exists( 'wp_verify_nonce' ) ) {
382
- $wpnonce = isset( $_REQUEST['_wpnonce'] ) ? wp_verify_nonce( sanitize_key( isset( $_REQUEST['_wpnonce'] ) ? $_REQUEST['_wpnonce'] : '' ), 'woocommerce-settings' ) : true;
383
- }
384
- $page = $wpnonce && isset( $_GET['page'] ) ? sanitize_text_field( wp_unslash( $_GET['page'] ) ) : '';
385
- $tab = $wpnonce && isset( $_GET['tab'] ) ? sanitize_text_field( wp_unslash( $_GET['tab'] ) ) : '';
386
- $report = $wpnonce && isset( $_GET['report'] ) ? sanitize_text_field( wp_unslash( $_GET['report'] ) ) : '';
387
 
388
  $filter_form = '';
389
  $filter_form .= '<form method="get" action="">';
390
- $filter_form .= '<input type="hidden" name="page" value="' . $page . '" />';
391
- $filter_form .= '<input type="hidden" name="tab" value="' . $tab . '" />';
392
- $filter_form .= '<input type="hidden" name="report" value="' . $report . '" />';
393
  $filter_form .= '<input type="hidden" name="year" value="' . $this->year . '" />';
394
  $filter_form .= '<input type="text" name="product_title" title="" value="' . $this->product_title . '" />' .
395
  '<input type="submit" value="' . __( 'Filter products', 'woocommerce-jetpack' ) . '" />';
2
  /**
3
  * Booster for WooCommerce - Reports - Sales
4
  *
5
+ * @version 5.6.8
6
  * @author Pluggabl LLC.
7
  * @package Booster_For_WooCommerce/includes
8
  */
34
  /**
35
  * Get_report.
36
  *
37
+ * @version 5.6.8
38
  * @since 2.3.0
39
  */
40
  public function get_report() {
41
+ // phpcs:disable WordPress.Security.NonceVerification
42
+ $html = '';
43
+ $this->year = isset( $_GET['year'] ) ? sanitize_text_field( wp_unslash( $_GET['year'] ) ) : gmdate( 'Y' );
44
+ $this->product_title = isset( $_GET['product_title'] ) ? sanitize_text_field( wp_unslash( $_GET['product_title'] ) ) : '';
45
+ // phpcs:enable WordPress.Security.NonceVerification
 
 
46
 
47
  $html .= $this->get_products_sales();
48
 
80
  /**
81
  * Get_products_sales.
82
  *
83
+ * @version 5.6.8
84
  * @since 2.3.0
85
  * @todo fix when variable and variations are all (wrongfully) counted in total sums
86
  * @todo display more info for "Parent product deleted" and "Product deleted"
361
  );
362
  }
363
 
364
+ $settings_link = '<a href="' . admin_url( wcj_admin_tab_url() . '&wcj-cat=emails_and_misc&section=reports' ) . '">' .
365
  '<< ' . __( 'Reports Settings', 'woocommerce-jetpack' ) . '</a>';
366
 
367
  $menu = '';
369
  $menu .= '<li><a href="' . esc_url( add_query_arg( 'year', gmdate( 'Y' ) ) ) . '" class="' .
370
  ( ( gmdate( 'Y' ) === $this->year ) ? 'current' : '' ) . '">' . gmdate( 'Y' ) . '</a> | </li>';
371
  $menu .= '<li><a href="' . esc_url( add_query_arg( 'year', ( gmdate( 'Y' ) - 1 ) ) ) . '" class="' .
372
+ ( ( (string) ( gmdate( 'Y' ) - 1 ) === $this->year ) ? 'current' : '' ) . '">' . ( gmdate( 'Y' ) - 1 ) . '</a> | </li>';
373
  $menu .= '<li><a href="' . esc_url( add_query_arg( 'year', ( gmdate( 'Y' ) - 2 ) ) ) . '" class="' .
374
+ ( ( (string) ( gmdate( 'Y' ) - 2 ) === $this->year ) ? 'current' : '' ) . '">' . ( gmdate( 'Y' ) - 2 ) . '</a></li>';
375
  $menu .= '</ul>';
376
  $menu .= '<br class="clear">';
377
 
378
+ // phpcs:disable WordPress.Security.NonceVerification
379
+ $page = isset( $_GET['page'] ) ? sanitize_text_field( wp_unslash( $_GET['page'] ) ) : '';
380
+ $tab = isset( $_GET['tab'] ) ? sanitize_text_field( wp_unslash( $_GET['tab'] ) ) : '';
381
+ $report = isset( $_GET['report'] ) ? sanitize_text_field( wp_unslash( $_GET['report'] ) ) : '';
382
+ // phpcs:enable WordPress.Security.NonceVerification
 
 
383
 
384
  $filter_form = '';
385
  $filter_form .= '<form method="get" action="">';
386
+ $filter_form .= '<input type="hidden" name="page" value="' . esc_attr( $page ) . '" />';
387
+ $filter_form .= '<input type="hidden" name="tab" value="' . esc_attr( $tab ) . '" />';
388
+ $filter_form .= '<input type="hidden" name="report" value="' . esc_attr( $report ) . '" />';
389
  $filter_form .= '<input type="hidden" name="year" value="' . $this->year . '" />';
390
  $filter_form .= '<input type="text" name="product_title" title="" value="' . $this->product_title . '" />' .
391
  '<input type="submit" value="' . __( 'Filter products', 'woocommerce-jetpack' ) . '" />';
includes/reports/class-wcj-reports-stock.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Reports - Stock
4
  *
5
- * @version 5.6.2
6
  * @author Pluggabl LLC.
7
  * @package Booster_For_WooCommerce/includes
8
  */
@@ -270,7 +270,7 @@ if ( ! class_exists( 'WCJ_Reports_Stock' ) ) :
270
  /**
271
  * Get_report_html.
272
  *
273
- * @version 5.6.2
274
  */
275
  public function get_report_html() {
276
  $products_info = $this->data_products;
@@ -312,7 +312,7 @@ if ( ! class_exists( 'WCJ_Reports_Stock' ) ) :
312
  ( ( 'overstocked' === $report_info['id'] ) &&
313
  ( $product_info['stock'] > 0 ) &&
314
 
315
- ( ( (int) gmdate( 'U' ) - strtotime( $product_info['date_added'] ) ) > $this->range_days * 24 * 60 * 60 ) &&
316
  ( 0 === $product_info['sales_in_period'][ $this->range_days ] ) ) ||
317
 
318
  ( ( 'understocked' === $report_info['id'] ) &&
2
  /**
3
  * Booster for WooCommerce - Reports - Stock
4
  *
5
+ * @version 5.6.8
6
  * @author Pluggabl LLC.
7
  * @package Booster_For_WooCommerce/includes
8
  */
270
  /**
271
  * Get_report_html.
272
  *
273
+ * @version 5.6.8
274
  */
275
  public function get_report_html() {
276
  $products_info = $this->data_products;
312
  ( ( 'overstocked' === $report_info['id'] ) &&
313
  ( $product_info['stock'] > 0 ) &&
314
 
315
+ ( ( wcj_get_timestamp_date_from_gmt() - strtotime( $product_info['date_added'] ) ) > $this->range_days * 24 * 60 * 60 ) &&
316
  ( 0 === $product_info['sales_in_period'][ $this->range_days ] ) ) ||
317
 
318
  ( ( 'understocked' === $report_info['id'] ) &&
includes/settings/pdf-invoicing/wcj-content-template-credit_note.html ADDED
@@ -0,0 +1,60 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <h1>Credit Note</h1>
2
+ <p>
3
+ <table class="pdf_invoice_heading_table">
4
+ <tbody>
5
+ <tr>
6
+ <th>Credit Note Nr.</th>
7
+ <td>[wcj_credit_note_number]</td>
8
+ </tr>
9
+ <tr>
10
+ <th>Credit Note Date</th>
11
+ <td>[wcj_credit_note_date]</td>
12
+ </tr>
13
+ <tr>
14
+ <th>Invoice Nr.</th>
15
+ <td>[wcj_invoice_number]</td>
16
+ </tr>
17
+ <tr>
18
+ <th>Order Nr.</th>
19
+ <td>[wcj_order_number]</td>
20
+ </tr>
21
+ </tbody>
22
+ </table>
23
+ </p>
24
+ <p>
25
+ <table class="pdf_invoice_seller_buyer_table">
26
+ <tbody>
27
+ <tr>
28
+ <th>Seller</th>
29
+ <th>Buyer</th>
30
+ </tr>
31
+ <tr>
32
+ <td>COMPANY NAME<br>COMPANY ADDRESS 1<br>COMPANY ADDRESS 2<br></td>
33
+ <td>[wcj_order_billing_address]</td>
34
+ </tr>
35
+ </tbody>
36
+ </table>
37
+ </p>
38
+ <p>
39
+ [wcj_order_items_table table_class="pdf_invoice_items_table" price_prefix="-"
40
+ columns="item_number|item_name|item_quantity|line_total_tax_excl"
41
+ columns_titles="|Product|Qty|Total"
42
+ columns_styles="width:5%;|width:75%;|width:5%;|width:15%;text-align:right;"]
43
+ <table class="pdf_invoice_totals_table">
44
+ <tbody>
45
+ <tr>
46
+ <th>Total (excl. TAX)</th>
47
+ <td>-[wcj_order_total_excl_tax]</td>
48
+ </tr>
49
+ <tr>
50
+ <th>Taxes</th>
51
+ <td>-[wcj_order_total_tax hide_if_zero="no"]</td>
52
+ </tr>
53
+ <tr>
54
+ <th>Order Total</th>
55
+ <td>-[wcj_order_total]</td>
56
+ </tr>
57
+ </tbody>
58
+ </table>
59
+ </p>
60
+ <p>Payment method: [wcj_order_payment_method]</p>
includes/settings/pdf-invoicing/wcj-content-template-credit_note.php DELETED
@@ -1,34 +0,0 @@
1
- <?php //phpcs:ignore ?>
2
- <h1>Credit Note</h1>
3
- <p>
4
- <table class="pdf_invoice_heading_table">
5
- <tbody>
6
- <tr><th>Credit Note Nr.</th><td>[wcj_credit_note_number]</td></tr>
7
- <tr><th>Credit Note Date</th><td>[wcj_credit_note_date]</td></tr>
8
- <tr><th>Invoice Nr.</th><td>[wcj_invoice_number]</td></tr>
9
- <tr><th>Order Nr.</th><td>[wcj_order_number]</td></tr>
10
- </tbody>
11
- </table>
12
- </p>
13
- <p>
14
- <table class="pdf_invoice_seller_buyer_table">
15
- <tbody>
16
- <tr><th>Seller</th><th>Buyer</th></tr>
17
- <tr><td>COMPANY NAME<br>COMPANY ADDRESS 1<br>COMPANY ADDRESS 2<br></td><td>[wcj_order_billing_address]</td></tr>
18
- </tbody>
19
- </table>
20
- </p>
21
- <p>
22
- [wcj_order_items_table table_class="pdf_invoice_items_table" price_prefix="-"
23
- columns="item_number|item_name|item_quantity|line_total_tax_excl"
24
- columns_titles="|Product|Qty|Total"
25
- columns_styles="width:5%;|width:75%;|width:5%;|width:15%;text-align:right;"]
26
- <table class="pdf_invoice_totals_table">
27
- <tbody>
28
- <tr><th>Total (excl. TAX)</th><td>-[wcj_order_total_excl_tax]</td></tr>
29
- <tr><th>Taxes</th><td>-[wcj_order_total_tax hide_if_zero="no"]</td></tr>
30
- <tr><th>Order Total</th><td>-[wcj_order_total]</td></tr>
31
- </tbody>
32
- </table>
33
- </p>
34
- <p>Payment method: [wcj_order_payment_method]</p>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/settings/pdf-invoicing/wcj-content-template-custom_doc.html ADDED
@@ -0,0 +1,64 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <h1>Custom Document</h1>
2
+ <p>
3
+ <table class="pdf_invoice_heading_table">
4
+ <tbody>
5
+ <tr>
6
+ <th>Custom Document Nr.</th>
7
+ <td>[wcj_custom_doc_number]</td>
8
+ </tr>
9
+ <tr>
10
+ <th>Custom Document Date</th>
11
+ <td>[wcj_custom_doc_date]</td>
12
+ </tr>
13
+ <tr>
14
+ <th>Invoice Nr.</th>
15
+ <td>[wcj_invoice_number]</td>
16
+ </tr>
17
+ <tr>
18
+ <th>Invoice Date</th>
19
+ <td>[wcj_invoice_date]</td>
20
+ </tr>
21
+ <tr>
22
+ <th>Order Nr.</th>
23
+ <td>[wcj_order_number]</td>
24
+ </tr>
25
+ </tbody>
26
+ </table>
27
+ </p>
28
+ <p>
29
+ <table class="pdf_invoice_seller_buyer_table">
30
+ <tbody>
31
+ <tr>
32
+ <th>Seller</th>
33
+ <th>Buyer</th>
34
+ </tr>
35
+ <tr>
36
+ <td>COMPANY NAME<br>COMPANY ADDRESS 1<br>COMPANY ADDRESS 2<br></td>
37
+ <td>[wcj_order_billing_address]</td>
38
+ </tr>
39
+ </tbody>
40
+ </table>
41
+ </p>
42
+ <p>
43
+ [wcj_order_items_table table_class="pdf_invoice_items_table"
44
+ columns="item_number|item_name|item_quantity|line_total_tax_excl"
45
+ columns_titles="|Product|Qty|Total"
46
+ columns_styles="width:5%;|width:75%;|width:5%;|width:15%;text-align:right;"]
47
+ <table class="pdf_invoice_totals_table">
48
+ <tbody>
49
+ <tr>
50
+ <th>Total (excl. TAX)</th>
51
+ <td>[wcj_order_total_excl_tax]</td>
52
+ </tr>
53
+ <tr>
54
+ <th>Taxes</th>
55
+ <td>[wcj_order_total_tax hide_if_zero="no"]</td>
56
+ </tr>
57
+ <tr>
58
+ <th>Order Total</th>
59
+ <td>[wcj_order_total]</td>
60
+ </tr>
61
+ </tbody>
62
+ </table>
63
+ </p>
64
+ <p>Payment method: [wcj_order_payment_method]</p>
includes/settings/pdf-invoicing/wcj-content-template-custom_doc.php DELETED
@@ -1,35 +0,0 @@
1
- <?php //phpcs:ignore ?>
2
- <h1>Custom Document</h1>
3
- <p>
4
- <table class="pdf_invoice_heading_table">
5
- <tbody>
6
- <tr><th>Custom Document Nr.</th><td>[wcj_custom_doc_number]</td></tr>
7
- <tr><th>Custom Document Date</th><td>[wcj_custom_doc_date]</td></tr>
8
- <tr><th>Invoice Nr.</th><td>[wcj_invoice_number]</td></tr>
9
- <tr><th>Invoice Date</th><td>[wcj_invoice_date]</td></tr>
10
- <tr><th>Order Nr.</th><td>[wcj_order_number]</td></tr>
11
- </tbody>
12
- </table>
13
- </p>
14
- <p>
15
- <table class="pdf_invoice_seller_buyer_table">
16
- <tbody>
17
- <tr><th>Seller</th><th>Buyer</th></tr>
18
- <tr><td>COMPANY NAME<br>COMPANY ADDRESS 1<br>COMPANY ADDRESS 2<br></td><td>[wcj_order_billing_address]</td></tr>
19
- </tbody>
20
- </table>
21
- </p>
22
- <p>
23
- [wcj_order_items_table table_class="pdf_invoice_items_table"
24
- columns="item_number|item_name|item_quantity|line_total_tax_excl"
25
- columns_titles="|Product|Qty|Total"
26
- columns_styles="width:5%;|width:75%;|width:5%;|width:15%;text-align:right;"]
27
- <table class="pdf_invoice_totals_table">
28
- <tbody>
29
- <tr><th>Total (excl. TAX)</th><td>[wcj_order_total_excl_tax]</td></tr>
30
- <tr><th>Taxes</th><td>[wcj_order_total_tax hide_if_zero="no"]</td></tr>
31
- <tr><th>Order Total</th><td>[wcj_order_total]</td></tr>
32
- </tbody>
33
- </table>
34
- </p>
35
- <p>Payment method: [wcj_order_payment_method]</p>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/settings/pdf-invoicing/wcj-content-template-invoice.html ADDED
@@ -0,0 +1,56 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <h1>Invoice</h1>
2
+ <p>
3
+ <table class="pdf_invoice_heading_table">
4
+ <tbody>
5
+ <tr>
6
+ <th>Invoice Nr.</th>
7
+ <td>[wcj_invoice_number]</td>
8
+ </tr>
9
+ <tr>
10
+ <th>Invoice Date</th>
11
+ <td>[wcj_invoice_date]</td>
12
+ </tr>
13
+ <tr>
14
+ <th>Order Nr.</th>
15
+ <td>[wcj_order_number]</td>
16
+ </tr>
17
+ </tbody>
18
+ </table>
19
+ </p>
20
+ <p>
21
+ <table class="pdf_invoice_seller_buyer_table">
22
+ <tbody>
23
+ <tr>
24
+ <th>Seller</th>
25
+ <th>Buyer</th>
26
+ </tr>
27
+ <tr>
28
+ <td>COMPANY NAME<br>COMPANY ADDRESS 1<br>COMPANY ADDRESS 2<br></td>
29
+ <td>[wcj_order_billing_address]</td>
30
+ </tr>
31
+ </tbody>
32
+ </table>
33
+ </p>
34
+ <p>
35
+ [wcj_order_items_table table_class="pdf_invoice_items_table"
36
+ columns="item_number|item_name|item_quantity|line_total_tax_excl"
37
+ columns_titles="|Product|Qty|Total"
38
+ columns_styles="width:5%;|width:75%;|width:5%;|width:15%;text-align:right;"]
39
+ <table class="pdf_invoice_totals_table">
40
+ <tbody>
41
+ <tr>
42
+ <th>Total (excl. TAX)</th>
43
+ <td>[wcj_order_total_excl_tax]</td>
44
+ </tr>
45
+ <tr>
46
+ <th>Taxes</th>
47
+ <td>[wcj_order_total_tax hide_if_zero="no"]</td>
48
+ </tr>
49
+ <tr>
50
+ <th>Order Total</th>
51
+ <td>[wcj_order_total]</td>
52
+ </tr>
53
+ </tbody>
54
+ </table>
55
+ </p>
56
+ <p>Payment method: [wcj_order_payment_method]</p>
includes/settings/pdf-invoicing/wcj-content-template-invoice.php DELETED
@@ -1,33 +0,0 @@
1
- <?php //phpcs:ignore ?>
2
- <h1>Invoice</h1>
3
- <p>
4
- <table class="pdf_invoice_heading_table">
5
- <tbody>
6
- <tr><th>Invoice Nr.</th><td>[wcj_invoice_number]</td></tr>
7
- <tr><th>Invoice Date</th><td>[wcj_invoice_date]</td></tr>
8
- <tr><th>Order Nr.</th><td>[wcj_order_number]</td></tr>
9
- </tbody>
10
- </table>
11
- </p>
12
- <p>
13
- <table class="pdf_invoice_seller_buyer_table">
14
- <tbody>
15
- <tr><th>Seller</th><th>Buyer</th></tr>
16
- <tr><td>COMPANY NAME<br>COMPANY ADDRESS 1<br>COMPANY ADDRESS 2<br></td><td>[wcj_order_billing_address]</td></tr>
17
- </tbody>
18
- </table>
19
- </p>
20
- <p>
21
- [wcj_order_items_table table_class="pdf_invoice_items_table"
22
- columns="item_number|item_name|item_quantity|line_total_tax_excl"
23
- columns_titles="|Product|Qty|Total"
24
- columns_styles="width:5%;|width:75%;|width:5%;|width:15%;text-align:right;"]
25
- <table class="pdf_invoice_totals_table">
26
- <tbody>
27
- <tr><th>Total (excl. TAX)</th><td>[wcj_order_total_excl_tax]</td></tr>
28
- <tr><th>Taxes</th><td>[wcj_order_total_tax hide_if_zero="no"]</td></tr>
29
- <tr><th>Order Total</th><td>[wcj_order_total]</td></tr>
30
- </tbody>
31
- </table>
32
- </p>
33
- <p>Payment method: [wcj_order_payment_method]</p>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/settings/pdf-invoicing/wcj-content-template-packing_slip.html ADDED
@@ -0,0 +1,44 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <h1>Packing Slip</h1>
2
+ <p>
3
+ <table class="pdf_invoice_heading_table">
4
+ <tbody>
5
+ <tr>
6
+ <th>Shipping method</th>
7
+ <td>[wcj_order_shipping_method]</td>
8
+ </tr>
9
+ <tr>
10
+ <th>Proforma Invoice Nr.</th>
11
+ <td>[wcj_proforma_invoice_number]</td>
12
+ </tr>
13
+ <tr>
14
+ <th>Invoice Nr.</th>
15
+ <td>[wcj_invoice_number]</td>
16
+ </tr>
17
+ <tr>
18
+ <th>Order Nr.</th>
19
+ <td>[wcj_order_number]</td>
20
+ </tr>
21
+ <tr>
22
+ <th>Order Date</th>
23
+ <td>[wcj_order_date]</td>
24
+ </tr>
25
+ </tbody>
26
+ </table>
27
+ </p>
28
+ <h2>Shipping address</h2>
29
+ <p>
30
+ <table>
31
+ <tbody>
32
+ <tr>
33
+ <td>[wcj_order_shipping_address]</td>
34
+ </tr>
35
+ </tbody>
36
+ </table>
37
+ </p>
38
+ <h2>Items</h2>
39
+ <p>
40
+ [wcj_order_items_table table_class="pdf_invoice_items_table"
41
+ columns="item_number|item_name|item_quantity"
42
+ columns_titles="|Item|Qty"
43
+ columns_styles="width:5%;|width:80%;|width:15%;text-align:right;"]
44
+ </p>
includes/settings/pdf-invoicing/wcj-content-template-packing_slip.php DELETED
@@ -1,28 +0,0 @@
1
- <?php //phpcs:ignore ?>
2
- <h1>Packing Slip</h1>
3
- <p>
4
- <table class="pdf_invoice_heading_table">
5
- <tbody>
6
- <tr><th>Shipping method</th><td>[wcj_order_shipping_method]</td></tr>
7
- <tr><th>Proforma Invoice Nr.</th><td>[wcj_proforma_invoice_number]</td></tr>
8
- <tr><th>Invoice Nr.</th><td>[wcj_invoice_number]</td></tr>
9
- <tr><th>Order Nr.</th><td>[wcj_order_number]</td></tr>
10
- <tr><th>Order Date</th><td>[wcj_order_date]</td></tr>
11
- </tbody>
12
- </table>
13
- </p>
14
- <h2>Shipping address</h2>
15
- <p>
16
- <table>
17
- <tbody>
18
- <tr><td>[wcj_order_shipping_address]</td></tr>
19
- </tbody>
20
- </table>
21
- </p>
22
- <h2>Items</h2>
23
- <p>
24
- [wcj_order_items_table table_class="pdf_invoice_items_table"
25
- columns="item_number|item_name|item_quantity"
26
- columns_titles="|Item|Qty"
27
- columns_styles="width:5%;|width:80%;|width:15%;text-align:right;"]
28
- </p>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/settings/pdf-invoicing/wcj-content-template-proforma_invoice.html ADDED
@@ -0,0 +1,56 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <h1>Proforma Invoice</h1>
2
+ <p>
3
+ <table class="pdf_invoice_heading_table">
4
+ <tbody>
5
+ <tr>
6
+ <th>Proforma Invoice Nr.</th>
7
+ <td>[wcj_proforma_invoice_number]</td>
8
+ </tr>
9
+ <tr>
10
+ <th>Proforma Invoice Date</th>
11
+ <td>[wcj_proforma_invoice_date]</td>
12
+ </tr>
13
+ <tr>
14
+ <th>Order Nr.</th>
15
+ <td>[wcj_order_number]</td>
16
+ </tr>
17
+ </tbody>
18
+ </table>
19
+ </p>
20
+ <p>
21
+ <table class="pdf_invoice_seller_buyer_table">
22
+ <tbody>
23
+ <tr>
24
+ <th>Seller</th>
25
+ <th>Buyer</th>
26
+ </tr>
27
+ <tr>
28
+ <td>COMPANY NAME<br>COMPANY ADDRESS 1<br>COMPANY ADDRESS 2<br></td>
29
+ <td>[wcj_order_billing_address]</td>
30
+ </tr>
31
+ </tbody>
32
+ </table>
33
+ </p>
34
+ <p>
35
+ [wcj_order_items_table table_class="pdf_invoice_items_table"
36
+ columns="item_number|item_name|item_quantity|line_total_tax_excl"
37
+ columns_titles="|Product|Qty|Total"
38
+ columns_styles="width:5%;|width:75%;|width:5%;|width:15%;text-align:right;"
39
+ discount_as_item="Discount"]
40
+ <table class="pdf_invoice_totals_table">
41
+ <tbody>
42
+ <tr>
43
+ <th>Total (excl. TAX)</th>
44
+ <td>[wcj_order_total_excl_tax]</td>
45
+ </tr>
46
+ <tr>
47
+ <th>Taxes</th>
48
+ <td>[wcj_order_total_tax hide_if_zero="no"]</td>
49
+ </tr>
50
+ <tr>
51
+ <th>Order Total</th>
52
+ <td>[wcj_order_total]</td>
53
+ </tr>
54
+ </tbody>
55
+ </table>
56
+ </p>
includes/settings/pdf-invoicing/wcj-content-template-proforma_invoice.php DELETED
@@ -1,33 +0,0 @@
1
- <?php //phpcs:ignore ?>
2
- <h1>Proforma Invoice</h1>
3
- <p>
4
- <table class="pdf_invoice_heading_table">
5
- <tbody>
6
- <tr><th>Proforma Invoice Nr.</th><td>[wcj_proforma_invoice_number]</td></tr>
7
- <tr><th>Proforma Invoice Date</th><td>[wcj_proforma_invoice_date]</td></tr>
8
- <tr><th>Order Nr.</th><td>[wcj_order_number]</td></tr>
9
- </tbody>
10
- </table>
11
- </p>
12
- <p>
13
- <table class="pdf_invoice_seller_buyer_table">
14
- <tbody>
15
- <tr><th>Seller</th><th>Buyer</th></tr>
16
- <tr><td>COMPANY NAME<br>COMPANY ADDRESS 1<br>COMPANY ADDRESS 2<br></td><td>[wcj_order_billing_address]</td></tr>
17
- </tbody>
18
- </table>
19
- </p>
20
- <p>
21
- [wcj_order_items_table table_class="pdf_invoice_items_table"
22
- columns="item_number|item_name|item_quantity|line_total_tax_excl"
23
- columns_titles="|Product|Qty|Total"
24
- columns_styles="width:5%;|width:75%;|width:5%;|width:15%;text-align:right;"
25
- discount_as_item="Discount"]
26
- <table class="pdf_invoice_totals_table">
27
- <tbody>
28
- <tr><th>Total (excl. TAX)</th><td>[wcj_order_total_excl_tax]</td></tr>
29
- <tr><th>Taxes</th><td>[wcj_order_total_tax hide_if_zero="no"]</td></tr>
30
- <tr><th>Order Total</th><td>[wcj_order_total]</td></tr>
31
- </tbody>
32
- </table>
33
- </p>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/settings/wcj-settings-admin-orders-list.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Settings - Admin Orders List
4
  *
5
- * @version 5.6.2
6
  * @since 3.2.4
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/settings
@@ -90,7 +90,7 @@ for ( $i = 1; $i <= $total_number; $i++ ) {
90
  'type' => 'select',
91
  'options' => array(
92
  'no' => __( 'No', 'woocommerce-jetpack' ),
93
- 'meta_value' => __( 'By meta (as text)', 'woocommerce-jetpack' ), // phpcs:ignore
94
  'meta_value_num' => __( 'By meta (as numbers)', 'woocommerce-jetpack' ),
95
  ),
96
  ),
2
  /**
3
  * Booster for WooCommerce - Settings - Admin Orders List
4
  *
5
+ * @version 5.6.8
6
  * @since 3.2.4
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/settings
90
  'type' => 'select',
91
  'options' => array(
92
  'no' => __( 'No', 'woocommerce-jetpack' ),
93
+ 'meta_value' => __( 'By meta (as text)', 'woocommerce-jetpack' ), // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_value
94
  'meta_value_num' => __( 'By meta (as numbers)', 'woocommerce-jetpack' ),
95
  ),
96
  ),
includes/settings/wcj-settings-checkout-files-upload.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Settings - Checkout Files Upload
4
  *
5
- * @version 5.6.2
6
  * @since 2.8.0
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/settings
@@ -331,7 +331,7 @@ $settings = array_merge(
331
  array(
332
  'title' => __( 'Label', 'woocommerce-jetpack' ),
333
  /* translators: %s: translators Added */
334
- 'desc_tip' => __( 'Replaced values: %field_id%, %field_label%, %required_html%.', 'woocommerce-jetpack' ), // phpcs:ignore
335
  'id' => 'wcj_checkout_files_upload_form_template_label',
336
  /* translators: %s: translators Added */
337
  'default' => '<tr><td colspan="2"><label for="%field_id%">%field_label%</label>%required_html%</td></tr>',
@@ -341,7 +341,7 @@ $settings = array_merge(
341
  array(
342
  'title' => __( 'Field', 'woocommerce-jetpack' ),
343
  /* translators: %s: translators Added */
344
- 'desc_tip' => __( 'Replaced values: %field_html%, %button_html%.', 'woocommerce-jetpack' ), // phpcs:ignore
345
  'id' => 'wcj_checkout_files_upload_form_template_field',
346
  /* translators: %s: translators Added */
347
  'default' => '<tr><td style="width:50%;max-width:50vw;">%field_html%</td><td style="width:50%;">%button_html%</td></tr>',
2
  /**
3
  * Booster for WooCommerce - Settings - Checkout Files Upload
4
  *
5
+ * @version 5.6.8
6
  * @since 2.8.0
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/settings
331
  array(
332
  'title' => __( 'Label', 'woocommerce-jetpack' ),
333
  /* translators: %s: translators Added */
334
+ 'desc_tip' => sprintf( __( 'Replaced values: %1$s, %2$s, %3$s.', 'woocommerce-jetpack' ), '%field_id%', '%field_label%', '%required_html%' ),
335
  'id' => 'wcj_checkout_files_upload_form_template_label',
336
  /* translators: %s: translators Added */
337
  'default' => '<tr><td colspan="2"><label for="%field_id%">%field_label%</label>%required_html%</td></tr>',
341
  array(
342
  'title' => __( 'Field', 'woocommerce-jetpack' ),
343
  /* translators: %s: translators Added */
344
+ 'desc_tip' => sprintf( __( 'Replaced values: %1$s, %2$s.', 'woocommerce-jetpack' ), '%field_html%', '%button_html%' ),
345
  'id' => 'wcj_checkout_files_upload_form_template_field',
346
  /* translators: %s: translators Added */
347
  'default' => '<tr><td style="width:50%;max-width:50vw;">%field_html%</td><td style="width:50%;">%button_html%</td></tr>',
includes/settings/wcj-settings-currency-per-product.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Settings - Currency per Product
4
  *
5
- * @version 5.6.0
6
  * @since 2.8.0
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/settings
@@ -122,7 +122,7 @@ $settings = array(
122
  'auto' => __( 'Automatically via Currency Exchange Rates module', 'woocommerce-jetpack' ),
123
  ),
124
  'desc' => ( '' === apply_filters( 'booster_message', '', 'desc' ) ) ?
125
- __( 'Visit', 'woocommerce-jetpack' ) . ' <a href="' . admin_url( 'admin.php?page=wc-settings&tab=jetpack&wcj-cat=prices_and_currencies&section=currency_exchange_rates' ) . '">' . __( 'Currency Exchange Rates module', 'woocommerce-jetpack' ) . '</a>'
126
  :
127
  apply_filters( 'booster_message', '', 'desc' ),
128
  'custom_attributes' => apply_filters( 'booster_message', '', 'disabled' ),
2
  /**
3
  * Booster for WooCommerce - Settings - Currency per Product
4
  *
5
+ * @version 5.6.8
6
  * @since 2.8.0
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/settings
122
  'auto' => __( 'Automatically via Currency Exchange Rates module', 'woocommerce-jetpack' ),
123
  ),
124
  'desc' => ( '' === apply_filters( 'booster_message', '', 'desc' ) ) ?
125
+ __( 'Visit', 'woocommerce-jetpack' ) . ' <a href="' . admin_url( wcj_admin_tab_url() . '&wcj-cat=prices_and_currencies&section=currency_exchange_rates' ) . '">' . __( 'Currency Exchange Rates module', 'woocommerce-jetpack' ) . '</a>'
126
  :
127
  apply_filters( 'booster_message', '', 'desc' ),
128
  'custom_attributes' => apply_filters( 'booster_message', '', 'disabled' ),
includes/settings/wcj-settings-debug-tools.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Settings - Debug Tools
4
  *
5
- * @version 5.6.0
6
  * @since 4.1.0
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/settings
@@ -47,10 +47,18 @@ return array(
47
  'id' => 'wcj_debug_tools_system_info',
48
  'default' => '',
49
  'type' => 'custom_link',
50
- 'link' => '<a href="' . esc_url( add_query_arg( 'wcj_debug', true ) ) . '">' . __( 'Show extended info', 'woocommerce-jetpack' ) . '</a>' .
 
 
 
 
 
 
 
51
  '<pre style="background-color: white; padding: 5px;">' . wcj_get_table_html(
52
  $this->get_system_info_table_array(),
53
  array(
 
54
  'columns_styles' => array( 'padding:0;', 'padding:0;' ),
55
  'table_heading_type' => 'vertical',
56
  )
2
  /**
3
  * Booster for WooCommerce - Settings - Debug Tools
4
  *
5
+ * @version 5.6.8
6
  * @since 4.1.0
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/settings
47
  'id' => 'wcj_debug_tools_system_info',
48
  'default' => '',
49
  'type' => 'custom_link',
50
+ 'link' => '<a href="' . esc_url(
51
+ add_query_arg(
52
+ array(
53
+ 'wcj_debug' => true,
54
+ 'wcj_debug-nonce' => wp_create_nonce( 'wcj_debug' ),
55
+ )
56
+ )
57
+ ) . '">' . __( 'Show extended info', 'woocommerce-jetpack' ) . '</a>' .
58
  '<pre style="background-color: white; padding: 5px;">' . wcj_get_table_html(
59
  $this->get_system_info_table_array(),
60
  array(
61
+ 'table_class' => 'widefat striped',
62
  'columns_styles' => array( 'padding:0;', 'padding:0;' ),
63
  'table_heading_type' => 'vertical',
64
  )
includes/settings/wcj-settings-max-products-per-user.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Settings - Max Products per User
4
  *
5
- * @version 5.6.0
6
  * @since 3.5.0
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/settings
@@ -100,7 +100,7 @@ return array(
100
  'default' => '',
101
  'type' => 'custom_link',
102
  'link' => '<a class="button" href="' .
103
- esc_url( add_query_arg( 'wcj_max_products_per_user_calculate_data', '1', esc_url( remove_query_arg( 'wcj_max_products_per_user_calculate_data_finished' ) ) ) ) . '">' .
104
  __( 'Calculate Data', 'woocommerce-jetpack' ) .
105
  '</a>',
106
  ),
2
  /**
3
  * Booster for WooCommerce - Settings - Max Products per User
4
  *
5
+ * @version 5.6.8
6
  * @since 3.5.0
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/settings
100
  'default' => '',
101
  'type' => 'custom_link',
102
  'link' => '<a class="button" href="' .
103
+ esc_url_raw( add_query_arg( 'wcj_max_products_per_user_calculate_data', '1', remove_query_arg( 'wcj_max_products_per_user_calculate_data_finished' ) ) ) . '">' .
104
  __( 'Calculate Data', 'woocommerce-jetpack' ) .
105
  '</a>',
106
  ),
includes/settings/wcj-settings-multicurrency-base-price.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Settings - Multicurrency Product Base Price
4
  *
5
- * @version 5.6.0
6
  * @since 2.8.0
7
  * @author Pluggabl LLC.
8
  * @todo (maybe) `if ( isset( $all_currencies[ $currency_from ] ) ) { unset( $all_currencies[ $currency_from ] ); }`
@@ -32,7 +32,7 @@ $settings = array(
32
  'auto' => __( 'Automatically via Currency Exchange Rates module', 'woocommerce-jetpack' ),
33
  ),
34
  'desc' => ( '' === apply_filters( 'booster_message', '', 'desc' ) ) ?
35
- __( 'Visit', 'woocommerce-jetpack' ) . ' <a href="' . admin_url( 'admin.php?page=wc-settings&tab=jetpack&wcj-cat=prices_and_currencies&section=currency_exchange_rates' ) . '">' . __( 'Currency Exchange Rates module', 'woocommerce-jetpack' ) . '</a>'
36
  :
37
  apply_filters( 'booster_message', '', 'desc' ),
38
  'custom_attributes' => apply_filters( 'booster_message', '', 'disabled' ),
2
  /**
3
  * Booster for WooCommerce - Settings - Multicurrency Product Base Price
4
  *
5
+ * @version 5.6.8
6
  * @since 2.8.0
7
  * @author Pluggabl LLC.
8
  * @todo (maybe) `if ( isset( $all_currencies[ $currency_from ] ) ) { unset( $all_currencies[ $currency_from ] ); }`
32
  'auto' => __( 'Automatically via Currency Exchange Rates module', 'woocommerce-jetpack' ),
33
  ),
34
  'desc' => ( '' === apply_filters( 'booster_message', '', 'desc' ) ) ?
35
+ __( 'Visit', 'woocommerce-jetpack' ) . ' <a href="' . admin_url( wcj_admin_tab_url() . '&wcj-cat=prices_and_currencies&section=currency_exchange_rates' ) . '">' . __( 'Currency Exchange Rates module', 'woocommerce-jetpack' ) . '</a>'
36
  :
37
  apply_filters( 'booster_message', '', 'desc' ),
38
  'custom_attributes' => apply_filters( 'booster_message', '', 'disabled' ),
includes/settings/wcj-settings-multicurrency.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Settings - Multicurrency (Currency Switcher)
4
  *
5
- * @version 5.6.0
6
  * @since 2.8.0
7
  * @author Pluggabl LLC.
8
  * @todo "pretty prices"
@@ -33,7 +33,7 @@ $settings = array(
33
  'auto' => __( 'Automatically via Currency Exchange Rates module', 'woocommerce-jetpack' ),
34
  ),
35
  'desc' => ( '' === apply_filters( 'booster_message', '', 'desc' ) ) ?
36
- __( 'Visit', 'woocommerce-jetpack' ) . ' <a href="' . admin_url( 'admin.php?page=wc-settings&tab=jetpack&wcj-cat=prices_and_currencies&section=currency_exchange_rates' ) . '">' . __( 'Currency Exchange Rates module', 'woocommerce-jetpack' ) . '</a>'
37
  :
38
  apply_filters( 'booster_message', '', 'desc' ),
39
  'custom_attributes' => apply_filters( 'booster_message', '', 'disabled' ),
@@ -395,7 +395,7 @@ $settings = array_merge(
395
  'desc' => sprintf(
396
  /* translators: %s: translators Added */
397
  __( 'Custom roles can be added via "Add/Manage Custom Roles" tool in Booster\'s <a href="%s">General</a> module.', 'woocommerce-jetpack' ),
398
- admin_url( 'admin.php?page=wc-settings&tab=jetpack&wcj-cat=emails_and_misc&section=general' )
399
  ),
400
  'id' => 'wcj_multicurrency_role_defaults_options',
401
  ),
2
  /**
3
  * Booster for WooCommerce - Settings - Multicurrency (Currency Switcher)
4
  *
5
+ * @version 5.6.8
6
  * @since 2.8.0
7
  * @author Pluggabl LLC.
8
  * @todo "pretty prices"
33
  'auto' => __( 'Automatically via Currency Exchange Rates module', 'woocommerce-jetpack' ),
34
  ),
35
  'desc' => ( '' === apply_filters( 'booster_message', '', 'desc' ) ) ?
36
+ __( 'Visit', 'woocommerce-jetpack' ) . ' <a href="' . admin_url( wcj_admin_tab_url() . '&wcj-cat=prices_and_currencies&section=currency_exchange_rates' ) . '">' . __( 'Currency Exchange Rates module', 'woocommerce-jetpack' ) . '</a>'
37
  :
38
  apply_filters( 'booster_message', '', 'desc' ),
39
  'custom_attributes' => apply_filters( 'booster_message', '', 'disabled' ),
395
  'desc' => sprintf(
396
  /* translators: %s: translators Added */
397
  __( 'Custom roles can be added via "Add/Manage Custom Roles" tool in Booster\'s <a href="%s">General</a> module.', 'woocommerce-jetpack' ),
398
+ admin_url( wcj_admin_tab_url() . '&wcj-cat=emails_and_misc&section=general' )
399
  ),
400
  'id' => 'wcj_multicurrency_role_defaults_options',
401
  ),
includes/settings/wcj-settings-order-min-amount.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Settings - Order Minimum Amount
4
  *
5
- * @version 5.6.2
6
  * @since 2.8.0
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/settings
@@ -142,7 +142,7 @@ $settings = array(
142
  'desc' => sprintf(
143
  /* translators: %s: translators Added */
144
  __( 'Custom roles can be added via "Add/Manage Custom Roles" tool in Booster\'s <a href="%s">General</a> module.', 'woocommerce-jetpack' ),
145
- admin_url( 'admin.php?page=wc-settings&tab=jetpack&wcj-cat=emails_and_misc&section=general' )
146
  ),
147
  ),
148
  );
2
  /**
3
  * Booster for WooCommerce - Settings - Order Minimum Amount
4
  *
5
+ * @version 5.6.8
6
  * @since 2.8.0
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/settings
142
  'desc' => sprintf(
143
  /* translators: %s: translators Added */
144
  __( 'Custom roles can be added via "Add/Manage Custom Roles" tool in Booster\'s <a href="%s">General</a> module.', 'woocommerce-jetpack' ),
145
+ admin_url( wcj_admin_tab_url() . '&wcj-cat=emails_and_misc&section=general' )
146
  ),
147
  ),
148
  );
includes/settings/wcj-settings-payment-gateways-by-user-role.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Settings - Gateways by User Role
4
  *
5
- * @version 5.6.0
6
  * @since 2.8.0
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/settings
@@ -38,7 +38,7 @@ $settings = array(
38
  sprintf(
39
  /* translators: %s: translators Added */
40
  __( 'Custom roles can be added via "Add/Manage Custom Roles" tool in Booster\'s <a href="%s">General</a> module', 'woocommerce-jetpack' ),
41
- admin_url( 'admin.php?page=wc-settings&tab=jetpack&wcj-cat=emails_and_misc&section=general' )
42
  ),
43
  'id' => 'wcj_payment_gateways_by_user_role_gateways_options',
44
  ),
2
  /**
3
  * Booster for WooCommerce - Settings - Gateways by User Role
4
  *
5
+ * @version 5.6.8
6
  * @since 2.8.0
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/settings
38
  sprintf(
39
  /* translators: %s: translators Added */
40
  __( 'Custom roles can be added via "Add/Manage Custom Roles" tool in Booster\'s <a href="%s">General</a> module', 'woocommerce-jetpack' ),
41
+ admin_url( wcj_admin_tab_url() . '&wcj-cat=emails_and_misc&section=general' )
42
  ),
43
  'id' => 'wcj_payment_gateways_by_user_role_gateways_options',
44
  ),
includes/settings/wcj-settings-payment-gateways-currency.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Settings - Gateways Currency Converter
4
  *
5
- * @version 5.6.0
6
  * @since 2.8.0
7
  * @author Pluggabl LLC.
8
  * @todo [dev] maybe make "Advanced: Fix Chosen Payment Method" option enabled by default (or even remove option completely and always perform `$this->fix_chosen_payment_method()`)
@@ -83,7 +83,7 @@ $settings = array_merge(
83
  ),
84
  'desc' => ( '' === apply_filters( 'booster_message', '', 'desc' ) ) ?
85
  __( 'Visit', 'woocommerce-jetpack' ) .
86
- ' <a href="' . admin_url( 'admin.php?page=wc-settings&tab=jetpack&wcj-cat=prices_and_currencies&section=currency_exchange_rates' ) . '">' .
87
  __( 'Currency Exchange Rates module', 'woocommerce-jetpack' ) . '</a>'
88
  : apply_filters( 'booster_message', '', 'desc' ),
89
  'custom_attributes' => apply_filters( 'booster_message', '', 'disabled' ),
2
  /**
3
  * Booster for WooCommerce - Settings - Gateways Currency Converter
4
  *
5
+ * @version 5.6.8
6
  * @since 2.8.0
7
  * @author Pluggabl LLC.
8
  * @todo [dev] maybe make "Advanced: Fix Chosen Payment Method" option enabled by default (or even remove option completely and always perform `$this->fix_chosen_payment_method()`)
83
  ),
84
  'desc' => ( '' === apply_filters( 'booster_message', '', 'desc' ) ) ?
85
  __( 'Visit', 'woocommerce-jetpack' ) .
86
+ ' <a href="' . admin_url( wcj_admin_tab_url() . '&wcj-cat=prices_and_currencies&section=currency_exchange_rates' ) . '">' .
87
  __( 'Currency Exchange Rates module', 'woocommerce-jetpack' ) . '</a>'
88
  : apply_filters( 'booster_message', '', 'desc' ),
89
  'custom_attributes' => apply_filters( 'booster_message', '', 'disabled' ),
includes/settings/wcj-settings-pdf-invoicing-advanced.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Settings - PDF Invoicing - Advanced
4
  *
5
- * @version 5.6.0
6
  * @since 3.3.0
7
  * @author Pluggabl LLC.
8
  * @todo (maybe) create "Tools (Options)" submodule
@@ -165,7 +165,14 @@ return array(
165
  array(
166
  'title' => __( 'Actions', 'woocommerce-jetpack' ),
167
  'type' => 'custom_link',
168
- 'link' => '<a class="button" href="' . esc_url( add_query_arg( 'wcj_download_fonts', '1' ) ) . '">' .
 
 
 
 
 
 
 
169
  ( $is_full_fonts ? __( 'Re-download', 'woocommerce-jetpack' ) : __( 'Download', 'woocommerce-jetpack' ) )
170
  . '</a>',
171
  'id' => 'wcj_invoicing_fonts_manager_styling_option',
2
  /**
3
  * Booster for WooCommerce - Settings - PDF Invoicing - Advanced
4
  *
5
+ * @version 5.6.8
6
  * @since 3.3.0
7
  * @author Pluggabl LLC.
8
  * @todo (maybe) create "Tools (Options)" submodule
165
  array(
166
  'title' => __( 'Actions', 'woocommerce-jetpack' ),
167
  'type' => 'custom_link',
168
+ 'link' => '<a class="button" href="' . esc_url_raw(
169
+ add_query_arg(
170
+ array(
171
+ 'wcj_download_fonts' => '1',
172
+ 'wcj_download_fonts-nonce' => wp_create_nonce( 'wcj_download_fonts' ),
173
+ )
174
+ )
175
+ ) . '">' .
176
  ( $is_full_fonts ? __( 'Re-download', 'woocommerce-jetpack' ) : __( 'Download', 'woocommerce-jetpack' ) )
177
  . '</a>',
178
  'id' => 'wcj_invoicing_fonts_manager_styling_option',
includes/settings/wcj-settings-pdf-invoicing-header.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Settings - PDF Invoicing - Header
4
  *
5
- * @version 5.6.0
6
  * @since 2.8.0
7
  * @author Pluggabl LLC.
8
  * @todo (maybe) add info on `<img>` in "Header Image" description
@@ -45,7 +45,7 @@ foreach ( $invoice_types as $invoice_type ) {
45
  sprintf(
46
  /* translators: %s: translators Added */
47
  __( 'If you are experiencing issues with displaying header image, please try setting different values for the "Advanced: Default Images Directory" option in %s.', 'woocommerce-jetpack' ),
48
- '<a target="_blank" href="' . admin_url( 'admin.php?page=wc-settings&tab=jetpack&wcj-cat=pdf_invoicing&section=pdf_invoicing_advanced' ) . '">' .
49
  __( 'PDF Invoicing & Packing Slips > Advanced', 'woocommerce-jetpack' ) .
50
  '</a>'
51
  ),
2
  /**
3
  * Booster for WooCommerce - Settings - PDF Invoicing - Header
4
  *
5
+ * @version 5.6.8
6
  * @since 2.8.0
7
  * @author Pluggabl LLC.
8
  * @todo (maybe) add info on `<img>` in "Header Image" description
45
  sprintf(
46
  /* translators: %s: translators Added */
47
  __( 'If you are experiencing issues with displaying header image, please try setting different values for the "Advanced: Default Images Directory" option in %s.', 'woocommerce-jetpack' ),
48
+ '<a target="_blank" href="' . admin_url( wcj_admin_tab_url() . '&wcj-cat=pdf_invoicing&section=pdf_invoicing_advanced' ) . '">' .
49
  __( 'PDF Invoicing & Packing Slips > Advanced', 'woocommerce-jetpack' ) .
50
  '</a>'
51
  ),
includes/settings/wcj-settings-pdf-invoicing-page.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Settings - PDF Invoicing - Page Settings
4
  *
5
- * @version 5.6.0
6
  * @since 2.8.0
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/settings
@@ -92,7 +92,7 @@ foreach ( $invoice_types as $invoice_type ) {
92
  sprintf(
93
  /* translators: %s: translators Added */
94
  __( 'If you are experiencing issues with displaying background image, please try setting different values for the "Advanced: Default Images Directory" option in %s.', 'woocommerce-jetpack' ),
95
- '<a target="_blank" href="' . admin_url( 'admin.php?page=wc-settings&tab=jetpack&wcj-cat=pdf_invoicing&section=pdf_invoicing_advanced' ) . '">' .
96
  __( 'PDF Invoicing & Packing Slips > Advanced', 'woocommerce-jetpack' ) .
97
  '</a>'
98
  ),
2
  /**
3
  * Booster for WooCommerce - Settings - PDF Invoicing - Page Settings
4
  *
5
+ * @version 5.6.8
6
  * @since 2.8.0
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/settings
92
  sprintf(
93
  /* translators: %s: translators Added */
94
  __( 'If you are experiencing issues with displaying background image, please try setting different values for the "Advanced: Default Images Directory" option in %s.', 'woocommerce-jetpack' ),
95
+ '<a target="_blank" href="' . admin_url( wcj_admin_tab_url() . '&wcj-cat=pdf_invoicing&section=pdf_invoicing_advanced' ) . '">' .
96
  __( 'PDF Invoicing & Packing Slips > Advanced', 'woocommerce-jetpack' ) .
97
  '</a>'
98
  ),
includes/settings/wcj-settings-price-by-country.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Settings - Prices and Currencies by Country
4
  *
5
- * @version 5.6.7
6
  * @since 2.8.1
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/settings
@@ -21,7 +21,15 @@ foreach ( $autogenerate_buttons_data as $autogenerate_button_id => $autogenerate
21
  $autogenerate_buttons[] = ( 0 === apply_filters( 'booster_option', 1, '' ) ?
22
  '<a class="button" disabled title="' . __( 'Available in Booster Plus only.', 'woocommerce-jetpack' ) . '">' . $autogenerate_button_desc . '</a>' :
23
  '<a class="button" href="' .
24
- esc_url( add_query_arg( 'wcj_generate_country_groups', $autogenerate_button_id, remove_query_arg( 'recalculate_price_filter_products_prices' ) ) ) . '"' .
 
 
 
 
 
 
 
 
25
  wcj_get_js_confirmation( __( 'All existing country groups will be deleted and new groups will be created. Are you sure?', 'woocommerce-jetpack' ) ) . '>' .
26
  $autogenerate_button_desc .
27
  '</a>' );
@@ -196,7 +204,7 @@ $settings = array(
196
  'recalculate_price_filter_products_prices' => '1',
197
  'recalculate_price_filter_products_prices-nonce' => wp_create_nonce( 'recalculate_price_filter_products_prices' ),
198
  ),
199
- remove_query_arg( array( 'wcj_generate_country_groups' ) )
200
  )
201
  ) . '">' .
202
  __( 'Recalculate price filter widget and sorting by price product prices.', 'woocommerce-jetpack' ) . '</a>',
@@ -423,7 +431,7 @@ $settings = array_merge(
423
  'auto' => __( 'Automatically via Currency Exchange Rates module', 'woocommerce-jetpack' ),
424
  ),
425
  'desc' => ( '' === apply_filters( 'booster_message', '', 'desc' ) )
426
- ? __( 'Visit', 'woocommerce-jetpack' ) . ' <a href="' . admin_url( 'admin.php?page=wc-settings&tab=jetpack&wcj-cat=prices_and_currencies&section=currency_exchange_rates' ) . '">' . __( 'Currency Exchange Rates module', 'woocommerce-jetpack' ) . '</a>'
427
  : apply_filters( 'booster_message', '', 'desc' ),
428
  'custom_attributes' => apply_filters( 'booster_message', '', 'disabled' ),
429
  ),
2
  /**
3
  * Booster for WooCommerce - Settings - Prices and Currencies by Country
4
  *
5
+ * @version 5.6.8
6
  * @since 2.8.1
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/settings
21
  $autogenerate_buttons[] = ( 0 === apply_filters( 'booster_option', 1, '' ) ?
22
  '<a class="button" disabled title="' . __( 'Available in Booster Plus only.', 'woocommerce-jetpack' ) . '">' . $autogenerate_button_desc . '</a>' :
23
  '<a class="button" href="' .
24
+ esc_url(
25
+ add_query_arg(
26
+ array(
27
+ 'wcj_generate_country_groups' => $autogenerate_button_id,
28
+ 'wcj_generate_country_groups-nonce' => wp_create_nonce( 'wcj_generate_country_groups' ),
29
+ ),
30
+ remove_query_arg( 'recalculate_price_filter_products_prices' )
31
+ )
32
+ ) . '"' .
33
  wcj_get_js_confirmation( __( 'All existing country groups will be deleted and new groups will be created. Are you sure?', 'woocommerce-jetpack' ) ) . '>' .
34
  $autogenerate_button_desc .
35
  '</a>' );
204
  'recalculate_price_filter_products_prices' => '1',
205
  'recalculate_price_filter_products_prices-nonce' => wp_create_nonce( 'recalculate_price_filter_products_prices' ),
206
  ),
207
+ remove_query_arg( array( 'wcj_generate_country_groups', 'wcj_generate_country_groups-nonce' ) )
208
  )
209
  ) . '">' .
210
  __( 'Recalculate price filter widget and sorting by price product prices.', 'woocommerce-jetpack' ) . '</a>',
431
  'auto' => __( 'Automatically via Currency Exchange Rates module', 'woocommerce-jetpack' ),
432
  ),
433
  'desc' => ( '' === apply_filters( 'booster_message', '', 'desc' ) )
434
+ ? __( 'Visit', 'woocommerce-jetpack' ) . ' <a href="' . admin_url( wcj_admin_tab_url() . '&wcj-cat=prices_and_currencies&section=currency_exchange_rates' ) . '">' . __( 'Currency Exchange Rates module', 'woocommerce-jetpack' ) . '</a>'
435
  : apply_filters( 'booster_message', '', 'desc' ),
436
  'custom_attributes' => apply_filters( 'booster_message', '', 'disabled' ),
437
  ),
includes/settings/wcj-settings-price-by-user-role.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Settings - Price based on User Role
4
  *
5
- * @version 5.6.0
6
  * @since 2.8.0
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/settings
@@ -156,7 +156,7 @@ $settings = array(
156
  'desc' => sprintf(
157
  /* translators: %s: translators Added */
158
  __( 'Custom roles can be added via "Add/Manage Custom Roles" tool in Booster\'s <a href="%s">General</a> module.', 'woocommerce-jetpack' ),
159
- admin_url( 'admin.php?page=wc-settings&tab=jetpack&wcj-cat=emails_and_misc&section=general' )
160
  ),
161
  'id' => 'wcj_price_by_user_role_multipliers_options',
162
  ),
2
  /**
3
  * Booster for WooCommerce - Settings - Price based on User Role
4
  *
5
+ * @version 5.6.8
6
  * @since 2.8.0
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/settings
156
  'desc' => sprintf(
157
  /* translators: %s: translators Added */
158
  __( 'Custom roles can be added via "Add/Manage Custom Roles" tool in Booster\'s <a href="%s">General</a> module.', 'woocommerce-jetpack' ),
159
+ admin_url( wcj_admin_tab_url() . '&wcj-cat=emails_and_misc&section=general' )
160
  ),
161
  'id' => 'wcj_price_by_user_role_multipliers_options',
162
  ),
includes/settings/wcj-settings-product-by-user.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce Settings - Product by User
4
  *
5
- * @version 5.6.0
6
  * @since 2.8.0
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/settings
@@ -85,7 +85,7 @@ $settings = array_merge(
85
  'desc' => sprintf(
86
  /* translators: %s: translators Added */
87
  __( 'Custom roles can be added via "Add/Manage Custom Roles" tool in Booster\'s <a href="%s">General</a> module', 'woocommerce-jetpack' ),
88
- admin_url( 'admin.php?page=wc-settings&tab=jetpack&wcj-cat=emails_and_misc&section=general' )
89
  ),
90
  'id' => 'wcj_product_by_user_user_visibility',
91
  'default' => array(),
2
  /**
3
  * Booster for WooCommerce Settings - Product by User
4
  *
5
+ * @version 5.6.8
6
  * @since 2.8.0
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/settings
85
  'desc' => sprintf(
86
  /* translators: %s: translators Added */
87
  __( 'Custom roles can be added via "Add/Manage Custom Roles" tool in Booster\'s <a href="%s">General</a> module', 'woocommerce-jetpack' ),
88
+ admin_url( wcj_admin_tab_url() . '&wcj-cat=emails_and_misc&section=general' )
89
  ),
90
  'id' => 'wcj_product_by_user_user_visibility',
91
  'default' => array(),
includes/settings/wcj-settings-related-products.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Settings - Related Products
4
  *
5
- * @version 5.6.0
6
  * @since 2.8.0
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/settings
@@ -36,7 +36,7 @@ $orderby_options = array(
36
  'title' => __( 'Title', 'woocommerce-jetpack' ),
37
  );
38
  if ( WCJ_IS_WC_VERSION_BELOW_3 ) {
39
- $orderby_options['meta_value'] = __( 'Meta Value', 'woocommerce-jetpack' ); // phpcs:ignore
40
  $orderby_options['meta_value_num'] = __( 'Meta Value (Numeric)', 'woocommerce-jetpack' );
41
  } else {
42
  $orderby_options['id'] = __( 'ID', 'woocommerce-jetpack' );
2
  /**
3
  * Booster for WooCommerce - Settings - Related Products
4
  *
5
+ * @version 5.6.8
6
  * @since 2.8.0
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/settings
36
  'title' => __( 'Title', 'woocommerce-jetpack' ),
37
  );
38
  if ( WCJ_IS_WC_VERSION_BELOW_3 ) {
39
+ $orderby_options['meta_value'] = __( 'Meta Value', 'woocommerce-jetpack' ); // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_value
40
  $orderby_options['meta_value_num'] = __( 'Meta Value (Numeric)', 'woocommerce-jetpack' );
41
  } else {
42
  $orderby_options['id'] = __( 'ID', 'woocommerce-jetpack' );
includes/settings/wcj-settings-shipping-options.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Settings - Shipping Options
4
  *
5
- * @version 5.6.0
6
  * @since 2.9.0
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/settings
@@ -60,7 +60,7 @@ $settings = array_merge(
60
  sprintf(
61
  /* translators: %s: translators Added */
62
  __( 'Similar results can be achieved with %s module.', 'woocommerce-jetpack' ),
63
- '<a href="' . admin_url( 'admin.php?page=wc-settings&tab=jetpack&wcj-cat=shipping_and_orders&section=shipping_by_products' ) . '">' .
64
  __( 'Shipping Methods by Products', 'woocommerce-jetpack' ) . '</a>'
65
  ),
66
  'type' => 'title',
2
  /**
3
  * Booster for WooCommerce - Settings - Shipping Options
4
  *
5
+ * @version 5.6.8
6
  * @since 2.9.0
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/settings
60
  sprintf(
61
  /* translators: %s: translators Added */
62
  __( 'Similar results can be achieved with %s module.', 'woocommerce-jetpack' ),
63
+ '<a href="' . admin_url( wcj_admin_tab_url() . '&wcj-cat=shipping_and_orders&section=shipping_by_products' ) . '">' .
64
  __( 'Shipping Methods by Products', 'woocommerce-jetpack' ) . '</a>'
65
  ),
66
  'type' => 'title',
includes/settings/wcj-settings-url-coupons.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Settings - URL Coupons
4
  *
5
- * @version 5.6.0
6
  * @since 2.9.1
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/settings
@@ -18,7 +18,7 @@ $settings = array(
18
  'desc' => sprintf(
19
  /* translators: %s: translators Added */
20
  __( 'Additionally you can hide standard coupon field on cart page in Booster\'s <a href="%s">Cart Customization</a> module.', 'woocommerce-jetpack' ),
21
- admin_url( 'admin.php?page=wc-settings&tab=jetpack&wcj-cat=cart_and_checkout&section=cart_customization' )
22
  ),
23
  'type' => 'title',
24
  'id' => 'wcj_url_coupons_options',
2
  /**
3
  * Booster for WooCommerce - Settings - URL Coupons
4
  *
5
+ * @version 5.6.8
6
  * @since 2.9.1
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/settings
18
  'desc' => sprintf(
19
  /* translators: %s: translators Added */
20
  __( 'Additionally you can hide standard coupon field on cart page in Booster\'s <a href="%s">Cart Customization</a> module.', 'woocommerce-jetpack' ),
21
+ admin_url( wcj_admin_tab_url() . '&wcj-cat=cart_and_checkout&section=cart_customization' )
22
  ),
23
  'type' => 'title',
24
  'id' => 'wcj_url_coupons_options',
includes/shipping/class-wc-shipping-wcj-custom-with-shipping-zones.php CHANGED
@@ -1,8 +1,8 @@
1
- <?php //phpcs:ignore
2
  /**
3
  * Booster for WooCommerce - Shipping - Custom Shipping with Shipping Zones
4
  *
5
- * @version 5.6.2
6
  * @since 2.5.6
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/includes
@@ -12,13 +12,13 @@ if ( ! defined( 'ABSPATH' ) ) {
12
  exit; // Exit if accessed directly.
13
  }
14
 
15
- if ( ! class_exists( 'WC_Shipping_WCJ_Custom_W_Zones' ) ) :
16
  /**
17
- * WC_Shipping_WCJ_Custom_W_Zones
18
  *
19
- * @version 2.5.6
20
  */
21
- class WC_Shipping_WCJ_Custom_W_Zones extends WC_Shipping_Method {
22
  /**
23
  * Form_field_ids
24
  *
1
+ <?php
2
  /**
3
  * Booster for WooCommerce - Shipping - Custom Shipping with Shipping Zones
4
  *
5
+ * @version 5.6.8
6
  * @since 2.5.6
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/includes
12
  exit; // Exit if accessed directly.
13
  }
14
 
15
+ if ( ! class_exists( 'WC_Shipping_WCJ_Custom_With_Shipping_Zones' ) ) :
16
  /**
17
+ * WC_Shipping_WCJ_Custom_With_Shipping_Zones
18
  *
19
+ * @version 5.6.8
20
  */
21
+ class WC_Shipping_WCJ_Custom_With_Shipping_Zones extends WC_Shipping_Method {
22
  /**
23
  * Form_field_ids
24
  *
includes/shortcodes/class-wcj-general-shortcodes.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Shortcodes - General
4
  *
5
- * @version 5.6.7
6
  * @author Pluggabl LLC.
7
  * @package Booster_For_WooCommerce/shortcodes
8
  */
@@ -476,7 +476,7 @@ if ( ! class_exists( 'WCJ_General_Shortcodes' ) ) :
476
  /**
477
  * Wcj_selector.
478
  *
479
- * @version 5.6.2
480
  * @since 3.1.0
481
  * @todo add `default` attribute
482
  * @todo (maybe) add more selector types (e.g.: currency)
@@ -498,7 +498,6 @@ if ( ! class_exists( 'WCJ_General_Shortcodes' ) ) :
498
  break;
499
  default: // 'all'.
500
  $countries = wcj_get_countries();
501
- asort( $options );
502
  break;
503
  }
504
 
@@ -518,6 +517,7 @@ if ( ! class_exists( 'WCJ_General_Shortcodes' ) ) :
518
  '<select name="wcj_' . $atts['selector_type'] . '_selector" class="wcj_' . $atts['selector_type'] . '_selector" onchange="this.form.submit()">' .
519
  $html .
520
  '</select>' .
 
521
  '</form>';
522
  }
523
 
@@ -604,34 +604,34 @@ if ( ! class_exists( 'WCJ_General_Shortcodes' ) ) :
604
  /**
605
  * Wcj_current_time.
606
  *
607
- * @version 5.6.2
608
  * @since 2.6.0
609
  * @param array $atts The user defined shortcode attributes.
610
  */
611
  public function wcj_current_time( $atts ) {
612
- return date_i18n( $atts['time_format'], gmdate( 'U' ) );
613
  }
614
 
615
  /**
616
  * Wcj_current_datetime.
617
  *
618
- * @version 5.6.2
619
  * @since 2.6.0
620
  * @param array $atts The user defined shortcode attributes.
621
  */
622
  public function wcj_current_datetime( $atts ) {
623
- return date_i18n( $atts['datetime_format'], gmdate( 'U' ) );
624
  }
625
 
626
  /**
627
  * Wcj_current_timestamp.
628
  *
629
- * @version 5.6.2
630
  * @since 2.6.0
631
  * @param array $atts The user defined shortcode attributes.
632
  */
633
  public function wcj_current_timestamp( $atts ) {
634
- return gmdate( 'U' );
635
  }
636
 
637
  /**
@@ -838,7 +838,7 @@ if ( ! class_exists( 'WCJ_General_Shortcodes' ) ) :
838
  /**
839
  * Wcj_currency_select_link_list.
840
  *
841
- * @version 5.5.9
842
  * @since 2.4.5
843
  * @param array $atts The user defined shortcode attributes.
844
  * @param array | string $content The user defined shortcode content.
@@ -875,7 +875,7 @@ if ( ! class_exists( 'WCJ_General_Shortcodes' ) ) :
875
  '%currency_symbol%' => get_woocommerce_currency_symbol( $currency_code ),
876
  );
877
  $currency_switcher_output = str_replace( array_keys( $template_replaced_values ), array_values( $template_replaced_values ), $switcher_template );
878
- $the_link = '<a href="' . esc_url( add_query_arg( 'wcj-currency', $currency_code ) ) . '">' . $currency_switcher_output . '</a>';
879
  if ( $currency_code !== $selected_currency ) {
880
  $links[] = $the_link;
881
  } else {
@@ -917,7 +917,7 @@ if ( ! class_exists( 'WCJ_General_Shortcodes' ) ) :
917
  /**
918
  * Get_currency_selector.
919
  *
920
- * @version 3.9.0
921
  * @since 2.4.5
922
  * @param array $atts The user defined shortcode attributes.
923
  * @param array | string $content The user defined shortcode content.
@@ -976,6 +976,7 @@ if ( ! class_exists( 'WCJ_General_Shortcodes' ) ) :
976
  if ( 'select' === $type ) {
977
  $html .= '</select>';
978
  }
 
979
  $html .= '</form>';
980
  return $html;
981
  }
@@ -1007,7 +1008,7 @@ if ( ! class_exists( 'WCJ_General_Shortcodes' ) ) :
1007
  /**
1008
  * Wcj_country_select_drop_down_list.
1009
  *
1010
- * @version 4.3.0
1011
  * @param array $atts The user defined shortcode attributes.
1012
  * @param array | string $content The user defined shortcode content.
1013
  */
@@ -1046,6 +1047,7 @@ if ( ! class_exists( 'WCJ_General_Shortcodes' ) ) :
1046
  }
1047
  }
1048
  }
 
1049
  $html .= '</select>';
1050
  $html .= '</form>';
1051
  return $html;
@@ -1087,11 +1089,11 @@ if ( ! class_exists( 'WCJ_General_Shortcodes' ) ) :
1087
  /**
1088
  * Wcj_current_date.
1089
  *
1090
- * @version 2.6.0
1091
  * @param array $atts The user defined shortcode attributes.
1092
  */
1093
  public function wcj_current_date( $atts ) {
1094
- return date_i18n( $atts['date_format'], gmdate( 'U' ) );
1095
  }
1096
 
1097
  /**
2
  /**
3
  * Booster for WooCommerce - Shortcodes - General
4
  *
5
+ * @version 5.6.8
6
  * @author Pluggabl LLC.
7
  * @package Booster_For_WooCommerce/shortcodes
8
  */
476
  /**
477
  * Wcj_selector.
478
  *
479
+ * @version 5.6.8
480
  * @since 3.1.0
481
  * @todo add `default` attribute
482
  * @todo (maybe) add more selector types (e.g.: currency)
498
  break;
499
  default: // 'all'.
500
  $countries = wcj_get_countries();
 
501
  break;
502
  }
503
 
517
  '<select name="wcj_' . $atts['selector_type'] . '_selector" class="wcj_' . $atts['selector_type'] . '_selector" onchange="this.form.submit()">' .
518
  $html .
519
  '</select>' .
520
+ wp_nonce_field( 'wcj_' . $atts['selector_type'] . '_selector', 'wcj_' . $atts['selector_type'] . '_selector-nonce' ) .
521
  '</form>';
522
  }
523
 
604
  /**
605
  * Wcj_current_time.
606
  *
607
+ * @version 5.6.8
608
  * @since 2.6.0
609
  * @param array $atts The user defined shortcode attributes.
610
  */
611
  public function wcj_current_time( $atts ) {
612
+ return date_i18n( $atts['time_format'], wcj_get_timestamp_date_from_gmt() );
613
  }
614
 
615
  /**
616
  * Wcj_current_datetime.
617
  *
618
+ * @version 5.6.8
619
  * @since 2.6.0
620
  * @param array $atts The user defined shortcode attributes.
621
  */
622
  public function wcj_current_datetime( $atts ) {
623
+ return date_i18n( $atts['datetime_format'], wcj_get_timestamp_date_from_gmt() );
624
  }
625
 
626
  /**
627
  * Wcj_current_timestamp.
628
  *
629
+ * @version 5.6.8
630
  * @since 2.6.0
631
  * @param array $atts The user defined shortcode attributes.
632
  */
633
  public function wcj_current_timestamp( $atts ) {
634
+ return wcj_get_timestamp_date_from_gmt();
635
  }
636
 
637
  /**
838
  /**
839
  * Wcj_currency_select_link_list.
840
  *
841
+ * @version 5.6.8
842
  * @since 2.4.5
843
  * @param array $atts The user defined shortcode attributes.
844
  * @param array | string $content The user defined shortcode content.
875
  '%currency_symbol%' => get_woocommerce_currency_symbol( $currency_code ),
876
  );
877
  $currency_switcher_output = str_replace( array_keys( $template_replaced_values ), array_values( $template_replaced_values ), $switcher_template );
878
+ $the_link = '<a href="' . esc_url( wp_nonce_url( add_query_arg( 'wcj-currency', $currency_code ), 'wcj-currency', 'wcj-currency-nonce' ) ) . '">' . $currency_switcher_output . '</a>';
879
  if ( $currency_code !== $selected_currency ) {
880
  $links[] = $the_link;
881
  } else {
917
  /**
918
  * Get_currency_selector.
919
  *
920
+ * @version 5.6.8
921
  * @since 2.4.5
922
  * @param array $atts The user defined shortcode attributes.
923
  * @param array | string $content The user defined shortcode content.
976
  if ( 'select' === $type ) {
977
  $html .= '</select>';
978
  }
979
+ $html .= wp_nonce_field( 'wcj-currency', 'wcj-currency-nonce' );
980
  $html .= '</form>';
981
  return $html;
982
  }
1008
  /**
1009
  * Wcj_country_select_drop_down_list.
1010
  *
1011
+ * @version 5.6.8
1012
  * @param array $atts The user defined shortcode attributes.
1013
  * @param array | string $content The user defined shortcode content.
1014
  */
1047
  }
1048
  }
1049
  }
1050
+ $html .= wp_nonce_field( 'wcj-country', 'wcj-country-nonce' );
1051
  $html .= '</select>';
1052
  $html .= '</form>';
1053
  return $html;
1089
  /**
1090
  * Wcj_current_date.
1091
  *
1092
+ * @version 5.6.8
1093
  * @param array $atts The user defined shortcode attributes.
1094
  */
1095
  public function wcj_current_date( $atts ) {
1096
+ return date_i18n( $atts['date_format'], wcj_get_timestamp_date_from_gmt() );
1097
  }
1098
 
1099
  /**
includes/shortcodes/class-wcj-invoices-shortcodes.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Shortcodes - Invoices
4
  *
5
- * @version 5.6.2
6
  * @author Pluggabl LLC.
7
  * @package Booster_For_WooCommerce/shortcodes
8
  */
@@ -57,17 +57,14 @@ if ( ! class_exists( 'WCJ_Invoices_Shortcodes' ) ) :
57
  /**
58
  * Init_atts.
59
  *
60
- * @version 5.6.2.
61
  * @param array $atts The user defined shortcode attributes.
62
  */
63
  public function init_atts( $atts ) {
64
  // Atts.
65
- $wpnonce = true;
66
- if ( function_exists( 'wp_verify_nonce' ) ) {
67
- $wpnonce = isset( $_REQUEST['_wpnonce'] ) ? wp_verify_nonce( sanitize_key( isset( $_REQUEST['_wpnonce'] ) ? $_REQUEST['_wpnonce'] : '' ) ) : true;
68
- }
69
  if ( 0 === $atts['order_id'] ) {
70
- $atts['order_id'] = ( isset( $_GET['order_id'] ) && $wpnonce ) ? sanitize_text_field(
71
  wp_unslash(
72
  $_GET['order_id']
73
  )
@@ -79,6 +76,7 @@ if ( ! class_exists( 'WCJ_Invoices_Shortcodes' ) ) :
79
  if ( 'shop_order' !== get_post_type( $atts['order_id'] ) ) {
80
  return false;
81
  }
 
82
 
83
  return $atts;
84
  }
2
  /**
3
  * Booster for WooCommerce - Shortcodes - Invoices
4
  *
5
+ * @version 5.6.8
6
  * @author Pluggabl LLC.
7
  * @package Booster_For_WooCommerce/shortcodes
8
  */
57
  /**
58
  * Init_atts.
59
  *
60
+ * @version 5.6.8
61
  * @param array $atts The user defined shortcode attributes.
62
  */
63
  public function init_atts( $atts ) {
64
  // Atts.
65
+ // phpcs:disable WordPress.Security.NonceVerification
 
 
 
66
  if ( 0 === $atts['order_id'] ) {
67
+ $atts['order_id'] = ( isset( $_GET['order_id'] ) ) ? sanitize_text_field(
68
  wp_unslash(
69
  $_GET['order_id']
70
  )
76
  if ( 'shop_order' !== get_post_type( $atts['order_id'] ) ) {
77
  return false;
78
  }
79
+ // phpcs:enable WordPress.Security.NonceVerification
80
 
81
  return $atts;
82
  }
includes/shortcodes/class-wcj-orders-shortcodes.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Shortcodes - Orders
4
  *
5
- * @version 5.6.3
6
  * @author Pluggabl LLC.
7
  * @package Booster_For_WooCommerce/shortcodes
8
  */
@@ -20,7 +20,7 @@ if ( ! class_exists( 'WCJ_Orders_Shortcodes' ) ) :
20
  /**
21
  * Constructor.
22
  *
23
- * @version 5.6.3
24
  */
25
  public function __construct() {
26
 
@@ -110,7 +110,7 @@ if ( ! class_exists( 'WCJ_Orders_Shortcodes' ) ) :
110
  /**
111
  * Add_extra_atts.
112
  *
113
- * @version 5.6.2
114
  * @param array $atts The user defined shortcode attributes.
115
  */
116
  public function add_extra_atts( $atts ) {
@@ -136,7 +136,7 @@ if ( ! class_exists( 'WCJ_Orders_Shortcodes' ) ) :
136
  'item_number' => 'all',
137
  'field' => 'name',
138
  'order_user_roles' => '',
139
- 'meta_key' => '', // phpcs:ignore
140
  'tax_class' => '',
141
  'fallback_billing_address' => 'no',
142
  'tax_display' => '',
@@ -199,14 +199,16 @@ if ( ! class_exists( 'WCJ_Orders_Shortcodes' ) ) :
199
  public function init_atts( $atts ) {
200
 
201
  // Atts.
 
202
  $atts['excl_tax'] = ( 'yes' === $atts['excl_tax'] );
203
  if ( 0 === $atts['order_id'] ) {
204
- $atts['order_id'] = ( isset( $_GET['order_id'] ) ) ? sanitize_text_field( wp_unslash( $_GET['order_id'] ) ) : get_the_ID(); // phpcs:ignore WordPress.Security.NonceVerification
205
  }
206
  if ( 0 === $atts['order_id'] ) {
207
- $atts['order_id'] = ( isset( $_GET['pdf_invoice'] ) ) ? sanitize_text_field( wp_unslash( $_GET['pdf_invoice'] ) ) : 0; // phpcs:ignore WordPress.Security.NonceVerification
208
  // PDF Invoices V1 compatibility.
209
  }
 
210
  if ( 0 === $atts['order_id'] ) {
211
  return false;
212
  }
2
  /**
3
  * Booster for WooCommerce - Shortcodes - Orders
4
  *
5
+ * @version 5.6.8
6
  * @author Pluggabl LLC.
7
  * @package Booster_For_WooCommerce/shortcodes
8
  */
20
  /**
21
  * Constructor.
22
  *
23
+ * @version 5.6.8
24
  */
25
  public function __construct() {
26
 
110
  /**
111
  * Add_extra_atts.
112
  *
113
+ * @version 5.6.8
114
  * @param array $atts The user defined shortcode attributes.
115
  */
116
  public function add_extra_atts( $atts ) {
136
  'item_number' => 'all',
137
  'field' => 'name',
138
  'order_user_roles' => '',
139
+ 'meta_key' => '', // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_key
140
  'tax_class' => '',
141
  'fallback_billing_address' => 'no',
142
  'tax_display' => '',
199
  public function init_atts( $atts ) {
200
 
201
  // Atts.
202
+ // phpcs:disable WordPress.Security.NonceVerification
203
  $atts['excl_tax'] = ( 'yes' === $atts['excl_tax'] );
204
  if ( 0 === $atts['order_id'] ) {
205
+ $atts['order_id'] = ( isset( $_GET['order_id'] ) ) ? sanitize_text_field( wp_unslash( $_GET['order_id'] ) ) : get_the_ID();
206
  }
207
  if ( 0 === $atts['order_id'] ) {
208
+ $atts['order_id'] = ( isset( $_GET['pdf_invoice'] ) ) ? sanitize_text_field( wp_unslash( $_GET['pdf_invoice'] ) ) : 0;
209
  // PDF Invoices V1 compatibility.
210
  }
211
+ // phpcs:enable WordPress.Security.NonceVerification
212
  if ( 0 === $atts['order_id'] ) {
213
  return false;
214
  }
includes/shortcodes/class-wcj-products-add-form-shortcodes.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Shortcodes - Products Add Form
4
  *
5
- * @version 5.6.2
6
  * @since 2.5.0
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/shortcodes
@@ -269,21 +269,18 @@ if ( ! class_exists( 'WCJ_Products_Add_Form_Shortcodes' ) ) :
269
  /**
270
  * Wcj_product_add_new.
271
  *
272
- * @version 5.6.2
273
  * @since 2.5.0
274
  * @todo `multipart` only if image
275
  * @param array $atts The user defined shortcode atts.
276
  */
277
  public function wcj_product_add_new( $atts ) {
278
- $wpnonce = isset( $_REQUEST['_wpnonce'] ) ? wp_verify_nonce( sanitize_key( isset( $_REQUEST['_wpnonce'] ) ? $_REQUEST['_wpnonce'] : '' ) ) : true;
279
  $header_html = '';
280
  $notice_html = '';
281
  $input_fields_html = '';
282
  $footer_html = '';
283
 
284
- if ( ! $wpnonce ) {
285
- return;
286
- }
287
  $args = array(
288
  'title' => ( isset( $_REQUEST['wcj_add_new_product_title'] ) ) ? sanitize_text_field( wp_unslash( $_REQUEST['wcj_add_new_product_title'] ) ) : '',
289
  'desc' => isset( $_REQUEST['wcj_add_new_product_desc'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['wcj_add_new_product_desc'] ) ) : '',
@@ -300,7 +297,7 @@ if ( ! class_exists( 'WCJ_Products_Add_Form_Shortcodes' ) ) :
300
  $args[ 'custom_taxonomy_' . $i ] = isset( $_REQUEST[ $param_id ] ) ? sanitize_text_field( wp_unslash( $_REQUEST[ $param_id ] ) ) : array();
301
  }
302
 
303
- if ( isset( $_REQUEST['wcj_add_new_product'] ) ) {
304
  $validate_args = $this->validate_args( $args, $atts );
305
  if ( true === ( $validate_args ) ) {
306
  $result = $this->wc_add_new_product( $args, $atts );
@@ -471,6 +468,7 @@ if ( ! class_exists( 'WCJ_Products_Add_Form_Shortcodes' ) ) :
471
 
472
  $footer_html .= '<input type="submit" class="button" name="wcj_add_new_product" value="' . ( ( 0 === $atts['product_id'] ) ?
473
  __( 'Add', 'woocommerce-jetpack' ) : __( 'Edit', 'woocommerce-jetpack' ) ) . '">';
 
474
  $footer_html .= '</form>';
475
 
476
  return $notice_html . $header_html . $input_fields_html . $footer_html;
2
  /**
3
  * Booster for WooCommerce - Shortcodes - Products Add Form
4
  *
5
+ * @version 5.6.8
6
  * @since 2.5.0
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/shortcodes
269
  /**
270
  * Wcj_product_add_new.
271
  *
272
+ * @version 5.6.8
273
  * @since 2.5.0
274
  * @todo `multipart` only if image
275
  * @param array $atts The user defined shortcode atts.
276
  */
277
  public function wcj_product_add_new( $atts ) {
278
+ $wpnonce = isset( $_REQUEST['wcj_add_new_product-nonce'] ) ? wp_verify_nonce( sanitize_key( $_REQUEST['wcj_add_new_product-nonce'] ), 'wcj_add_new_product' ) : false;
279
  $header_html = '';
280
  $notice_html = '';
281
  $input_fields_html = '';
282
  $footer_html = '';
283
 
 
 
 
284
  $args = array(
285
  'title' => ( isset( $_REQUEST['wcj_add_new_product_title'] ) ) ? sanitize_text_field( wp_unslash( $_REQUEST['wcj_add_new_product_title'] ) ) : '',
286
  'desc' => isset( $_REQUEST['wcj_add_new_product_desc'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['wcj_add_new_product_desc'] ) ) : '',
297
  $args[ 'custom_taxonomy_' . $i ] = isset( $_REQUEST[ $param_id ] ) ? sanitize_text_field( wp_unslash( $_REQUEST[ $param_id ] ) ) : array();
298
  }
299
 
300
+ if ( $wpnonce && isset( $_REQUEST['wcj_add_new_product'] ) ) {
301
  $validate_args = $this->validate_args( $args, $atts );
302
  if ( true === ( $validate_args ) ) {
303
  $result = $this->wc_add_new_product( $args, $atts );
468
 
469
  $footer_html .= '<input type="submit" class="button" name="wcj_add_new_product" value="' . ( ( 0 === $atts['product_id'] ) ?
470
  __( 'Add', 'woocommerce-jetpack' ) : __( 'Edit', 'woocommerce-jetpack' ) ) . '">';
471
+ $footer_html .= wp_nonce_field( 'wcj_add_new_product', 'wcj_add_new_product-nonce' );
472
  $footer_html .= '</form>';
473
 
474
  return $notice_html . $header_html . $input_fields_html . $footer_html;
includes/shortcodes/class-wcj-products-crowdfunding-shortcodes.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Shortcodes - Products Crowdfunding
4
  *
5
- * @version 5.6.2
6
  * @since 2.5.4
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/includes
@@ -217,12 +217,12 @@ if ( ! class_exists( 'WCJ_Products_Crowdfunding_Shortcodes' ) ) :
217
  /**
218
  * Wcj_product_crowdfunding_time_remaining.
219
  *
220
- * @version 5.6.2
221
  * @since 2.2.6
222
  * @param array $atts The user defined shortcode attributes.
223
  */
224
  public function wcj_product_crowdfunding_time_remaining( $atts ) {
225
- $seconds_remaining = strtotime( $this->wcj_product_crowdfunding_deadline( $atts ) ) - gmdate( 'U' );
226
  $days_remaining = floor( $seconds_remaining / ( 24 * 60 * 60 ) );
227
  $hours_remaining = floor( $seconds_remaining / ( 60 * 60 ) );
228
  $minutes_remaining = floor( $seconds_remaining / 60 );
@@ -244,7 +244,7 @@ if ( ! class_exists( 'WCJ_Products_Crowdfunding_Shortcodes' ) ) :
244
  /**
245
  * Wcj_product_crowdfunding_time_remaining_progress_bar.
246
  *
247
- * @version 5.6.2
248
  * @since 2.5.0
249
  * @param array $atts The user defined shortcode attributes.
250
  */
@@ -252,7 +252,7 @@ if ( ! class_exists( 'WCJ_Products_Crowdfunding_Shortcodes' ) ) :
252
  $deadline_seconds = strtotime( get_post_meta( wcj_get_product_id_or_variation_parent_id( $this->the_product ), '_wcj_crowdfunding_deadline', true ) );
253
  $startdate_seconds = strtotime( get_post_meta( wcj_get_product_id_or_variation_parent_id( $this->the_product ), '_wcj_crowdfunding_startdate', true ) );
254
 
255
- $seconds_remaining = $deadline_seconds - gmdate( 'U' );
256
  $seconds_total = $deadline_seconds - $startdate_seconds;
257
 
258
  $current_value = $seconds_remaining;
2
  /**
3
  * Booster for WooCommerce - Shortcodes - Products Crowdfunding
4
  *
5
+ * @version 5.6.8
6
  * @since 2.5.4
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/includes
217
  /**
218
  * Wcj_product_crowdfunding_time_remaining.
219
  *
220
+ * @version 5.6.8
221
  * @since 2.2.6
222
  * @param array $atts The user defined shortcode attributes.
223
  */
224
  public function wcj_product_crowdfunding_time_remaining( $atts ) {
225
+ $seconds_remaining = strtotime( $this->wcj_product_crowdfunding_deadline( $atts ) ) - wcj_get_timestamp_date_from_gmt();
226
  $days_remaining = floor( $seconds_remaining / ( 24 * 60 * 60 ) );
227
  $hours_remaining = floor( $seconds_remaining / ( 60 * 60 ) );
228
  $minutes_remaining = floor( $seconds_remaining / 60 );
244
  /**
245
  * Wcj_product_crowdfunding_time_remaining_progress_bar.
246
  *
247
+ * @version 5.6.8
248
  * @since 2.5.0
249
  * @param array $atts The user defined shortcode attributes.
250
  */
252
  $deadline_seconds = strtotime( get_post_meta( wcj_get_product_id_or_variation_parent_id( $this->the_product ), '_wcj_crowdfunding_deadline', true ) );
253
  $startdate_seconds = strtotime( get_post_meta( wcj_get_product_id_or_variation_parent_id( $this->the_product ), '_wcj_crowdfunding_startdate', true ) );
254
 
255
+ $seconds_remaining = $deadline_seconds - wcj_get_timestamp_date_from_gmt();
256
  $seconds_total = $deadline_seconds - $startdate_seconds;
257
 
258
  $current_value = $seconds_remaining;
includes/shortcodes/class-wcj-products-shortcodes.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Shortcodes - Products
4
  *
5
- * @version 5.6.2
6
  * @author Pluggabl LLC.
7
  * @package Booster_For_WooCommerce/shortcodes
8
  */
@@ -21,7 +21,7 @@ if ( ! class_exists( 'WCJ_Products_Shortcodes' ) ) :
21
  /**
22
  * Constructor.
23
  *
24
- * @version 5.4.8
25
  * @todo (maybe) add `[wcj_product_stock_price]`
26
  */
27
  public function __construct() {
@@ -128,7 +128,7 @@ if ( ! class_exists( 'WCJ_Products_Shortcodes' ) ) :
128
  'width' => 0,
129
  'height' => 0,
130
  'color' => 'black',
131
- 'meta_key' => '', //phpcs:ignore
132
  );
133
 
134
  parent::__construct();
@@ -313,7 +313,7 @@ if ( ! class_exists( 'WCJ_Products_Shortcodes' ) ) :
313
  /**
314
  * Wcj_product_time_since_last_sale.
315
  *
316
- * @version 5.6.2
317
  * @since 2.4.0
318
  * @param array $atts Shortcode atts.
319
  */
@@ -346,7 +346,7 @@ if ( ! class_exists( 'WCJ_Products_Shortcodes' ) ) :
346
  if ( $item['product_id'] === $atts['product_id'] ) {
347
  // Found sale!
348
  /* translators: %s: search term */
349
- return sprintf( __( '%s ago', 'woocommerce-jetpack' ), human_time_diff( get_the_time( 'U', $order_id ), (int) gmdate( 'U' ) ) );
350
  }
351
  }
352
  }
2
  /**
3
  * Booster for WooCommerce - Shortcodes - Products
4
  *
5
+ * @version 5.6.8
6
  * @author Pluggabl LLC.
7
  * @package Booster_For_WooCommerce/shortcodes
8
  */
21
  /**
22
  * Constructor.
23
  *
24
+ * @version 5.6.8
25
  * @todo (maybe) add `[wcj_product_stock_price]`
26
  */
27
  public function __construct() {
128
  'width' => 0,
129
  'height' => 0,
130
  'color' => 'black',
131
+ 'meta_key' => '', // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_key
132
  );
133
 
134
  parent::__construct();
313
  /**
314
  * Wcj_product_time_since_last_sale.
315
  *
316
+ * @version 5.6.8
317
  * @since 2.4.0
318
  * @param array $atts Shortcode atts.
319
  */
346
  if ( $item['product_id'] === $atts['product_id'] ) {
347
  // Found sale!
348
  /* translators: %s: search term */
349
+ return sprintf( __( '%s ago', 'woocommerce-jetpack' ), human_time_diff( get_the_time( 'U', $order_id ), wcj_get_timestamp_date_from_gmt() ) );
350
  }
351
  }
352
  }
includes/tools/class-wcj-eu-countries-vat-rates-tool.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Tool - EU Countries VAT Rates
4
  *
5
- * @version 5.6.2
6
  * @since 2.3.10
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/tools
@@ -35,14 +35,11 @@ if ( ! class_exists( 'WCJ_EU_Countries_VAT_Rates_Tool' ) ) :
35
  /**
36
  * Add_eu_countries_vat_rates.
37
  *
38
- * @version 5.6.2
39
  * @since 2.3.10
40
  */
41
  public function add_eu_countries_vat_rates() {
42
- $wpnonce = true;
43
- if ( function_exists( 'wp_verify_nonce' ) ) {
44
- $wpnonce = isset( $_REQUEST['_wpnonce'] ) ? wp_verify_nonce( sanitize_key( isset( $_REQUEST['_wpnonce'] ) ? $_REQUEST['_wpnonce'] : '' ) ) : true;
45
- }
46
  if ( ! $wpnonce || ! isset( $_POST['add_eu_countries_vat_rates'] ) ) {
47
  return;
48
  }
@@ -72,36 +69,42 @@ if ( ! class_exists( 'WCJ_EU_Countries_VAT_Rates_Tool' ) ) :
72
  /**
73
  * Create_eu_countries_vat_rates_tool.
74
  *
75
- * @version 5.6.2
76
  * @since 2.3.10
77
  * @param string $header_html Get html data.
78
  */
79
  public function create_eu_countries_vat_rates_tool( $header_html ) {
 
 
 
 
 
80
 
81
  $the_tool_html = '';
82
  $the_tool_html .= '<div class="wcj-setting-jetpack-body wcj_tools_cnt_main">';
83
  $the_tool_html .= $header_html;
84
 
85
- $data = array();
86
- $wpnonce = true;
87
- if ( function_exists( 'wp_verify_nonce' ) ) {
88
- $wpnonce = isset( $_REQUEST['_wpnonce'] ) ? wp_verify_nonce( sanitize_key( isset( $_REQUEST['_wpnonce'] ) ? $_REQUEST['_wpnonce'] : '' ) ) : true;
89
- }
90
- $the_name = ( $wpnonce && isset( $_POST['wcj_tax_name'] ) ) ? sanitize_text_field( wp_unslash( $_POST['wcj_tax_name'] ) ) : __( 'VAT', 'woocommerce' );
91
  $data[] = array(
92
  __( 'Name', 'woocommerce-jetpack' ),
93
  '<input class="input-text" type="text" name="wcj_tax_name" value="' . $the_name . '">',
 
94
  );
95
  $data[] = array(
96
  '',
97
- '<input class="button-primary" type="submit" name="add_eu_countries_vat_rates" value="' . __( 'Add EU Countries VAT Rates', 'woocommerce-jetpack' ) . '">' . __( 'Note: will add duplicates.', 'woocommerce-jetpack' ),
 
98
  );
99
- $the_tool_html .= '<p>';
100
  $the_tool_html .= '<form method="post" action="">';
101
- $the_tool_html .= wcj_get_table_html( $data, array( 'table_heading_type' => 'vertical' ) );
 
 
 
 
 
 
102
  $the_tool_html .= '</form>';
103
- $the_tool_html .= '</p>';
104
-
105
  $the_tool_html .= '<h4>' . __( 'List of EU VAT rates to be added', 'woocommerce-jetpack' ) . '</h4>';
106
  $eu_vat_rates = wcj_get_european_union_countries_with_vat();
107
  $data = array();
2
  /**
3
  * Booster for WooCommerce - Tool - EU Countries VAT Rates
4
  *
5
+ * @version 5.6.8
6
  * @since 2.3.10
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/tools
35
  /**
36
  * Add_eu_countries_vat_rates.
37
  *
38
+ * @version 5.6.8
39
  * @since 2.3.10
40
  */
41
  public function add_eu_countries_vat_rates() {
42
+ $wpnonce = isset( $_REQUEST['add_eu_countries_vat_rates-nonce'] ) ? wp_verify_nonce( sanitize_key( $_REQUEST['add_eu_countries_vat_rates-nonce'] ), 'add_eu_countries_vat_rates' ) : false;
 
 
 
43
  if ( ! $wpnonce || ! isset( $_POST['add_eu_countries_vat_rates'] ) ) {
44
  return;
45
  }
69
  /**
70
  * Create_eu_countries_vat_rates_tool.
71
  *
72
+ * @version 5.6.8
73
  * @since 2.3.10
74
  * @param string $header_html Get html data.
75
  */
76
  public function create_eu_countries_vat_rates_tool( $header_html ) {
77
+ $wpnonce = isset( $_REQUEST['wcj_tools_nonce'] ) ? wp_verify_nonce( sanitize_key( $_REQUEST['wcj_tools_nonce'] ), 'wcj_tools' ) : false;
78
+ if ( ! $wpnonce ) {
79
+ wp_safe_redirect( admin_url( 'admin.php?page=wcj-tools' ) );
80
+ exit;
81
+ }
82
 
83
  $the_tool_html = '';
84
  $the_tool_html .= '<div class="wcj-setting-jetpack-body wcj_tools_cnt_main">';
85
  $the_tool_html .= $header_html;
86
 
87
+ $data = array();
88
+ $the_name = isset( $_POST['wcj_tax_name'] ) ? sanitize_text_field( wp_unslash( $_POST['wcj_tax_name'] ) ) : __( 'VAT', 'woocommerce' );
 
 
 
 
89
  $data[] = array(
90
  __( 'Name', 'woocommerce-jetpack' ),
91
  '<input class="input-text" type="text" name="wcj_tax_name" value="' . $the_name . '">',
92
+ '',
93
  );
94
  $data[] = array(
95
  '',
96
+ '<input class="button-primary" type="submit" name="add_eu_countries_vat_rates" value="' . __( 'Add EU Countries VAT Rates', 'woocommerce-jetpack' ) . '">' . wp_nonce_field( 'add_eu_countries_vat_rates', 'add_eu_countries_vat_rates-nonce' ),
97
+ __( 'Note: will add duplicates.', 'woocommerce-jetpack' ),
98
  );
 
99
  $the_tool_html .= '<form method="post" action="">';
100
+ $the_tool_html .= wcj_get_table_html(
101
+ $data,
102
+ array(
103
+ 'table_class' => 'widefat striped',
104
+ 'table_heading_type' => 'vertical',
105
+ )
106
+ );
107
  $the_tool_html .= '</form>';
 
 
108
  $the_tool_html .= '<h4>' . __( 'List of EU VAT rates to be added', 'woocommerce-jetpack' ) . '</h4>';
109
  $eu_vat_rates = wcj_get_european_union_countries_with_vat();
110
  $data = array();
langs/woocommerce-jetpack.pot CHANGED
@@ -34,28 +34,28 @@ msgid "Product category (archive) view"
34
  msgstr ""
35
 
36
  #: includes/admin/class-wc-settings-jetpack.php:33
37
- #: includes/admin/class-wc-settings-jetpack.php:394
38
  #: includes/class-wcj-admin-bar.php:299
39
  #: includes/class-wcj-checkout-files-upload.php:273
40
- #: includes/class-wcj-eu-vat-number.php:179
41
- #: includes/class-wcj-max-products-per-user.php:217
42
  #: includes/class-wcj-orders.php:133 includes/class-wcj-orders.php:170
43
- #: includes/class-wcj-payment-gateways.php:102
44
- #: includes/class-wcj-track-users.php:174 includes/class-wcj-track-users.php:265
45
- #: includes/classes/class-wcj-module.php:678
46
- #: includes/classes/class-wcj-module.php:887
47
- #: includes/settings/wcj-settings-price-by-country.php:267
48
  msgid "Booster"
49
  msgstr ""
50
 
51
- #: includes/admin/class-wc-settings-jetpack.php:88
52
  #, php-format
53
  msgid ""
54
  "You're using Booster free version. To unlock more features please consider <a "
55
  "target=\"_blank\" href=\"%s\">Upgrade Booster to unlock this feature</a>."
56
  msgstr ""
57
 
58
- #: includes/admin/class-wc-settings-jetpack.php:113
59
  #, php-format
60
  msgid ""
61
  "Please rate <strong>Booster for WooCommerce</strong> %1$s on <a href=\"%2$s\" "
@@ -63,7 +63,7 @@ msgid ""
63
  "from Booster team!"
64
  msgstr ""
65
 
66
- #: includes/admin/class-wc-settings-jetpack.php:172
67
  #, php-format
68
  msgid ""
69
  "Please rate <strong>Booster for WooCommerce</strong> %1$s on <a href=\"%2$s"
@@ -71,39 +71,39 @@ msgid ""
71
  "from Booster team!"
72
  msgstr ""
73
 
74
- #: includes/admin/class-wc-settings-jetpack.php:247
75
- #: includes/admin/class-wc-settings-jetpack.php:313
76
- #: includes/admin/class-wc-settings-jetpack.php:931
77
  #: includes/admin/wcj-modules-cats.php:17 includes/class-wcj-admin-bar.php:234
78
  #: includes/class-wcj-my-account.php:39
79
  msgid "Dashboard"
80
  msgstr ""
81
 
82
- #: includes/admin/class-wc-settings-jetpack.php:248
83
  msgid "All Module"
84
  msgstr ""
85
 
86
- #: includes/admin/class-wc-settings-jetpack.php:249
87
  msgid "Active Modules"
88
  msgstr ""
89
 
90
- #: includes/admin/class-wc-settings-jetpack.php:250
91
  #: includes/class-wcj-admin-bar.php:167
92
  msgid "Manage Settings"
93
  msgstr ""
94
 
95
- #: includes/admin/class-wc-settings-jetpack.php:361
96
  #, php-format
97
  msgid ""
98
  "Please note that current <em>%1$s</em> module is deprecated and will be "
99
  "removed in future updates. Please use <em>%2$s</em> module instead."
100
  msgstr ""
101
 
102
- #: includes/admin/class-wc-settings-jetpack.php:367
103
  msgid "Module will be removed from the module's list as soon as you disable it."
104
  msgstr ""
105
 
106
- #: includes/admin/class-wc-settings-jetpack.php:379
107
  #, php-format
108
  msgid ""
109
  "Please note that <em>%s</em> module is currently under development. Until "
@@ -111,253 +111,253 @@ msgid ""
111
  "be moved to paid plugin version."
112
  msgstr ""
113
 
114
- #: includes/admin/class-wc-settings-jetpack.php:390
115
  #: includes/class-wcj-admin-bar.php:411
116
  #: includes/settings/wcj-settings-emails-verification.php:152
117
- #: includes/settings/wcj-settings-price-by-country.php:266
118
  msgid "WooCommerce"
119
  msgstr ""
120
 
121
- #: includes/admin/class-wc-settings-jetpack.php:392
122
- #: includes/admin/class-wc-settings-jetpack.php:623
123
  #: includes/class-wcj-admin-bar.php:184 includes/class-wcj-admin-bar.php:535
124
  #: includes/class-wcj-admin-bar.php:635 includes/core/class-wcj-admin.php:140
125
  msgid "Settings"
126
  msgstr ""
127
 
128
- #: includes/admin/class-wc-settings-jetpack.php:449
129
  msgid ""
130
  "This section lets you export, import or reset all Booster's modules settings."
131
  msgstr ""
132
 
133
- #: includes/admin/class-wc-settings-jetpack.php:477
134
- #: includes/admin/class-wc-settings-jetpack.php:1049
135
  #: includes/class-wcj-export-import.php:31
136
  msgid "Export"
137
  msgstr ""
138
 
139
- #: includes/admin/class-wc-settings-jetpack.php:478
140
  msgid "Export all Booster's options to a file."
141
  msgstr ""
142
 
143
- #: includes/admin/class-wc-settings-jetpack.php:481
144
- #: includes/admin/class-wc-settings-jetpack.php:1040
145
- #: includes/class-wcj-purchase-data.php:124
146
  msgid "Import"
147
  msgstr ""
148
 
149
- #: includes/admin/class-wc-settings-jetpack.php:483
150
  msgid "Import all Booster's options from a file."
151
  msgstr ""
152
 
153
- #: includes/admin/class-wc-settings-jetpack.php:487
154
  msgid ""
155
  "This will reset settings to defaults for all Booster modules. Are you sure?"
156
  msgstr ""
157
 
158
- #: includes/admin/class-wc-settings-jetpack.php:488
159
- #: includes/admin/class-wc-settings-jetpack.php:1060
160
  msgid "Reset"
161
  msgstr ""
162
 
163
- #: includes/admin/class-wc-settings-jetpack.php:489
164
  msgid "Reset all Booster's options."
165
  msgstr ""
166
 
167
- #: includes/admin/class-wc-settings-jetpack.php:493
168
  msgid "This will delete all Booster meta. Are you sure?"
169
  msgstr ""
170
 
171
- #: includes/admin/class-wc-settings-jetpack.php:494
172
- #: includes/admin/class-wc-settings-jetpack.php:1069
173
  msgid "Reset meta"
174
  msgstr ""
175
 
176
- #: includes/admin/class-wc-settings-jetpack.php:495
177
  msgid "Reset all Booster's meta."
178
  msgstr ""
179
 
180
- #: includes/admin/class-wc-settings-jetpack.php:548
181
  msgid "Version"
182
  msgstr ""
183
 
184
- #: includes/admin/class-wc-settings-jetpack.php:575
185
- #: includes/admin/class-wc-settings-jetpack.php:584
186
  msgid "Select All"
187
  msgstr ""
188
 
189
- #: includes/admin/class-wc-settings-jetpack.php:577
190
- #: includes/admin/class-wc-settings-jetpack.php:585
191
  msgid "Module"
192
  msgstr ""
193
 
194
- #: includes/admin/class-wc-settings-jetpack.php:579
195
- #: includes/admin/class-wc-settings-jetpack.php:588
196
  #: includes/export/class-wcj-export-fields-helper.php:297
197
- #: includes/gateways/class-wc-gateway-wcj-custom.php:67
198
  #: includes/settings/wcj-settings-checkout-custom-fields.php:181
199
  #: includes/settings/wcj-settings-eu-vat-number.php:37
200
  #: includes/settings/wcj-settings-product-by-user.php:16
201
  #: includes/shortcodes/class-wcj-products-add-form-shortcodes.php:190
202
- #: includes/shortcodes/class-wcj-products-add-form-shortcodes.php:372
203
  msgid "Description"
204
  msgstr ""
205
 
206
- #: includes/admin/class-wc-settings-jetpack.php:625
207
- #: includes/admin/class-wc-settings-jetpack.php:1078
208
  #: includes/class-wcj-admin-bar.php:188
209
- #: includes/classes/class-wcj-module.php:1040
210
  msgid "Documentation"
211
  msgstr ""
212
 
213
- #: includes/admin/class-wc-settings-jetpack.php:636
214
  msgid "No active modules found."
215
  msgstr ""
216
 
217
- #: includes/admin/class-wc-settings-jetpack.php:642
218
  msgid "Total Modules:"
219
  msgstr ""
220
 
221
- #: includes/admin/class-wc-settings-jetpack.php:706
222
  msgid "Autoload Booster's Options"
223
  msgstr ""
224
 
225
- #: includes/admin/class-wc-settings-jetpack.php:708
226
  msgid ""
227
  "Choose if you want Booster's options to be autoloaded when calling "
228
  "add_option. After saving this option, you need to Reset all Booster's "
229
  "settings. Leave default value (i.e. Enabled) if not sure."
230
  msgstr ""
231
 
232
- #: includes/admin/class-wc-settings-jetpack.php:713
233
  msgid "Load Modules on Init Hook"
234
  msgstr ""
235
 
236
- #: includes/admin/class-wc-settings-jetpack.php:715
237
  msgid "Choose if you want to load Booster Modules on Init hook."
238
  msgstr ""
239
 
240
- #: includes/admin/class-wc-settings-jetpack.php:715
241
  msgid ""
242
  "It will load the locale appropriately if users change it from the profile "
243
  "page."
244
  msgstr ""
245
 
246
- #: includes/admin/class-wc-settings-jetpack.php:720
247
  msgid "Use List Instead of Comma Separated Text for Products in Settings"
248
  msgstr ""
249
 
250
- #: includes/admin/class-wc-settings-jetpack.php:724
251
- #: includes/admin/class-wc-settings-jetpack.php:745
252
- #: includes/admin/class-wc-settings-jetpack.php:761
253
  #, php-format
254
  msgid "Supported modules: %s."
255
  msgstr ""
256
 
257
- #: includes/admin/class-wc-settings-jetpack.php:728
258
  #: includes/class-wcj-payment-gateways-per-category.php:31
259
  msgid "Gateways per Product or Category"
260
  msgstr ""
261
 
262
- #: includes/admin/class-wc-settings-jetpack.php:729
263
  #: includes/class-wcj-global-discount.php:38
264
  #: includes/settings/wcj-settings-product-addons.php:275
265
  msgid "Global Discount"
266
  msgstr ""
267
 
268
- #: includes/admin/class-wc-settings-jetpack.php:730
269
- #: includes/admin/class-wc-settings-jetpack.php:749
270
- #: includes/admin/class-wc-settings-jetpack.php:765
271
  #: includes/class-wcj-product-custom-info.php:29
272
- #: includes/functions/wcj-functions-general.php:488
273
  msgid "Product Info"
274
  msgstr ""
275
 
276
- #: includes/admin/class-wc-settings-jetpack.php:731
277
  #: includes/admin/wcj-welcome-screen-content.php:82
278
  #: includes/class-wcj-product-input-fields.php:29
279
  #: includes/input-fields/class-wcj-product-input-fields-core.php:214
280
  msgid "Product Input Fields"
281
  msgstr ""
282
 
283
- #: includes/admin/class-wc-settings-jetpack.php:732
284
  msgid "Products XML"
285
  msgstr ""
286
 
287
- #: includes/admin/class-wc-settings-jetpack.php:733
288
- #: includes/class-wcj-related-products.php:52
289
  #: includes/settings/meta-box/wcj-settings-meta-box-related-products.php:33
290
  #: includes/settings/wcj-settings-free-price.php:23
291
  msgid "Related Products"
292
  msgstr ""
293
 
294
- #: includes/admin/class-wc-settings-jetpack.php:741
295
  msgid ""
296
  "Use List Instead of Comma Separated Text for Products Categories in Settings"
297
  msgstr ""
298
 
299
- #: includes/admin/class-wc-settings-jetpack.php:757
300
  msgid "Use List Instead of Comma Separated Text for Products Tags in Settings"
301
  msgstr ""
302
 
303
- #: includes/admin/class-wc-settings-jetpack.php:796
304
  #: includes/core/class-wcj-admin.php:124
305
  msgid "Booster for WooCommerce"
306
  msgstr ""
307
 
308
- #: includes/admin/class-wc-settings-jetpack.php:890
309
  msgid "Need Help?"
310
  msgstr ""
311
 
312
- #: includes/admin/class-wc-settings-jetpack.php:917
313
  #: includes/class-wcj-my-account.php:32
314
  msgid "My Account"
315
  msgstr ""
316
 
317
- #: includes/admin/class-wc-settings-jetpack.php:921
318
  msgid "Get Booster Plus"
319
  msgstr ""
320
 
321
- #: includes/admin/class-wc-settings-jetpack.php:928
322
  msgid "Getting Started"
323
  msgstr ""
324
 
325
- #: includes/admin/class-wc-settings-jetpack.php:932
326
  msgid "Navigating Categories"
327
  msgstr ""
328
 
329
- #: includes/admin/class-wc-settings-jetpack.php:933
330
  msgid "How to get started with booster"
331
  msgstr ""
332
 
333
- #: includes/admin/class-wc-settings-jetpack.php:938
334
  msgid "Frequently Asked Questions"
335
  msgstr ""
336
 
337
- #: includes/admin/class-wc-settings-jetpack.php:943
338
  msgid "Do I need to have coding skills to use Booster Plus?"
339
  msgstr ""
340
 
341
- #: includes/admin/class-wc-settings-jetpack.php:947
342
  msgid ""
343
  "Absolutely not. You can configure pretty much everything Booster Plus has to "
344
  "offer without any coding knowledge."
345
  msgstr ""
346
 
347
- #: includes/admin/class-wc-settings-jetpack.php:952
348
  msgid "Will Booster Plus slow down my website?"
349
  msgstr ""
350
 
351
- #: includes/admin/class-wc-settings-jetpack.php:956
352
  msgid ""
353
  "Absolutely not. Booster Plus is carefully built with performance in mind."
354
  msgstr ""
355
 
356
- #: includes/admin/class-wc-settings-jetpack.php:961
357
  msgid "Do you offer refunds?"
358
  msgstr ""
359
 
360
- #: includes/admin/class-wc-settings-jetpack.php:965
361
  #, php-format
362
  msgid ""
363
  "If you are not completely satisfied with Booster Plus within the fist 30 "
@@ -365,38 +365,38 @@ msgid ""
365
  "no questions asked."
366
  msgstr ""
367
 
368
- #: includes/admin/class-wc-settings-jetpack.php:970
369
  msgid "Can I use Booster Plus on client sites?"
370
  msgstr ""
371
 
372
- #: includes/admin/class-wc-settings-jetpack.php:974
373
  msgid ""
374
  "Yes, you can use Booster Plus on client sites. You can purchase the multiple "
375
  "sites license of Booster Plus."
376
  msgstr ""
377
 
378
- #: includes/admin/class-wc-settings-jetpack.php:979
379
  msgid "Do you have an affiliate program?"
380
  msgstr ""
381
 
382
- #: includes/admin/class-wc-settings-jetpack.php:983
383
  msgid "Yes, We do have an affiliate program. "
384
  msgstr ""
385
 
386
- #: includes/admin/class-wc-settings-jetpack.php:983
387
  msgid "Click here"
388
  msgstr ""
389
 
390
- #: includes/admin/class-wc-settings-jetpack.php:983
391
  msgid " for the details."
392
  msgstr ""
393
 
394
- #: includes/admin/class-wc-settings-jetpack.php:988
395
  msgid ""
396
  "Why should I choose the Booster Plus suite over other individual plugins?"
397
  msgstr ""
398
 
399
- #: includes/admin/class-wc-settings-jetpack.php:992
400
  msgid ""
401
  "Oh, that's an easy one! Implementing just a few modules from the Booster Plus "
402
  "suite is more cost-effective than using dozens of individual plugins often "
@@ -408,171 +408,171 @@ msgid ""
408
  "your WooCommerce site easily."
409
  msgstr ""
410
 
411
- #: includes/admin/class-wc-settings-jetpack.php:997
412
  msgid "What features does Booster Plus have?"
413
  msgstr ""
414
 
415
- #: includes/admin/class-wc-settings-jetpack.php:1001
416
  msgid "You can see all the features at "
417
  msgstr ""
418
 
419
- #: includes/admin/class-wc-settings-jetpack.php:1001
420
  msgid "About Booster"
421
  msgstr ""
422
 
423
- #: includes/admin/class-wc-settings-jetpack.php:1001
424
  msgid " page."
425
  msgstr ""
426
 
427
- #: includes/admin/class-wc-settings-jetpack.php:1005
428
  msgid "Still have a question?"
429
  msgstr ""
430
 
431
- #: includes/admin/class-wc-settings-jetpack.php:1006
432
  msgid "CONTACT BOOSTER SUPPORT"
433
  msgstr ""
434
 
435
- #: includes/admin/class-wc-settings-jetpack.php:1012
436
  msgid "Connect with Booster"
437
  msgstr ""
438
 
439
- #: includes/admin/class-wc-settings-jetpack.php:1016
440
  msgid "BOOSTER WEBSITE"
441
  msgstr ""
442
 
443
- #: includes/admin/class-wc-settings-jetpack.php:1030
444
- #: includes/class-wcj-general.php:250 includes/class-wcj-product-by-user.php:278
445
  #: includes/settings/wcj-settings-pdf-invoicing-advanced.php:166
446
  #: includes/tools/class-wcj-order-statuses-tool.php:191
447
  #: includes/tools/class-wcj-order-statuses-tool.php:285
448
  msgid "Actions"
449
  msgstr ""
450
 
451
- #: includes/admin/class-wc-settings-jetpack.php:1041
452
  msgid "Import Booster options"
453
  msgstr ""
454
 
455
- #: includes/admin/class-wc-settings-jetpack.php:1050
456
  msgid "Export Booster options"
457
  msgstr ""
458
 
459
- #: includes/admin/class-wc-settings-jetpack.php:1061
460
  msgid "Reset all Booster's options"
461
  msgstr ""
462
 
463
- #: includes/admin/class-wc-settings-jetpack.php:1070
464
  msgid "Reset all Booster's meta"
465
  msgstr ""
466
 
467
- #: includes/admin/class-wc-settings-jetpack.php:1085
468
  msgid "Here you can find all documentation of Booster"
469
  msgstr ""
470
 
471
- #: includes/admin/class-wc-settings-jetpack.php:1087
472
  msgid "See Documentation"
473
  msgstr ""
474
 
475
- #: includes/admin/class-wc-settings-jetpack.php:1094
476
  msgid "Latest updates"
477
  msgstr ""
478
 
479
- #: includes/admin/class-wc-settings-jetpack.php:1097
480
  msgid "Version "
481
  msgstr ""
482
 
483
- #: includes/admin/class-wc-settings-jetpack.php:1102
484
  msgid "SEE MORE"
485
  msgstr ""
486
 
487
- #: includes/admin/class-wc-settings-jetpack.php:1113
488
  #: includes/core/class-wcj-admin.php:98
489
  msgid "Please rate "
490
  msgstr ""
491
 
492
- #: includes/admin/class-wc-settings-jetpack.php:1113
493
  #: includes/core/class-wcj-admin.php:98
494
  msgid "Booster for Woocommerce"
495
  msgstr ""
496
 
497
- #: includes/admin/class-wc-settings-jetpack.php:1121
498
  #: includes/core/class-wcj-admin.php:106
499
  msgid "WordPress.org"
500
  msgstr ""
501
 
502
- #: includes/admin/class-wc-settings-jetpack.php:1121
503
  #: includes/core/class-wcj-admin.php:106
504
  msgid " to help us spread the word. Thank you from Booster team!"
505
  msgstr ""
506
 
507
- #: includes/admin/class-wc-settings-jetpack.php:1125
508
  msgid "Upgrade today to unlock these popular premium features:"
509
  msgstr ""
510
 
511
- #: includes/admin/class-wc-settings-jetpack.php:1127
512
  msgid "+ PDF Invoices and Packing slips –"
513
  msgstr ""
514
 
515
- #: includes/admin/class-wc-settings-jetpack.php:1127
516
  msgid ""
517
  "Add ability to create Proforma Invoices, Credit Notes and Packaging slips"
518
  msgstr ""
519
 
520
- #: includes/admin/class-wc-settings-jetpack.php:1128
521
  msgid "+ Empty Cart –"
522
  msgstr ""
523
 
524
- #: includes/admin/class-wc-settings-jetpack.php:1128
525
  msgid ""
526
  "customize empty cart button text, different button positions on cart page"
527
  msgstr ""
528
 
529
- #: includes/admin/class-wc-settings-jetpack.php:1129
530
  msgid "+ Cart and checkout –"
531
  msgstr ""
532
 
533
- #: includes/admin/class-wc-settings-jetpack.php:1129
534
  msgid "add multiple – custom fields, custom info blocks, check out file uploads"
535
  msgstr ""
536
 
537
- #: includes/admin/class-wc-settings-jetpack.php:1130
538
  msgid "+ Mini cart –"
539
  msgstr ""
540
 
541
- #: includes/admin/class-wc-settings-jetpack.php:1130
542
  msgid "More custom information options"
543
  msgstr ""
544
 
545
- #: includes/admin/class-wc-settings-jetpack.php:1131
546
  msgid "+ Prices and currencies –"
547
  msgstr ""
548
 
549
- #: includes/admin/class-wc-settings-jetpack.php:1131
550
  msgid "add more unlimited number of currencies to WooCommerce"
551
  msgstr ""
552
 
553
- #: includes/admin/class-wc-settings-jetpack.php:1132
554
  msgid "+ Export options –"
555
  msgstr ""
556
 
557
- #: includes/admin/class-wc-settings-jetpack.php:1132
558
  msgid "more fields enabled"
559
  msgstr ""
560
 
561
- #: includes/admin/class-wc-settings-jetpack.php:1133
562
  msgid "+ Add to cart –"
563
  msgstr ""
564
 
565
- #: includes/admin/class-wc-settings-jetpack.php:1133
566
  msgid ""
567
  "customize add to cart messages, Button labels - multiple category groups "
568
  "allowed+ +"
569
  msgstr ""
570
 
571
- #: includes/admin/class-wc-settings-jetpack.php:1134
572
  msgid "+ More configuration options for payments and shipping"
573
  msgstr ""
574
 
575
- #: includes/admin/class-wc-settings-jetpack.php:1137
576
  msgid "Upgrade to Booster Plus"
577
  msgstr ""
578
 
@@ -585,51 +585,51 @@ msgstr ""
585
  msgid "Doesn't apply rounding, offset etc."
586
  msgstr ""
587
 
588
- #: includes/admin/class-wcj-settings-custom-fields.php:351
589
  msgid "Save changes"
590
  msgstr ""
591
 
592
- #: includes/admin/class-wcj-settings-manager.php:68
593
  msgid "Please upload a file to import!"
594
  msgstr ""
595
 
596
- #: includes/admin/class-wcj-settings-manager.php:81
597
- #: includes/admin/class-wcj-settings-manager.php:86
598
  msgid "Wrong file format!"
599
  msgstr ""
600
 
601
- #: includes/admin/class-wcj-settings-manager.php:96
602
  #, php-format
603
  msgid "%d options successfully imported."
604
  msgstr ""
605
 
606
- #: includes/admin/class-wcj-settings-manager.php:152
607
  #, php-format
608
  msgid "%d meta successfully deleted."
609
  msgstr ""
610
 
611
- #: includes/admin/class-wcj-settings-manager.php:171
612
  #, php-format
613
  msgid "%d options successfully deleted."
614
  msgstr ""
615
 
616
- #: includes/admin/class-wcj-tools.php:59
617
  msgid "Booster for WooCommerce Tools"
618
  msgstr ""
619
 
620
- #: includes/admin/class-wcj-tools.php:60
621
  msgid "Booster Tools"
622
  msgstr ""
623
 
624
- #: includes/admin/class-wcj-tools.php:81
625
  msgid "Tools Dashboard"
626
  msgstr ""
627
 
628
- #: includes/admin/class-wcj-tools.php:109
629
  msgid "Booster for WooCommerce Tools - Dashboard"
630
  msgstr ""
631
 
632
- #: includes/admin/class-wcj-tools.php:110
633
  msgid ""
634
  "This dashboard lets you check statuses and short descriptions of all "
635
  "available Booster for WooCommerce tools. Tools can be enabled through "
@@ -637,8 +637,8 @@ msgid ""
637
  "above."
638
  msgstr ""
639
 
640
- #: includes/admin/class-wcj-welcome.php:56
641
- #: includes/admin/class-wcj-welcome.php:57
642
  msgid "Welcome to Booster"
643
  msgstr ""
644
 
@@ -670,7 +670,7 @@ msgstr ""
670
 
671
  #: includes/admin/wcj-modules-cats.php:61 includes/class-wcj-admin-bar.php:493
672
  #: includes/class-wcj-admin-bar.php:497 includes/class-wcj-admin-bar.php:543
673
- #: includes/class-wcj-product-bulk-meta-editor.php:294
674
  #: includes/class-wcj-product-by-user.php:176
675
  #: includes/class-wcj-product-by-user.php:213
676
  #: includes/class-wcj-shipping-by-products.php:40
@@ -993,7 +993,7 @@ msgstr ""
993
 
994
  #: includes/class-wcj-admin-bar.php:267 includes/class-wcj-admin-bar.php:311
995
  #: includes/class-wcj-admin-bar.php:659
996
- #: includes/classes/class-wcj-module.php:858
997
  #: includes/settings/wcj-settings-wpml.php:97
998
  msgid "Tools"
999
  msgstr ""
@@ -1058,7 +1058,7 @@ msgstr ""
1058
  #: includes/class-wcj-admin-bar.php:418 includes/class-wcj-admin-bar.php:422
1059
  #: includes/class-wcj-admin-bar.php:440 includes/class-wcj-my-account.php:40
1060
  #: includes/class-wcj-my-account.php:48 includes/class-wcj-orders.php:31
1061
- #: includes/reports/wcj-class-reports-sales-gateways.php:183
1062
  #: includes/settings/wcj-settings-reports.php:24
1063
  #: includes/settings/wcj-settings-reports.php:62
1064
  #: includes/settings/wcj-settings-reports.php:103
@@ -1111,7 +1111,7 @@ msgstr ""
1111
  msgid "Most Stocked"
1112
  msgstr ""
1113
 
1114
- #: includes/class-wcj-admin-bar.php:477 includes/class-wcj-eu-vat-number.php:243
1115
  msgid "Taxes"
1116
  msgstr ""
1117
 
@@ -1127,11 +1127,11 @@ msgstr ""
1127
  msgid "Add product"
1128
  msgstr ""
1129
 
1130
- #: includes/class-wcj-admin-bar.php:505 includes/class-wcj-sku.php:711
1131
  #: includes/export/class-wcj-export-fields-helper.php:322
1132
  #: includes/settings/wcj-settings-product-by-user.php:22
1133
  #: includes/shortcodes/class-wcj-products-add-form-shortcodes.php:196
1134
- #: includes/shortcodes/class-wcj-products-add-form-shortcodes.php:436
1135
  msgid "Categories"
1136
  msgstr ""
1137
 
@@ -1139,7 +1139,7 @@ msgstr ""
1139
  #: includes/export/class-wcj-export-fields-helper.php:323
1140
  #: includes/settings/wcj-settings-product-by-user.php:23
1141
  #: includes/shortcodes/class-wcj-products-add-form-shortcodes.php:197
1142
- #: includes/shortcodes/class-wcj-products-add-form-shortcodes.php:446
1143
  msgid "Tags"
1144
  msgstr ""
1145
 
@@ -1284,21 +1284,21 @@ msgstr ""
1284
  msgid "Not Completed"
1285
  msgstr ""
1286
 
1287
- #: includes/class-wcj-admin-orders-list.php:269
1288
  msgid "Trash"
1289
  msgstr ""
1290
 
1291
- #: includes/class-wcj-admin-orders-list.php:367
1292
- #: includes/class-wcj-product-by-country.php:192
1293
- #: includes/class-wcj-product-by-country.php:228
1294
  msgid "All countries"
1295
  msgstr ""
1296
 
1297
- #: includes/class-wcj-admin-orders-list.php:376
1298
  msgid "All currencies"
1299
  msgstr ""
1300
 
1301
- #: includes/class-wcj-admin-orders-list.php:418
1302
  #: includes/export/class-wcj-export-fields-helper.php:52
1303
  #: includes/export/class-wcj-export-fields-helper.php:136
1304
  #: includes/export/class-wcj-export-fields-helper.php:219
@@ -1306,7 +1306,7 @@ msgstr ""
1306
  msgid "Billing Country"
1307
  msgstr ""
1308
 
1309
- #: includes/class-wcj-admin-orders-list.php:421
1310
  #: includes/settings/wcj-settings-admin-orders-list.php:37
1311
  msgid "Currency Code"
1312
  msgstr ""
@@ -1357,38 +1357,38 @@ msgstr ""
1357
  msgid "Order Meta"
1358
  msgstr ""
1359
 
1360
- #: includes/class-wcj-admin-tools.php:245
1361
  msgid "Order Items Meta"
1362
  msgstr ""
1363
 
1364
- #: includes/class-wcj-admin-tools.php:247
1365
  msgid "Item Key"
1366
  msgstr ""
1367
 
1368
- #: includes/class-wcj-admin-tools.php:247
1369
  msgid "Item Meta Key"
1370
  msgstr ""
1371
 
1372
- #: includes/class-wcj-admin-tools.php:247
1373
  msgid "Item Meta Value"
1374
  msgstr ""
1375
 
1376
- #: includes/class-wcj-admin-tools.php:295 includes/class-wcj-admin-tools.php:340
1377
- #: includes/class-wcj-admin-tools.php:350
1378
- #: includes/class-wcj-product-bulk-meta-editor.php:383
1379
- #: includes/class-wcj-sku.php:710
1380
- #: includes/reports/class-wcj-reports-sales.php:212
1381
  #: includes/reports/class-wcj-reports-stock.php:289
1382
  msgid "Product"
1383
  msgstr ""
1384
 
1385
- #: includes/class-wcj-admin-tools.php:296 includes/class-wcj-admin-tools.php:341
1386
- #: includes/class-wcj-admin-tools.php:351
1387
  #: includes/reports/class-wcj-reports-stock.php:290
1388
  msgid "Category"
1389
  msgstr ""
1390
 
1391
- #: includes/class-wcj-admin-tools.php:369
1392
  msgid "Total Products:"
1393
  msgstr ""
1394
 
@@ -1682,8 +1682,8 @@ msgstr ""
1682
 
1683
  #: includes/class-wcj-coupon-by-user-role.php:94
1684
  #: includes/class-wcj-coupon-by-user-role.php:95
 
1685
  #: includes/class-wcj-coupon-by-user-role.php:117
1686
- #: includes/class-wcj-coupon-by-user-role.php:118
1687
  #: includes/settings/wcj-settings-coupon-by-user-role.php:71
1688
  msgid "Coupon is not valid for your user role."
1689
  msgstr ""
@@ -1932,34 +1932,34 @@ msgid ""
1932
  "currency rate with real conversion then enable it"
1933
  msgstr ""
1934
 
1935
- #: includes/class-wcj-currency-exchange-rates.php:220
1936
  #: includes/settings/wcj-settings-currency-exchange-rates.php:52
1937
  msgid "Exchange Rates Server"
1938
  msgstr ""
1939
 
1940
- #: includes/class-wcj-currency-exchange-rates.php:226
1941
  #, php-format
1942
  msgid "Use default: %s"
1943
  msgstr ""
1944
 
1945
- #: includes/class-wcj-currency-exchange-rates.php:253
1946
  msgid "Exchange Rates Offset (Percent)"
1947
  msgstr ""
1948
 
1949
- #: includes/class-wcj-currency-exchange-rates.php:259
1950
  #, php-format
1951
  msgid "Use default: %s%%"
1952
  msgstr ""
1953
 
1954
- #: includes/class-wcj-currency-exchange-rates.php:260
1955
  msgid "Custom offset"
1956
  msgstr ""
1957
 
1958
- #: includes/class-wcj-currency-exchange-rates.php:264
1959
  msgid "Custom offset (Percent)"
1960
  msgstr ""
1961
 
1962
- #: includes/class-wcj-currency-exchange-rates.php:265
1963
  msgid "Used when \"Custom offset\" option is selected above."
1964
  msgstr ""
1965
 
@@ -2270,7 +2270,7 @@ msgid ""
2270
  msgstr ""
2271
 
2272
  #: includes/class-wcj-eu-vat-number.php:30
2273
- #: includes/class-wcj-eu-vat-number.php:334
2274
  #: includes/settings/wcj-settings-eu-vat-number.php:25
2275
  #: includes/settings/wcj-settings-eu-vat-number.php:32
2276
  msgid "EU VAT Number"
@@ -2298,45 +2298,45 @@ msgstr ""
2298
  msgid "Add all EU countries VAT standard rates to WooCommerce."
2299
  msgstr ""
2300
 
2301
- #: includes/class-wcj-eu-vat-number.php:231
2302
  msgid "Customer IP"
2303
  msgstr ""
2304
 
2305
- #: includes/class-wcj-eu-vat-number.php:235 includes/class-wcj-orders.php:170
2306
  #: includes/settings/wcj-settings-orders.php:129
2307
  #: includes/settings/wcj-settings-payment-gateways-by-country.php:30
2308
  msgid "Country by IP"
2309
  msgstr ""
2310
 
2311
- #: includes/class-wcj-eu-vat-number.php:239
2312
  msgid "Customer EU VAT Number"
2313
  msgstr ""
2314
 
2315
- #: includes/class-wcj-eu-vat-number.php:448
2316
  #: includes/settings/wcj-settings-eu-vat-number.php:169
2317
  msgid "Validating VAT. Please wait..."
2318
  msgstr ""
2319
 
2320
- #: includes/class-wcj-eu-vat-number.php:449
2321
  #: includes/settings/wcj-settings-eu-vat-number.php:176
2322
  msgid "VAT is valid."
2323
  msgstr ""
2324
 
2325
- #: includes/class-wcj-eu-vat-number.php:450
2326
  #: includes/settings/wcj-settings-eu-vat-number.php:183
2327
  msgid "VAT is not valid."
2328
  msgstr ""
2329
 
2330
- #: includes/class-wcj-eu-vat-number.php:451
2331
  #: includes/settings/wcj-settings-eu-vat-number.php:191
2332
  msgid "Validation failed. Please try again."
2333
  msgstr ""
2334
 
2335
- #: includes/class-wcj-eu-vat-number.php:589
2336
  msgid "<strong>Billing EU VAT Number</strong>is a required field."
2337
  msgstr ""
2338
 
2339
- #: includes/class-wcj-eu-vat-number.php:608
2340
  #: includes/settings/wcj-settings-eu-vat-number.php:78
2341
  msgid "<strong>EU VAT Number</strong> is not valid."
2342
  msgstr ""
@@ -2398,32 +2398,32 @@ msgstr ""
2398
  msgid "Export Products."
2399
  msgstr ""
2400
 
2401
- #: includes/class-wcj-export-import.php:255
2402
- #: includes/class-wcj-export-import.php:261
2403
  msgid "Filter by Billing Country"
2404
  msgstr ""
2405
 
2406
- #: includes/class-wcj-export-import.php:256
2407
  msgid "Filter by Product Title"
2408
  msgstr ""
2409
 
2410
- #: includes/class-wcj-export-import.php:275
2411
- #: includes/reports/class-wcj-reports-product-sales-daily.php:217
2412
- #: includes/reports/wcj-class-reports-sales-gateways.php:166
2413
  #: includes/settings/wcj-settings-orders.php:48
2414
  msgid "Filter"
2415
  msgstr ""
2416
 
2417
- #: includes/class-wcj-export-import.php:307
2418
  #: includes/class-wcj-track-users.php:45
2419
  msgid "All time"
2420
  msgstr ""
2421
 
2422
- #: includes/class-wcj-export-import.php:326
2423
  msgid "Custom:"
2424
  msgstr ""
2425
 
2426
- #: includes/class-wcj-export-import.php:331
2427
  msgid "Go"
2428
  msgstr ""
2429
 
@@ -2476,8 +2476,8 @@ msgid "Booster User Role"
2476
  msgstr ""
2477
 
2478
  #: includes/class-wcj-general.php:250 includes/class-wcj-general.php:272
2479
- #: includes/class-wcj-sku.php:709
2480
- #: includes/reports/class-wcj-reports-sales.php:211
2481
  #: includes/settings/wcj-settings-cross-sells.php:46
2482
  #: includes/settings/wcj-settings-order-numbers.php:172
2483
  #: includes/settings/wcj-settings-product-by-user.php:175
@@ -2488,10 +2488,10 @@ msgid "ID"
2488
  msgstr ""
2489
 
2490
  #: includes/class-wcj-general.php:250 includes/class-wcj-general.php:273
2491
- #: includes/class-wcj-offer-price.php:179
2492
  #: includes/export/class-wcj-export-fields-helper.php:287
2493
- #: includes/tools/class-wcj-eu-countries-vat-rates-tool.php:92
2494
- #: includes/tools/class-wcj-eu-countries-vat-rates-tool.php:132
2495
  msgid "Name"
2496
  msgstr ""
2497
 
@@ -2500,12 +2500,12 @@ msgid "Capabilities"
2500
  msgstr ""
2501
 
2502
  #: includes/class-wcj-general.php:264
2503
- #: includes/class-wcj-payment-gateways.php:134
2504
- #: includes/class-wcj-product-bulk-meta-editor.php:411
2505
- #: includes/class-wcj-product-by-user.php:287
2506
  #: includes/pdf-invoices/submodules/class-wcj-pdf-invoicing-display.php:163
2507
  #: includes/pdf-invoices/submodules/class-wcj-pdf-invoicing-display.php:387
2508
- #: includes/shortcodes/class-wcj-products-add-form-shortcodes.php:394
2509
  #: includes/tools/class-wcj-order-statuses-tool.php:213
2510
  msgid "Delete"
2511
  msgstr ""
@@ -2562,39 +2562,39 @@ msgid ""
2562
  msgstr ""
2563
 
2564
  #: includes/class-wcj-max-products-per-user.php:139
2565
- #: includes/class-wcj-max-products-per-user.php:385
2566
  #: includes/settings/wcj-settings-max-products-per-user.php:77
2567
  msgid ""
2568
  "You can only buy maximum %max_qty% pcs. of %product_title% (you already "
2569
  "bought %qty_already_bought% pcs.)."
2570
  msgstr ""
2571
 
2572
- #: includes/class-wcj-max-products-per-user.php:158
2573
  msgid "Data re-calculated."
2574
  msgstr ""
2575
 
2576
- #: includes/class-wcj-max-products-per-user.php:160
2577
  #, php-format
2578
  msgid "%s order(s) processed."
2579
  msgstr ""
2580
 
2581
- #: includes/class-wcj-max-products-per-user.php:217
2582
  msgid "Maximum Products per User: Sales Data"
2583
  msgstr ""
2584
 
2585
- #: includes/class-wcj-max-products-per-user.php:235
2586
  msgid "User ID"
2587
  msgstr ""
2588
 
2589
- #: includes/class-wcj-max-products-per-user.php:235
2590
  msgid "User Name"
2591
  msgstr ""
2592
 
2593
- #: includes/class-wcj-max-products-per-user.php:235
2594
  msgid "Qty Bought"
2595
  msgstr ""
2596
 
2597
- #: includes/class-wcj-max-products-per-user.php:238
2598
  #: includes/functions/wcj-functions-users.php:179
2599
  #: includes/functions/wcj-functions-users.php:215
2600
  msgid "Guest"
@@ -2723,12 +2723,12 @@ msgstr ""
2723
  msgid "Lost password"
2724
  msgstr ""
2725
 
2726
- #: includes/class-wcj-my-account.php:331
2727
  #, php-format
2728
  msgid "Hello %1$s (not %1$s? <a href=\"%2$s\">Log out</a>)"
2729
  msgstr ""
2730
 
2731
- #: includes/class-wcj-my-account.php:342
2732
  #, php-format
2733
  msgid ""
2734
  "From your account dashboard you can view your <a href=\"%1$s\">recent orders</"
@@ -2736,7 +2736,7 @@ msgid ""
2736
  "href=\"%3$s\">edit your password and account details</a>."
2737
  msgstr ""
2738
 
2739
- #: includes/class-wcj-my-account.php:452
2740
  msgid "User role"
2741
  msgstr ""
2742
 
@@ -2754,11 +2754,11 @@ msgstr ""
2754
  msgid "Let your customers suggest their price for products."
2755
  msgstr ""
2756
 
2757
- #: includes/class-wcj-offer-price.php:160
2758
  msgid "Booster: Offer Price History"
2759
  msgstr ""
2760
 
2761
- #: includes/class-wcj-offer-price.php:176
2762
  #: includes/settings/wcj-settings-cross-sells.php:47
2763
  #: includes/settings/wcj-settings-order-numbers.php:173
2764
  #: includes/settings/wcj-settings-products-xml.php:244
@@ -2767,7 +2767,7 @@ msgstr ""
2767
  msgid "Date"
2768
  msgstr ""
2769
 
2770
- #: includes/class-wcj-offer-price.php:177
2771
  #: includes/export/class-wcj-export-fields-helper.php:293
2772
  #: includes/reports/class-wcj-reports-stock.php:291
2773
  #: includes/settings/meta-box/wcj-settings-meta-box-wholesale-price.php:71
@@ -2778,7 +2778,7 @@ msgstr ""
2778
  msgid "Price"
2779
  msgstr ""
2780
 
2781
- #: includes/class-wcj-offer-price.php:178
2782
  #: includes/settings/wcj-settings-coupon-by-user-role.php:63
2783
  #: includes/settings/wcj-settings-currency-per-product.php:38
2784
  #: includes/settings/wcj-settings-currency-per-product.php:45
@@ -2788,7 +2788,7 @@ msgstr ""
2788
  msgid "Message"
2789
  msgstr ""
2790
 
2791
- #: includes/class-wcj-offer-price.php:180
2792
  #: includes/export/class-wcj-export-fields-helper.php:83
2793
  #: includes/input-fields/wcj-product-input-fields-options.php:47
2794
  #: includes/reports/class-wcj-reports-customers.php:101
@@ -2796,108 +2796,108 @@ msgstr ""
2796
  msgid "Email"
2797
  msgstr ""
2798
 
2799
- #: includes/class-wcj-offer-price.php:181
2800
  #: includes/export/class-wcj-export-fields-helper.php:82
2801
  msgid "Customer ID"
2802
  msgstr ""
2803
 
2804
- #: includes/class-wcj-offer-price.php:182
2805
  msgid "User IP"
2806
  msgstr ""
2807
 
2808
- #: includes/class-wcj-offer-price.php:183
2809
  msgid "User Agent"
2810
  msgstr ""
2811
 
2812
- #: includes/class-wcj-offer-price.php:184
2813
  msgid "Sent to"
2814
  msgstr ""
2815
 
2816
- #: includes/class-wcj-offer-price.php:197
2817
  msgid "No price offers yet."
2818
  msgstr ""
2819
 
2820
- #: includes/class-wcj-offer-price.php:260
2821
  #, php-format
2822
  msgid "Average offer: %1$s (from %2$s offer(s))"
2823
  msgstr ""
2824
 
2825
- #: includes/class-wcj-offer-price.php:268
2826
  msgid "Update product after checking the box."
2827
  msgstr ""
2828
 
2829
- #: includes/class-wcj-offer-price.php:349
2830
  #: includes/settings/wcj-settings-offer-price.php:169
2831
  #, php-format
2832
  msgid "Your price (%s)"
2833
  msgstr ""
2834
 
2835
- #: includes/class-wcj-offer-price.php:356
2836
  #: includes/settings/wcj-settings-offer-price.php:241
2837
  #, php-format
2838
  msgid "Suggest your price for %s"
2839
  msgstr ""
2840
 
2841
- #: includes/class-wcj-offer-price.php:414
2842
  #: includes/settings/wcj-settings-offer-price.php:208
2843
  msgid "Your email"
2844
  msgstr ""
2845
 
2846
- #: includes/class-wcj-offer-price.php:418
2847
  #: includes/settings/wcj-settings-offer-price.php:216
2848
  msgid "Your name"
2849
  msgstr ""
2850
 
2851
- #: includes/class-wcj-offer-price.php:422
2852
  #: includes/settings/wcj-settings-offer-price.php:224
2853
  msgid "Your message"
2854
  msgstr ""
2855
 
2856
- #: includes/class-wcj-offer-price.php:426
2857
  #: includes/settings/wcj-settings-offer-price.php:248
2858
  msgid "Send"
2859
  msgstr ""
2860
 
2861
- #: includes/class-wcj-offer-price.php:428
2862
  #: includes/settings/wcj-settings-offer-price.php:232
2863
  msgid "Send a copy to your email"
2864
  msgstr ""
2865
 
2866
- #: includes/class-wcj-offer-price.php:497
2867
  #: includes/settings/wcj-settings-offer-price.php:72
2868
  msgid "Make an offer"
2869
  msgstr ""
2870
 
2871
- #: includes/class-wcj-offer-price.php:561
2872
  #: includes/settings/wcj-settings-offer-price.php:352
2873
  #, php-format
2874
  msgid "Product: %s"
2875
  msgstr ""
2876
 
2877
- #: includes/class-wcj-offer-price.php:563
2878
  #: includes/settings/wcj-settings-offer-price.php:354
2879
  #, php-format
2880
  msgid "Offered price: %s"
2881
  msgstr ""
2882
 
2883
- #: includes/class-wcj-offer-price.php:565
2884
  #: includes/settings/wcj-settings-offer-price.php:356
2885
  #, php-format
2886
  msgid "From: %1$s %2$s"
2887
  msgstr ""
2888
 
2889
- #: includes/class-wcj-offer-price.php:567
2890
  #: includes/settings/wcj-settings-offer-price.php:358
2891
  #, php-format
2892
  msgid "Message: %s"
2893
  msgstr ""
2894
 
2895
- #: includes/class-wcj-offer-price.php:581
2896
  #: includes/settings/wcj-settings-offer-price.php:342
2897
  msgid "Price Offer"
2898
  msgstr ""
2899
 
2900
- #: includes/class-wcj-offer-price.php:591
2901
  #: includes/settings/wcj-settings-offer-price.php:269
2902
  msgid "Your price offer has been sent."
2903
  msgstr ""
@@ -3058,23 +3058,23 @@ msgstr ""
3058
  msgid "Tool renumerates all orders."
3059
  msgstr ""
3060
 
3061
- #: includes/class-wcj-order-numbers.php:354
3062
  msgid "Orders successfully renumerated!"
3063
  msgstr ""
3064
 
3065
- #: includes/class-wcj-order-numbers.php:359
3066
  #, php-format
3067
  msgid "Sequential number generation is enabled. Next order number will be %s."
3068
  msgstr ""
3069
 
3070
- #: includes/class-wcj-order-numbers.php:372
3071
  #, php-format
3072
  msgid ""
3073
  "Press the button below to renumerate all existing orders starting from order "
3074
  "counter settings in <a href=\"%s\">Order Numbers</a> module."
3075
  msgstr ""
3076
 
3077
- #: includes/class-wcj-order-numbers.php:380
3078
  msgid "Renumerate orders"
3079
  msgstr ""
3080
 
@@ -3165,6 +3165,31 @@ msgid_plural "Download permissions regenerated for %s orders."
3165
  msgstr[0] ""
3166
  msgstr[1] ""
3167
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3168
  #: includes/class-wcj-payment-gateways-by-country.php:29
3169
  msgid "Gateways by Country, State or Postcode"
3170
  msgstr ""
@@ -3281,12 +3306,12 @@ msgstr ""
3281
  msgid "Add multiple custom payment gateways to WooCommerce."
3282
  msgstr ""
3283
 
3284
- #: includes/class-wcj-payment-gateways.php:77
3285
  #, php-format
3286
  msgid "<strong>%s</strong> is a required field."
3287
  msgstr ""
3288
 
3289
- #: includes/class-wcj-payment-gateways.php:102
3290
  #, php-format
3291
  msgid "%s Fields"
3292
  msgstr ""
@@ -3448,10 +3473,10 @@ msgid "After the price"
3448
  msgstr ""
3449
 
3450
  #: includes/class-wcj-price-labels.php:46
3451
- #: includes/class-wcj-product-by-country.php:201
3452
  #: includes/class-wcj-product-by-user-role.php:62
3453
  #: includes/class-wcj-product-info.php:255
3454
- #: includes/class-wcj-product-price-by-formula.php:169
3455
  #: includes/class-wcj-shipping-by-products.php:214
3456
  #: includes/class-wcj-shipping-options.php:191
3457
  #: includes/classes/class-wcj-module.php:221
@@ -3600,18 +3625,18 @@ msgstr ""
3600
  #: includes/settings/wcj-settings-pdf-invoicing-numbering.php:28
3601
  #: includes/settings/wcj-settings-pdf-invoicing-page.php:107
3602
  #: includes/settings/wcj-settings-pdf-invoicing-styling.php:81
3603
- #: includes/settings/wcj-settings-price-by-country.php:73
3604
  #: includes/settings/wcj-settings-price-by-country.php:81
3605
- #: includes/settings/wcj-settings-price-by-country.php:101
3606
- #: includes/settings/wcj-settings-price-by-country.php:117
3607
- #: includes/settings/wcj-settings-price-by-country.php:144
3608
- #: includes/settings/wcj-settings-price-by-country.php:191
3609
- #: includes/settings/wcj-settings-price-by-country.php:209
3610
- #: includes/settings/wcj-settings-price-by-country.php:218
3611
- #: includes/settings/wcj-settings-price-by-country.php:227
3612
- #: includes/settings/wcj-settings-price-by-country.php:237
3613
- #: includes/settings/wcj-settings-price-by-country.php:284
3614
  #: includes/settings/wcj-settings-price-by-country.php:292
 
3615
  #: includes/settings/wcj-settings-price-by-user-role.php:23
3616
  #: includes/settings/wcj-settings-price-by-user-role.php:50
3617
  #: includes/settings/wcj-settings-price-by-user-role.php:97
@@ -3841,11 +3866,15 @@ msgid ""
3841
  "addon in pdf."
3842
  msgstr ""
3843
 
3844
- #: includes/class-wcj-product-addons.php:299
3845
  msgid "Some of the required addons are not selected!"
3846
  msgstr ""
3847
 
3848
- #: includes/class-wcj-product-addons.php:314
 
 
 
 
3849
  msgid ""
3850
  "Booster: Free plugin's version is limited to only three products with per "
3851
  "product addons enabled at a time. You will need to get <a href=\"https://"
@@ -3867,14 +3896,19 @@ msgid ""
3867
  "product's edit page."
3868
  msgstr ""
3869
 
 
 
 
 
 
3870
  #: includes/class-wcj-product-bookings.php:159
3871
- #: includes/class-wcj-product-bookings.php:289
3872
  #: includes/settings/wcj-settings-product-bookings.php:80
3873
  msgid "\"Date to\" must be after \"Date from\""
3874
  msgstr ""
3875
 
3876
  #: includes/class-wcj-product-bookings.php:173
3877
- #: includes/class-wcj-product-open-pricing.php:293
3878
  #: includes/settings/wcj-settings-add-to-cart.php:153
3879
  #: includes/settings/wcj-settings-add-to-cart.php:185
3880
  #: includes/settings/wcj-settings-add-to-cart.php:220
@@ -3886,32 +3920,32 @@ msgstr ""
3886
  msgid "Period"
3887
  msgstr ""
3888
 
3889
- #: includes/class-wcj-product-bookings.php:279
3890
  #: includes/settings/wcj-settings-product-bookings.php:66
3891
  msgid "\"Date from\" must be set"
3892
  msgstr ""
3893
 
3894
- #: includes/class-wcj-product-bookings.php:283
3895
  #: includes/settings/wcj-settings-product-bookings.php:73
3896
  msgid "\"Date to\" must be set"
3897
  msgstr ""
3898
 
3899
- #: includes/class-wcj-product-bookings.php:426
3900
  #: includes/settings/wcj-settings-product-bookings.php:38
3901
  msgid "Date from"
3902
  msgstr ""
3903
 
3904
- #: includes/class-wcj-product-bookings.php:430
3905
  #: includes/settings/wcj-settings-product-bookings.php:45
3906
  msgid "Date to"
3907
  msgstr ""
3908
 
3909
- #: includes/class-wcj-product-bookings.php:455
3910
  #: includes/settings/wcj-settings-product-bookings.php:59
3911
  msgid "/ day"
3912
  msgstr ""
3913
 
3914
- #: includes/class-wcj-product-bookings.php:537
3915
  msgid ""
3916
  "Booster: Free plugin's version is limited to only one bookings product "
3917
  "enabled at a time. You will need to get <a href=\"https://booster.io/buy-"
@@ -3936,30 +3970,30 @@ msgstr ""
3936
  msgid "Product Bulk Meta Editor Tool."
3937
  msgstr ""
3938
 
3939
- #: includes/class-wcj-product-bulk-meta-editor.php:181
3940
  msgid "Please enter meta key."
3941
  msgstr ""
3942
 
3943
- #: includes/class-wcj-product-bulk-meta-editor.php:203
3944
  #, php-format
3945
  msgid "Meta for <strong>%d</strong> product(s) was updated."
3946
  msgstr ""
3947
 
3948
- #: includes/class-wcj-product-bulk-meta-editor.php:207
3949
  #, php-format
3950
  msgid "Meta for <strong>%d</strong> product(s) was not updated."
3951
  msgstr ""
3952
 
3953
- #: includes/class-wcj-product-bulk-meta-editor.php:252
3954
  msgid "Meta key"
3955
  msgstr ""
3956
 
3957
- #: includes/class-wcj-product-bulk-meta-editor.php:255
3958
  #, php-format
3959
  msgid "for example %s"
3960
  msgstr ""
3961
 
3962
- #: includes/class-wcj-product-bulk-meta-editor.php:261
3963
  #: includes/settings/meta-box/wcj-settings-meta-box-add-to-cart-button-visibility.php:22
3964
  #: includes/settings/meta-box/wcj-settings-meta-box-add-to-cart-button-visibility.php:41
3965
  #: includes/settings/wcj-settings-price-by-user-role.php:73
@@ -3968,33 +4002,33 @@ msgstr ""
3968
  msgid "Show"
3969
  msgstr ""
3970
 
3971
- #: includes/class-wcj-product-bulk-meta-editor.php:265
3972
- #: includes/class-wcj-product-bulk-meta-editor.php:384
3973
  #: includes/settings/wcj-settings-product-add-to-cart.php:312
3974
  msgid "Meta"
3975
  msgstr ""
3976
 
3977
- #: includes/class-wcj-product-bulk-meta-editor.php:290
3978
  msgid ""
3979
  "Hold <strong>Control</strong> key to select multiple products. Press "
3980
  "<strong>Control</strong> + <strong>A</strong> to select all products."
3981
  msgstr ""
3982
 
3983
- #: includes/class-wcj-product-bulk-meta-editor.php:315
3984
- #: includes/class-wcj-product-by-user.php:287
3985
- #: includes/class-wcj-purchase-data.php:125
3986
- #: includes/classes/class-wcj-module.php:1000
3987
  #: includes/functions/wcj-functions-general.php:208
3988
- #: includes/functions/wcj-functions-html.php:131
3989
- #: includes/reports/class-wcj-reports-monthly-sales.php:392
3990
  #: includes/settings/wcj-settings-empty-cart.php:88
3991
- #: includes/shortcodes/class-wcj-products-add-form-shortcodes.php:394
3992
  #: includes/tools/class-wcj-order-statuses-tool.php:213
3993
  #: includes/tools/class-wcj-order-statuses-tool.php:363
3994
  msgid "Are you sure?"
3995
  msgstr ""
3996
 
3997
- #: includes/class-wcj-product-bulk-meta-editor.php:332
3998
  #: includes/settings/wcj-settings-admin-orders-list.php:79
3999
  #: includes/settings/wcj-settings-admin-products-list.php:64
4000
  #: includes/settings/wcj-settings-checkout-fees.php:81
@@ -4005,45 +4039,45 @@ msgstr ""
4005
  msgid "Value"
4006
  msgstr ""
4007
 
4008
- #: includes/class-wcj-product-bulk-meta-editor.php:337
4009
  msgid "Set"
4010
  msgstr ""
4011
 
4012
- #: includes/class-wcj-product-bulk-meta-editor.php:341
4013
  msgid "Set Meta for All Products"
4014
  msgstr ""
4015
 
4016
- #: includes/class-wcj-product-bulk-meta-editor.php:360
4017
  msgid "Save all"
4018
  msgstr ""
4019
 
4020
- #: includes/class-wcj-product-bulk-meta-editor.php:363
4021
  msgid "Delete all"
4022
  msgstr ""
4023
 
4024
- #: includes/class-wcj-product-bulk-meta-editor.php:408
4025
  msgid "Save"
4026
  msgstr ""
4027
 
4028
- #: includes/class-wcj-product-bulk-meta-editor.php:435
4029
- #: includes/class-wcj-purchase-data.php:108
4030
  #: includes/export/class-wcj-export-fields-helper.php:285
4031
  #: includes/functions/wcj-functions-reports.php:27
4032
  #: includes/settings/wcj-settings-product-bulk-meta-editor.php:45
4033
  msgid "Product ID"
4034
  msgstr ""
4035
 
4036
- #: includes/class-wcj-product-bulk-meta-editor.php:438
4037
  #: includes/settings/wcj-settings-product-bulk-meta-editor.php:46
4038
  msgid "Product status"
4039
  msgstr ""
4040
 
4041
- #: includes/class-wcj-product-bulk-meta-editor.php:441
4042
  #: includes/settings/wcj-settings-product-bulk-meta-editor.php:47
4043
  msgid "Meta keys"
4044
  msgstr ""
4045
 
4046
- #: includes/class-wcj-product-bulk-meta-editor.php:466
4047
  msgid "Show all"
4048
  msgstr ""
4049
 
@@ -4060,74 +4094,74 @@ msgstr ""
4060
  msgid "Bulk Price Converter Tool."
4061
  msgstr ""
4062
 
4063
- #: includes/class-wcj-product-bulk-price-converter.php:273
4064
  msgid "Multiply value must be above zero."
4065
  msgstr ""
4066
 
4067
- #: includes/class-wcj-product-bulk-price-converter.php:279
4068
  msgid "Prices changed successfully!"
4069
  msgstr ""
4070
 
4071
- #: includes/class-wcj-product-bulk-price-converter.php:304
4072
  msgid "Multiply all product prices by"
4073
  msgstr ""
4074
 
4075
- #: includes/class-wcj-product-bulk-price-converter.php:312
4076
  msgid "Price type to modify"
4077
  msgstr ""
4078
 
4079
- #: includes/class-wcj-product-bulk-price-converter.php:314
4080
  msgid "Both"
4081
  msgstr ""
4082
 
4083
- #: includes/class-wcj-product-bulk-price-converter.php:316
4084
  msgid "Sale prices only"
4085
  msgstr ""
4086
 
4087
- #: includes/class-wcj-product-bulk-price-converter.php:318
4088
  msgid "Regular prices only"
4089
  msgstr ""
4090
 
4091
- #: includes/class-wcj-product-bulk-price-converter.php:325
4092
  msgid "Products category"
4093
  msgstr ""
4094
 
4095
- #: includes/class-wcj-product-bulk-price-converter.php:327
4096
  #: includes/shortcodes/class-wcj-products-shortcodes.php:376
4097
  msgid "Any"
4098
  msgstr ""
4099
 
4100
- #: includes/class-wcj-product-bulk-price-converter.php:329
4101
  #: includes/settings/wcj-settings-global-discount.php:113
4102
  msgid "None"
4103
  msgstr ""
4104
 
4105
- #: includes/class-wcj-product-bulk-price-converter.php:336
4106
  msgid "\"Pretty prices\" threshold"
4107
  msgstr ""
4108
 
4109
- #: includes/class-wcj-product-bulk-price-converter.php:337
4110
  #: includes/settings/wcj-settings-payment-gateways-min-max.php:90
4111
  msgid "Leave zero to disable."
4112
  msgstr ""
4113
 
4114
- #: includes/class-wcj-product-bulk-price-converter.php:338
4115
  msgid ""
4116
  "Otherwise - all prices below \"threshold\" will end with 0,99 and all prices "
4117
  "above or equal to \"threshold\" will end with 9,00."
4118
  msgstr ""
4119
 
4120
- #: includes/class-wcj-product-bulk-price-converter.php:339
4121
  msgid ""
4122
  "E.g.: if you set \"threshold\" to 100, then all prices below 100 will be like "
4123
  "45,99 and all other prices will be like 109,00."
4124
  msgstr ""
4125
 
4126
- #: includes/class-wcj-product-bulk-price-converter.php:347
4127
  msgid "Preview Prices"
4128
  msgstr ""
4129
 
4130
- #: includes/class-wcj-product-bulk-price-converter.php:354
4131
  msgid "Change Prices"
4132
  msgstr ""
4133
 
@@ -4157,54 +4191,54 @@ msgstr ""
4157
  msgid "Countries"
4158
  msgstr ""
4159
 
4160
- #: includes/class-wcj-product-by-country.php:155
4161
  msgid "User Country Selection Options"
4162
  msgstr ""
4163
 
4164
- #: includes/class-wcj-product-by-country.php:160
4165
  msgid "User Country Selection Method"
4166
  msgstr ""
4167
 
4168
- #: includes/class-wcj-product-by-country.php:161
4169
  msgid "Possible values: \"Automatically by IP\" or \"Manually\"."
4170
  msgstr ""
4171
 
4172
- #: includes/class-wcj-product-by-country.php:164
4173
  #, php-format
4174
  msgid ""
4175
  "If \"Manually\" option is selected, you can add country selection drop box to "
4176
  "frontend with \"%1$s\" widget or %2$s shortcode."
4177
  msgstr ""
4178
 
4179
- #: includes/class-wcj-product-by-country.php:165
4180
  #: includes/class-wcj-product-custom-visibility.php:38
4181
  #: includes/widgets/class-wcj-widget-selector.php:37
4182
  msgid "Booster - Selector"
4183
  msgstr ""
4184
 
4185
- #: includes/class-wcj-product-by-country.php:173
4186
  msgid "Automatically by IP"
4187
  msgstr ""
4188
 
4189
- #: includes/class-wcj-product-by-country.php:174
4190
  #: includes/settings/wcj-settings-pdf-invoicing.php:36
4191
  msgid "Manually"
4192
  msgstr ""
4193
 
4194
- #: includes/class-wcj-product-by-country.php:180
4195
- #: includes/class-wcj-product-by-country.php:216
4196
  msgid "Country List"
4197
  msgstr ""
4198
 
4199
- #: includes/class-wcj-product-by-country.php:181
4200
  msgid ""
4201
  "This option sets which countries will be added to the list in [wcj_selector "
4202
  "selector_type=\"country\"] shortcode. Possible values: \"All countries\" or "
4203
  "\"WooCommerce selling locations\"."
4204
  msgstr ""
4205
 
4206
- #: includes/class-wcj-product-by-country.php:184
4207
- #: includes/class-wcj-product-by-country.php:220
4208
  #, php-format
4209
  msgid ""
4210
  "If \"WooCommerce selling locations\" option is selected, country list will be "
@@ -4212,24 +4246,24 @@ msgid ""
4212
  "a>."
4213
  msgstr ""
4214
 
4215
- #: includes/class-wcj-product-by-country.php:193
4216
- #: includes/class-wcj-product-by-country.php:229
4217
  msgid "WooCommerce selling locations"
4218
  msgstr ""
4219
 
4220
- #: includes/class-wcj-product-by-country.php:199
4221
  msgid "Overwrite by Billing Country"
4222
  msgstr ""
4223
 
4224
- #: includes/class-wcj-product-by-country.php:200
4225
  msgid "Tries to overwrite Country by User Billing Country on Checkout Page."
4226
  msgstr ""
4227
 
4228
- #: includes/class-wcj-product-by-country.php:211
4229
  msgid "Admin Country List Options"
4230
  msgstr ""
4231
 
4232
- #: includes/class-wcj-product-by-country.php:217
4233
  msgid ""
4234
  "This option sets which countries will be added to list in product's edit "
4235
  "page. Possible values: \"All countries\" or \"WooCommerce selling locations\"."
@@ -4278,17 +4312,17 @@ msgstr ""
4278
  msgid "Set product availability by time."
4279
  msgstr ""
4280
 
4281
- #: includes/class-wcj-product-by-time.php:99
4282
  #: includes/settings/wcj-settings-product-by-time.php:95
4283
  msgid "%product_title% is not available today."
4284
  msgstr ""
4285
 
4286
- #: includes/class-wcj-product-by-time.php:102
4287
  msgid "<p >%product_title% is not available today."
4288
  msgstr ""
4289
 
4290
- #: includes/class-wcj-product-by-time.php:107
4291
- #: includes/class-wcj-product-by-time.php:110
4292
  #: includes/settings/wcj-settings-product-by-time.php:84
4293
  msgid "%product_title% is available only at %time_today% today."
4294
  msgstr ""
@@ -4358,19 +4392,19 @@ msgid ""
4358
  "form to frontend."
4359
  msgstr ""
4360
 
4361
- #: includes/class-wcj-product-by-user.php:236
4362
- #: includes/class-wcj-product-by-user.php:245
4363
  msgid "Wrong user ID!"
4364
  msgstr ""
4365
 
4366
- #: includes/class-wcj-product-by-user.php:278
4367
  #: includes/export/class-wcj-export-fields-helper.php:298
4368
  msgid "Status"
4369
  msgstr ""
4370
 
4371
- #: includes/class-wcj-product-by-user.php:278
4372
  #: includes/class-wcj-product-tabs.php:663
4373
- #: includes/gateways/class-wc-gateway-wcj-custom.php:59
4374
  #: includes/input-fields/wcj-product-input-fields-options.php:53
4375
  #: includes/settings/meta-box/wcj-settings-meta-box-product-addons.php:104
4376
  #: includes/settings/wcj-settings-admin-orders-list.php:187
@@ -4393,7 +4427,7 @@ msgstr ""
4393
  #: includes/settings/wcj-settings-upsells.php:45
4394
  #: includes/shipping/class-wc-shipping-wcj-custom-template.php:122
4395
  #: includes/shipping/class-wc-shipping-wcj-custom-with-shipping-zones.php:223
4396
- #: includes/shortcodes/class-wcj-products-add-form-shortcodes.php:364
4397
  #: includes/widgets/class-wcj-widget-country-switcher.php:77
4398
  #: includes/widgets/class-wcj-widget-left-to-free-shipping.php:63
4399
  #: includes/widgets/class-wcj-widget-multicurrency.php:85
@@ -4401,8 +4435,8 @@ msgstr ""
4401
  msgid "Title"
4402
  msgstr ""
4403
 
4404
- #: includes/class-wcj-product-by-user.php:286
4405
- #: includes/shortcodes/class-wcj-products-add-form-shortcodes.php:473
4406
  #: includes/tools/class-wcj-order-statuses-tool.php:222
4407
  #: includes/tools/class-wcj-order-statuses-tool.php:300
4408
  msgid "Edit"
@@ -4448,11 +4482,11 @@ msgstr ""
4448
  msgid "Custom Visibility"
4449
  msgstr ""
4450
 
4451
- #: includes/class-wcj-product-custom-visibility.php:105
4452
  msgid "Options List"
4453
  msgstr ""
4454
 
4455
- #: includes/class-wcj-product-custom-visibility.php:110
4456
  #: includes/settings/wcj-settings-admin-bar.php:17
4457
  #: includes/settings/wcj-settings-breadcrumbs.php:17
4458
  #: includes/settings/wcj-settings-cart-customization.php:17
@@ -4485,11 +4519,11 @@ msgstr ""
4485
  msgid "Options"
4486
  msgstr ""
4487
 
4488
- #: includes/class-wcj-product-custom-visibility.php:111
4489
  msgid "One per line."
4490
  msgstr ""
4491
 
4492
- #: includes/class-wcj-product-custom-visibility.php:112
4493
  msgid ""
4494
  "Can not be empty. Options will be added to each product's admin edit page and "
4495
  "to the selection drop box on frontend."
@@ -4667,7 +4701,7 @@ msgid "Save and display product MSRP in WooCommerce."
4667
  msgstr ""
4668
 
4669
  #: includes/class-wcj-product-msrp.php:134
4670
- #: includes/class-wcj-product-msrp.php:169
4671
  #: includes/settings/meta-box/wcj-settings-meta-box-product-msrp.php:51
4672
  msgid "MSRP"
4673
  msgstr ""
@@ -4684,22 +4718,22 @@ msgstr ""
4684
  msgid "Open Pricing"
4685
  msgstr ""
4686
 
4687
- #: includes/class-wcj-product-open-pricing.php:380
4688
  #: includes/settings/wcj-settings-product-open-pricing.php:79
4689
  msgid "Price is required!"
4690
  msgstr ""
4691
 
4692
- #: includes/class-wcj-product-open-pricing.php:392
4693
  #: includes/settings/wcj-settings-product-open-pricing.php:87
4694
  msgid "Entered price is too small!"
4695
  msgstr ""
4696
 
4697
- #: includes/class-wcj-product-open-pricing.php:407
4698
  #: includes/settings/wcj-settings-product-open-pricing.php:95
4699
  msgid "Entered price is too big!"
4700
  msgstr ""
4701
 
4702
- #: includes/class-wcj-product-open-pricing.php:523
4703
  #: includes/settings/wcj-settings-product-open-pricing.php:32
4704
  msgid "Name Your Price"
4705
  msgstr ""
@@ -4718,26 +4752,26 @@ msgstr ""
4718
  msgid "Set formula for automatic product price calculation."
4719
  msgstr ""
4720
 
4721
- #: includes/class-wcj-product-price-by-formula.php:126
4722
  msgid "Booking cost"
4723
  msgstr ""
4724
 
4725
- #: includes/class-wcj-product-price-by-formula.php:141
4726
  #, php-format
4727
  msgid "From: %s"
4728
  msgstr ""
4729
 
4730
- #: includes/class-wcj-product-price-by-formula.php:168
4731
  msgid "Reset products"
4732
  msgstr ""
4733
 
4734
- #: includes/class-wcj-product-price-by-formula.php:174
4735
  msgid ""
4736
  "If enabled will also reset formula related settings on products when "
4737
  "<code>Reset Settings</code> button is pressed."
4738
  msgstr ""
4739
 
4740
- #: includes/class-wcj-product-price-by-formula.php:174
4741
  msgid ""
4742
  "It's necessary to <code>Save changes</code> first with the option enabled so "
4743
  "the <code>Reset settings</code> can be pressed."
@@ -4942,7 +4976,7 @@ msgstr ""
4942
 
4943
  #: includes/class-wcj-products-xml.php:102
4944
  #: includes/exchange-rates/class-wcj-exchange-rates-crons.php:227
4945
- #: tracking/class-plugin-usage-tracker.php:157
4946
  msgid "Once Weekly"
4947
  msgstr ""
4948
 
@@ -4951,11 +4985,11 @@ msgstr ""
4951
  msgid "Once a Minute"
4952
  msgstr ""
4953
 
4954
- #: includes/class-wcj-products-xml.php:121
4955
  msgid "An error has occurred while creating products XML file."
4956
  msgstr ""
4957
 
4958
- #: includes/class-wcj-products-xml.php:125
4959
  #, php-format
4960
  msgid "Products XML file #%s created successfully."
4961
  msgstr ""
@@ -4989,19 +5023,19 @@ msgstr ""
4989
  msgid "Import products costs from \"WooCommerce Cost of Goods\"."
4990
  msgstr ""
4991
 
4992
- #: includes/class-wcj-purchase-data.php:109
4993
  msgid "Product Title"
4994
  msgstr ""
4995
 
4996
- #: includes/class-wcj-purchase-data.php:110
4997
  msgid "WooCommerce Cost of Goods (source)"
4998
  msgstr ""
4999
 
5000
- #: includes/class-wcj-purchase-data.php:111
5001
  msgid "Booster: Product cost (destination)"
5002
  msgstr ""
5003
 
5004
- #: includes/class-wcj-purchase-data.php:155
5005
  #: includes/shipping/class-wc-shipping-wcj-custom-template.php:137
5006
  #: includes/shipping/class-wc-shipping-wcj-custom-template.php:194
5007
  #: includes/shipping/class-wc-shipping-wcj-custom-with-shipping-zones.php:163
@@ -5009,48 +5043,48 @@ msgstr ""
5009
  msgid "Cost"
5010
  msgstr ""
5011
 
5012
- #: includes/class-wcj-purchase-data.php:158
5013
- #: includes/class-wcj-purchase-data.php:223
5014
- #: includes/class-wcj-purchase-data.php:315
5015
  #: includes/functions/wcj-functions-reports.php:31
5016
  #: includes/settings/wcj-settings-purchase-data.php:152
5017
  #: includes/settings/wcj-settings-purchase-data.php:180
5018
  msgid "Profit"
5019
  msgstr ""
5020
 
5021
- #: includes/class-wcj-purchase-data.php:226
5022
  #: includes/settings/wcj-settings-purchase-data.php:161
5023
  #: includes/settings/wcj-settings-purchase-data.php:187
5024
  msgid "Purchase Cost"
5025
  msgstr ""
5026
 
5027
- #: includes/class-wcj-purchase-data.php:312
5028
  msgid "Selling"
5029
  msgstr ""
5030
 
5031
- #: includes/class-wcj-purchase-data.php:313
5032
  msgid "Buying"
5033
  msgstr ""
5034
 
5035
- #: includes/class-wcj-purchase-data.php:329
5036
  msgid "Report"
5037
  msgstr ""
5038
 
5039
- #: includes/class-wcj-related-products.php:53
5040
  msgid ""
5041
  "Change displayed related products number, columns, order; relate by tag, "
5042
  "category, product attribute or manually on per product basis (Plus). Hide "
5043
  "related products completely."
5044
  msgstr ""
5045
 
5046
- #: includes/class-wcj-related-products.php:54
5047
  msgid ""
5048
  "Change displayed related products number, columns, order; relate by tag, "
5049
  "category, product attribute or manually on per product basis. Hide related "
5050
  "products completely."
5051
  msgstr ""
5052
 
5053
- #: includes/class-wcj-related-products.php:58
5054
  #, php-format
5055
  msgid ""
5056
  "You may need to <a href=\"%s\">clear all products transients</a> to "
@@ -5063,51 +5097,51 @@ msgstr ""
5063
  msgid "Stock, sales, customers etc. reports."
5064
  msgstr ""
5065
 
5066
- #: includes/class-wcj-reports.php:93
5067
  msgid "Booster: More Ranges - Months"
5068
  msgstr ""
5069
 
5070
- #: includes/class-wcj-reports.php:95 includes/class-wcj-reports.php:146
5071
  msgid "Select Range"
5072
  msgstr ""
5073
 
5074
- #: includes/class-wcj-reports.php:144
5075
  msgid "Booster: More Ranges"
5076
  msgstr ""
5077
 
5078
- #: includes/class-wcj-reports.php:255
5079
  msgid "Booster: Product Sales (Daily)"
5080
  msgstr ""
5081
 
5082
- #: includes/class-wcj-reports.php:262
5083
  msgid "Booster: Product Sales (Monthly)"
5084
  msgstr ""
5085
 
5086
- #: includes/class-wcj-reports.php:269
5087
  msgid "Booster: Monthly Sales (with Currency Conversion)"
5088
  msgstr ""
5089
 
5090
- #: includes/class-wcj-reports.php:276
5091
  msgid "Booster: Payment Gateways"
5092
  msgstr ""
5093
 
5094
- #: includes/class-wcj-reports.php:293
5095
  msgid "Booster: All in stock"
5096
  msgstr ""
5097
 
5098
- #: includes/class-wcj-reports.php:300
5099
  msgid "Booster: Understocked"
5100
  msgstr ""
5101
 
5102
- #: includes/class-wcj-reports.php:307
5103
  msgid "Booster: Overstocked"
5104
  msgstr ""
5105
 
5106
- #: includes/class-wcj-reports.php:324
5107
  msgid "Booster: Customers by Country"
5108
  msgstr ""
5109
 
5110
- #: includes/class-wcj-reports.php:331
5111
  msgid "Booster: Customers by Country Sets"
5112
  msgstr ""
5113
 
@@ -5315,8 +5349,8 @@ msgstr ""
5315
  #: includes/settings/wcj-settings-order-min-amount.php:69
5316
  #: includes/settings/wcj-settings-orders.php:135
5317
  #: includes/settings/wcj-settings-orders.php:162
5318
- #: includes/settings/wcj-settings-pdf-invoicing-advanced.php:191
5319
- #: includes/settings/wcj-settings-pdf-invoicing-advanced.php:249
5320
  #: includes/settings/wcj-settings-product-by-condition.php:115
5321
  #: includes/settings/wcj-settings-product-by-user.php:122
5322
  #: includes/settings/wcj-settings-product-open-pricing.php:131
@@ -5327,7 +5361,7 @@ msgstr ""
5327
  #: includes/settings/wcj-settings-purchase-data.php:188
5328
  #: includes/settings/wcj-settings-sku.php:314
5329
  #: includes/settings/wcj-settings-sku.php:341
5330
- #: includes/shortcodes/class-wcj-products-add-form-shortcodes.php:473
5331
  #: includes/tools/class-wcj-order-statuses-tool.php:300
5332
  msgid "Add"
5333
  msgstr ""
@@ -5551,7 +5585,7 @@ msgstr ""
5551
  msgid "Add multiple custom shipping methods to WooCommerce."
5552
  msgstr ""
5553
 
5554
- #: includes/class-wcj-sku.php:30 includes/class-wcj-sku.php:712
5555
  #: includes/export/class-wcj-export-fields-helper.php:288
5556
  msgid "SKU"
5557
  msgstr ""
@@ -5575,33 +5609,33 @@ msgstr ""
5575
  msgid "The tool generates and sets product SKUs for existing products."
5576
  msgstr ""
5577
 
5578
- #: includes/class-wcj-sku.php:713
5579
  msgid "Old SKU"
5580
  msgstr ""
5581
 
5582
- #: includes/class-wcj-sku.php:719
5583
  msgid "SKUs generated and set successfully!"
5584
  msgstr ""
5585
 
5586
- #: includes/class-wcj-sku.php:730
5587
  msgid "Preview SKUs"
5588
  msgstr ""
5589
 
5590
- #: includes/class-wcj-sku.php:732
5591
  msgid "Set SKUs"
5592
  msgstr ""
5593
 
5594
- #: includes/class-wcj-sku.php:735
5595
  msgid ""
5596
  "You can optionally limit affected products by main product's ID (set option "
5597
  "to zero to ignore):"
5598
  msgstr ""
5599
 
5600
- #: includes/class-wcj-sku.php:737
5601
  msgid "Min ID"
5602
  msgstr ""
5603
 
5604
- #: includes/class-wcj-sku.php:740
5605
  msgid "Max ID"
5606
  msgstr ""
5607
 
@@ -5699,20 +5733,20 @@ msgstr ""
5699
  msgid "Referer Type"
5700
  msgstr ""
5701
 
5702
- #: includes/class-wcj-track-users.php:174
5703
  msgid "Acquisition Source"
5704
  msgstr ""
5705
 
5706
- #: includes/class-wcj-track-users.php:211
5707
  #: includes/settings/wcj-settings-products-xml.php:144
5708
  msgid "URL:"
5709
  msgstr ""
5710
 
5711
- #: includes/class-wcj-track-users.php:212
5712
  msgid "Type:"
5713
  msgstr ""
5714
 
5715
- #: includes/class-wcj-track-users.php:267
5716
  #, php-format
5717
  msgid "Top %d countries by visits"
5718
  msgstr ""
@@ -5720,8 +5754,8 @@ msgstr ""
5720
  #: includes/class-wcj-track-users.php:341
5721
  #: includes/input-fields/wcj-product-input-fields-options.php:46
5722
  #: includes/settings/wcj-settings-checkout-custom-fields.php:154
5723
- #: includes/tools/class-wcj-eu-countries-vat-rates-tool.php:110
5724
- #: includes/tools/class-wcj-eu-countries-vat-rates-tool.php:130
5725
  msgid "Country"
5726
  msgstr ""
5727
 
@@ -5729,12 +5763,12 @@ msgstr ""
5729
  msgid "Visits"
5730
  msgstr ""
5731
 
5732
- #: includes/class-wcj-track-users.php:373
5733
  #, php-format
5734
  msgid "Stats generated at %1$s. Next update is scheduled at %2$s."
5735
  msgstr ""
5736
 
5737
- #: includes/class-wcj-track-users.php:374
5738
  msgid "Update now"
5739
  msgstr ""
5740
 
@@ -5789,7 +5823,7 @@ msgstr ""
5789
  msgid "Booster for WooCommerce basic WPML support."
5790
  msgstr ""
5791
 
5792
- #: includes/class-wcj-wpml.php:205
5793
  msgid "File wpml-config.xml successfully regenerated!"
5794
  msgstr ""
5795
 
@@ -5832,30 +5866,30 @@ msgid ""
5832
  "\" products."
5833
  msgstr ""
5834
 
5835
- #: includes/classes/class-wcj-module.php:772
5836
  #, php-format
5837
  msgid "Selected: %s."
5838
  msgstr ""
5839
 
5840
- #: includes/classes/class-wcj-module.php:843
5841
  msgid "Back to Module Settings"
5842
  msgstr ""
5843
 
5844
- #: includes/classes/class-wcj-module.php:864
5845
  #: includes/settings/wcj-settings-wpml.php:102
5846
  msgid "Module Tools"
5847
  msgstr ""
5848
 
5849
- #: includes/classes/class-wcj-module.php:942
5850
  #: includes/settings/wcj-settings-checkout-core-fields.php:82
5851
  msgid "enabled"
5852
  msgstr ""
5853
 
5854
- #: includes/classes/class-wcj-module.php:943
5855
  msgid "disabled"
5856
  msgstr ""
5857
 
5858
- #: includes/classes/class-wcj-module.php:951
5859
  #: includes/settings/wcj-settings-product-tabs.php:181
5860
  #: includes/settings/wcj-settings-product-tabs.php:196
5861
  #: includes/settings/wcj-settings-product-tabs.php:211
@@ -5863,27 +5897,27 @@ msgstr ""
5863
  msgid "Deprecated"
5864
  msgstr ""
5865
 
5866
- #: includes/classes/class-wcj-module.php:990
5867
  msgid "Reset Settings"
5868
  msgstr ""
5869
 
5870
- #: includes/classes/class-wcj-module.php:996
5871
  msgid "Reset Module to Default Settings"
5872
  msgstr ""
5873
 
5874
- #: includes/classes/class-wcj-module.php:997
5875
  msgid "Reset Submodule to Default Settings"
5876
  msgstr ""
5877
 
5878
- #: includes/classes/class-wcj-module.php:1006
5879
  msgid "Reset settings"
5880
  msgstr ""
5881
 
5882
- #: includes/classes/class-wcj-module.php:1044
5883
  msgid "Module Options"
5884
  msgstr ""
5885
 
5886
- #: includes/classes/class-wcj-module.php:1051
5887
  msgid "Enable Module"
5888
  msgstr ""
5889
 
@@ -5970,7 +6004,7 @@ msgid "Order status %1$s to %2$s"
5970
  msgstr ""
5971
 
5972
  #: includes/emails/class-wc-email-wcj-custom.php:247
5973
- #: includes/gateways/class-wc-gateway-wcj-custom.php:52
5974
  #: includes/settings/wcj-settings-admin-products-list.php:22
5975
  #: includes/settings/wcj-settings-admin-products-list.php:86
5976
  #: includes/settings/wcj-settings-checkout-custom-fields.php:130
@@ -6229,7 +6263,7 @@ msgstr ""
6229
 
6230
  #: includes/export/class-wcj-export-fields-helper.php:88
6231
  #: includes/export/class-wcj-export-fields-helper.php:299
6232
- #: includes/gateways/class-wc-gateway-wcj-custom.php:152
6233
  msgid "URL"
6234
  msgstr ""
6235
 
@@ -6434,7 +6468,7 @@ msgstr ""
6434
  #: includes/settings/meta-box/wcj-settings-meta-box-price-by-user-role.php:108
6435
  #: includes/settings/wcj-settings-product-by-user.php:19
6436
  #: includes/shortcodes/class-wcj-products-add-form-shortcodes.php:193
6437
- #: includes/shortcodes/class-wcj-products-add-form-shortcodes.php:408
6438
  msgid "Regular Price"
6439
  msgstr ""
6440
 
@@ -6444,7 +6478,7 @@ msgstr ""
6444
  #: includes/settings/meta-box/wcj-settings-meta-box-price-by-user-role.php:117
6445
  #: includes/settings/wcj-settings-product-by-user.php:20
6446
  #: includes/shortcodes/class-wcj-products-add-form-shortcodes.php:194
6447
- #: includes/shortcodes/class-wcj-products-add-form-shortcodes.php:417
6448
  msgid "Sale Price"
6449
  msgstr ""
6450
 
@@ -6474,7 +6508,7 @@ msgstr ""
6474
  #: includes/export/class-wcj-export-fields-helper.php:296
6475
  #: includes/settings/wcj-settings-product-by-user.php:17
6476
  #: includes/shortcodes/class-wcj-products-add-form-shortcodes.php:191
6477
- #: includes/shortcodes/class-wcj-products-add-form-shortcodes.php:381
6478
  msgid "Short Description"
6479
  msgstr ""
6480
 
@@ -6583,22 +6617,22 @@ msgstr ""
6583
  msgid "Availability Class"
6584
  msgstr ""
6585
 
6586
- #: includes/functions/wcj-functions-admin.php:148
6587
  #, php-format
6588
  msgid ""
6589
  "<strong>Booster for WooCommerce</strong> plugin was successfully updated to "
6590
  "version <strong>%s</strong>."
6591
  msgstr ""
6592
 
6593
- #: includes/functions/wcj-functions-admin.php:195
6594
  msgid "Search&hellip;"
6595
  msgstr ""
6596
 
6597
- #: includes/functions/wcj-functions-admin.php:246
6598
  msgid "Enter comma separated list of IDs."
6599
  msgstr ""
6600
 
6601
- #: includes/functions/wcj-functions-admin.php:327
6602
  #: includes/settings/wcj-settings-emails-verification.php:79
6603
  #: includes/settings/wcj-settings-emails-verification.php:88
6604
  #: includes/settings/wcj-settings-emails-verification.php:136
@@ -6606,60 +6640,60 @@ msgstr ""
6606
  msgid "Replaced value: %s"
6607
  msgstr ""
6608
 
6609
- #: includes/functions/wcj-functions-admin.php:327
6610
  #, php-format
6611
  msgid "Replaced values: %s"
6612
  msgstr ""
6613
 
6614
- #: includes/functions/wcj-functions-admin.php:359
6615
  msgid "Upgrade Booster to unlock this feature"
6616
  msgstr ""
6617
 
6618
- #: includes/functions/wcj-functions-admin.php:362
6619
  #, php-format
6620
  msgid ""
6621
  "Some settings fields are locked and you will need %s to modify all locked "
6622
  "fields."
6623
  msgstr ""
6624
 
6625
- #: includes/functions/wcj-functions-admin.php:366
6626
  msgid "Buy now"
6627
  msgstr ""
6628
 
6629
- #: includes/functions/wcj-functions-admin.php:366
6630
  msgid "Visit Booster Site"
6631
  msgstr ""
6632
 
6633
- #: includes/functions/wcj-functions-admin.php:372
6634
  #, php-format
6635
  msgid "Upgrade <a href=\"%s\" target=\"_blank\">Booster</a> to change value."
6636
  msgstr ""
6637
 
6638
- #: includes/functions/wcj-functions-admin.php:376
6639
  #, php-format
6640
  msgid ""
6641
  "Upgrade <a href=\"%1$s\" target=\"_blank\">Booster to unlock this feature</a> "
6642
  "to enable \"%2$s\" option."
6643
  msgstr ""
6644
 
6645
- #: includes/functions/wcj-functions-admin.php:380
6646
  #, php-format
6647
  msgid "Upgrade Booster to to enable \"%s\" option."
6648
  msgstr ""
6649
 
6650
- #: includes/functions/wcj-functions-admin.php:384
6651
  #, php-format
6652
  msgid ""
6653
  "Upgrade <a href=\"%s\" target=\"_blank\">Booster</a> to change values below."
6654
  msgstr ""
6655
 
6656
- #: includes/functions/wcj-functions-admin.php:388
6657
  #, php-format
6658
  msgid ""
6659
  "Upgrade <a href=\"%s\" target=\"_blank\">Booster </a> to change values above."
6660
  msgstr ""
6661
 
6662
- #: includes/functions/wcj-functions-admin.php:391
6663
  msgid "Upgrade Booster to change value."
6664
  msgstr ""
6665
 
@@ -7697,26 +7731,6 @@ msgstr ""
7697
  msgid "%s seconds till next run."
7698
  msgstr ""
7699
 
7700
- #: includes/functions/wcj-functions-crons.php:116
7701
- msgid "Once weekly"
7702
- msgstr ""
7703
-
7704
- #: includes/functions/wcj-functions-crons.php:120
7705
- msgid "Once every 30 minutes"
7706
- msgstr ""
7707
-
7708
- #: includes/functions/wcj-functions-crons.php:124
7709
- msgid "Once every 15 minutes"
7710
- msgstr ""
7711
-
7712
- #: includes/functions/wcj-functions-crons.php:128
7713
- msgid "Once every 5 minutes"
7714
- msgstr ""
7715
-
7716
- #: includes/functions/wcj-functions-crons.php:132
7717
- msgid "Once a minute"
7718
- msgstr ""
7719
-
7720
  #: includes/functions/wcj-functions-exchange-rates.php:76
7721
  msgid "European Central Bank (ECB)"
7722
  msgstr ""
@@ -7745,92 +7759,92 @@ msgstr ""
7745
  msgid "CoinMarketCap"
7746
  msgstr ""
7747
 
7748
- #: includes/functions/wcj-functions-general.php:706
7749
  #: includes/settings/wcj-settings-cross-sells.php:78
7750
  #: includes/settings/wcj-settings-empty-cart.php:50
7751
  msgid "Before cart"
7752
  msgstr ""
7753
 
7754
- #: includes/functions/wcj-functions-general.php:707
7755
  msgid "Before cart table"
7756
  msgstr ""
7757
 
7758
- #: includes/functions/wcj-functions-general.php:708
7759
  msgid "Before cart contents"
7760
  msgstr ""
7761
 
7762
- #: includes/functions/wcj-functions-general.php:709
7763
  msgid "Cart contents"
7764
  msgstr ""
7765
 
7766
- #: includes/functions/wcj-functions-general.php:710
7767
  msgid "Cart coupon"
7768
  msgstr ""
7769
 
7770
- #: includes/functions/wcj-functions-general.php:711
7771
  msgid "Cart actions"
7772
  msgstr ""
7773
 
7774
- #: includes/functions/wcj-functions-general.php:712
7775
  msgid "After cart contents"
7776
  msgstr ""
7777
 
7778
- #: includes/functions/wcj-functions-general.php:713
7779
  msgid "After cart table"
7780
  msgstr ""
7781
 
7782
- #: includes/functions/wcj-functions-general.php:714
7783
  #: includes/settings/wcj-settings-cross-sells.php:79
7784
  msgid "Cart collaterals"
7785
  msgstr ""
7786
 
7787
- #: includes/functions/wcj-functions-general.php:715
7788
  #: includes/settings/wcj-settings-cross-sells.php:80
7789
  #: includes/settings/wcj-settings-empty-cart.php:59
7790
  msgid "After cart"
7791
  msgstr ""
7792
 
7793
- #: includes/functions/wcj-functions-general.php:717
7794
  msgid "Before cart totals"
7795
  msgstr ""
7796
 
7797
- #: includes/functions/wcj-functions-general.php:718
7798
  #: includes/settings/wcj-settings-empty-cart.php:52
7799
  msgid "Cart totals: Before shipping"
7800
  msgstr ""
7801
 
7802
- #: includes/functions/wcj-functions-general.php:719
7803
  #: includes/settings/wcj-settings-empty-cart.php:53
7804
  msgid "Cart totals: After shipping"
7805
  msgstr ""
7806
 
7807
- #: includes/functions/wcj-functions-general.php:720
7808
  #: includes/settings/wcj-settings-empty-cart.php:54
7809
  msgid "Cart totals: Before order total"
7810
  msgstr ""
7811
 
7812
- #: includes/functions/wcj-functions-general.php:721
7813
  #: includes/settings/wcj-settings-empty-cart.php:55
7814
  msgid "Cart totals: After order total"
7815
  msgstr ""
7816
 
7817
- #: includes/functions/wcj-functions-general.php:722
7818
  msgid "Proceed to checkout"
7819
  msgstr ""
7820
 
7821
- #: includes/functions/wcj-functions-general.php:723
7822
  msgid "After cart totals"
7823
  msgstr ""
7824
 
7825
- #: includes/functions/wcj-functions-general.php:725
7826
  msgid "Before shipping calculator"
7827
  msgstr ""
7828
 
7829
- #: includes/functions/wcj-functions-general.php:726
7830
  msgid "After shipping calculator"
7831
  msgstr ""
7832
 
7833
- #: includes/functions/wcj-functions-general.php:728
7834
  msgid "If cart is empty"
7835
  msgstr ""
7836
 
@@ -7839,23 +7853,23 @@ msgstr ""
7839
  msgid "Current image path: %s."
7840
  msgstr ""
7841
 
7842
- #: includes/functions/wcj-functions-invoicing.php:276
7843
  msgid "Invoice"
7844
  msgstr ""
7845
 
7846
- #: includes/functions/wcj-functions-invoicing.php:282
7847
  msgid "Proforma Invoice"
7848
  msgstr ""
7849
 
7850
- #: includes/functions/wcj-functions-invoicing.php:288
7851
  msgid "Packing Slip"
7852
  msgstr ""
7853
 
7854
- #: includes/functions/wcj-functions-invoicing.php:294
7855
  msgid "Credit Note"
7856
  msgstr ""
7857
 
7858
- #: includes/functions/wcj-functions-invoicing.php:305
7859
  msgid "Custom Document"
7860
  msgstr ""
7861
 
@@ -7956,139 +7970,139 @@ msgstr ""
7956
  msgid "You have Free delivery"
7957
  msgstr ""
7958
 
7959
- #: includes/gateways/class-wc-gateway-wcj-custom.php:54
7960
  msgid "Enable Custom Payment"
7961
  msgstr ""
7962
 
7963
- #: includes/gateways/class-wc-gateway-wcj-custom.php:61
7964
  #: includes/shipping/class-wc-shipping-wcj-custom-template.php:124
7965
  #: includes/shipping/class-wc-shipping-wcj-custom-with-shipping-zones.php:225
7966
  msgid "This controls the title which the user sees during checkout."
7967
  msgstr ""
7968
 
7969
- #: includes/gateways/class-wc-gateway-wcj-custom.php:62
7970
  msgid "Custom Payment"
7971
  msgstr ""
7972
 
7973
- #: includes/gateways/class-wc-gateway-wcj-custom.php:69
7974
  msgid "Payment method description that the customer will see on your checkout."
7975
  msgstr ""
7976
 
7977
- #: includes/gateways/class-wc-gateway-wcj-custom.php:70
7978
  msgid "You can add input fields with [wcj_input_field] shortcode."
7979
  msgstr ""
7980
 
7981
- #: includes/gateways/class-wc-gateway-wcj-custom.php:71
7982
  msgid "Custom Payment Description."
7983
  msgstr ""
7984
 
7985
- #: includes/gateways/class-wc-gateway-wcj-custom.php:76
7986
  msgid "Instructions"
7987
  msgstr ""
7988
 
7989
- #: includes/gateways/class-wc-gateway-wcj-custom.php:78
7990
  msgid "Instructions that will be added to the thank you page."
7991
  msgstr ""
7992
 
7993
- #: includes/gateways/class-wc-gateway-wcj-custom.php:84
7994
  msgid "Email Instructions"
7995
  msgstr ""
7996
 
7997
- #: includes/gateways/class-wc-gateway-wcj-custom.php:86
7998
  msgid "Instructions that will be added to the emails."
7999
  msgstr ""
8000
 
8001
- #: includes/gateways/class-wc-gateway-wcj-custom.php:92
8002
  msgid "Icon"
8003
  msgstr ""
8004
 
8005
- #: includes/gateways/class-wc-gateway-wcj-custom.php:94
8006
  #: includes/settings/wcj-settings-payment-gateways-icons.php:19
8007
  msgid ""
8008
  "If you want to show an image next to the gateway's name on the frontend, "
8009
  "enter a URL to an image."
8010
  msgstr ""
8011
 
8012
- #: includes/gateways/class-wc-gateway-wcj-custom.php:101
8013
  #: includes/settings/wcj-settings-shipping-by-order-amount.php:62
8014
  msgid "Minimum order amount"
8015
  msgstr ""
8016
 
8017
- #: includes/gateways/class-wc-gateway-wcj-custom.php:103
8018
  msgid ""
8019
  "If you want to set minimum order amount (excluding fees) to show this gateway "
8020
  "on frontend, enter a number here. Set to 0 to disable."
8021
  msgstr ""
8022
 
8023
- #: includes/gateways/class-wc-gateway-wcj-custom.php:110
8024
  #: includes/settings/wcj-settings-payment-gateways-by-shipping.php:67
8025
  msgid "Enable for shipping methods"
8026
  msgstr ""
8027
 
8028
- #: includes/gateways/class-wc-gateway-wcj-custom.php:115
8029
  msgid ""
8030
  "If gateway is only available for certain shipping methods, set it up here. "
8031
  "Leave blank to enable for all methods."
8032
  msgstr ""
8033
 
8034
- #: includes/gateways/class-wc-gateway-wcj-custom.php:118
8035
  #: includes/settings/wcj-settings-payment-gateways-by-shipping.php:74
8036
  msgid "Select shipping methods"
8037
  msgstr ""
8038
 
8039
- #: includes/gateways/class-wc-gateway-wcj-custom.php:122
8040
  msgid "Enable for virtual orders"
8041
  msgstr ""
8042
 
8043
- #: includes/gateways/class-wc-gateway-wcj-custom.php:123
8044
  msgid "Enable gateway if the order is virtual"
8045
  msgstr ""
8046
 
8047
- #: includes/gateways/class-wc-gateway-wcj-custom.php:129
8048
  #: includes/settings/wcj-settings-order-custom-statuses.php:22
8049
  msgid "Default Order Status"
8050
  msgstr ""
8051
 
8052
- #: includes/gateways/class-wc-gateway-wcj-custom.php:130
8053
  msgid "Enable Custom Statuses feature to add custom statuses to the list."
8054
  msgstr ""
8055
 
8056
- #: includes/gateways/class-wc-gateway-wcj-custom.php:137
8057
  msgid "Send Additional Emails"
8058
  msgstr ""
8059
 
8060
- #: includes/gateways/class-wc-gateway-wcj-custom.php:138
8061
  msgid "Send to Admin"
8062
  msgstr ""
8063
 
8064
- #: includes/gateways/class-wc-gateway-wcj-custom.php:144
8065
  msgid "Send to Customer"
8066
  msgstr ""
8067
 
8068
- #: includes/gateways/class-wc-gateway-wcj-custom.php:145
8069
  msgid ""
8070
  "This may help if you are using pending or custom default status and not "
8071
  "getting new order emails."
8072
  msgstr ""
8073
 
8074
- #: includes/gateways/class-wc-gateway-wcj-custom.php:151
8075
  msgid "Custom Return URL (Thank You Page)"
8076
  msgstr ""
8077
 
8078
- #: includes/gateways/class-wc-gateway-wcj-custom.php:153
8079
  msgid "Enter full URL with http(s)."
8080
  msgstr ""
8081
 
8082
- #: includes/gateways/class-wc-gateway-wcj-custom.php:154
8083
  msgid "Optional. Leave blank to use default URL."
8084
  msgstr ""
8085
 
8086
- #: includes/gateways/class-wc-gateway-wcj-custom.php:359
8087
  #: includes/settings/wcj-settings-payment-gateways.php:48
8088
  msgid "Custom Gateway"
8089
  msgstr ""
8090
 
8091
- #: includes/gateways/class-wc-gateway-wcj-custom.php:361
8092
  msgid "Booster for WooCommerce: Custom Payment Gateway"
8093
  msgstr ""
8094
 
@@ -8106,15 +8120,15 @@ msgstr ""
8106
  msgid "Product Input Field"
8107
  msgstr ""
8108
 
8109
- #: includes/input-fields/class-wcj-product-input-fields-core.php:543
8110
  msgid "Wrong file type!"
8111
  msgstr ""
8112
 
8113
- #: includes/input-fields/class-wcj-product-input-fields-core.php:552
8114
  msgid "File is too big!"
8115
  msgstr ""
8116
 
8117
- #: includes/input-fields/class-wcj-product-input-fields-core.php:789
8118
  msgid "Select a country&hellip;"
8119
  msgstr ""
8120
 
@@ -8167,7 +8181,6 @@ msgstr ""
8167
  #: includes/settings/meta-box/wcj-settings-meta-box-product-addons.php:97
8168
  #: includes/settings/wcj-settings-checkout-custom-fields.php:147
8169
  #: includes/settings/wcj-settings-product-addons.php:100
8170
- #: tracking/class-example-settings.php:84
8171
  msgid "Checkbox"
8172
  msgstr ""
8173
 
@@ -8193,7 +8206,6 @@ msgstr ""
8193
 
8194
  #: includes/input-fields/wcj-product-input-fields-options.php:43
8195
  #: includes/settings/wcj-settings-checkout-custom-fields.php:151
8196
- #: tracking/class-example-settings.php:91
8197
  msgid "Select"
8198
  msgstr ""
8199
 
@@ -8449,77 +8461,77 @@ msgstr ""
8449
  msgid "Select/Radio: Options"
8450
  msgstr ""
8451
 
8452
- #: includes/pdf-invoices/class-wcj-pdf-invoicing-renumerate-tool.php:71
8453
  msgid "Invoices successfully renumerated!"
8454
  msgstr ""
8455
 
8456
- #: includes/pdf-invoices/class-wcj-pdf-invoicing-renumerate-tool.php:73
8457
  msgid "Please select at least one order status."
8458
  msgstr ""
8459
 
8460
- #: includes/pdf-invoices/class-wcj-pdf-invoicing-renumerate-tool.php:78
8461
  msgid "Booster - Renumerate Invoices"
8462
  msgstr ""
8463
 
8464
- #: includes/pdf-invoices/class-wcj-pdf-invoicing-renumerate-tool.php:79
8465
  msgid ""
8466
  "The tool renumerates invoices from choosen date. Invoice number format is set "
8467
  "in WooCommerce > Settings > Booster > PDF Invoicing & Packing Slips > "
8468
  "Numbering."
8469
  msgstr ""
8470
 
8471
- #: includes/pdf-invoices/class-wcj-pdf-invoicing-renumerate-tool.php:86
8472
  #: includes/settings/meta-box/wcj-settings-meta-box-crowdfunding.php:26
8473
  msgid "Start Date"
8474
  msgstr ""
8475
 
8476
- #: includes/pdf-invoices/class-wcj-pdf-invoicing-renumerate-tool.php:88
8477
  msgid "Date to start renumerating. Leave blank to renumerate all invoices."
8478
  msgstr ""
8479
 
8480
- #: includes/pdf-invoices/class-wcj-pdf-invoicing-renumerate-tool.php:93
8481
  msgid "End Date"
8482
  msgstr ""
8483
 
8484
- #: includes/pdf-invoices/class-wcj-pdf-invoicing-renumerate-tool.php:95
8485
  msgid "Date to end renumerating. Leave blank to renumerate all invoices."
8486
  msgstr ""
8487
 
8488
- #: includes/pdf-invoices/class-wcj-pdf-invoicing-renumerate-tool.php:100
8489
  msgid "Start Number"
8490
  msgstr ""
8491
 
8492
- #: includes/pdf-invoices/class-wcj-pdf-invoicing-renumerate-tool.php:102
8493
  msgid "Counter to start renumerating. Leave 0 to continue from current counter."
8494
  msgstr ""
8495
 
8496
- #: includes/pdf-invoices/class-wcj-pdf-invoicing-renumerate-tool.php:107
8497
  msgid "Delete All"
8498
  msgstr ""
8499
 
8500
- #: includes/pdf-invoices/class-wcj-pdf-invoicing-renumerate-tool.php:109
8501
  msgid "Clear all invoices before renumerating"
8502
  msgstr ""
8503
 
8504
- #: includes/pdf-invoices/class-wcj-pdf-invoicing-renumerate-tool.php:121
8505
  #: includes/pdf-invoices/class-wcj-pdf-invoicing-report-tool.php:156
8506
  msgid "Document Type"
8507
  msgstr ""
8508
 
8509
- #: includes/pdf-invoices/class-wcj-pdf-invoicing-renumerate-tool.php:130
8510
  msgid "Order Statuses"
8511
  msgstr ""
8512
 
8513
- #: includes/pdf-invoices/class-wcj-pdf-invoicing-renumerate-tool.php:134
8514
  msgid "Renumerate invoices"
8515
  msgstr ""
8516
 
8517
- #: includes/pdf-invoices/class-wcj-pdf-invoicing-renumerate-tool.php:241
8518
  #, php-format
8519
  msgid "Total documents created: %d"
8520
  msgstr ""
8521
 
8522
- #: includes/pdf-invoices/class-wcj-pdf-invoicing-renumerate-tool.php:243
8523
  #, php-format
8524
  msgid "Total documents deleted: %d"
8525
  msgstr ""
@@ -8532,10 +8544,6 @@ msgid ""
8532
  "Settings > Booster > PDF Invoicing & Packing Slips > Advanced</a>."
8533
  msgstr ""
8534
 
8535
- #: includes/pdf-invoices/class-wcj-pdf-invoicing-report-tool.php:99
8536
- msgid "Sorry, but something went wrong..."
8537
- msgstr ""
8538
-
8539
  #: includes/pdf-invoices/class-wcj-pdf-invoicing-report-tool.php:105
8540
  #: includes/pdf-invoices/class-wcj-pdf-invoicing-report-tool.php:127
8541
  msgid "Please fill year and month values."
@@ -8575,7 +8583,7 @@ msgstr ""
8575
  #: includes/settings/wcj-settings-multicurrency-base-price.php:67
8576
  #: includes/settings/wcj-settings-multicurrency.php:244
8577
  #: includes/settings/wcj-settings-order-min-amount.php:87
8578
- #: includes/settings/wcj-settings-price-by-country.php:249
8579
  #: includes/settings/wcj-settings-price-by-user-role.php:110
8580
  #: includes/settings/wcj-settings-product-addons.php:251
8581
  msgid "Advanced"
@@ -8709,28 +8717,28 @@ msgstr ""
8709
  msgid "Templates"
8710
  msgstr ""
8711
 
8712
- #: includes/price-by-country/class-wcj-price-by-country-group-generator.php:44
8713
  msgid "Country groups successfully generated."
8714
  msgstr ""
8715
 
8716
- #: includes/price-by-country/class-wcj-price-by-country-group-generator.php:47
8717
  msgid "Country groups generation failed."
8718
  msgstr ""
8719
 
8720
  #: includes/price-by-country/class-wcj-price-by-country-local.php:124
8721
  #: includes/settings/meta-box/wcj-settings-meta-box-price-by-country.php:77
8722
- #: includes/settings/wcj-settings-price-by-country.php:457
8723
  msgid "Make empty price"
8724
  msgstr ""
8725
 
8726
  #: includes/price-by-country/class-wcj-price-by-country-local.php:249
8727
  #: includes/settings/meta-box/wcj-settings-meta-box-price-by-country.php:21
8728
  #: includes/settings/wcj-settings-add-to-cart.php:59
8729
- #: includes/settings/wcj-settings-price-by-country.php:342
8730
- #: includes/settings/wcj-settings-price-by-country.php:343
8731
- #: includes/settings/wcj-settings-price-by-country.php:348
8732
- #: includes/settings/wcj-settings-price-by-country.php:398
8733
- #: includes/settings/wcj-settings-price-by-country.php:448
8734
  msgid "Group"
8735
  msgstr ""
8736
 
@@ -8801,7 +8809,7 @@ msgid "Orders Average / Day"
8801
  msgstr ""
8802
 
8803
  #: includes/reports/class-wcj-reports-monthly-sales.php:102
8804
- #: includes/reports/class-wcj-reports-sales.php:347
8805
  msgid "Total Sum"
8806
  msgstr ""
8807
 
@@ -8825,103 +8833,113 @@ msgstr ""
8825
  msgid "Orders by Currency"
8826
  msgstr ""
8827
 
8828
- #: includes/reports/class-wcj-reports-monthly-sales.php:220
8829
- #: includes/reports/class-wcj-reports-monthly-sales.php:236
8830
- #: includes/reports/class-wcj-reports-monthly-sales.php:308
8831
- #: includes/reports/class-wcj-reports-monthly-sales.php:313
8832
  #, php-format
8833
  msgid "Forecast: %s"
8834
  msgstr ""
8835
 
8836
- #: includes/reports/class-wcj-reports-monthly-sales.php:260
8837
  msgid "Grab average rate"
8838
  msgstr ""
8839
 
8840
- #: includes/reports/class-wcj-reports-monthly-sales.php:319
8841
  msgid "Totals"
8842
  msgstr ""
8843
 
8844
- #: includes/reports/class-wcj-reports-monthly-sales.php:363
8845
  msgid "Report currency"
8846
  msgstr ""
8847
 
8848
- #: includes/reports/class-wcj-reports-monthly-sales.php:383
8849
  #, php-format
8850
  msgid "Report generated in: %s s"
8851
  msgstr ""
8852
 
8853
- #: includes/reports/class-wcj-reports-monthly-sales.php:387
8854
  msgid "Save Currency Rates"
8855
  msgstr ""
8856
 
8857
- #: includes/reports/class-wcj-reports-monthly-sales.php:392
8858
  msgid "Reset Currency Rates"
8859
  msgstr ""
8860
 
8861
  #: includes/reports/class-wcj-reports-product-sales-daily.php:180
8862
- #: includes/reports/class-wcj-reports-sales.php:367
8863
- #: includes/reports/wcj-class-reports-sales-gateways.php:128
8864
  msgid "Reports Settings"
8865
  msgstr ""
8866
 
8867
- #: includes/reports/class-wcj-reports-product-sales-daily.php:208
8868
- #: includes/reports/wcj-class-reports-sales-gateways.php:160
8869
  msgid "From:"
8870
  msgstr ""
8871
 
8872
- #: includes/reports/class-wcj-reports-product-sales-daily.php:211
8873
- #: includes/reports/wcj-class-reports-sales-gateways.php:163
8874
  msgid "To:"
8875
  msgstr ""
8876
 
8877
- #: includes/reports/class-wcj-reports-product-sales-daily.php:214
8878
  msgid "Product:"
8879
  msgstr ""
8880
 
8881
- #: includes/reports/class-wcj-reports-product-sales-daily.php:305
8882
  #, php-format
8883
  msgid "Total: %d"
8884
  msgstr ""
8885
 
8886
- #: includes/reports/class-wcj-reports-product-sales-daily.php:310
8887
- #: includes/reports/class-wcj-reports-product-sales-daily.php:315
8888
  #, php-format
8889
  msgid "Total: %s"
8890
  msgstr ""
8891
 
8892
- #: includes/reports/class-wcj-reports-product-sales-daily.php:334
8893
- #: includes/reports/wcj-class-reports-sales-gateways.php:196
8894
  #, php-format
8895
  msgid "Total orders: %d"
8896
  msgstr ""
8897
 
8898
- #: includes/reports/class-wcj-reports-product-sales-daily.php:335
8899
- #: includes/reports/class-wcj-reports-sales.php:400
8900
- #: includes/reports/wcj-class-reports-sales-gateways.php:198
8901
  msgid "No sales data for current period."
8902
  msgstr ""
8903
 
8904
- #: includes/reports/class-wcj-reports-sales.php:143
 
 
 
 
 
 
 
 
 
 
8905
  msgid "Variation"
8906
  msgstr ""
8907
 
8908
- #: includes/reports/class-wcj-reports-sales.php:213
8909
  msgid "Last Sale"
8910
  msgstr ""
8911
 
8912
- #: includes/reports/class-wcj-reports-sales.php:214
8913
  msgid "Total"
8914
  msgstr ""
8915
 
8916
- #: includes/reports/class-wcj-reports-sales.php:336
8917
  msgid "Total Items"
8918
  msgstr ""
8919
 
8920
- #: includes/reports/class-wcj-reports-sales.php:358
8921
  msgid "Total Profit"
8922
  msgstr ""
8923
 
8924
- #: includes/reports/class-wcj-reports-sales.php:395
8925
  msgid "Filter products"
8926
  msgstr ""
8927
 
@@ -8960,12 +8978,6 @@ msgid ""
8960
  "accounted."
8961
  msgstr ""
8962
 
8963
- #: includes/reports/class-wcj-reports-stock.php:121
8964
- #: includes/reports/class-wcj-reports-stock.php:197
8965
- #: includes/reports/wcj-class-reports-sales-gateways.php:98
8966
- msgid "N/A"
8967
- msgstr ""
8968
-
8969
  #: includes/reports/class-wcj-reports-stock.php:293
8970
  msgid "Stock price"
8971
  msgstr ""
@@ -9031,10 +9043,6 @@ msgstr ""
9031
  msgid "Report was generated in: "
9032
  msgstr ""
9033
 
9034
- #: includes/reports/wcj-class-reports-sales-gateways.php:182
9035
- msgid "Gateway"
9036
- msgstr ""
9037
-
9038
  #: includes/settings/meta-box/wcj-settings-meta-box-add-to-cart-button-visibility.php:21
9039
  #: includes/settings/meta-box/wcj-settings-meta-box-add-to-cart-button-visibility.php:40
9040
  #: includes/settings/wcj-settings-admin-orders-list.php:139
@@ -9312,7 +9320,7 @@ msgstr ""
9312
  #: includes/settings/wcj-settings-general.php:129
9313
  #: includes/settings/wcj-settings-general.php:137
9314
  #: includes/settings/wcj-settings-pdf-invoicing-advanced.php:93
9315
- #: includes/settings/wcj-settings-pdf-invoicing-advanced.php:175
9316
  #: includes/settings/wcj-settings-price-by-user-role.php:59
9317
  #: includes/settings/wcj-settings-price-by-user-role.php:165
9318
  #: includes/settings/wcj-settings-product-add-to-cart.php:135
@@ -10504,7 +10512,7 @@ msgid "Fields Options"
10504
  msgstr ""
10505
 
10506
  #: includes/settings/wcj-settings-checkout-core-fields.php:94
10507
- #: includes/shortcodes/class-wcj-products-add-form-shortcodes.php:357
10508
  msgid "required"
10509
  msgstr ""
10510
 
@@ -11508,7 +11516,8 @@ msgid "Before"
11508
  msgstr ""
11509
 
11510
  #: includes/settings/wcj-settings-checkout-files-upload.php:334
11511
- msgid "Replaced values: %field_id%, %field_label%, %required_html%."
 
11512
  msgstr ""
11513
 
11514
  #: includes/settings/wcj-settings-checkout-files-upload.php:342
@@ -11519,7 +11528,8 @@ msgid "Field"
11519
  msgstr ""
11520
 
11521
  #: includes/settings/wcj-settings-checkout-files-upload.php:344
11522
- msgid "Replaced values: %field_html%, %button_html%."
 
11523
  msgstr ""
11524
 
11525
  #: includes/settings/wcj-settings-checkout-files-upload.php:352
@@ -11859,7 +11869,7 @@ msgstr ""
11859
  #: includes/settings/wcj-settings-multicurrency-base-price.php:26
11860
  #: includes/settings/wcj-settings-multicurrency.php:26
11861
  #: includes/settings/wcj-settings-payment-gateways-currency.php:76
11862
- #: includes/settings/wcj-settings-price-by-country.php:417
11863
  msgid "Exchange Rates Updates"
11864
  msgstr ""
11865
 
@@ -11973,7 +11983,7 @@ msgid "Custom Currency"
11973
  msgstr ""
11974
 
11975
  #: includes/settings/wcj-settings-currency-exchange-rates.php:192
11976
- #: includes/settings/wcj-settings-price-by-country.php:412
11977
  msgid "Exchange Rates"
11978
  msgstr ""
11979
 
@@ -11993,7 +12003,7 @@ msgstr ""
11993
  #: includes/settings/wcj-settings-multicurrency-base-price.php:151
11994
  #: includes/settings/wcj-settings-multicurrency.php:322
11995
  #: includes/settings/wcj-settings-multicurrency.php:366
11996
- #: includes/settings/wcj-settings-price-by-country.php:389
11997
  #: includes/settings/wcj-settings-price-formats.php:68
11998
  msgid "Currency"
11999
  msgstr ""
@@ -12066,7 +12076,7 @@ msgstr ""
12066
  #: includes/settings/wcj-settings-multicurrency-base-price.php:31
12067
  #: includes/settings/wcj-settings-multicurrency.php:32
12068
  #: includes/settings/wcj-settings-payment-gateways-currency.php:81
12069
- #: includes/settings/wcj-settings-price-by-country.php:422
12070
  msgid "Enter Rates Manually"
12071
  msgstr ""
12072
 
@@ -12074,7 +12084,7 @@ msgstr ""
12074
  #: includes/settings/wcj-settings-multicurrency-base-price.php:32
12075
  #: includes/settings/wcj-settings-multicurrency.php:33
12076
  #: includes/settings/wcj-settings-payment-gateways-currency.php:82
12077
- #: includes/settings/wcj-settings-price-by-country.php:423
12078
  msgid "Automatically via Currency Exchange Rates module"
12079
  msgstr ""
12080
 
@@ -12082,7 +12092,7 @@ msgstr ""
12082
  #: includes/settings/wcj-settings-multicurrency-base-price.php:35
12083
  #: includes/settings/wcj-settings-multicurrency.php:36
12084
  #: includes/settings/wcj-settings-payment-gateways-currency.php:85
12085
- #: includes/settings/wcj-settings-price-by-country.php:426
12086
  msgid "Visit"
12087
  msgstr ""
12088
 
@@ -12090,7 +12100,7 @@ msgstr ""
12090
  #: includes/settings/wcj-settings-multicurrency-base-price.php:35
12091
  #: includes/settings/wcj-settings-multicurrency.php:36
12092
  #: includes/settings/wcj-settings-payment-gateways-currency.php:87
12093
- #: includes/settings/wcj-settings-price-by-country.php:426
12094
  msgid "Currency Exchange Rates module"
12095
  msgstr ""
12096
 
@@ -12249,7 +12259,7 @@ msgstr ""
12249
  msgid "System Info"
12250
  msgstr ""
12251
 
12252
- #: includes/settings/wcj-settings-debug-tools.php:50
12253
  msgid "Show extended info"
12254
  msgstr ""
12255
 
@@ -12640,7 +12650,7 @@ msgid "Export Options"
12640
  msgstr ""
12641
 
12642
  #: includes/settings/wcj-settings-export.php:23
12643
- #: includes/settings/wcj-settings-pdf-invoicing-advanced.php:242
12644
  msgid "CSV Separator"
12645
  msgstr ""
12646
 
@@ -13072,7 +13082,7 @@ msgstr ""
13072
 
13073
  #: includes/settings/wcj-settings-global-discount.php:114
13074
  #: includes/settings/wcj-settings-multicurrency.php:84
13075
- #: includes/settings/wcj-settings-price-by-country.php:94
13076
  #: includes/settings/wcj-settings-product-price-by-formula.php:79
13077
  #: includes/shipping/class-wc-shipping-wcj-custom-with-shipping-zones.php:256
13078
  msgid "Round"
@@ -13199,7 +13209,7 @@ msgstr ""
13199
  #: includes/settings/wcj-settings-global-discount.php:231
13200
  #: includes/settings/wcj-settings-multicurrency-base-price.php:80
13201
  #: includes/settings/wcj-settings-multicurrency.php:259
13202
- #: includes/settings/wcj-settings-price-by-country.php:254
13203
  #: includes/settings/wcj-settings-price-by-user-role.php:115
13204
  #: includes/settings/wcj-settings-product-addons.php:279
13205
  #: includes/settings/wcj-settings-product-price-by-formula.php:136
@@ -13209,7 +13219,7 @@ msgstr ""
13209
  #: includes/settings/wcj-settings-global-discount.php:232
13210
  #: includes/settings/wcj-settings-multicurrency-base-price.php:81
13211
  #: includes/settings/wcj-settings-multicurrency.php:260
13212
- #: includes/settings/wcj-settings-price-by-country.php:255
13213
  #: includes/settings/wcj-settings-price-by-user-role.php:116
13214
  #: includes/settings/wcj-settings-product-addons.php:280
13215
  #: includes/settings/wcj-settings-product-price-by-formula.php:137
@@ -13436,7 +13446,7 @@ msgstr ""
13436
 
13437
  #: includes/settings/wcj-settings-multicurrency-base-price.php:72
13438
  #: includes/settings/wcj-settings-multicurrency.php:274
13439
- #: includes/settings/wcj-settings-price-by-country.php:282
13440
  #: includes/settings/wcj-settings-product-price-by-formula.php:143
13441
  msgid "Save Calculated Products Prices"
13442
  msgstr ""
@@ -13453,7 +13463,7 @@ msgstr ""
13453
  #: includes/settings/wcj-settings-order-min-amount.php:119
13454
  #: includes/settings/wcj-settings-order-numbers.php:143
13455
  #: includes/settings/wcj-settings-payment-gateways-min-max.php:72
13456
- #: includes/settings/wcj-settings-price-by-country.php:162
13457
  #: includes/settings/wcj-settings-price-by-user-role.php:135
13458
  #: includes/settings/wcj-settings-product-msrp.php:116
13459
  msgid "Compatibility"
@@ -13551,20 +13561,20 @@ msgid "If using exchange rates, choose rounding here."
13551
  msgstr ""
13552
 
13553
  #: includes/settings/wcj-settings-multicurrency.php:83
13554
- #: includes/settings/wcj-settings-price-by-country.php:93
13555
  #: includes/shipping/class-wc-shipping-wcj-custom-with-shipping-zones.php:255
13556
  msgid "No rounding"
13557
  msgstr ""
13558
 
13559
  #: includes/settings/wcj-settings-multicurrency.php:85
13560
- #: includes/settings/wcj-settings-price-by-country.php:96
13561
  #: includes/settings/wcj-settings-product-price-by-formula.php:80
13562
  #: includes/shipping/class-wc-shipping-wcj-custom-with-shipping-zones.php:257
13563
  msgid "Round up"
13564
  msgstr ""
13565
 
13566
  #: includes/settings/wcj-settings-multicurrency.php:86
13567
- #: includes/settings/wcj-settings-price-by-country.php:95
13568
  #: includes/settings/wcj-settings-product-price-by-formula.php:81
13569
  #: includes/shipping/class-wc-shipping-wcj-custom-with-shipping-zones.php:258
13570
  msgid "Round down"
@@ -13596,12 +13606,12 @@ msgid ""
13596
  msgstr ""
13597
 
13598
  #: includes/settings/wcj-settings-multicurrency.php:125
13599
- #: includes/settings/wcj-settings-price-by-country.php:208
13600
  msgid "Free Shipping"
13601
  msgstr ""
13602
 
13603
  #: includes/settings/wcj-settings-multicurrency.php:128
13604
- #: includes/settings/wcj-settings-price-by-country.php:211
13605
  msgid "Converts minimum amount from WooCommerce Free Shipping native method."
13606
  msgstr ""
13607
 
@@ -13610,7 +13620,7 @@ msgid "WooCommerce Fixed Coupons"
13610
  msgstr ""
13611
 
13612
  #: includes/settings/wcj-settings-multicurrency.php:136
13613
- #: includes/settings/wcj-settings-price-by-country.php:219
13614
  msgid ""
13615
  "When a fixed coupon is used its value changes according to the current "
13616
  "currency."
@@ -13750,7 +13760,7 @@ msgid ""
13750
  msgstr ""
13751
 
13752
  #: includes/settings/wcj-settings-multicurrency.php:275
13753
- #: includes/settings/wcj-settings-price-by-country.php:283
13754
  #: includes/settings/wcj-settings-product-price-by-formula.php:144
13755
  msgid ""
13756
  "This may help if you are experiencing compatibility issues with other plugins."
@@ -15593,69 +15603,69 @@ msgstr ""
15593
  msgid "Fonts Manager"
15594
  msgstr ""
15595
 
15596
- #: includes/settings/wcj-settings-pdf-invoicing-advanced.php:169
15597
  msgid "Re-download"
15598
  msgstr ""
15599
 
15600
- #: includes/settings/wcj-settings-pdf-invoicing-advanced.php:169
15601
  msgid "Download"
15602
  msgstr ""
15603
 
15604
- #: includes/settings/wcj-settings-pdf-invoicing-advanced.php:174
15605
  msgid "Disable Fonts Download"
15606
  msgstr ""
15607
 
15608
- #: includes/settings/wcj-settings-pdf-invoicing-advanced.php:185
15609
  msgid "General Display Options"
15610
  msgstr ""
15611
 
15612
- #: includes/settings/wcj-settings-pdf-invoicing-advanced.php:190
15613
  msgid "Add PDF Invoices Meta Box to Admin Edit Order Page"
15614
  msgstr ""
15615
 
15616
- #: includes/settings/wcj-settings-pdf-invoicing-advanced.php:197
15617
  msgid "Open docs in new window"
15618
  msgstr ""
15619
 
15620
- #: includes/settings/wcj-settings-pdf-invoicing-advanced.php:203
15621
  msgid "Add editable numbers and dates"
15622
  msgstr ""
15623
 
15624
- #: includes/settings/wcj-settings-pdf-invoicing-advanced.php:213
15625
  msgid "Report Tool Options"
15626
  msgstr ""
15627
 
15628
- #: includes/settings/wcj-settings-pdf-invoicing-advanced.php:218
15629
  msgid "Reports Filename"
15630
  msgstr ""
15631
 
15632
- #: includes/settings/wcj-settings-pdf-invoicing-advanced.php:226
15633
  msgid "Report Columns"
15634
  msgstr ""
15635
 
15636
- #: includes/settings/wcj-settings-pdf-invoicing-advanced.php:227
15637
  msgid "Leave blank to show all columns."
15638
  msgstr ""
15639
 
15640
- #: includes/settings/wcj-settings-pdf-invoicing-advanced.php:235
15641
  msgid "Tax Percent Precision"
15642
  msgstr ""
15643
 
15644
- #: includes/settings/wcj-settings-pdf-invoicing-advanced.php:248
15645
  msgid "CSV UTF-8 BOM"
15646
  msgstr ""
15647
 
15648
- #: includes/settings/wcj-settings-pdf-invoicing-advanced.php:255
15649
  msgid "Replace Periods with Commas in CSV Data"
15650
  msgstr ""
15651
 
15652
- #: includes/settings/wcj-settings-pdf-invoicing-advanced.php:256
15653
  #: includes/settings/wcj-settings-product-open-pricing.php:183
15654
  msgid "Replace"
15655
  msgstr ""
15656
 
15657
  #: includes/settings/wcj-settings-pdf-invoicing-display.php:30
15658
- #: includes/settings/wcj-settings-price-by-country.php:396
15659
  #: includes/settings/wcj-settings-shipping.php:34
15660
  msgid "Admin Title"
15661
  msgstr ""
@@ -15998,99 +16008,99 @@ msgstr ""
15998
  msgid "Available in Booster Plus only."
15999
  msgstr ""
16000
 
16001
- #: includes/settings/wcj-settings-price-by-country.php:25
16002
  msgid ""
16003
  "All existing country groups will be deleted and new groups will be created. "
16004
  "Are you sure?"
16005
  msgstr ""
16006
 
16007
- #: includes/settings/wcj-settings-price-by-country.php:33
16008
  msgid "Price by Country Options"
16009
  msgstr ""
16010
 
16011
- #: includes/settings/wcj-settings-price-by-country.php:35
16012
  msgid ""
16013
  "Change product's price and currency by customer's country. Customer's country "
16014
  "is detected automatically by IP, or selected by customer manually."
16015
  msgstr ""
16016
 
16017
- #: includes/settings/wcj-settings-price-by-country.php:39
16018
  msgid "Customer Country Detection Method"
16019
  msgstr ""
16020
 
16021
- #: includes/settings/wcj-settings-price-by-country.php:41
16022
  msgid ""
16023
  "If you choose \"by user selection\", use [wcj_country_select_drop_down_list] "
16024
  "shortcode to display country selection list on frontend."
16025
  msgstr ""
16026
 
16027
- #: includes/settings/wcj-settings-price-by-country.php:45
16028
  msgid "by IP"
16029
  msgstr ""
16030
 
16031
- #: includes/settings/wcj-settings-price-by-country.php:46
16032
  msgid "by IP, then by user selection"
16033
  msgstr ""
16034
 
16035
- #: includes/settings/wcj-settings-price-by-country.php:47
16036
  msgid "by user selection"
16037
  msgstr ""
16038
 
16039
- #: includes/settings/wcj-settings-price-by-country.php:51
16040
  msgid "Override Country Options"
16041
  msgstr ""
16042
 
16043
- #: includes/settings/wcj-settings-price-by-country.php:56
16044
  msgid "No Override"
16045
  msgstr ""
16046
 
16047
- #: includes/settings/wcj-settings-price-by-country.php:57
16048
  msgid "Override Country with Customer's Checkout Billing Country"
16049
  msgstr ""
16050
 
16051
- #: includes/settings/wcj-settings-price-by-country.php:58
16052
  msgid "Override Country with Customer's Checkout Shipping Country"
16053
  msgstr ""
16054
 
16055
- #: includes/settings/wcj-settings-price-by-country.php:62
16056
  msgid "Override Scope"
16057
  msgstr ""
16058
 
16059
- #: includes/settings/wcj-settings-price-by-country.php:67
16060
  msgid "All site"
16061
  msgstr ""
16062
 
16063
- #: includes/settings/wcj-settings-price-by-country.php:68
16064
  msgid "Checkout only"
16065
  msgstr ""
16066
 
16067
- #: includes/settings/wcj-settings-price-by-country.php:72
16068
  msgid "Revert Currency to Default on Checkout"
16069
  msgstr ""
16070
 
16071
- #: includes/settings/wcj-settings-price-by-country.php:77
16072
  msgid ""
16073
  "If selected currency is &#8364; and your shop currency is &#36;, So if you "
16074
  "want to show &#36; on the checkout page you can enable the option."
16075
  msgstr ""
16076
 
16077
- #: includes/settings/wcj-settings-price-by-country.php:80
16078
  msgid "Auto set default checkout billing country"
16079
  msgstr ""
16080
 
16081
- #: includes/settings/wcj-settings-price-by-country.php:87
16082
  msgid "Price Rounding"
16083
  msgstr ""
16084
 
16085
- #: includes/settings/wcj-settings-price-by-country.php:88
16086
  msgid "If you choose to multiply price, set rounding options here."
16087
  msgstr ""
16088
 
16089
- #: includes/settings/wcj-settings-price-by-country.php:100
16090
  msgid "Make Pretty Price"
16091
  msgstr ""
16092
 
16093
- #: includes/settings/wcj-settings-price-by-country.php:102
16094
  msgid ""
16095
  "If enabled, this will be applied if exchange rates are used. Final converted "
16096
  "price will be rounded, then decreased by smallest possible value. For "
@@ -16099,211 +16109,211 @@ msgid ""
16099
  "above zero."
16100
  msgstr ""
16101
 
16102
- #: includes/settings/wcj-settings-price-by-country.php:108
16103
  msgid "Discount Min Amount Multiplier"
16104
  msgstr ""
16105
 
16106
- #: includes/settings/wcj-settings-price-by-country.php:109
16107
  msgid ""
16108
  "If \"Make Pretty Price\" is enabled, here you can set by how many smallest "
16109
  "possible values (e.g. cents) final price should be decreased."
16110
  msgstr ""
16111
 
16112
- #: includes/settings/wcj-settings-price-by-country.php:116
16113
  msgid "Price by Country on per Product Basis"
16114
  msgstr ""
16115
 
16116
- #: includes/settings/wcj-settings-price-by-country.php:118
16117
  msgid "This will add product data fields in product edit."
16118
  msgstr ""
16119
 
16120
- #: includes/settings/wcj-settings-price-by-country.php:124
16121
  msgid "Per product options - backend style"
16122
  msgstr ""
16123
 
16124
- #: includes/settings/wcj-settings-price-by-country.php:129
16125
  #: includes/settings/wcj-settings-product-msrp.php:107
16126
  msgid "Inline"
16127
  msgstr ""
16128
 
16129
- #: includes/settings/wcj-settings-price-by-country.php:130
16130
  msgid "Separate meta box"
16131
  msgstr ""
16132
 
16133
- #: includes/settings/wcj-settings-price-by-country.php:134
16134
  msgid "Per product options - backend user role visibility"
16135
  msgstr ""
16136
 
16137
- #: includes/settings/wcj-settings-price-by-country.php:135
16138
  msgid "Leave empty to show to all user roles."
16139
  msgstr ""
16140
 
16141
- #: includes/settings/wcj-settings-price-by-country.php:143
16142
  msgid "Add Countries Flags Images to Select Drop-Down Box"
16143
  msgstr ""
16144
 
16145
- #: includes/settings/wcj-settings-price-by-country.php:145
16146
  msgid ""
16147
  "If you are using [wcj_country_select_drop_down_list] shortcode or \"Booster: "
16148
  "Country Switcher\" widget, this will add country flags to these select boxes."
16149
  msgstr ""
16150
 
16151
- #: includes/settings/wcj-settings-price-by-country.php:151
16152
  #: includes/settings/wcj-settings-price-by-user-role.php:65
16153
  msgid "Search Engine Bots"
16154
  msgstr ""
16155
 
16156
- #: includes/settings/wcj-settings-price-by-country.php:152
16157
  msgid "Disable Price by Country for Bots"
16158
  msgstr ""
16159
 
16160
- #: includes/settings/wcj-settings-price-by-country.php:167
16161
  msgid "Active Webtofee subscription Section"
16162
  msgstr ""
16163
 
16164
- #: includes/settings/wcj-settings-price-by-country.php:168
16165
  msgid "Compatibility with Webtofee subscription PLugin"
16166
  msgstr ""
16167
 
16168
- #: includes/settings/wcj-settings-price-by-country.php:174
16169
- #: includes/settings/wcj-settings-price-by-country.php:175
16170
  msgid "Active B2B Plugin Price Section"
16171
  msgstr ""
16172
 
16173
- #: includes/settings/wcj-settings-price-by-country.php:181
16174
  #: includes/settings/wcj-settings-product-price-by-formula.php:117
16175
  msgid "Disable Quick Edit Product For Admin Scope"
16176
  msgstr ""
16177
 
16178
- #: includes/settings/wcj-settings-price-by-country.php:182
16179
  #: includes/settings/wcj-settings-product-price-by-formula.php:118
16180
  msgid "Disable For Admin Quick Edit Scope."
16181
  msgstr ""
16182
 
16183
- #: includes/settings/wcj-settings-price-by-country.php:183
16184
  msgid "Disable module on Edit Product For Admin scope."
16185
  msgstr ""
16186
 
16187
- #: includes/settings/wcj-settings-price-by-country.php:183
16188
  #: includes/settings/wcj-settings-product-price-by-formula.php:119
16189
  msgid ""
16190
  "For example if you use Quick Edit Product and donot want change the deafult "
16191
  "price then the box ticked"
16192
  msgstr ""
16193
 
16194
- #: includes/settings/wcj-settings-price-by-country.php:190
16195
  msgid "Price Filter Widget and Sorting by Price Support"
16196
  msgstr ""
16197
 
16198
- #: includes/settings/wcj-settings-price-by-country.php:202
16199
  msgid "Recalculate price filter widget and sorting by price product prices."
16200
  msgstr ""
16201
 
16202
- #: includes/settings/wcj-settings-price-by-country.php:217
16203
  msgid "WooCommerce Coupons"
16204
  msgstr ""
16205
 
16206
- #: includes/settings/wcj-settings-price-by-country.php:225
16207
  msgid "Woo Discount Rules"
16208
  msgstr ""
16209
 
16210
- #: includes/settings/wcj-settings-price-by-country.php:229
16211
  #, php-format
16212
  msgid ""
16213
  "Adds compatibility with <a href=\"%s\" target=\"_blank\">Woo Discount Rules</"
16214
  "a> plugin."
16215
  msgstr ""
16216
 
16217
- #: includes/settings/wcj-settings-price-by-country.php:229
16218
  #, php-format
16219
  msgid ""
16220
  "If it doesn't work properly try to enable <a href=\"%s\">redirect to the cart "
16221
  "page after successful addition</a> option."
16222
  msgstr ""
16223
 
16224
- #: includes/settings/wcj-settings-price-by-country.php:235
16225
  msgid "WooCommerce Points and Rewards"
16226
  msgstr ""
16227
 
16228
- #: includes/settings/wcj-settings-price-by-country.php:239
16229
  #, php-format
16230
  msgid ""
16231
  "Adds compatibility with <a href=\"%s\" target=\"_blank\">WooCommerce Points "
16232
  "and Rewards</a> plugin."
16233
  msgstr ""
16234
 
16235
- #: includes/settings/wcj-settings-price-by-country.php:261
16236
  msgid "User IP Detection Method"
16237
  msgstr ""
16238
 
16239
- #: includes/settings/wcj-settings-price-by-country.php:271
16240
  msgid "Price Format Method"
16241
  msgstr ""
16242
 
16243
- #: includes/settings/wcj-settings-price-by-country.php:272
16244
  msgid "The moment \"Pretty Price\" and \"Rounding\" will be applied"
16245
  msgstr ""
16246
 
16247
- #: includes/settings/wcj-settings-price-by-country.php:277
16248
  msgid "get_price()"
16249
  msgstr ""
16250
 
16251
- #: includes/settings/wcj-settings-price-by-country.php:278
16252
  msgid "wc_get_price_to_display()"
16253
  msgstr ""
16254
 
16255
- #: includes/settings/wcj-settings-price-by-country.php:290
16256
  msgid "Save Country Group ID"
16257
  msgstr ""
16258
 
16259
- #: includes/settings/wcj-settings-price-by-country.php:291
16260
  msgid ""
16261
  "Try to disable it if the country detection is not correct, most probably if "
16262
  "\"Override Country Options\" is enabled."
16263
  msgstr ""
16264
 
16265
- #: includes/settings/wcj-settings-price-by-country.php:302
16266
  msgid "Country Groups"
16267
  msgstr ""
16268
 
16269
- #: includes/settings/wcj-settings-price-by-country.php:307
16270
  msgid "Countries Selection"
16271
  msgstr ""
16272
 
16273
- #: includes/settings/wcj-settings-price-by-country.php:308
16274
  msgid "Choose how do you want to enter countries groups in admin."
16275
  msgstr ""
16276
 
16277
- #: includes/settings/wcj-settings-price-by-country.php:313
16278
  msgid "Comma separated list"
16279
  msgstr ""
16280
 
16281
- #: includes/settings/wcj-settings-price-by-country.php:314
16282
  msgid "Multiselect"
16283
  msgstr ""
16284
 
16285
- #: includes/settings/wcj-settings-price-by-country.php:315
16286
  #: includes/settings/wcj-settings-product-by-condition.php:90
16287
  #: includes/settings/wcj-settings-related-products.php:181
16288
  msgid "Chosen select"
16289
  msgstr ""
16290
 
16291
- #: includes/settings/wcj-settings-price-by-country.php:319
16292
  msgid "Autogenerate Groups"
16293
  msgstr ""
16294
 
16295
- #: includes/settings/wcj-settings-price-by-country.php:325
16296
  msgid "Groups Number"
16297
  msgstr ""
16298
 
16299
- #: includes/settings/wcj-settings-price-by-country.php:354
16300
  msgid ""
16301
  "Countries. List of comma separated country codes.<br>For country codes and "
16302
  "predefined sets visit <a href=\"https://booster.io/country-codes/\" target="
16303
  "\"_blank\">https://booster.io/country-codes/</a>"
16304
  msgstr ""
16305
 
16306
- #: includes/settings/wcj-settings-price-by-country.php:449
16307
  msgid "Multiply Price by"
16308
  msgstr ""
16309
 
@@ -17334,7 +17344,7 @@ msgstr ""
17334
 
17335
  #: includes/settings/wcj-settings-product-by-user.php:18
17336
  #: includes/shortcodes/class-wcj-products-add-form-shortcodes.php:192
17337
- #: includes/shortcodes/class-wcj-products-add-form-shortcodes.php:400
17338
  msgid "Image"
17339
  msgstr ""
17340
 
@@ -17383,7 +17393,7 @@ msgid "Message: Product Successfully Added"
17383
  msgstr ""
17384
 
17385
  #: includes/settings/wcj-settings-product-by-user.php:130
17386
- #: includes/shortcodes/class-wcj-products-add-form-shortcodes.php:317
17387
  msgid "\"%product_title%\" successfully added!"
17388
  msgstr ""
17389
 
@@ -17392,7 +17402,7 @@ msgid "Message: Product Successfully Edited"
17392
  msgstr ""
17393
 
17394
  #: includes/settings/wcj-settings-product-by-user.php:137
17395
- #: includes/shortcodes/class-wcj-products-add-form-shortcodes.php:325
17396
  msgid "\"%product_title%\" successfully edited!"
17397
  msgstr ""
17398
 
@@ -20611,7 +20621,7 @@ msgstr ""
20611
  msgid "Attribute \"name\" is required!"
20612
  msgstr ""
20613
 
20614
- #: includes/shortcodes/class-wcj-orders-shortcodes.php:395
20615
  #, php-format
20616
  msgid "Refund #%1$s - %2$s"
20617
  msgstr ""
@@ -20629,7 +20639,7 @@ msgid "Product exists!"
20629
  msgstr ""
20630
 
20631
  #: includes/shortcodes/class-wcj-products-add-form-shortcodes.php:195
20632
- #: includes/shortcodes/class-wcj-products-add-form-shortcodes.php:426
20633
  msgid "Product URL"
20634
  msgstr ""
20635
 
@@ -20642,15 +20652,15 @@ msgstr ""
20642
  msgid "Sale price must be less than the regular price!"
20643
  msgstr ""
20644
 
20645
- #: includes/shortcodes/class-wcj-products-add-form-shortcodes.php:309
20646
  msgid "Error!"
20647
  msgstr ""
20648
 
20649
- #: includes/shortcodes/class-wcj-products-add-form-shortcodes.php:352
20650
  msgid "Add New Product"
20651
  msgstr ""
20652
 
20653
- #: includes/shortcodes/class-wcj-products-add-form-shortcodes.php:352
20654
  msgid "Edit Product"
20655
  msgstr ""
20656
 
@@ -20675,12 +20685,12 @@ msgstr ""
20675
  msgid "This product is currently out of stock and unavailable."
20676
  msgstr ""
20677
 
20678
- #: includes/tools/class-wcj-eu-countries-vat-rates-tool.php:58
20679
- #: includes/tools/class-wcj-eu-countries-vat-rates-tool.php:90
20680
  msgid "VAT"
20681
  msgstr ""
20682
 
20683
- #: includes/tools/class-wcj-eu-countries-vat-rates-tool.php:97
20684
  msgid "Add EU Countries VAT Rates"
20685
  msgstr ""
20686
 
@@ -20688,16 +20698,16 @@ msgstr ""
20688
  msgid "Note: will add duplicates."
20689
  msgstr ""
20690
 
20691
- #: includes/tools/class-wcj-eu-countries-vat-rates-tool.php:105
20692
  msgid "List of EU VAT rates to be added"
20693
  msgstr ""
20694
 
20695
- #: includes/tools/class-wcj-eu-countries-vat-rates-tool.php:111
20696
- #: includes/tools/class-wcj-eu-countries-vat-rates-tool.php:131
20697
  msgid "Rate"
20698
  msgstr ""
20699
 
20700
- #: includes/tools/class-wcj-eu-countries-vat-rates-tool.php:125
20701
  msgid "Current standard tax rates"
20702
  msgstr ""
20703
 
@@ -20879,33 +20889,17 @@ msgstr ""
20879
  msgid "Product custom visibility"
20880
  msgstr ""
20881
 
20882
- #: tracking/class-example-settings.php:60 tracking/class-example-settings.php:71
20883
- msgid "Example Settings"
20884
- msgstr ""
20885
-
20886
- #: tracking/class-example-settings.php:77
20887
- msgid "Text field:"
20888
- msgstr ""
20889
-
20890
- #: tracking/class-example-settings.php:98
20891
- msgid "Opt out"
20892
- msgstr ""
20893
-
20894
- #: tracking/class-example-settings.php:118
20895
- msgid "Default setting"
20896
- msgstr ""
20897
-
20898
- #: tracking/class-plugin-usage-tracker.php:161
20899
  msgid "Once Monthly"
20900
  msgstr ""
20901
 
20902
- #: tracking/class-plugin-usage-tracker.php:361
20903
  msgid ""
20904
  "We can't detect any product information. This is most probably because you "
20905
  "have not included the code snippet."
20906
  msgstr ""
20907
 
20908
- #: tracking/class-plugin-usage-tracker.php:891
20909
  #, php-format
20910
  msgid ""
20911
  "Thank you for installing our %1$s. We would like to track its usage on your "
@@ -20914,7 +20908,7 @@ msgid ""
20914
  "improvements to the %1$s. Tracking is completely optional."
20915
  msgstr ""
20916
 
20917
- #: tracking/class-plugin-usage-tracker.php:898
20918
  #, php-format
20919
  msgid ""
20920
  "Thank you for installing our %1$s. We'd like your permission to track its "
@@ -20923,79 +20917,79 @@ msgid ""
20923
  "help us make improvements to the %1$s. Tracking is completely optional."
20924
  msgstr ""
20925
 
20926
- #: tracking/class-plugin-usage-tracker.php:909
20927
  msgid "Allow"
20928
  msgstr ""
20929
 
20930
- #: tracking/class-plugin-usage-tracker.php:910
20931
  msgid "Do Not Allow"
20932
  msgstr ""
20933
 
20934
- #: tracking/class-plugin-usage-tracker.php:956
20935
  #, php-format
20936
  msgid ""
20937
  "Thank you for opting in to tracking. Would you like to receive occasional "
20938
  "news about this %s, including details of new features and special offers?"
20939
  msgstr ""
20940
 
20941
- #: tracking/class-plugin-usage-tracker.php:966
20942
  msgid "Yes Please"
20943
  msgstr ""
20944
 
20945
- #: tracking/class-plugin-usage-tracker.php:967
20946
  msgid "No Thank You"
20947
  msgstr ""
20948
 
20949
- #: tracking/class-plugin-usage-tracker.php:1001
20950
  msgid "Sorry to see you go"
20951
  msgstr ""
20952
 
20953
- #: tracking/class-plugin-usage-tracker.php:1002
20954
  msgid ""
20955
  "Before you deactivate the plugin, would you quickly give us your reason for "
20956
  "doing so?"
20957
  msgstr ""
20958
 
20959
- #: tracking/class-plugin-usage-tracker.php:1004
20960
  msgid "Set up is too difficult"
20961
  msgstr ""
20962
 
20963
- #: tracking/class-plugin-usage-tracker.php:1005
20964
  msgid "Lack of documentation"
20965
  msgstr ""
20966
 
20967
- #: tracking/class-plugin-usage-tracker.php:1006
20968
  msgid "Not the features I wanted"
20969
  msgstr ""
20970
 
20971
- #: tracking/class-plugin-usage-tracker.php:1007
20972
  msgid "Found a better plugin"
20973
  msgstr ""
20974
 
20975
- #: tracking/class-plugin-usage-tracker.php:1008
20976
  msgid "Installed by mistake"
20977
  msgstr ""
20978
 
20979
- #: tracking/class-plugin-usage-tracker.php:1009
20980
  msgid "Only required temporarily"
20981
  msgstr ""
20982
 
20983
- #: tracking/class-plugin-usage-tracker.php:1010
20984
  msgid "Didn't work"
20985
  msgstr ""
20986
 
20987
- #: tracking/class-plugin-usage-tracker.php:1012
20988
  msgid "Details (optional)"
20989
  msgstr ""
20990
 
20991
- #: tracking/class-plugin-usage-tracker.php:1053
20992
  msgid "Submitting form"
20993
  msgstr ""
20994
 
20995
- #: tracking/class-plugin-usage-tracker.php:1113
20996
  msgid "Submit and Deactivate"
20997
  msgstr ""
20998
 
20999
- #: tracking/class-plugin-usage-tracker.php:1113
21000
  msgid "Just Deactivate"
21001
  msgstr ""
34
  msgstr ""
35
 
36
  #: includes/admin/class-wc-settings-jetpack.php:33
37
+ #: includes/admin/class-wc-settings-jetpack.php:414
38
  #: includes/class-wcj-admin-bar.php:299
39
  #: includes/class-wcj-checkout-files-upload.php:273
40
+ #: includes/class-wcj-eu-vat-number.php:176
41
+ #: includes/class-wcj-max-products-per-user.php:219
42
  #: includes/class-wcj-orders.php:133 includes/class-wcj-orders.php:170
43
+ #: includes/class-wcj-payment-gateways.php:103
44
+ #: includes/class-wcj-track-users.php:175 includes/class-wcj-track-users.php:266
45
+ #: includes/classes/class-wcj-module.php:676
46
+ #: includes/classes/class-wcj-module.php:885
47
+ #: includes/settings/wcj-settings-price-by-country.php:275
48
  msgid "Booster"
49
  msgstr ""
50
 
51
+ #: includes/admin/class-wc-settings-jetpack.php:108
52
  #, php-format
53
  msgid ""
54
  "You're using Booster free version. To unlock more features please consider <a "
55
  "target=\"_blank\" href=\"%s\">Upgrade Booster to unlock this feature</a>."
56
  msgstr ""
57
 
58
+ #: includes/admin/class-wc-settings-jetpack.php:133
59
  #, php-format
60
  msgid ""
61
  "Please rate <strong>Booster for WooCommerce</strong> %1$s on <a href=\"%2$s\" "
63
  "from Booster team!"
64
  msgstr ""
65
 
66
+ #: includes/admin/class-wc-settings-jetpack.php:192
67
  #, php-format
68
  msgid ""
69
  "Please rate <strong>Booster for WooCommerce</strong> %1$s on <a href=\"%2$s"
71
  "from Booster team!"
72
  msgstr ""
73
 
74
+ #: includes/admin/class-wc-settings-jetpack.php:267
75
+ #: includes/admin/class-wc-settings-jetpack.php:333
76
+ #: includes/admin/class-wc-settings-jetpack.php:942
77
  #: includes/admin/wcj-modules-cats.php:17 includes/class-wcj-admin-bar.php:234
78
  #: includes/class-wcj-my-account.php:39
79
  msgid "Dashboard"
80
  msgstr ""
81
 
82
+ #: includes/admin/class-wc-settings-jetpack.php:268
83
  msgid "All Module"
84
  msgstr ""
85
 
86
+ #: includes/admin/class-wc-settings-jetpack.php:269
87
  msgid "Active Modules"
88
  msgstr ""
89
 
90
+ #: includes/admin/class-wc-settings-jetpack.php:270
91
  #: includes/class-wcj-admin-bar.php:167
92
  msgid "Manage Settings"
93
  msgstr ""
94
 
95
+ #: includes/admin/class-wc-settings-jetpack.php:381
96
  #, php-format
97
  msgid ""
98
  "Please note that current <em>%1$s</em> module is deprecated and will be "
99
  "removed in future updates. Please use <em>%2$s</em> module instead."
100
  msgstr ""
101
 
102
+ #: includes/admin/class-wc-settings-jetpack.php:387
103
  msgid "Module will be removed from the module's list as soon as you disable it."
104
  msgstr ""
105
 
106
+ #: includes/admin/class-wc-settings-jetpack.php:399
107
  #, php-format
108
  msgid ""
109
  "Please note that <em>%s</em> module is currently under development. Until "
111
  "be moved to paid plugin version."
112
  msgstr ""
113
 
114
+ #: includes/admin/class-wc-settings-jetpack.php:410
115
  #: includes/class-wcj-admin-bar.php:411
116
  #: includes/settings/wcj-settings-emails-verification.php:152
117
+ #: includes/settings/wcj-settings-price-by-country.php:274
118
  msgid "WooCommerce"
119
  msgstr ""
120
 
121
+ #: includes/admin/class-wc-settings-jetpack.php:412
122
+ #: includes/admin/class-wc-settings-jetpack.php:640
123
  #: includes/class-wcj-admin-bar.php:184 includes/class-wcj-admin-bar.php:535
124
  #: includes/class-wcj-admin-bar.php:635 includes/core/class-wcj-admin.php:140
125
  msgid "Settings"
126
  msgstr ""
127
 
128
+ #: includes/admin/class-wc-settings-jetpack.php:466
129
  msgid ""
130
  "This section lets you export, import or reset all Booster's modules settings."
131
  msgstr ""
132
 
133
+ #: includes/admin/class-wc-settings-jetpack.php:494
134
+ #: includes/admin/class-wc-settings-jetpack.php:1060
135
  #: includes/class-wcj-export-import.php:31
136
  msgid "Export"
137
  msgstr ""
138
 
139
+ #: includes/admin/class-wc-settings-jetpack.php:495
140
  msgid "Export all Booster's options to a file."
141
  msgstr ""
142
 
143
+ #: includes/admin/class-wc-settings-jetpack.php:498
144
+ #: includes/admin/class-wc-settings-jetpack.php:1051
145
+ #: includes/class-wcj-purchase-data.php:121
146
  msgid "Import"
147
  msgstr ""
148
 
149
+ #: includes/admin/class-wc-settings-jetpack.php:500
150
  msgid "Import all Booster's options from a file."
151
  msgstr ""
152
 
153
+ #: includes/admin/class-wc-settings-jetpack.php:504
154
  msgid ""
155
  "This will reset settings to defaults for all Booster modules. Are you sure?"
156
  msgstr ""
157
 
158
+ #: includes/admin/class-wc-settings-jetpack.php:505
159
+ #: includes/admin/class-wc-settings-jetpack.php:1071
160
  msgid "Reset"
161
  msgstr ""
162
 
163
+ #: includes/admin/class-wc-settings-jetpack.php:506
164
  msgid "Reset all Booster's options."
165
  msgstr ""
166
 
167
+ #: includes/admin/class-wc-settings-jetpack.php:510
168
  msgid "This will delete all Booster meta. Are you sure?"
169
  msgstr ""
170
 
171
+ #: includes/admin/class-wc-settings-jetpack.php:511
172
+ #: includes/admin/class-wc-settings-jetpack.php:1080
173
  msgid "Reset meta"
174
  msgstr ""
175
 
176
+ #: includes/admin/class-wc-settings-jetpack.php:512
177
  msgid "Reset all Booster's meta."
178
  msgstr ""
179
 
180
+ #: includes/admin/class-wc-settings-jetpack.php:565
181
  msgid "Version"
182
  msgstr ""
183
 
184
+ #: includes/admin/class-wc-settings-jetpack.php:592
185
+ #: includes/admin/class-wc-settings-jetpack.php:601
186
  msgid "Select All"
187
  msgstr ""
188
 
189
+ #: includes/admin/class-wc-settings-jetpack.php:594
190
+ #: includes/admin/class-wc-settings-jetpack.php:602
191
  msgid "Module"
192
  msgstr ""
193
 
194
+ #: includes/admin/class-wc-settings-jetpack.php:596
195
+ #: includes/admin/class-wc-settings-jetpack.php:605
196
  #: includes/export/class-wcj-export-fields-helper.php:297
197
+ #: includes/gateways/class-wc-gateway-wcj-custom-template.php:67
198
  #: includes/settings/wcj-settings-checkout-custom-fields.php:181
199
  #: includes/settings/wcj-settings-eu-vat-number.php:37
200
  #: includes/settings/wcj-settings-product-by-user.php:16
201
  #: includes/shortcodes/class-wcj-products-add-form-shortcodes.php:190
202
+ #: includes/shortcodes/class-wcj-products-add-form-shortcodes.php:369
203
  msgid "Description"
204
  msgstr ""
205
 
206
+ #: includes/admin/class-wc-settings-jetpack.php:642
207
+ #: includes/admin/class-wc-settings-jetpack.php:1089
208
  #: includes/class-wcj-admin-bar.php:188
209
+ #: includes/classes/class-wcj-module.php:1038
210
  msgid "Documentation"
211
  msgstr ""
212
 
213
+ #: includes/admin/class-wc-settings-jetpack.php:653
214
  msgid "No active modules found."
215
  msgstr ""
216
 
217
+ #: includes/admin/class-wc-settings-jetpack.php:659
218
  msgid "Total Modules:"
219
  msgstr ""
220
 
221
+ #: includes/admin/class-wc-settings-jetpack.php:723
222
  msgid "Autoload Booster's Options"
223
  msgstr ""
224
 
225
+ #: includes/admin/class-wc-settings-jetpack.php:725
226
  msgid ""
227
  "Choose if you want Booster's options to be autoloaded when calling "
228
  "add_option. After saving this option, you need to Reset all Booster's "
229
  "settings. Leave default value (i.e. Enabled) if not sure."
230
  msgstr ""
231
 
232
+ #: includes/admin/class-wc-settings-jetpack.php:730
233
  msgid "Load Modules on Init Hook"
234
  msgstr ""
235
 
236
+ #: includes/admin/class-wc-settings-jetpack.php:732
237
  msgid "Choose if you want to load Booster Modules on Init hook."
238
  msgstr ""
239
 
240
+ #: includes/admin/class-wc-settings-jetpack.php:732
241
  msgid ""
242
  "It will load the locale appropriately if users change it from the profile "
243
  "page."
244
  msgstr ""
245
 
246
+ #: includes/admin/class-wc-settings-jetpack.php:737
247
  msgid "Use List Instead of Comma Separated Text for Products in Settings"
248
  msgstr ""
249
 
250
+ #: includes/admin/class-wc-settings-jetpack.php:741
251
+ #: includes/admin/class-wc-settings-jetpack.php:762
252
+ #: includes/admin/class-wc-settings-jetpack.php:778
253
  #, php-format
254
  msgid "Supported modules: %s."
255
  msgstr ""
256
 
257
+ #: includes/admin/class-wc-settings-jetpack.php:745
258
  #: includes/class-wcj-payment-gateways-per-category.php:31
259
  msgid "Gateways per Product or Category"
260
  msgstr ""
261
 
262
+ #: includes/admin/class-wc-settings-jetpack.php:746
263
  #: includes/class-wcj-global-discount.php:38
264
  #: includes/settings/wcj-settings-product-addons.php:275
265
  msgid "Global Discount"
266
  msgstr ""
267
 
268
+ #: includes/admin/class-wc-settings-jetpack.php:747
269
+ #: includes/admin/class-wc-settings-jetpack.php:766
270
+ #: includes/admin/class-wc-settings-jetpack.php:782
271
  #: includes/class-wcj-product-custom-info.php:29
272
+ #: includes/functions/wcj-functions-general.php:485
273
  msgid "Product Info"
274
  msgstr ""
275
 
276
+ #: includes/admin/class-wc-settings-jetpack.php:748
277
  #: includes/admin/wcj-welcome-screen-content.php:82
278
  #: includes/class-wcj-product-input-fields.php:29
279
  #: includes/input-fields/class-wcj-product-input-fields-core.php:214
280
  msgid "Product Input Fields"
281
  msgstr ""
282
 
283
+ #: includes/admin/class-wc-settings-jetpack.php:749
284
  msgid "Products XML"
285
  msgstr ""
286
 
287
+ #: includes/admin/class-wc-settings-jetpack.php:750
288
+ #: includes/class-wcj-related-products.php:30
289
  #: includes/settings/meta-box/wcj-settings-meta-box-related-products.php:33
290
  #: includes/settings/wcj-settings-free-price.php:23
291
  msgid "Related Products"
292
  msgstr ""
293
 
294
+ #: includes/admin/class-wc-settings-jetpack.php:758
295
  msgid ""
296
  "Use List Instead of Comma Separated Text for Products Categories in Settings"
297
  msgstr ""
298
 
299
+ #: includes/admin/class-wc-settings-jetpack.php:774
300
  msgid "Use List Instead of Comma Separated Text for Products Tags in Settings"
301
  msgstr ""
302
 
303
+ #: includes/admin/class-wc-settings-jetpack.php:810
304
  #: includes/core/class-wcj-admin.php:124
305
  msgid "Booster for WooCommerce"
306
  msgstr ""
307
 
308
+ #: includes/admin/class-wc-settings-jetpack.php:901
309
  msgid "Need Help?"
310
  msgstr ""
311
 
312
+ #: includes/admin/class-wc-settings-jetpack.php:928
313
  #: includes/class-wcj-my-account.php:32
314
  msgid "My Account"
315
  msgstr ""
316
 
317
+ #: includes/admin/class-wc-settings-jetpack.php:932
318
  msgid "Get Booster Plus"
319
  msgstr ""
320
 
321
+ #: includes/admin/class-wc-settings-jetpack.php:939
322
  msgid "Getting Started"
323
  msgstr ""
324
 
325
+ #: includes/admin/class-wc-settings-jetpack.php:943
326
  msgid "Navigating Categories"
327
  msgstr ""
328
 
329
+ #: includes/admin/class-wc-settings-jetpack.php:944
330
  msgid "How to get started with booster"
331
  msgstr ""
332
 
333
+ #: includes/admin/class-wc-settings-jetpack.php:949
334
  msgid "Frequently Asked Questions"
335
  msgstr ""
336
 
337
+ #: includes/admin/class-wc-settings-jetpack.php:954
338
  msgid "Do I need to have coding skills to use Booster Plus?"
339
  msgstr ""
340
 
341
+ #: includes/admin/class-wc-settings-jetpack.php:958
342
  msgid ""
343
  "Absolutely not. You can configure pretty much everything Booster Plus has to "
344
  "offer without any coding knowledge."
345
  msgstr ""
346
 
347
+ #: includes/admin/class-wc-settings-jetpack.php:963
348
  msgid "Will Booster Plus slow down my website?"
349
  msgstr ""
350
 
351
+ #: includes/admin/class-wc-settings-jetpack.php:967
352
  msgid ""
353
  "Absolutely not. Booster Plus is carefully built with performance in mind."
354
  msgstr ""
355
 
356
+ #: includes/admin/class-wc-settings-jetpack.php:972
357
  msgid "Do you offer refunds?"
358
  msgstr ""
359
 
360
+ #: includes/admin/class-wc-settings-jetpack.php:976
361
  #, php-format
362
  msgid ""
363
  "If you are not completely satisfied with Booster Plus within the fist 30 "
365
  "no questions asked."
366
  msgstr ""
367
 
368
+ #: includes/admin/class-wc-settings-jetpack.php:981
369
  msgid "Can I use Booster Plus on client sites?"
370
  msgstr ""
371
 
372
+ #: includes/admin/class-wc-settings-jetpack.php:985
373
  msgid ""
374
  "Yes, you can use Booster Plus on client sites. You can purchase the multiple "
375
  "sites license of Booster Plus."
376
  msgstr ""
377
 
378
+ #: includes/admin/class-wc-settings-jetpack.php:990
379
  msgid "Do you have an affiliate program?"
380
  msgstr ""
381
 
382
+ #: includes/admin/class-wc-settings-jetpack.php:994
383
  msgid "Yes, We do have an affiliate program. "
384
  msgstr ""
385
 
386
+ #: includes/admin/class-wc-settings-jetpack.php:994
387
  msgid "Click here"
388
  msgstr ""
389
 
390
+ #: includes/admin/class-wc-settings-jetpack.php:994
391
  msgid " for the details."
392
  msgstr ""
393
 
394
+ #: includes/admin/class-wc-settings-jetpack.php:999
395
  msgid ""
396
  "Why should I choose the Booster Plus suite over other individual plugins?"
397
  msgstr ""
398
 
399
+ #: includes/admin/class-wc-settings-jetpack.php:1003
400
  msgid ""
401
  "Oh, that's an easy one! Implementing just a few modules from the Booster Plus "
402
  "suite is more cost-effective than using dozens of individual plugins often "
408
  "your WooCommerce site easily."
409
  msgstr ""
410
 
411
+ #: includes/admin/class-wc-settings-jetpack.php:1008
412
  msgid "What features does Booster Plus have?"
413
  msgstr ""
414
 
415
+ #: includes/admin/class-wc-settings-jetpack.php:1012
416
  msgid "You can see all the features at "
417
  msgstr ""
418
 
419
+ #: includes/admin/class-wc-settings-jetpack.php:1012
420
  msgid "About Booster"
421
  msgstr ""
422
 
423
+ #: includes/admin/class-wc-settings-jetpack.php:1012
424
  msgid " page."
425
  msgstr ""
426
 
427
+ #: includes/admin/class-wc-settings-jetpack.php:1016
428
  msgid "Still have a question?"
429
  msgstr ""
430
 
431
+ #: includes/admin/class-wc-settings-jetpack.php:1017
432
  msgid "CONTACT BOOSTER SUPPORT"
433
  msgstr ""
434
 
435
+ #: includes/admin/class-wc-settings-jetpack.php:1023
436
  msgid "Connect with Booster"
437
  msgstr ""
438
 
439
+ #: includes/admin/class-wc-settings-jetpack.php:1027
440
  msgid "BOOSTER WEBSITE"
441
  msgstr ""
442
 
443
+ #: includes/admin/class-wc-settings-jetpack.php:1041
444
+ #: includes/class-wcj-general.php:250 includes/class-wcj-product-by-user.php:276
445
  #: includes/settings/wcj-settings-pdf-invoicing-advanced.php:166
446
  #: includes/tools/class-wcj-order-statuses-tool.php:191
447
  #: includes/tools/class-wcj-order-statuses-tool.php:285
448
  msgid "Actions"
449
  msgstr ""
450
 
451
+ #: includes/admin/class-wc-settings-jetpack.php:1052
452
  msgid "Import Booster options"
453
  msgstr ""
454
 
455
+ #: includes/admin/class-wc-settings-jetpack.php:1061
456
  msgid "Export Booster options"
457
  msgstr ""
458
 
459
+ #: includes/admin/class-wc-settings-jetpack.php:1072
460
  msgid "Reset all Booster's options"
461
  msgstr ""
462
 
463
+ #: includes/admin/class-wc-settings-jetpack.php:1081
464
  msgid "Reset all Booster's meta"
465
  msgstr ""
466
 
467
+ #: includes/admin/class-wc-settings-jetpack.php:1096
468
  msgid "Here you can find all documentation of Booster"
469
  msgstr ""
470
 
471
+ #: includes/admin/class-wc-settings-jetpack.php:1098
472
  msgid "See Documentation"
473
  msgstr ""
474
 
475
+ #: includes/admin/class-wc-settings-jetpack.php:1105
476
  msgid "Latest updates"
477
  msgstr ""
478
 
479
+ #: includes/admin/class-wc-settings-jetpack.php:1108
480
  msgid "Version "
481
  msgstr ""
482
 
483
+ #: includes/admin/class-wc-settings-jetpack.php:1113
484
  msgid "SEE MORE"
485
  msgstr ""
486
 
487
+ #: includes/admin/class-wc-settings-jetpack.php:1124
488
  #: includes/core/class-wcj-admin.php:98
489
  msgid "Please rate "
490
  msgstr ""
491
 
492
+ #: includes/admin/class-wc-settings-jetpack.php:1124
493
  #: includes/core/class-wcj-admin.php:98
494
  msgid "Booster for Woocommerce"
495
  msgstr ""
496
 
497
+ #: includes/admin/class-wc-settings-jetpack.php:1132
498
  #: includes/core/class-wcj-admin.php:106
499
  msgid "WordPress.org"
500
  msgstr ""
501
 
502
+ #: includes/admin/class-wc-settings-jetpack.php:1132
503
  #: includes/core/class-wcj-admin.php:106
504
  msgid " to help us spread the word. Thank you from Booster team!"
505
  msgstr ""
506
 
507
+ #: includes/admin/class-wc-settings-jetpack.php:1136
508
  msgid "Upgrade today to unlock these popular premium features:"
509
  msgstr ""
510
 
511
+ #: includes/admin/class-wc-settings-jetpack.php:1138
512
  msgid "+ PDF Invoices and Packing slips –"
513
  msgstr ""
514
 
515
+ #: includes/admin/class-wc-settings-jetpack.php:1138
516
  msgid ""
517
  "Add ability to create Proforma Invoices, Credit Notes and Packaging slips"
518
  msgstr ""
519
 
520
+ #: includes/admin/class-wc-settings-jetpack.php:1139
521
  msgid "+ Empty Cart –"
522
  msgstr ""
523
 
524
+ #: includes/admin/class-wc-settings-jetpack.php:1139
525
  msgid ""
526
  "customize empty cart button text, different button positions on cart page"
527
  msgstr ""
528
 
529
+ #: includes/admin/class-wc-settings-jetpack.php:1140
530
  msgid "+ Cart and checkout –"
531
  msgstr ""
532
 
533
+ #: includes/admin/class-wc-settings-jetpack.php:1140
534
  msgid "add multiple – custom fields, custom info blocks, check out file uploads"
535
  msgstr ""
536
 
537
+ #: includes/admin/class-wc-settings-jetpack.php:1141
538
  msgid "+ Mini cart –"
539
  msgstr ""
540
 
541
+ #: includes/admin/class-wc-settings-jetpack.php:1141
542
  msgid "More custom information options"
543
  msgstr ""
544
 
545
+ #: includes/admin/class-wc-settings-jetpack.php:1142
546
  msgid "+ Prices and currencies –"
547
  msgstr ""
548
 
549
+ #: includes/admin/class-wc-settings-jetpack.php:1142
550
  msgid "add more unlimited number of currencies to WooCommerce"
551
  msgstr ""
552
 
553
+ #: includes/admin/class-wc-settings-jetpack.php:1143
554
  msgid "+ Export options –"
555
  msgstr ""
556
 
557
+ #: includes/admin/class-wc-settings-jetpack.php:1143
558
  msgid "more fields enabled"
559
  msgstr ""
560
 
561
+ #: includes/admin/class-wc-settings-jetpack.php:1144
562
  msgid "+ Add to cart –"
563
  msgstr ""
564
 
565
+ #: includes/admin/class-wc-settings-jetpack.php:1144
566
  msgid ""
567
  "customize add to cart messages, Button labels - multiple category groups "
568
  "allowed+ +"
569
  msgstr ""
570
 
571
+ #: includes/admin/class-wc-settings-jetpack.php:1145
572
  msgid "+ More configuration options for payments and shipping"
573
  msgstr ""
574
 
575
+ #: includes/admin/class-wc-settings-jetpack.php:1148
576
  msgid "Upgrade to Booster Plus"
577
  msgstr ""
578
 
585
  msgid "Doesn't apply rounding, offset etc."
586
  msgstr ""
587
 
588
+ #: includes/admin/class-wcj-settings-custom-fields.php:348
589
  msgid "Save changes"
590
  msgstr ""
591
 
592
+ #: includes/admin/class-wcj-settings-manager.php:76
593
  msgid "Please upload a file to import!"
594
  msgstr ""
595
 
596
+ #: includes/admin/class-wcj-settings-manager.php:92
597
+ #: includes/admin/class-wcj-settings-manager.php:97
598
  msgid "Wrong file format!"
599
  msgstr ""
600
 
601
+ #: includes/admin/class-wcj-settings-manager.php:107
602
  #, php-format
603
  msgid "%d options successfully imported."
604
  msgstr ""
605
 
606
+ #: includes/admin/class-wcj-settings-manager.php:167
607
  #, php-format
608
  msgid "%d meta successfully deleted."
609
  msgstr ""
610
 
611
+ #: includes/admin/class-wcj-settings-manager.php:186
612
  #, php-format
613
  msgid "%d options successfully deleted."
614
  msgstr ""
615
 
616
+ #: includes/admin/class-wcj-tools.php:57
617
  msgid "Booster for WooCommerce Tools"
618
  msgstr ""
619
 
620
+ #: includes/admin/class-wcj-tools.php:58
621
  msgid "Booster Tools"
622
  msgstr ""
623
 
624
+ #: includes/admin/class-wcj-tools.php:79
625
  msgid "Tools Dashboard"
626
  msgstr ""
627
 
628
+ #: includes/admin/class-wcj-tools.php:106
629
  msgid "Booster for WooCommerce Tools - Dashboard"
630
  msgstr ""
631
 
632
+ #: includes/admin/class-wcj-tools.php:107
633
  msgid ""
634
  "This dashboard lets you check statuses and short descriptions of all "
635
  "available Booster for WooCommerce tools. Tools can be enabled through "
637
  "above."
638
  msgstr ""
639
 
640
+ #: includes/admin/class-wcj-welcome.php:53
641
+ #: includes/admin/class-wcj-welcome.php:54
642
  msgid "Welcome to Booster"
643
  msgstr ""
644
 
670
 
671
  #: includes/admin/wcj-modules-cats.php:61 includes/class-wcj-admin-bar.php:493
672
  #: includes/class-wcj-admin-bar.php:497 includes/class-wcj-admin-bar.php:543
673
+ #: includes/class-wcj-product-bulk-meta-editor.php:299
674
  #: includes/class-wcj-product-by-user.php:176
675
  #: includes/class-wcj-product-by-user.php:213
676
  #: includes/class-wcj-shipping-by-products.php:40
993
 
994
  #: includes/class-wcj-admin-bar.php:267 includes/class-wcj-admin-bar.php:311
995
  #: includes/class-wcj-admin-bar.php:659
996
+ #: includes/classes/class-wcj-module.php:856
997
  #: includes/settings/wcj-settings-wpml.php:97
998
  msgid "Tools"
999
  msgstr ""
1058
  #: includes/class-wcj-admin-bar.php:418 includes/class-wcj-admin-bar.php:422
1059
  #: includes/class-wcj-admin-bar.php:440 includes/class-wcj-my-account.php:40
1060
  #: includes/class-wcj-my-account.php:48 includes/class-wcj-orders.php:31
1061
+ #: includes/reports/class-wcj-reports-sales-gateways.php:179
1062
  #: includes/settings/wcj-settings-reports.php:24
1063
  #: includes/settings/wcj-settings-reports.php:62
1064
  #: includes/settings/wcj-settings-reports.php:103
1111
  msgid "Most Stocked"
1112
  msgstr ""
1113
 
1114
+ #: includes/class-wcj-admin-bar.php:477 includes/class-wcj-eu-vat-number.php:240
1115
  msgid "Taxes"
1116
  msgstr ""
1117
 
1127
  msgid "Add product"
1128
  msgstr ""
1129
 
1130
+ #: includes/class-wcj-admin-bar.php:505 includes/class-wcj-sku.php:708
1131
  #: includes/export/class-wcj-export-fields-helper.php:322
1132
  #: includes/settings/wcj-settings-product-by-user.php:22
1133
  #: includes/shortcodes/class-wcj-products-add-form-shortcodes.php:196
1134
+ #: includes/shortcodes/class-wcj-products-add-form-shortcodes.php:433
1135
  msgid "Categories"
1136
  msgstr ""
1137
 
1139
  #: includes/export/class-wcj-export-fields-helper.php:323
1140
  #: includes/settings/wcj-settings-product-by-user.php:23
1141
  #: includes/shortcodes/class-wcj-products-add-form-shortcodes.php:197
1142
+ #: includes/shortcodes/class-wcj-products-add-form-shortcodes.php:443
1143
  msgid "Tags"
1144
  msgstr ""
1145
 
1284
  msgid "Not Completed"
1285
  msgstr ""
1286
 
1287
+ #: includes/class-wcj-admin-orders-list.php:266
1288
  msgid "Trash"
1289
  msgstr ""
1290
 
1291
+ #: includes/class-wcj-admin-orders-list.php:359
1292
+ #: includes/class-wcj-product-by-country.php:194
1293
+ #: includes/class-wcj-product-by-country.php:230
1294
  msgid "All countries"
1295
  msgstr ""
1296
 
1297
+ #: includes/class-wcj-admin-orders-list.php:368
1298
  msgid "All currencies"
1299
  msgstr ""
1300
 
1301
+ #: includes/class-wcj-admin-orders-list.php:411
1302
  #: includes/export/class-wcj-export-fields-helper.php:52
1303
  #: includes/export/class-wcj-export-fields-helper.php:136
1304
  #: includes/export/class-wcj-export-fields-helper.php:219
1306
  msgid "Billing Country"
1307
  msgstr ""
1308
 
1309
+ #: includes/class-wcj-admin-orders-list.php:414
1310
  #: includes/settings/wcj-settings-admin-orders-list.php:37
1311
  msgid "Currency Code"
1312
  msgstr ""
1357
  msgid "Order Meta"
1358
  msgstr ""
1359
 
1360
+ #: includes/class-wcj-admin-tools.php:249
1361
  msgid "Order Items Meta"
1362
  msgstr ""
1363
 
1364
+ #: includes/class-wcj-admin-tools.php:251
1365
  msgid "Item Key"
1366
  msgstr ""
1367
 
1368
+ #: includes/class-wcj-admin-tools.php:251
1369
  msgid "Item Meta Key"
1370
  msgstr ""
1371
 
1372
+ #: includes/class-wcj-admin-tools.php:251
1373
  msgid "Item Meta Value"
1374
  msgstr ""
1375
 
1376
+ #: includes/class-wcj-admin-tools.php:299 includes/class-wcj-admin-tools.php:344
1377
+ #: includes/class-wcj-admin-tools.php:354
1378
+ #: includes/class-wcj-product-bulk-meta-editor.php:390
1379
+ #: includes/class-wcj-sku.php:707
1380
+ #: includes/reports/class-wcj-reports-sales.php:210
1381
  #: includes/reports/class-wcj-reports-stock.php:289
1382
  msgid "Product"
1383
  msgstr ""
1384
 
1385
+ #: includes/class-wcj-admin-tools.php:300 includes/class-wcj-admin-tools.php:345
1386
+ #: includes/class-wcj-admin-tools.php:355
1387
  #: includes/reports/class-wcj-reports-stock.php:290
1388
  msgid "Category"
1389
  msgstr ""
1390
 
1391
+ #: includes/class-wcj-admin-tools.php:373
1392
  msgid "Total Products:"
1393
  msgstr ""
1394
 
1682
 
1683
  #: includes/class-wcj-coupon-by-user-role.php:94
1684
  #: includes/class-wcj-coupon-by-user-role.php:95
1685
+ #: includes/class-wcj-coupon-by-user-role.php:116
1686
  #: includes/class-wcj-coupon-by-user-role.php:117
 
1687
  #: includes/settings/wcj-settings-coupon-by-user-role.php:71
1688
  msgid "Coupon is not valid for your user role."
1689
  msgstr ""
1932
  "currency rate with real conversion then enable it"
1933
  msgstr ""
1934
 
1935
+ #: includes/class-wcj-currency-exchange-rates.php:225
1936
  #: includes/settings/wcj-settings-currency-exchange-rates.php:52
1937
  msgid "Exchange Rates Server"
1938
  msgstr ""
1939
 
1940
+ #: includes/class-wcj-currency-exchange-rates.php:231
1941
  #, php-format
1942
  msgid "Use default: %s"
1943
  msgstr ""
1944
 
1945
+ #: includes/class-wcj-currency-exchange-rates.php:258
1946
  msgid "Exchange Rates Offset (Percent)"
1947
  msgstr ""
1948
 
1949
+ #: includes/class-wcj-currency-exchange-rates.php:264
1950
  #, php-format
1951
  msgid "Use default: %s%%"
1952
  msgstr ""
1953
 
1954
+ #: includes/class-wcj-currency-exchange-rates.php:265
1955
  msgid "Custom offset"
1956
  msgstr ""
1957
 
1958
+ #: includes/class-wcj-currency-exchange-rates.php:269
1959
  msgid "Custom offset (Percent)"
1960
  msgstr ""
1961
 
1962
+ #: includes/class-wcj-currency-exchange-rates.php:270
1963
  msgid "Used when \"Custom offset\" option is selected above."
1964
  msgstr ""
1965
 
2270
  msgstr ""
2271
 
2272
  #: includes/class-wcj-eu-vat-number.php:30
2273
+ #: includes/class-wcj-eu-vat-number.php:338
2274
  #: includes/settings/wcj-settings-eu-vat-number.php:25
2275
  #: includes/settings/wcj-settings-eu-vat-number.php:32
2276
  msgid "EU VAT Number"
2298
  msgid "Add all EU countries VAT standard rates to WooCommerce."
2299
  msgstr ""
2300
 
2301
+ #: includes/class-wcj-eu-vat-number.php:228
2302
  msgid "Customer IP"
2303
  msgstr ""
2304
 
2305
+ #: includes/class-wcj-eu-vat-number.php:232 includes/class-wcj-orders.php:170
2306
  #: includes/settings/wcj-settings-orders.php:129
2307
  #: includes/settings/wcj-settings-payment-gateways-by-country.php:30
2308
  msgid "Country by IP"
2309
  msgstr ""
2310
 
2311
+ #: includes/class-wcj-eu-vat-number.php:236
2312
  msgid "Customer EU VAT Number"
2313
  msgstr ""
2314
 
2315
+ #: includes/class-wcj-eu-vat-number.php:452
2316
  #: includes/settings/wcj-settings-eu-vat-number.php:169
2317
  msgid "Validating VAT. Please wait..."
2318
  msgstr ""
2319
 
2320
+ #: includes/class-wcj-eu-vat-number.php:453
2321
  #: includes/settings/wcj-settings-eu-vat-number.php:176
2322
  msgid "VAT is valid."
2323
  msgstr ""
2324
 
2325
+ #: includes/class-wcj-eu-vat-number.php:454
2326
  #: includes/settings/wcj-settings-eu-vat-number.php:183
2327
  msgid "VAT is not valid."
2328
  msgstr ""
2329
 
2330
+ #: includes/class-wcj-eu-vat-number.php:455
2331
  #: includes/settings/wcj-settings-eu-vat-number.php:191
2332
  msgid "Validation failed. Please try again."
2333
  msgstr ""
2334
 
2335
+ #: includes/class-wcj-eu-vat-number.php:595
2336
  msgid "<strong>Billing EU VAT Number</strong>is a required field."
2337
  msgstr ""
2338
 
2339
+ #: includes/class-wcj-eu-vat-number.php:614
2340
  #: includes/settings/wcj-settings-eu-vat-number.php:78
2341
  msgid "<strong>EU VAT Number</strong> is not valid."
2342
  msgstr ""
2398
  msgid "Export Products."
2399
  msgstr ""
2400
 
2401
+ #: includes/class-wcj-export-import.php:243
2402
+ #: includes/class-wcj-export-import.php:249
2403
  msgid "Filter by Billing Country"
2404
  msgstr ""
2405
 
2406
+ #: includes/class-wcj-export-import.php:244
2407
  msgid "Filter by Product Title"
2408
  msgstr ""
2409
 
2410
+ #: includes/class-wcj-export-import.php:263
2411
+ #: includes/reports/class-wcj-reports-product-sales-daily.php:218
2412
+ #: includes/reports/class-wcj-reports-sales-gateways.php:162
2413
  #: includes/settings/wcj-settings-orders.php:48
2414
  msgid "Filter"
2415
  msgstr ""
2416
 
2417
+ #: includes/class-wcj-export-import.php:292
2418
  #: includes/class-wcj-track-users.php:45
2419
  msgid "All time"
2420
  msgstr ""
2421
 
2422
+ #: includes/class-wcj-export-import.php:311
2423
  msgid "Custom:"
2424
  msgstr ""
2425
 
2426
+ #: includes/class-wcj-export-import.php:317
2427
  msgid "Go"
2428
  msgstr ""
2429
 
2476
  msgstr ""
2477
 
2478
  #: includes/class-wcj-general.php:250 includes/class-wcj-general.php:272
2479
+ #: includes/class-wcj-sku.php:706
2480
+ #: includes/reports/class-wcj-reports-sales.php:209
2481
  #: includes/settings/wcj-settings-cross-sells.php:46
2482
  #: includes/settings/wcj-settings-order-numbers.php:172
2483
  #: includes/settings/wcj-settings-product-by-user.php:175
2488
  msgstr ""
2489
 
2490
  #: includes/class-wcj-general.php:250 includes/class-wcj-general.php:273
2491
+ #: includes/class-wcj-offer-price.php:167
2492
  #: includes/export/class-wcj-export-fields-helper.php:287
2493
+ #: includes/tools/class-wcj-eu-countries-vat-rates-tool.php:90
2494
+ #: includes/tools/class-wcj-eu-countries-vat-rates-tool.php:135
2495
  msgid "Name"
2496
  msgstr ""
2497
 
2500
  msgstr ""
2501
 
2502
  #: includes/class-wcj-general.php:264
2503
+ #: includes/class-wcj-payment-gateways.php:135
2504
+ #: includes/class-wcj-product-bulk-meta-editor.php:418
2505
+ #: includes/class-wcj-product-by-user.php:301
2506
  #: includes/pdf-invoices/submodules/class-wcj-pdf-invoicing-display.php:163
2507
  #: includes/pdf-invoices/submodules/class-wcj-pdf-invoicing-display.php:387
2508
+ #: includes/shortcodes/class-wcj-products-add-form-shortcodes.php:391
2509
  #: includes/tools/class-wcj-order-statuses-tool.php:213
2510
  msgid "Delete"
2511
  msgstr ""
2562
  msgstr ""
2563
 
2564
  #: includes/class-wcj-max-products-per-user.php:139
2565
+ #: includes/class-wcj-max-products-per-user.php:387
2566
  #: includes/settings/wcj-settings-max-products-per-user.php:77
2567
  msgid ""
2568
  "You can only buy maximum %max_qty% pcs. of %product_title% (you already "
2569
  "bought %qty_already_bought% pcs.)."
2570
  msgstr ""
2571
 
2572
+ #: includes/class-wcj-max-products-per-user.php:159
2573
  msgid "Data re-calculated."
2574
  msgstr ""
2575
 
2576
+ #: includes/class-wcj-max-products-per-user.php:161
2577
  #, php-format
2578
  msgid "%s order(s) processed."
2579
  msgstr ""
2580
 
2581
+ #: includes/class-wcj-max-products-per-user.php:219
2582
  msgid "Maximum Products per User: Sales Data"
2583
  msgstr ""
2584
 
2585
+ #: includes/class-wcj-max-products-per-user.php:237
2586
  msgid "User ID"
2587
  msgstr ""
2588
 
2589
+ #: includes/class-wcj-max-products-per-user.php:237
2590
  msgid "User Name"
2591
  msgstr ""
2592
 
2593
+ #: includes/class-wcj-max-products-per-user.php:237
2594
  msgid "Qty Bought"
2595
  msgstr ""
2596
 
2597
+ #: includes/class-wcj-max-products-per-user.php:240
2598
  #: includes/functions/wcj-functions-users.php:179
2599
  #: includes/functions/wcj-functions-users.php:215
2600
  msgid "Guest"
2723
  msgid "Lost password"
2724
  msgstr ""
2725
 
2726
+ #: includes/class-wcj-my-account.php:335
2727
  #, php-format
2728
  msgid "Hello %1$s (not %1$s? <a href=\"%2$s\">Log out</a>)"
2729
  msgstr ""
2730
 
2731
+ #: includes/class-wcj-my-account.php:346
2732
  #, php-format
2733
  msgid ""
2734
  "From your account dashboard you can view your <a href=\"%1$s\">recent orders</"
2736
  "href=\"%3$s\">edit your password and account details</a>."
2737
  msgstr ""
2738
 
2739
+ #: includes/class-wcj-my-account.php:456
2740
  msgid "User role"
2741
  msgstr ""
2742
 
2754
  msgid "Let your customers suggest their price for products."
2755
  msgstr ""
2756
 
2757
+ #: includes/class-wcj-offer-price.php:148
2758
  msgid "Booster: Offer Price History"
2759
  msgstr ""
2760
 
2761
+ #: includes/class-wcj-offer-price.php:164
2762
  #: includes/settings/wcj-settings-cross-sells.php:47
2763
  #: includes/settings/wcj-settings-order-numbers.php:173
2764
  #: includes/settings/wcj-settings-products-xml.php:244
2767
  msgid "Date"
2768
  msgstr ""
2769
 
2770
+ #: includes/class-wcj-offer-price.php:165
2771
  #: includes/export/class-wcj-export-fields-helper.php:293
2772
  #: includes/reports/class-wcj-reports-stock.php:291
2773
  #: includes/settings/meta-box/wcj-settings-meta-box-wholesale-price.php:71
2778
  msgid "Price"
2779
  msgstr ""
2780
 
2781
+ #: includes/class-wcj-offer-price.php:166
2782
  #: includes/settings/wcj-settings-coupon-by-user-role.php:63
2783
  #: includes/settings/wcj-settings-currency-per-product.php:38
2784
  #: includes/settings/wcj-settings-currency-per-product.php:45
2788
  msgid "Message"
2789
  msgstr ""
2790
 
2791
+ #: includes/class-wcj-offer-price.php:168
2792
  #: includes/export/class-wcj-export-fields-helper.php:83
2793
  #: includes/input-fields/wcj-product-input-fields-options.php:47
2794
  #: includes/reports/class-wcj-reports-customers.php:101
2796
  msgid "Email"
2797
  msgstr ""
2798
 
2799
+ #: includes/class-wcj-offer-price.php:169
2800
  #: includes/export/class-wcj-export-fields-helper.php:82
2801
  msgid "Customer ID"
2802
  msgstr ""
2803
 
2804
+ #: includes/class-wcj-offer-price.php:170
2805
  msgid "User IP"
2806
  msgstr ""
2807
 
2808
+ #: includes/class-wcj-offer-price.php:171
2809
  msgid "User Agent"
2810
  msgstr ""
2811
 
2812
+ #: includes/class-wcj-offer-price.php:172
2813
  msgid "Sent to"
2814
  msgstr ""
2815
 
2816
+ #: includes/class-wcj-offer-price.php:185
2817
  msgid "No price offers yet."
2818
  msgstr ""
2819
 
2820
+ #: includes/class-wcj-offer-price.php:249
2821
  #, php-format
2822
  msgid "Average offer: %1$s (from %2$s offer(s))"
2823
  msgstr ""
2824
 
2825
+ #: includes/class-wcj-offer-price.php:258
2826
  msgid "Update product after checking the box."
2827
  msgstr ""
2828
 
2829
+ #: includes/class-wcj-offer-price.php:339
2830
  #: includes/settings/wcj-settings-offer-price.php:169
2831
  #, php-format
2832
  msgid "Your price (%s)"
2833
  msgstr ""
2834
 
2835
+ #: includes/class-wcj-offer-price.php:346
2836
  #: includes/settings/wcj-settings-offer-price.php:241
2837
  #, php-format
2838
  msgid "Suggest your price for %s"
2839
  msgstr ""
2840
 
2841
+ #: includes/class-wcj-offer-price.php:404
2842
  #: includes/settings/wcj-settings-offer-price.php:208
2843
  msgid "Your email"
2844
  msgstr ""
2845
 
2846
+ #: includes/class-wcj-offer-price.php:408
2847
  #: includes/settings/wcj-settings-offer-price.php:216
2848
  msgid "Your name"
2849
  msgstr ""
2850
 
2851
+ #: includes/class-wcj-offer-price.php:412
2852
  #: includes/settings/wcj-settings-offer-price.php:224
2853
  msgid "Your message"
2854
  msgstr ""
2855
 
2856
+ #: includes/class-wcj-offer-price.php:416
2857
  #: includes/settings/wcj-settings-offer-price.php:248
2858
  msgid "Send"
2859
  msgstr ""
2860
 
2861
+ #: includes/class-wcj-offer-price.php:418
2862
  #: includes/settings/wcj-settings-offer-price.php:232
2863
  msgid "Send a copy to your email"
2864
  msgstr ""
2865
 
2866
+ #: includes/class-wcj-offer-price.php:488
2867
  #: includes/settings/wcj-settings-offer-price.php:72
2868
  msgid "Make an offer"
2869
  msgstr ""
2870
 
2871
+ #: includes/class-wcj-offer-price.php:553
2872
  #: includes/settings/wcj-settings-offer-price.php:352
2873
  #, php-format
2874
  msgid "Product: %s"
2875
  msgstr ""
2876
 
2877
+ #: includes/class-wcj-offer-price.php:555
2878
  #: includes/settings/wcj-settings-offer-price.php:354
2879
  #, php-format
2880
  msgid "Offered price: %s"
2881
  msgstr ""
2882
 
2883
+ #: includes/class-wcj-offer-price.php:557
2884
  #: includes/settings/wcj-settings-offer-price.php:356
2885
  #, php-format
2886
  msgid "From: %1$s %2$s"
2887
  msgstr ""
2888
 
2889
+ #: includes/class-wcj-offer-price.php:559
2890
  #: includes/settings/wcj-settings-offer-price.php:358
2891
  #, php-format
2892
  msgid "Message: %s"
2893
  msgstr ""
2894
 
2895
+ #: includes/class-wcj-offer-price.php:573
2896
  #: includes/settings/wcj-settings-offer-price.php:342
2897
  msgid "Price Offer"
2898
  msgstr ""
2899
 
2900
+ #: includes/class-wcj-offer-price.php:583
2901
  #: includes/settings/wcj-settings-offer-price.php:269
2902
  msgid "Your price offer has been sent."
2903
  msgstr ""
3058
  msgid "Tool renumerates all orders."
3059
  msgstr ""
3060
 
3061
+ #: includes/class-wcj-order-numbers.php:352
3062
  msgid "Orders successfully renumerated!"
3063
  msgstr ""
3064
 
3065
+ #: includes/class-wcj-order-numbers.php:357
3066
  #, php-format
3067
  msgid "Sequential number generation is enabled. Next order number will be %s."
3068
  msgstr ""
3069
 
3070
+ #: includes/class-wcj-order-numbers.php:370
3071
  #, php-format
3072
  msgid ""
3073
  "Press the button below to renumerate all existing orders starting from order "
3074
  "counter settings in <a href=\"%s\">Order Numbers</a> module."
3075
  msgstr ""
3076
 
3077
+ #: includes/class-wcj-order-numbers.php:378
3078
  msgid "Renumerate orders"
3079
  msgstr ""
3080
 
3165
  msgstr[0] ""
3166
  msgstr[1] ""
3167
 
3168
+ #: includes/class-wcj-orders.php:365
3169
+ #: includes/functions/wcj-functions-crons.php:116
3170
+ msgid "Once weekly"
3171
+ msgstr ""
3172
+
3173
+ #: includes/class-wcj-orders.php:369
3174
+ #: includes/functions/wcj-functions-crons.php:120
3175
+ msgid "Once every 30 minutes"
3176
+ msgstr ""
3177
+
3178
+ #: includes/class-wcj-orders.php:373
3179
+ #: includes/functions/wcj-functions-crons.php:124
3180
+ msgid "Once every 15 minutes"
3181
+ msgstr ""
3182
+
3183
+ #: includes/class-wcj-orders.php:377
3184
+ #: includes/functions/wcj-functions-crons.php:128
3185
+ msgid "Once every 5 minutes"
3186
+ msgstr ""
3187
+
3188
+ #: includes/class-wcj-orders.php:381
3189
+ #: includes/functions/wcj-functions-crons.php:132
3190
+ msgid "Once a minute"
3191
+ msgstr ""
3192
+
3193
  #: includes/class-wcj-payment-gateways-by-country.php:29
3194
  msgid "Gateways by Country, State or Postcode"
3195
  msgstr ""
3306
  msgid "Add multiple custom payment gateways to WooCommerce."
3307
  msgstr ""
3308
 
3309
+ #: includes/class-wcj-payment-gateways.php:78
3310
  #, php-format
3311
  msgid "<strong>%s</strong> is a required field."
3312
  msgstr ""
3313
 
3314
+ #: includes/class-wcj-payment-gateways.php:103
3315
  #, php-format
3316
  msgid "%s Fields"
3317
  msgstr ""
3473
  msgstr ""
3474
 
3475
  #: includes/class-wcj-price-labels.php:46
3476
+ #: includes/class-wcj-product-by-country.php:203
3477
  #: includes/class-wcj-product-by-user-role.php:62
3478
  #: includes/class-wcj-product-info.php:255
3479
+ #: includes/class-wcj-product-price-by-formula.php:171
3480
  #: includes/class-wcj-shipping-by-products.php:214
3481
  #: includes/class-wcj-shipping-options.php:191
3482
  #: includes/classes/class-wcj-module.php:221
3625
  #: includes/settings/wcj-settings-pdf-invoicing-numbering.php:28
3626
  #: includes/settings/wcj-settings-pdf-invoicing-page.php:107
3627
  #: includes/settings/wcj-settings-pdf-invoicing-styling.php:81
 
3628
  #: includes/settings/wcj-settings-price-by-country.php:81
3629
+ #: includes/settings/wcj-settings-price-by-country.php:89
3630
+ #: includes/settings/wcj-settings-price-by-country.php:109
3631
+ #: includes/settings/wcj-settings-price-by-country.php:125
3632
+ #: includes/settings/wcj-settings-price-by-country.php:152
3633
+ #: includes/settings/wcj-settings-price-by-country.php:199
3634
+ #: includes/settings/wcj-settings-price-by-country.php:217
3635
+ #: includes/settings/wcj-settings-price-by-country.php:226
3636
+ #: includes/settings/wcj-settings-price-by-country.php:235
3637
+ #: includes/settings/wcj-settings-price-by-country.php:245
3638
  #: includes/settings/wcj-settings-price-by-country.php:292
3639
+ #: includes/settings/wcj-settings-price-by-country.php:300
3640
  #: includes/settings/wcj-settings-price-by-user-role.php:23
3641
  #: includes/settings/wcj-settings-price-by-user-role.php:50
3642
  #: includes/settings/wcj-settings-price-by-user-role.php:97
3866
  "addon in pdf."
3867
  msgstr ""
3868
 
3869
+ #: includes/class-wcj-product-addons.php:300
3870
  msgid "Some of the required addons are not selected!"
3871
  msgstr ""
3872
 
3873
+ #: includes/class-wcj-product-addons.php:306
3874
+ msgid "Invalid security nonce"
3875
+ msgstr ""
3876
+
3877
+ #: includes/class-wcj-product-addons.php:319
3878
  msgid ""
3879
  "Booster: Free plugin's version is limited to only three products with per "
3880
  "product addons enabled at a time. You will need to get <a href=\"https://"
3896
  "product's edit page."
3897
  msgstr ""
3898
 
3899
+ #: includes/class-wcj-product-bookings.php:129
3900
+ #: includes/pdf-invoices/class-wcj-pdf-invoicing-report-tool.php:99
3901
+ msgid "Sorry, but something went wrong..."
3902
+ msgstr ""
3903
+
3904
  #: includes/class-wcj-product-bookings.php:159
3905
+ #: includes/class-wcj-product-bookings.php:287
3906
  #: includes/settings/wcj-settings-product-bookings.php:80
3907
  msgid "\"Date to\" must be after \"Date from\""
3908
  msgstr ""
3909
 
3910
  #: includes/class-wcj-product-bookings.php:173
3911
+ #: includes/class-wcj-product-open-pricing.php:298
3912
  #: includes/settings/wcj-settings-add-to-cart.php:153
3913
  #: includes/settings/wcj-settings-add-to-cart.php:185
3914
  #: includes/settings/wcj-settings-add-to-cart.php:220
3920
  msgid "Period"
3921
  msgstr ""
3922
 
3923
+ #: includes/class-wcj-product-bookings.php:277
3924
  #: includes/settings/wcj-settings-product-bookings.php:66
3925
  msgid "\"Date from\" must be set"
3926
  msgstr ""
3927
 
3928
+ #: includes/class-wcj-product-bookings.php:281
3929
  #: includes/settings/wcj-settings-product-bookings.php:73
3930
  msgid "\"Date to\" must be set"
3931
  msgstr ""
3932
 
3933
+ #: includes/class-wcj-product-bookings.php:420
3934
  #: includes/settings/wcj-settings-product-bookings.php:38
3935
  msgid "Date from"
3936
  msgstr ""
3937
 
3938
+ #: includes/class-wcj-product-bookings.php:424
3939
  #: includes/settings/wcj-settings-product-bookings.php:45
3940
  msgid "Date to"
3941
  msgstr ""
3942
 
3943
+ #: includes/class-wcj-product-bookings.php:450
3944
  #: includes/settings/wcj-settings-product-bookings.php:59
3945
  msgid "/ day"
3946
  msgstr ""
3947
 
3948
+ #: includes/class-wcj-product-bookings.php:541
3949
  msgid ""
3950
  "Booster: Free plugin's version is limited to only one bookings product "
3951
  "enabled at a time. You will need to get <a href=\"https://booster.io/buy-"
3970
  msgid "Product Bulk Meta Editor Tool."
3971
  msgstr ""
3972
 
3973
+ #: includes/class-wcj-product-bulk-meta-editor.php:185
3974
  msgid "Please enter meta key."
3975
  msgstr ""
3976
 
3977
+ #: includes/class-wcj-product-bulk-meta-editor.php:207
3978
  #, php-format
3979
  msgid "Meta for <strong>%d</strong> product(s) was updated."
3980
  msgstr ""
3981
 
3982
+ #: includes/class-wcj-product-bulk-meta-editor.php:211
3983
  #, php-format
3984
  msgid "Meta for <strong>%d</strong> product(s) was not updated."
3985
  msgstr ""
3986
 
3987
+ #: includes/class-wcj-product-bulk-meta-editor.php:256
3988
  msgid "Meta key"
3989
  msgstr ""
3990
 
3991
+ #: includes/class-wcj-product-bulk-meta-editor.php:259
3992
  #, php-format
3993
  msgid "for example %s"
3994
  msgstr ""
3995
 
3996
+ #: includes/class-wcj-product-bulk-meta-editor.php:266
3997
  #: includes/settings/meta-box/wcj-settings-meta-box-add-to-cart-button-visibility.php:22
3998
  #: includes/settings/meta-box/wcj-settings-meta-box-add-to-cart-button-visibility.php:41
3999
  #: includes/settings/wcj-settings-price-by-user-role.php:73
4002
  msgid "Show"
4003
  msgstr ""
4004
 
4005
+ #: includes/class-wcj-product-bulk-meta-editor.php:270
4006
+ #: includes/class-wcj-product-bulk-meta-editor.php:391
4007
  #: includes/settings/wcj-settings-product-add-to-cart.php:312
4008
  msgid "Meta"
4009
  msgstr ""
4010
 
4011
+ #: includes/class-wcj-product-bulk-meta-editor.php:295
4012
  msgid ""
4013
  "Hold <strong>Control</strong> key to select multiple products. Press "
4014
  "<strong>Control</strong> + <strong>A</strong> to select all products."
4015
  msgstr ""
4016
 
4017
+ #: includes/class-wcj-product-bulk-meta-editor.php:320
4018
+ #: includes/class-wcj-product-by-user.php:301
4019
+ #: includes/class-wcj-purchase-data.php:122
4020
+ #: includes/classes/class-wcj-module.php:998
4021
  #: includes/functions/wcj-functions-general.php:208
4022
+ #: includes/functions/wcj-functions-html.php:138
4023
+ #: includes/reports/class-wcj-reports-monthly-sales.php:389
4024
  #: includes/settings/wcj-settings-empty-cart.php:88
4025
+ #: includes/shortcodes/class-wcj-products-add-form-shortcodes.php:391
4026
  #: includes/tools/class-wcj-order-statuses-tool.php:213
4027
  #: includes/tools/class-wcj-order-statuses-tool.php:363
4028
  msgid "Are you sure?"
4029
  msgstr ""
4030
 
4031
+ #: includes/class-wcj-product-bulk-meta-editor.php:337
4032
  #: includes/settings/wcj-settings-admin-orders-list.php:79
4033
  #: includes/settings/wcj-settings-admin-products-list.php:64
4034
  #: includes/settings/wcj-settings-checkout-fees.php:81
4039
  msgid "Value"
4040
  msgstr ""
4041
 
4042
+ #: includes/class-wcj-product-bulk-meta-editor.php:343
4043
  msgid "Set"
4044
  msgstr ""
4045
 
4046
+ #: includes/class-wcj-product-bulk-meta-editor.php:347
4047
  msgid "Set Meta for All Products"
4048
  msgstr ""
4049
 
4050
+ #: includes/class-wcj-product-bulk-meta-editor.php:367
4051
  msgid "Save all"
4052
  msgstr ""
4053
 
4054
+ #: includes/class-wcj-product-bulk-meta-editor.php:370
4055
  msgid "Delete all"
4056
  msgstr ""
4057
 
4058
+ #: includes/class-wcj-product-bulk-meta-editor.php:415
4059
  msgid "Save"
4060
  msgstr ""
4061
 
4062
+ #: includes/class-wcj-product-bulk-meta-editor.php:444
4063
+ #: includes/class-wcj-purchase-data.php:105
4064
  #: includes/export/class-wcj-export-fields-helper.php:285
4065
  #: includes/functions/wcj-functions-reports.php:27
4066
  #: includes/settings/wcj-settings-product-bulk-meta-editor.php:45
4067
  msgid "Product ID"
4068
  msgstr ""
4069
 
4070
+ #: includes/class-wcj-product-bulk-meta-editor.php:447
4071
  #: includes/settings/wcj-settings-product-bulk-meta-editor.php:46
4072
  msgid "Product status"
4073
  msgstr ""
4074
 
4075
+ #: includes/class-wcj-product-bulk-meta-editor.php:450
4076
  #: includes/settings/wcj-settings-product-bulk-meta-editor.php:47
4077
  msgid "Meta keys"
4078
  msgstr ""
4079
 
4080
+ #: includes/class-wcj-product-bulk-meta-editor.php:475
4081
  msgid "Show all"
4082
  msgstr ""
4083
 
4094
  msgid "Bulk Price Converter Tool."
4095
  msgstr ""
4096
 
4097
+ #: includes/class-wcj-product-bulk-price-converter.php:261
4098
  msgid "Multiply value must be above zero."
4099
  msgstr ""
4100
 
4101
+ #: includes/class-wcj-product-bulk-price-converter.php:267
4102
  msgid "Prices changed successfully!"
4103
  msgstr ""
4104
 
4105
+ #: includes/class-wcj-product-bulk-price-converter.php:292
4106
  msgid "Multiply all product prices by"
4107
  msgstr ""
4108
 
4109
+ #: includes/class-wcj-product-bulk-price-converter.php:300
4110
  msgid "Price type to modify"
4111
  msgstr ""
4112
 
4113
+ #: includes/class-wcj-product-bulk-price-converter.php:302
4114
  msgid "Both"
4115
  msgstr ""
4116
 
4117
+ #: includes/class-wcj-product-bulk-price-converter.php:304
4118
  msgid "Sale prices only"
4119
  msgstr ""
4120
 
4121
+ #: includes/class-wcj-product-bulk-price-converter.php:306
4122
  msgid "Regular prices only"
4123
  msgstr ""
4124
 
4125
+ #: includes/class-wcj-product-bulk-price-converter.php:313
4126
  msgid "Products category"
4127
  msgstr ""
4128
 
4129
+ #: includes/class-wcj-product-bulk-price-converter.php:315
4130
  #: includes/shortcodes/class-wcj-products-shortcodes.php:376
4131
  msgid "Any"
4132
  msgstr ""
4133
 
4134
+ #: includes/class-wcj-product-bulk-price-converter.php:317
4135
  #: includes/settings/wcj-settings-global-discount.php:113
4136
  msgid "None"
4137
  msgstr ""
4138
 
4139
+ #: includes/class-wcj-product-bulk-price-converter.php:324
4140
  msgid "\"Pretty prices\" threshold"
4141
  msgstr ""
4142
 
4143
+ #: includes/class-wcj-product-bulk-price-converter.php:325
4144
  #: includes/settings/wcj-settings-payment-gateways-min-max.php:90
4145
  msgid "Leave zero to disable."
4146
  msgstr ""
4147
 
4148
+ #: includes/class-wcj-product-bulk-price-converter.php:326
4149
  msgid ""
4150
  "Otherwise - all prices below \"threshold\" will end with 0,99 and all prices "
4151
  "above or equal to \"threshold\" will end with 9,00."
4152
  msgstr ""
4153
 
4154
+ #: includes/class-wcj-product-bulk-price-converter.php:327
4155
  msgid ""
4156
  "E.g.: if you set \"threshold\" to 100, then all prices below 100 will be like "
4157
  "45,99 and all other prices will be like 109,00."
4158
  msgstr ""
4159
 
4160
+ #: includes/class-wcj-product-bulk-price-converter.php:335
4161
  msgid "Preview Prices"
4162
  msgstr ""
4163
 
4164
+ #: includes/class-wcj-product-bulk-price-converter.php:342
4165
  msgid "Change Prices"
4166
  msgstr ""
4167
 
4191
  msgid "Countries"
4192
  msgstr ""
4193
 
4194
+ #: includes/class-wcj-product-by-country.php:157
4195
  msgid "User Country Selection Options"
4196
  msgstr ""
4197
 
4198
+ #: includes/class-wcj-product-by-country.php:162
4199
  msgid "User Country Selection Method"
4200
  msgstr ""
4201
 
4202
+ #: includes/class-wcj-product-by-country.php:163
4203
  msgid "Possible values: \"Automatically by IP\" or \"Manually\"."
4204
  msgstr ""
4205
 
4206
+ #: includes/class-wcj-product-by-country.php:166
4207
  #, php-format
4208
  msgid ""
4209
  "If \"Manually\" option is selected, you can add country selection drop box to "
4210
  "frontend with \"%1$s\" widget or %2$s shortcode."
4211
  msgstr ""
4212
 
4213
+ #: includes/class-wcj-product-by-country.php:167
4214
  #: includes/class-wcj-product-custom-visibility.php:38
4215
  #: includes/widgets/class-wcj-widget-selector.php:37
4216
  msgid "Booster - Selector"
4217
  msgstr ""
4218
 
4219
+ #: includes/class-wcj-product-by-country.php:175
4220
  msgid "Automatically by IP"
4221
  msgstr ""
4222
 
4223
+ #: includes/class-wcj-product-by-country.php:176
4224
  #: includes/settings/wcj-settings-pdf-invoicing.php:36
4225
  msgid "Manually"
4226
  msgstr ""
4227
 
4228
+ #: includes/class-wcj-product-by-country.php:182
4229
+ #: includes/class-wcj-product-by-country.php:218
4230
  msgid "Country List"
4231
  msgstr ""
4232
 
4233
+ #: includes/class-wcj-product-by-country.php:183
4234
  msgid ""
4235
  "This option sets which countries will be added to the list in [wcj_selector "
4236
  "selector_type=\"country\"] shortcode. Possible values: \"All countries\" or "
4237
  "\"WooCommerce selling locations\"."
4238
  msgstr ""
4239
 
4240
+ #: includes/class-wcj-product-by-country.php:186
4241
+ #: includes/class-wcj-product-by-country.php:222
4242
  #, php-format
4243
  msgid ""
4244
  "If \"WooCommerce selling locations\" option is selected, country list will be "
4246
  "a>."
4247
  msgstr ""
4248
 
4249
+ #: includes/class-wcj-product-by-country.php:195
4250
+ #: includes/class-wcj-product-by-country.php:231
4251
  msgid "WooCommerce selling locations"
4252
  msgstr ""
4253
 
4254
+ #: includes/class-wcj-product-by-country.php:201
4255
  msgid "Overwrite by Billing Country"
4256
  msgstr ""
4257
 
4258
+ #: includes/class-wcj-product-by-country.php:202
4259
  msgid "Tries to overwrite Country by User Billing Country on Checkout Page."
4260
  msgstr ""
4261
 
4262
+ #: includes/class-wcj-product-by-country.php:213
4263
  msgid "Admin Country List Options"
4264
  msgstr ""
4265
 
4266
+ #: includes/class-wcj-product-by-country.php:219
4267
  msgid ""
4268
  "This option sets which countries will be added to list in product's edit "
4269
  "page. Possible values: \"All countries\" or \"WooCommerce selling locations\"."
4312
  msgid "Set product availability by time."
4313
  msgstr ""
4314
 
4315
+ #: includes/class-wcj-product-by-time.php:98
4316
  #: includes/settings/wcj-settings-product-by-time.php:95
4317
  msgid "%product_title% is not available today."
4318
  msgstr ""
4319
 
4320
+ #: includes/class-wcj-product-by-time.php:101
4321
  msgid "<p >%product_title% is not available today."
4322
  msgstr ""
4323
 
4324
+ #: includes/class-wcj-product-by-time.php:106
4325
+ #: includes/class-wcj-product-by-time.php:109
4326
  #: includes/settings/wcj-settings-product-by-time.php:84
4327
  msgid "%product_title% is available only at %time_today% today."
4328
  msgstr ""
4392
  "form to frontend."
4393
  msgstr ""
4394
 
4395
+ #: includes/class-wcj-product-by-user.php:234
4396
+ #: includes/class-wcj-product-by-user.php:243
4397
  msgid "Wrong user ID!"
4398
  msgstr ""
4399
 
4400
+ #: includes/class-wcj-product-by-user.php:276
4401
  #: includes/export/class-wcj-export-fields-helper.php:298
4402
  msgid "Status"
4403
  msgstr ""
4404
 
4405
+ #: includes/class-wcj-product-by-user.php:276
4406
  #: includes/class-wcj-product-tabs.php:663
4407
+ #: includes/gateways/class-wc-gateway-wcj-custom-template.php:59
4408
  #: includes/input-fields/wcj-product-input-fields-options.php:53
4409
  #: includes/settings/meta-box/wcj-settings-meta-box-product-addons.php:104
4410
  #: includes/settings/wcj-settings-admin-orders-list.php:187
4427
  #: includes/settings/wcj-settings-upsells.php:45
4428
  #: includes/shipping/class-wc-shipping-wcj-custom-template.php:122
4429
  #: includes/shipping/class-wc-shipping-wcj-custom-with-shipping-zones.php:223
4430
+ #: includes/shortcodes/class-wcj-products-add-form-shortcodes.php:361
4431
  #: includes/widgets/class-wcj-widget-country-switcher.php:77
4432
  #: includes/widgets/class-wcj-widget-left-to-free-shipping.php:63
4433
  #: includes/widgets/class-wcj-widget-multicurrency.php:85
4435
  msgid "Title"
4436
  msgstr ""
4437
 
4438
+ #: includes/class-wcj-product-by-user.php:292
4439
+ #: includes/shortcodes/class-wcj-products-add-form-shortcodes.php:470
4440
  #: includes/tools/class-wcj-order-statuses-tool.php:222
4441
  #: includes/tools/class-wcj-order-statuses-tool.php:300
4442
  msgid "Edit"
4482
  msgid "Custom Visibility"
4483
  msgstr ""
4484
 
4485
+ #: includes/class-wcj-product-custom-visibility.php:102
4486
  msgid "Options List"
4487
  msgstr ""
4488
 
4489
+ #: includes/class-wcj-product-custom-visibility.php:107
4490
  #: includes/settings/wcj-settings-admin-bar.php:17
4491
  #: includes/settings/wcj-settings-breadcrumbs.php:17
4492
  #: includes/settings/wcj-settings-cart-customization.php:17
4519
  msgid "Options"
4520
  msgstr ""
4521
 
4522
+ #: includes/class-wcj-product-custom-visibility.php:108
4523
  msgid "One per line."
4524
  msgstr ""
4525
 
4526
+ #: includes/class-wcj-product-custom-visibility.php:109
4527
  msgid ""
4528
  "Can not be empty. Options will be added to each product's admin edit page and "
4529
  "to the selection drop box on frontend."
4701
  msgstr ""
4702
 
4703
  #: includes/class-wcj-product-msrp.php:134
4704
+ #: includes/class-wcj-product-msrp.php:170
4705
  #: includes/settings/meta-box/wcj-settings-meta-box-product-msrp.php:51
4706
  msgid "MSRP"
4707
  msgstr ""
4718
  msgid "Open Pricing"
4719
  msgstr ""
4720
 
4721
+ #: includes/class-wcj-product-open-pricing.php:382
4722
  #: includes/settings/wcj-settings-product-open-pricing.php:79
4723
  msgid "Price is required!"
4724
  msgstr ""
4725
 
4726
+ #: includes/class-wcj-product-open-pricing.php:394
4727
  #: includes/settings/wcj-settings-product-open-pricing.php:87
4728
  msgid "Entered price is too small!"
4729
  msgstr ""
4730
 
4731
+ #: includes/class-wcj-product-open-pricing.php:409
4732
  #: includes/settings/wcj-settings-product-open-pricing.php:95
4733
  msgid "Entered price is too big!"
4734
  msgstr ""
4735
 
4736
+ #: includes/class-wcj-product-open-pricing.php:519
4737
  #: includes/settings/wcj-settings-product-open-pricing.php:32
4738
  msgid "Name Your Price"
4739
  msgstr ""
4752
  msgid "Set formula for automatic product price calculation."
4753
  msgstr ""
4754
 
4755
+ #: includes/class-wcj-product-price-by-formula.php:128
4756
  msgid "Booking cost"
4757
  msgstr ""
4758
 
4759
+ #: includes/class-wcj-product-price-by-formula.php:143
4760
  #, php-format
4761
  msgid "From: %s"
4762
  msgstr ""
4763
 
4764
+ #: includes/class-wcj-product-price-by-formula.php:170
4765
  msgid "Reset products"
4766
  msgstr ""
4767
 
4768
+ #: includes/class-wcj-product-price-by-formula.php:176
4769
  msgid ""
4770
  "If enabled will also reset formula related settings on products when "
4771
  "<code>Reset Settings</code> button is pressed."
4772
  msgstr ""
4773
 
4774
+ #: includes/class-wcj-product-price-by-formula.php:176
4775
  msgid ""
4776
  "It's necessary to <code>Save changes</code> first with the option enabled so "
4777
  "the <code>Reset settings</code> can be pressed."
4976
 
4977
  #: includes/class-wcj-products-xml.php:102
4978
  #: includes/exchange-rates/class-wcj-exchange-rates-crons.php:227
4979
+ #: tracking/class-plugin-usage-tracker.php:213
4980
  msgid "Once Weekly"
4981
  msgstr ""
4982
 
4985
  msgid "Once a Minute"
4986
  msgstr ""
4987
 
4988
+ #: includes/class-wcj-products-xml.php:122
4989
  msgid "An error has occurred while creating products XML file."
4990
  msgstr ""
4991
 
4992
+ #: includes/class-wcj-products-xml.php:126
4993
  #, php-format
4994
  msgid "Products XML file #%s created successfully."
4995
  msgstr ""
5023
  msgid "Import products costs from \"WooCommerce Cost of Goods\"."
5024
  msgstr ""
5025
 
5026
+ #: includes/class-wcj-purchase-data.php:106
5027
  msgid "Product Title"
5028
  msgstr ""
5029
 
5030
+ #: includes/class-wcj-purchase-data.php:107
5031
  msgid "WooCommerce Cost of Goods (source)"
5032
  msgstr ""
5033
 
5034
+ #: includes/class-wcj-purchase-data.php:108
5035
  msgid "Booster: Product cost (destination)"
5036
  msgstr ""
5037
 
5038
+ #: includes/class-wcj-purchase-data.php:153
5039
  #: includes/shipping/class-wc-shipping-wcj-custom-template.php:137
5040
  #: includes/shipping/class-wc-shipping-wcj-custom-template.php:194
5041
  #: includes/shipping/class-wc-shipping-wcj-custom-with-shipping-zones.php:163
5043
  msgid "Cost"
5044
  msgstr ""
5045
 
5046
+ #: includes/class-wcj-purchase-data.php:156
5047
+ #: includes/class-wcj-purchase-data.php:221
5048
+ #: includes/class-wcj-purchase-data.php:313
5049
  #: includes/functions/wcj-functions-reports.php:31
5050
  #: includes/settings/wcj-settings-purchase-data.php:152
5051
  #: includes/settings/wcj-settings-purchase-data.php:180
5052
  msgid "Profit"
5053
  msgstr ""
5054
 
5055
+ #: includes/class-wcj-purchase-data.php:224
5056
  #: includes/settings/wcj-settings-purchase-data.php:161
5057
  #: includes/settings/wcj-settings-purchase-data.php:187
5058
  msgid "Purchase Cost"
5059
  msgstr ""
5060
 
5061
+ #: includes/class-wcj-purchase-data.php:310
5062
  msgid "Selling"
5063
  msgstr ""
5064
 
5065
+ #: includes/class-wcj-purchase-data.php:311
5066
  msgid "Buying"
5067
  msgstr ""
5068
 
5069
+ #: includes/class-wcj-purchase-data.php:327
5070
  msgid "Report"
5071
  msgstr ""
5072
 
5073
+ #: includes/class-wcj-related-products.php:31
5074
  msgid ""
5075
  "Change displayed related products number, columns, order; relate by tag, "
5076
  "category, product attribute or manually on per product basis (Plus). Hide "
5077
  "related products completely."
5078
  msgstr ""
5079
 
5080
+ #: includes/class-wcj-related-products.php:32
5081
  msgid ""
5082
  "Change displayed related products number, columns, order; relate by tag, "
5083
  "category, product attribute or manually on per product basis. Hide related "
5084
  "products completely."
5085
  msgstr ""
5086
 
5087
+ #: includes/class-wcj-related-products.php:36
5088
  #, php-format
5089
  msgid ""
5090
  "You may need to <a href=\"%s\">clear all products transients</a> to "
5097
  msgid "Stock, sales, customers etc. reports."
5098
  msgstr ""
5099
 
5100
+ #: includes/class-wcj-reports.php:94
5101
  msgid "Booster: More Ranges - Months"
5102
  msgstr ""
5103
 
5104
+ #: includes/class-wcj-reports.php:96 includes/class-wcj-reports.php:148
5105
  msgid "Select Range"
5106
  msgstr ""
5107
 
5108
+ #: includes/class-wcj-reports.php:146
5109
  msgid "Booster: More Ranges"
5110
  msgstr ""
5111
 
5112
+ #: includes/class-wcj-reports.php:258
5113
  msgid "Booster: Product Sales (Daily)"
5114
  msgstr ""
5115
 
5116
+ #: includes/class-wcj-reports.php:265
5117
  msgid "Booster: Product Sales (Monthly)"
5118
  msgstr ""
5119
 
5120
+ #: includes/class-wcj-reports.php:272
5121
  msgid "Booster: Monthly Sales (with Currency Conversion)"
5122
  msgstr ""
5123
 
5124
+ #: includes/class-wcj-reports.php:279
5125
  msgid "Booster: Payment Gateways"
5126
  msgstr ""
5127
 
5128
+ #: includes/class-wcj-reports.php:296
5129
  msgid "Booster: All in stock"
5130
  msgstr ""
5131
 
5132
+ #: includes/class-wcj-reports.php:303
5133
  msgid "Booster: Understocked"
5134
  msgstr ""
5135
 
5136
+ #: includes/class-wcj-reports.php:310
5137
  msgid "Booster: Overstocked"
5138
  msgstr ""
5139
 
5140
+ #: includes/class-wcj-reports.php:327
5141
  msgid "Booster: Customers by Country"
5142
  msgstr ""
5143
 
5144
+ #: includes/class-wcj-reports.php:334
5145
  msgid "Booster: Customers by Country Sets"
5146
  msgstr ""
5147
 
5349
  #: includes/settings/wcj-settings-order-min-amount.php:69
5350
  #: includes/settings/wcj-settings-orders.php:135
5351
  #: includes/settings/wcj-settings-orders.php:162
5352
+ #: includes/settings/wcj-settings-pdf-invoicing-advanced.php:198
5353
+ #: includes/settings/wcj-settings-pdf-invoicing-advanced.php:256
5354
  #: includes/settings/wcj-settings-product-by-condition.php:115
5355
  #: includes/settings/wcj-settings-product-by-user.php:122
5356
  #: includes/settings/wcj-settings-product-open-pricing.php:131
5361
  #: includes/settings/wcj-settings-purchase-data.php:188
5362
  #: includes/settings/wcj-settings-sku.php:314
5363
  #: includes/settings/wcj-settings-sku.php:341
5364
+ #: includes/shortcodes/class-wcj-products-add-form-shortcodes.php:470
5365
  #: includes/tools/class-wcj-order-statuses-tool.php:300
5366
  msgid "Add"
5367
  msgstr ""
5585
  msgid "Add multiple custom shipping methods to WooCommerce."
5586
  msgstr ""
5587
 
5588
+ #: includes/class-wcj-sku.php:30 includes/class-wcj-sku.php:709
5589
  #: includes/export/class-wcj-export-fields-helper.php:288
5590
  msgid "SKU"
5591
  msgstr ""
5609
  msgid "The tool generates and sets product SKUs for existing products."
5610
  msgstr ""
5611
 
5612
+ #: includes/class-wcj-sku.php:710
5613
  msgid "Old SKU"
5614
  msgstr ""
5615
 
5616
+ #: includes/class-wcj-sku.php:716
5617
  msgid "SKUs generated and set successfully!"
5618
  msgstr ""
5619
 
5620
+ #: includes/class-wcj-sku.php:727
5621
  msgid "Preview SKUs"
5622
  msgstr ""
5623
 
5624
+ #: includes/class-wcj-sku.php:729
5625
  msgid "Set SKUs"
5626
  msgstr ""
5627
 
5628
+ #: includes/class-wcj-sku.php:732
5629
  msgid ""
5630
  "You can optionally limit affected products by main product's ID (set option "
5631
  "to zero to ignore):"
5632
  msgstr ""
5633
 
5634
+ #: includes/class-wcj-sku.php:734
5635
  msgid "Min ID"
5636
  msgstr ""
5637
 
5638
+ #: includes/class-wcj-sku.php:737
5639
  msgid "Max ID"
5640
  msgstr ""
5641
 
5733
  msgid "Referer Type"
5734
  msgstr ""
5735
 
5736
+ #: includes/class-wcj-track-users.php:175
5737
  msgid "Acquisition Source"
5738
  msgstr ""
5739
 
5740
+ #: includes/class-wcj-track-users.php:212
5741
  #: includes/settings/wcj-settings-products-xml.php:144
5742
  msgid "URL:"
5743
  msgstr ""
5744
 
5745
+ #: includes/class-wcj-track-users.php:213
5746
  msgid "Type:"
5747
  msgstr ""
5748
 
5749
+ #: includes/class-wcj-track-users.php:268
5750
  #, php-format
5751
  msgid "Top %d countries by visits"
5752
  msgstr ""
5754
  #: includes/class-wcj-track-users.php:341
5755
  #: includes/input-fields/wcj-product-input-fields-options.php:46
5756
  #: includes/settings/wcj-settings-checkout-custom-fields.php:154
5757
+ #: includes/tools/class-wcj-eu-countries-vat-rates-tool.php:113
5758
+ #: includes/tools/class-wcj-eu-countries-vat-rates-tool.php:133
5759
  msgid "Country"
5760
  msgstr ""
5761
 
5763
  msgid "Visits"
5764
  msgstr ""
5765
 
5766
+ #: includes/class-wcj-track-users.php:380
5767
  #, php-format
5768
  msgid "Stats generated at %1$s. Next update is scheduled at %2$s."
5769
  msgstr ""
5770
 
5771
+ #: includes/class-wcj-track-users.php:388
5772
  msgid "Update now"
5773
  msgstr ""
5774
 
5823
  msgid "Booster for WooCommerce basic WPML support."
5824
  msgstr ""
5825
 
5826
+ #: includes/class-wcj-wpml.php:206
5827
  msgid "File wpml-config.xml successfully regenerated!"
5828
  msgstr ""
5829
 
5866
  "\" products."
5867
  msgstr ""
5868
 
5869
+ #: includes/classes/class-wcj-module.php:770
5870
  #, php-format
5871
  msgid "Selected: %s."
5872
  msgstr ""
5873
 
5874
+ #: includes/classes/class-wcj-module.php:841
5875
  msgid "Back to Module Settings"
5876
  msgstr ""
5877
 
5878
+ #: includes/classes/class-wcj-module.php:862
5879
  #: includes/settings/wcj-settings-wpml.php:102
5880
  msgid "Module Tools"
5881
  msgstr ""
5882
 
5883
+ #: includes/classes/class-wcj-module.php:940
5884
  #: includes/settings/wcj-settings-checkout-core-fields.php:82
5885
  msgid "enabled"
5886
  msgstr ""
5887
 
5888
+ #: includes/classes/class-wcj-module.php:941
5889
  msgid "disabled"
5890
  msgstr ""
5891
 
5892
+ #: includes/classes/class-wcj-module.php:949
5893
  #: includes/settings/wcj-settings-product-tabs.php:181
5894
  #: includes/settings/wcj-settings-product-tabs.php:196
5895
  #: includes/settings/wcj-settings-product-tabs.php:211
5897
  msgid "Deprecated"
5898
  msgstr ""
5899
 
5900
+ #: includes/classes/class-wcj-module.php:988
5901
  msgid "Reset Settings"
5902
  msgstr ""
5903
 
5904
+ #: includes/classes/class-wcj-module.php:994
5905
  msgid "Reset Module to Default Settings"
5906
  msgstr ""
5907
 
5908
+ #: includes/classes/class-wcj-module.php:995
5909
  msgid "Reset Submodule to Default Settings"
5910
  msgstr ""
5911
 
5912
+ #: includes/classes/class-wcj-module.php:1004
5913
  msgid "Reset settings"
5914
  msgstr ""
5915
 
5916
+ #: includes/classes/class-wcj-module.php:1042
5917
  msgid "Module Options"
5918
  msgstr ""
5919
 
5920
+ #: includes/classes/class-wcj-module.php:1049
5921
  msgid "Enable Module"
5922
  msgstr ""
5923
 
6004
  msgstr ""
6005
 
6006
  #: includes/emails/class-wc-email-wcj-custom.php:247
6007
+ #: includes/gateways/class-wc-gateway-wcj-custom-template.php:52
6008
  #: includes/settings/wcj-settings-admin-products-list.php:22
6009
  #: includes/settings/wcj-settings-admin-products-list.php:86
6010
  #: includes/settings/wcj-settings-checkout-custom-fields.php:130
6263
 
6264
  #: includes/export/class-wcj-export-fields-helper.php:88
6265
  #: includes/export/class-wcj-export-fields-helper.php:299
6266
+ #: includes/gateways/class-wc-gateway-wcj-custom-template.php:152
6267
  msgid "URL"
6268
  msgstr ""
6269
 
6468
  #: includes/settings/meta-box/wcj-settings-meta-box-price-by-user-role.php:108
6469
  #: includes/settings/wcj-settings-product-by-user.php:19
6470
  #: includes/shortcodes/class-wcj-products-add-form-shortcodes.php:193
6471
+ #: includes/shortcodes/class-wcj-products-add-form-shortcodes.php:405
6472
  msgid "Regular Price"
6473
  msgstr ""
6474
 
6478
  #: includes/settings/meta-box/wcj-settings-meta-box-price-by-user-role.php:117
6479
  #: includes/settings/wcj-settings-product-by-user.php:20
6480
  #: includes/shortcodes/class-wcj-products-add-form-shortcodes.php:194
6481
+ #: includes/shortcodes/class-wcj-products-add-form-shortcodes.php:414
6482
  msgid "Sale Price"
6483
  msgstr ""
6484
 
6508
  #: includes/export/class-wcj-export-fields-helper.php:296
6509
  #: includes/settings/wcj-settings-product-by-user.php:17
6510
  #: includes/shortcodes/class-wcj-products-add-form-shortcodes.php:191
6511
+ #: includes/shortcodes/class-wcj-products-add-form-shortcodes.php:378
6512
  msgid "Short Description"
6513
  msgstr ""
6514
 
6617
  msgid "Availability Class"
6618
  msgstr ""
6619
 
6620
+ #: includes/functions/wcj-functions-admin.php:146
6621
  #, php-format
6622
  msgid ""
6623
  "<strong>Booster for WooCommerce</strong> plugin was successfully updated to "
6624
  "version <strong>%s</strong>."
6625
  msgstr ""
6626
 
6627
+ #: includes/functions/wcj-functions-admin.php:193
6628
  msgid "Search&hellip;"
6629
  msgstr ""
6630
 
6631
+ #: includes/functions/wcj-functions-admin.php:244
6632
  msgid "Enter comma separated list of IDs."
6633
  msgstr ""
6634
 
6635
+ #: includes/functions/wcj-functions-admin.php:325
6636
  #: includes/settings/wcj-settings-emails-verification.php:79
6637
  #: includes/settings/wcj-settings-emails-verification.php:88
6638
  #: includes/settings/wcj-settings-emails-verification.php:136
6640
  msgid "Replaced value: %s"
6641
  msgstr ""
6642
 
6643
+ #: includes/functions/wcj-functions-admin.php:325
6644
  #, php-format
6645
  msgid "Replaced values: %s"
6646
  msgstr ""
6647
 
6648
+ #: includes/functions/wcj-functions-admin.php:357
6649
  msgid "Upgrade Booster to unlock this feature"
6650
  msgstr ""
6651
 
6652
+ #: includes/functions/wcj-functions-admin.php:360
6653
  #, php-format
6654
  msgid ""
6655
  "Some settings fields are locked and you will need %s to modify all locked "
6656
  "fields."
6657
  msgstr ""
6658
 
6659
+ #: includes/functions/wcj-functions-admin.php:364
6660
  msgid "Buy now"
6661
  msgstr ""
6662
 
6663
+ #: includes/functions/wcj-functions-admin.php:364
6664
  msgid "Visit Booster Site"
6665
  msgstr ""
6666
 
6667
+ #: includes/functions/wcj-functions-admin.php:370
6668
  #, php-format
6669
  msgid "Upgrade <a href=\"%s\" target=\"_blank\">Booster</a> to change value."
6670
  msgstr ""
6671
 
6672
+ #: includes/functions/wcj-functions-admin.php:374
6673
  #, php-format
6674
  msgid ""
6675
  "Upgrade <a href=\"%1$s\" target=\"_blank\">Booster to unlock this feature</a> "
6676
  "to enable \"%2$s\" option."
6677
  msgstr ""
6678
 
6679
+ #: includes/functions/wcj-functions-admin.php:378
6680
  #, php-format
6681
  msgid "Upgrade Booster to to enable \"%s\" option."
6682
  msgstr ""
6683
 
6684
+ #: includes/functions/wcj-functions-admin.php:382
6685
  #, php-format
6686
  msgid ""
6687
  "Upgrade <a href=\"%s\" target=\"_blank\">Booster</a> to change values below."
6688
  msgstr ""
6689
 
6690
+ #: includes/functions/wcj-functions-admin.php:386
6691
  #, php-format
6692
  msgid ""
6693
  "Upgrade <a href=\"%s\" target=\"_blank\">Booster </a> to change values above."
6694
  msgstr ""
6695
 
6696
+ #: includes/functions/wcj-functions-admin.php:389
6697
  msgid "Upgrade Booster to change value."
6698
  msgstr ""
6699
 
7731
  msgid "%s seconds till next run."
7732
  msgstr ""
7733
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7734
  #: includes/functions/wcj-functions-exchange-rates.php:76
7735
  msgid "European Central Bank (ECB)"
7736
  msgstr ""
7759
  msgid "CoinMarketCap"
7760
  msgstr ""
7761
 
7762
+ #: includes/functions/wcj-functions-general.php:703
7763
  #: includes/settings/wcj-settings-cross-sells.php:78
7764
  #: includes/settings/wcj-settings-empty-cart.php:50
7765
  msgid "Before cart"
7766
  msgstr ""
7767
 
7768
+ #: includes/functions/wcj-functions-general.php:704
7769
  msgid "Before cart table"
7770
  msgstr ""
7771
 
7772
+ #: includes/functions/wcj-functions-general.php:705
7773
  msgid "Before cart contents"
7774
  msgstr ""
7775
 
7776
+ #: includes/functions/wcj-functions-general.php:706
7777
  msgid "Cart contents"
7778
  msgstr ""
7779
 
7780
+ #: includes/functions/wcj-functions-general.php:707
7781
  msgid "Cart coupon"
7782
  msgstr ""
7783
 
7784
+ #: includes/functions/wcj-functions-general.php:708
7785
  msgid "Cart actions"
7786
  msgstr ""
7787
 
7788
+ #: includes/functions/wcj-functions-general.php:709
7789
  msgid "After cart contents"
7790
  msgstr ""
7791
 
7792
+ #: includes/functions/wcj-functions-general.php:710
7793
  msgid "After cart table"
7794
  msgstr ""
7795
 
7796
+ #: includes/functions/wcj-functions-general.php:711
7797
  #: includes/settings/wcj-settings-cross-sells.php:79
7798
  msgid "Cart collaterals"
7799
  msgstr ""
7800
 
7801
+ #: includes/functions/wcj-functions-general.php:712
7802
  #: includes/settings/wcj-settings-cross-sells.php:80
7803
  #: includes/settings/wcj-settings-empty-cart.php:59
7804
  msgid "After cart"
7805
  msgstr ""
7806
 
7807
+ #: includes/functions/wcj-functions-general.php:714
7808
  msgid "Before cart totals"
7809
  msgstr ""
7810
 
7811
+ #: includes/functions/wcj-functions-general.php:715
7812
  #: includes/settings/wcj-settings-empty-cart.php:52
7813
  msgid "Cart totals: Before shipping"
7814
  msgstr ""
7815
 
7816
+ #: includes/functions/wcj-functions-general.php:716
7817
  #: includes/settings/wcj-settings-empty-cart.php:53
7818
  msgid "Cart totals: After shipping"
7819
  msgstr ""
7820
 
7821
+ #: includes/functions/wcj-functions-general.php:717
7822
  #: includes/settings/wcj-settings-empty-cart.php:54
7823
  msgid "Cart totals: Before order total"
7824
  msgstr ""
7825
 
7826
+ #: includes/functions/wcj-functions-general.php:718
7827
  #: includes/settings/wcj-settings-empty-cart.php:55
7828
  msgid "Cart totals: After order total"
7829
  msgstr ""
7830
 
7831
+ #: includes/functions/wcj-functions-general.php:719
7832
  msgid "Proceed to checkout"
7833
  msgstr ""
7834
 
7835
+ #: includes/functions/wcj-functions-general.php:720
7836
  msgid "After cart totals"
7837
  msgstr ""
7838
 
7839
+ #: includes/functions/wcj-functions-general.php:722
7840
  msgid "Before shipping calculator"
7841
  msgstr ""
7842
 
7843
+ #: includes/functions/wcj-functions-general.php:723
7844
  msgid "After shipping calculator"
7845
  msgstr ""
7846
 
7847
+ #: includes/functions/wcj-functions-general.php:725
7848
  msgid "If cart is empty"
7849
  msgstr ""
7850
 
7853
  msgid "Current image path: %s."
7854
  msgstr ""
7855
 
7856
+ #: includes/functions/wcj-functions-invoicing.php:279
7857
  msgid "Invoice"
7858
  msgstr ""
7859
 
7860
+ #: includes/functions/wcj-functions-invoicing.php:285
7861
  msgid "Proforma Invoice"
7862
  msgstr ""
7863
 
7864
+ #: includes/functions/wcj-functions-invoicing.php:291
7865
  msgid "Packing Slip"
7866
  msgstr ""
7867
 
7868
+ #: includes/functions/wcj-functions-invoicing.php:297
7869
  msgid "Credit Note"
7870
  msgstr ""
7871
 
7872
+ #: includes/functions/wcj-functions-invoicing.php:308
7873
  msgid "Custom Document"
7874
  msgstr ""
7875
 
7970
  msgid "You have Free delivery"
7971
  msgstr ""
7972
 
7973
+ #: includes/gateways/class-wc-gateway-wcj-custom-template.php:54
7974
  msgid "Enable Custom Payment"
7975
  msgstr ""
7976
 
7977
+ #: includes/gateways/class-wc-gateway-wcj-custom-template.php:61
7978
  #: includes/shipping/class-wc-shipping-wcj-custom-template.php:124
7979
  #: includes/shipping/class-wc-shipping-wcj-custom-with-shipping-zones.php:225
7980
  msgid "This controls the title which the user sees during checkout."
7981
  msgstr ""
7982
 
7983
+ #: includes/gateways/class-wc-gateway-wcj-custom-template.php:62
7984
  msgid "Custom Payment"
7985
  msgstr ""
7986
 
7987
+ #: includes/gateways/class-wc-gateway-wcj-custom-template.php:69
7988
  msgid "Payment method description that the customer will see on your checkout."
7989
  msgstr ""
7990
 
7991
+ #: includes/gateways/class-wc-gateway-wcj-custom-template.php:70
7992
  msgid "You can add input fields with [wcj_input_field] shortcode."
7993
  msgstr ""
7994
 
7995
+ #: includes/gateways/class-wc-gateway-wcj-custom-template.php:71
7996
  msgid "Custom Payment Description."
7997
  msgstr ""
7998
 
7999
+ #: includes/gateways/class-wc-gateway-wcj-custom-template.php:76
8000
  msgid "Instructions"
8001
  msgstr ""
8002
 
8003
+ #: includes/gateways/class-wc-gateway-wcj-custom-template.php:78
8004
  msgid "Instructions that will be added to the thank you page."
8005
  msgstr ""
8006
 
8007
+ #: includes/gateways/class-wc-gateway-wcj-custom-template.php:84
8008
  msgid "Email Instructions"
8009
  msgstr ""
8010
 
8011
+ #: includes/gateways/class-wc-gateway-wcj-custom-template.php:86
8012
  msgid "Instructions that will be added to the emails."
8013
  msgstr ""
8014
 
8015
+ #: includes/gateways/class-wc-gateway-wcj-custom-template.php:92
8016
  msgid "Icon"
8017
  msgstr ""
8018
 
8019
+ #: includes/gateways/class-wc-gateway-wcj-custom-template.php:94
8020
  #: includes/settings/wcj-settings-payment-gateways-icons.php:19
8021
  msgid ""
8022
  "If you want to show an image next to the gateway's name on the frontend, "
8023
  "enter a URL to an image."
8024
  msgstr ""
8025
 
8026
+ #: includes/gateways/class-wc-gateway-wcj-custom-template.php:101
8027
  #: includes/settings/wcj-settings-shipping-by-order-amount.php:62
8028
  msgid "Minimum order amount"
8029
  msgstr ""
8030
 
8031
+ #: includes/gateways/class-wc-gateway-wcj-custom-template.php:103
8032
  msgid ""
8033
  "If you want to set minimum order amount (excluding fees) to show this gateway "
8034
  "on frontend, enter a number here. Set to 0 to disable."
8035
  msgstr ""
8036
 
8037
+ #: includes/gateways/class-wc-gateway-wcj-custom-template.php:110
8038
  #: includes/settings/wcj-settings-payment-gateways-by-shipping.php:67
8039
  msgid "Enable for shipping methods"
8040
  msgstr ""
8041
 
8042
+ #: includes/gateways/class-wc-gateway-wcj-custom-template.php:115
8043
  msgid ""
8044
  "If gateway is only available for certain shipping methods, set it up here. "
8045
  "Leave blank to enable for all methods."
8046
  msgstr ""
8047
 
8048
+ #: includes/gateways/class-wc-gateway-wcj-custom-template.php:118
8049
  #: includes/settings/wcj-settings-payment-gateways-by-shipping.php:74
8050
  msgid "Select shipping methods"
8051
  msgstr ""
8052
 
8053
+ #: includes/gateways/class-wc-gateway-wcj-custom-template.php:122
8054
  msgid "Enable for virtual orders"
8055
  msgstr ""
8056
 
8057
+ #: includes/gateways/class-wc-gateway-wcj-custom-template.php:123
8058
  msgid "Enable gateway if the order is virtual"
8059
  msgstr ""
8060
 
8061
+ #: includes/gateways/class-wc-gateway-wcj-custom-template.php:129
8062
  #: includes/settings/wcj-settings-order-custom-statuses.php:22
8063
  msgid "Default Order Status"
8064
  msgstr ""
8065
 
8066
+ #: includes/gateways/class-wc-gateway-wcj-custom-template.php:130
8067
  msgid "Enable Custom Statuses feature to add custom statuses to the list."
8068
  msgstr ""
8069
 
8070
+ #: includes/gateways/class-wc-gateway-wcj-custom-template.php:137
8071
  msgid "Send Additional Emails"
8072
  msgstr ""
8073
 
8074
+ #: includes/gateways/class-wc-gateway-wcj-custom-template.php:138
8075
  msgid "Send to Admin"
8076
  msgstr ""
8077
 
8078
+ #: includes/gateways/class-wc-gateway-wcj-custom-template.php:144
8079
  msgid "Send to Customer"
8080
  msgstr ""
8081
 
8082
+ #: includes/gateways/class-wc-gateway-wcj-custom-template.php:145
8083
  msgid ""
8084
  "This may help if you are using pending or custom default status and not "
8085
  "getting new order emails."
8086
  msgstr ""
8087
 
8088
+ #: includes/gateways/class-wc-gateway-wcj-custom-template.php:151
8089
  msgid "Custom Return URL (Thank You Page)"
8090
  msgstr ""
8091
 
8092
+ #: includes/gateways/class-wc-gateway-wcj-custom-template.php:153
8093
  msgid "Enter full URL with http(s)."
8094
  msgstr ""
8095
 
8096
+ #: includes/gateways/class-wc-gateway-wcj-custom-template.php:154
8097
  msgid "Optional. Leave blank to use default URL."
8098
  msgstr ""
8099
 
8100
+ #: includes/gateways/class-wc-gateway-wcj-custom-template.php:359
8101
  #: includes/settings/wcj-settings-payment-gateways.php:48
8102
  msgid "Custom Gateway"
8103
  msgstr ""
8104
 
8105
+ #: includes/gateways/class-wc-gateway-wcj-custom-template.php:361
8106
  msgid "Booster for WooCommerce: Custom Payment Gateway"
8107
  msgstr ""
8108
 
8120
  msgid "Product Input Field"
8121
  msgstr ""
8122
 
8123
+ #: includes/input-fields/class-wcj-product-input-fields-core.php:540
8124
  msgid "Wrong file type!"
8125
  msgstr ""
8126
 
8127
+ #: includes/input-fields/class-wcj-product-input-fields-core.php:549
8128
  msgid "File is too big!"
8129
  msgstr ""
8130
 
8131
+ #: includes/input-fields/class-wcj-product-input-fields-core.php:781
8132
  msgid "Select a country&hellip;"
8133
  msgstr ""
8134
 
8181
  #: includes/settings/meta-box/wcj-settings-meta-box-product-addons.php:97
8182
  #: includes/settings/wcj-settings-checkout-custom-fields.php:147
8183
  #: includes/settings/wcj-settings-product-addons.php:100
 
8184
  msgid "Checkbox"
8185
  msgstr ""
8186
 
8206
 
8207
  #: includes/input-fields/wcj-product-input-fields-options.php:43
8208
  #: includes/settings/wcj-settings-checkout-custom-fields.php:151
 
8209
  msgid "Select"
8210
  msgstr ""
8211
 
8461
  msgid "Select/Radio: Options"
8462
  msgstr ""
8463
 
8464
+ #: includes/pdf-invoices/class-wcj-pdf-invoicing-renumerate-tool.php:75
8465
  msgid "Invoices successfully renumerated!"
8466
  msgstr ""
8467
 
8468
+ #: includes/pdf-invoices/class-wcj-pdf-invoicing-renumerate-tool.php:77
8469
  msgid "Please select at least one order status."
8470
  msgstr ""
8471
 
8472
+ #: includes/pdf-invoices/class-wcj-pdf-invoicing-renumerate-tool.php:82
8473
  msgid "Booster - Renumerate Invoices"
8474
  msgstr ""
8475
 
8476
+ #: includes/pdf-invoices/class-wcj-pdf-invoicing-renumerate-tool.php:83
8477
  msgid ""
8478
  "The tool renumerates invoices from choosen date. Invoice number format is set "
8479
  "in WooCommerce > Settings > Booster > PDF Invoicing & Packing Slips > "
8480
  "Numbering."
8481
  msgstr ""
8482
 
8483
+ #: includes/pdf-invoices/class-wcj-pdf-invoicing-renumerate-tool.php:90
8484
  #: includes/settings/meta-box/wcj-settings-meta-box-crowdfunding.php:26
8485
  msgid "Start Date"
8486
  msgstr ""
8487
 
8488
+ #: includes/pdf-invoices/class-wcj-pdf-invoicing-renumerate-tool.php:92
8489
  msgid "Date to start renumerating. Leave blank to renumerate all invoices."
8490
  msgstr ""
8491
 
8492
+ #: includes/pdf-invoices/class-wcj-pdf-invoicing-renumerate-tool.php:97
8493
  msgid "End Date"
8494
  msgstr ""
8495
 
8496
+ #: includes/pdf-invoices/class-wcj-pdf-invoicing-renumerate-tool.php:99
8497
  msgid "Date to end renumerating. Leave blank to renumerate all invoices."
8498
  msgstr ""
8499
 
8500
+ #: includes/pdf-invoices/class-wcj-pdf-invoicing-renumerate-tool.php:104
8501
  msgid "Start Number"
8502
  msgstr ""
8503
 
8504
+ #: includes/pdf-invoices/class-wcj-pdf-invoicing-renumerate-tool.php:106
8505
  msgid "Counter to start renumerating. Leave 0 to continue from current counter."
8506
  msgstr ""
8507
 
8508
+ #: includes/pdf-invoices/class-wcj-pdf-invoicing-renumerate-tool.php:111
8509
  msgid "Delete All"
8510
  msgstr ""
8511
 
8512
+ #: includes/pdf-invoices/class-wcj-pdf-invoicing-renumerate-tool.php:113
8513
  msgid "Clear all invoices before renumerating"
8514
  msgstr ""
8515
 
8516
+ #: includes/pdf-invoices/class-wcj-pdf-invoicing-renumerate-tool.php:125
8517
  #: includes/pdf-invoices/class-wcj-pdf-invoicing-report-tool.php:156
8518
  msgid "Document Type"
8519
  msgstr ""
8520
 
8521
+ #: includes/pdf-invoices/class-wcj-pdf-invoicing-renumerate-tool.php:134
8522
  msgid "Order Statuses"
8523
  msgstr ""
8524
 
8525
+ #: includes/pdf-invoices/class-wcj-pdf-invoicing-renumerate-tool.php:138
8526
  msgid "Renumerate invoices"
8527
  msgstr ""
8528
 
8529
+ #: includes/pdf-invoices/class-wcj-pdf-invoicing-renumerate-tool.php:245
8530
  #, php-format
8531
  msgid "Total documents created: %d"
8532
  msgstr ""
8533
 
8534
+ #: includes/pdf-invoices/class-wcj-pdf-invoicing-renumerate-tool.php:247
8535
  #, php-format
8536
  msgid "Total documents deleted: %d"
8537
  msgstr ""
8544
  "Settings > Booster > PDF Invoicing & Packing Slips > Advanced</a>."
8545
  msgstr ""
8546
 
 
 
 
 
8547
  #: includes/pdf-invoices/class-wcj-pdf-invoicing-report-tool.php:105
8548
  #: includes/pdf-invoices/class-wcj-pdf-invoicing-report-tool.php:127
8549
  msgid "Please fill year and month values."
8583
  #: includes/settings/wcj-settings-multicurrency-base-price.php:67
8584
  #: includes/settings/wcj-settings-multicurrency.php:244
8585
  #: includes/settings/wcj-settings-order-min-amount.php:87
8586
+ #: includes/settings/wcj-settings-price-by-country.php:257
8587
  #: includes/settings/wcj-settings-price-by-user-role.php:110
8588
  #: includes/settings/wcj-settings-product-addons.php:251
8589
  msgid "Advanced"
8717
  msgid "Templates"
8718
  msgstr ""
8719
 
8720
+ #: includes/price-by-country/class-wcj-price-by-country-group-generator.php:41
8721
  msgid "Country groups successfully generated."
8722
  msgstr ""
8723
 
8724
+ #: includes/price-by-country/class-wcj-price-by-country-group-generator.php:44
8725
  msgid "Country groups generation failed."
8726
  msgstr ""
8727
 
8728
  #: includes/price-by-country/class-wcj-price-by-country-local.php:124
8729
  #: includes/settings/meta-box/wcj-settings-meta-box-price-by-country.php:77
8730
+ #: includes/settings/wcj-settings-price-by-country.php:465
8731
  msgid "Make empty price"
8732
  msgstr ""
8733
 
8734
  #: includes/price-by-country/class-wcj-price-by-country-local.php:249
8735
  #: includes/settings/meta-box/wcj-settings-meta-box-price-by-country.php:21
8736
  #: includes/settings/wcj-settings-add-to-cart.php:59
8737
+ #: includes/settings/wcj-settings-price-by-country.php:350
8738
+ #: includes/settings/wcj-settings-price-by-country.php:351
8739
+ #: includes/settings/wcj-settings-price-by-country.php:356
8740
+ #: includes/settings/wcj-settings-price-by-country.php:406
8741
+ #: includes/settings/wcj-settings-price-by-country.php:456
8742
  msgid "Group"
8743
  msgstr ""
8744
 
8809
  msgstr ""
8810
 
8811
  #: includes/reports/class-wcj-reports-monthly-sales.php:102
8812
+ #: includes/reports/class-wcj-reports-sales.php:345
8813
  msgid "Total Sum"
8814
  msgstr ""
8815
 
8833
  msgid "Orders by Currency"
8834
  msgstr ""
8835
 
8836
+ #: includes/reports/class-wcj-reports-monthly-sales.php:217
8837
+ #: includes/reports/class-wcj-reports-monthly-sales.php:233
8838
+ #: includes/reports/class-wcj-reports-monthly-sales.php:305
8839
+ #: includes/reports/class-wcj-reports-monthly-sales.php:310
8840
  #, php-format
8841
  msgid "Forecast: %s"
8842
  msgstr ""
8843
 
8844
+ #: includes/reports/class-wcj-reports-monthly-sales.php:257
8845
  msgid "Grab average rate"
8846
  msgstr ""
8847
 
8848
+ #: includes/reports/class-wcj-reports-monthly-sales.php:316
8849
  msgid "Totals"
8850
  msgstr ""
8851
 
8852
+ #: includes/reports/class-wcj-reports-monthly-sales.php:360
8853
  msgid "Report currency"
8854
  msgstr ""
8855
 
8856
+ #: includes/reports/class-wcj-reports-monthly-sales.php:380
8857
  #, php-format
8858
  msgid "Report generated in: %s s"
8859
  msgstr ""
8860
 
8861
+ #: includes/reports/class-wcj-reports-monthly-sales.php:384
8862
  msgid "Save Currency Rates"
8863
  msgstr ""
8864
 
8865
+ #: includes/reports/class-wcj-reports-monthly-sales.php:389
8866
  msgid "Reset Currency Rates"
8867
  msgstr ""
8868
 
8869
  #: includes/reports/class-wcj-reports-product-sales-daily.php:180
8870
+ #: includes/reports/class-wcj-reports-sales-gateways.php:125
8871
+ #: includes/reports/class-wcj-reports-sales.php:365
8872
  msgid "Reports Settings"
8873
  msgstr ""
8874
 
8875
+ #: includes/reports/class-wcj-reports-product-sales-daily.php:209
8876
+ #: includes/reports/class-wcj-reports-sales-gateways.php:155
8877
  msgid "From:"
8878
  msgstr ""
8879
 
8880
+ #: includes/reports/class-wcj-reports-product-sales-daily.php:212
8881
+ #: includes/reports/class-wcj-reports-sales-gateways.php:158
8882
  msgid "To:"
8883
  msgstr ""
8884
 
8885
+ #: includes/reports/class-wcj-reports-product-sales-daily.php:215
8886
  msgid "Product:"
8887
  msgstr ""
8888
 
8889
+ #: includes/reports/class-wcj-reports-product-sales-daily.php:306
8890
  #, php-format
8891
  msgid "Total: %d"
8892
  msgstr ""
8893
 
8894
+ #: includes/reports/class-wcj-reports-product-sales-daily.php:311
8895
+ #: includes/reports/class-wcj-reports-product-sales-daily.php:316
8896
  #, php-format
8897
  msgid "Total: %s"
8898
  msgstr ""
8899
 
8900
+ #: includes/reports/class-wcj-reports-product-sales-daily.php:335
8901
+ #: includes/reports/class-wcj-reports-sales-gateways.php:192
8902
  #, php-format
8903
  msgid "Total orders: %d"
8904
  msgstr ""
8905
 
8906
+ #: includes/reports/class-wcj-reports-product-sales-daily.php:336
8907
+ #: includes/reports/class-wcj-reports-sales-gateways.php:194
8908
+ #: includes/reports/class-wcj-reports-sales.php:396
8909
  msgid "No sales data for current period."
8910
  msgstr ""
8911
 
8912
+ #: includes/reports/class-wcj-reports-sales-gateways.php:95
8913
+ #: includes/reports/class-wcj-reports-stock.php:121
8914
+ #: includes/reports/class-wcj-reports-stock.php:197
8915
+ msgid "N/A"
8916
+ msgstr ""
8917
+
8918
+ #: includes/reports/class-wcj-reports-sales-gateways.php:178
8919
+ msgid "Gateway"
8920
+ msgstr ""
8921
+
8922
+ #: includes/reports/class-wcj-reports-sales.php:141
8923
  msgid "Variation"
8924
  msgstr ""
8925
 
8926
+ #: includes/reports/class-wcj-reports-sales.php:211
8927
  msgid "Last Sale"
8928
  msgstr ""
8929
 
8930
+ #: includes/reports/class-wcj-reports-sales.php:212
8931
  msgid "Total"
8932
  msgstr ""
8933
 
8934
+ #: includes/reports/class-wcj-reports-sales.php:334
8935
  msgid "Total Items"
8936
  msgstr ""
8937
 
8938
+ #: includes/reports/class-wcj-reports-sales.php:356
8939
  msgid "Total Profit"
8940
  msgstr ""
8941
 
8942
+ #: includes/reports/class-wcj-reports-sales.php:391
8943
  msgid "Filter products"
8944
  msgstr ""
8945
 
8978
  "accounted."
8979
  msgstr ""
8980
 
 
 
 
 
 
 
8981
  #: includes/reports/class-wcj-reports-stock.php:293
8982
  msgid "Stock price"
8983
  msgstr ""
9043
  msgid "Report was generated in: "
9044
  msgstr ""
9045
 
 
 
 
 
9046
  #: includes/settings/meta-box/wcj-settings-meta-box-add-to-cart-button-visibility.php:21
9047
  #: includes/settings/meta-box/wcj-settings-meta-box-add-to-cart-button-visibility.php:40
9048
  #: includes/settings/wcj-settings-admin-orders-list.php:139
9320
  #: includes/settings/wcj-settings-general.php:129
9321
  #: includes/settings/wcj-settings-general.php:137
9322
  #: includes/settings/wcj-settings-pdf-invoicing-advanced.php:93
9323
+ #: includes/settings/wcj-settings-pdf-invoicing-advanced.php:182
9324
  #: includes/settings/wcj-settings-price-by-user-role.php:59
9325
  #: includes/settings/wcj-settings-price-by-user-role.php:165
9326
  #: includes/settings/wcj-settings-product-add-to-cart.php:135
10512
  msgstr ""
10513
 
10514
  #: includes/settings/wcj-settings-checkout-core-fields.php:94
10515
+ #: includes/shortcodes/class-wcj-products-add-form-shortcodes.php:354
10516
  msgid "required"
10517
  msgstr ""
10518
 
11516
  msgstr ""
11517
 
11518
  #: includes/settings/wcj-settings-checkout-files-upload.php:334
11519
+ #, php-format
11520
+ msgid "Replaced values: %1$s, %2$s, %3$s."
11521
  msgstr ""
11522
 
11523
  #: includes/settings/wcj-settings-checkout-files-upload.php:342
11528
  msgstr ""
11529
 
11530
  #: includes/settings/wcj-settings-checkout-files-upload.php:344
11531
+ #, php-format
11532
+ msgid "Replaced values: %1$s, %2$s."
11533
  msgstr ""
11534
 
11535
  #: includes/settings/wcj-settings-checkout-files-upload.php:352
11869
  #: includes/settings/wcj-settings-multicurrency-base-price.php:26
11870
  #: includes/settings/wcj-settings-multicurrency.php:26
11871
  #: includes/settings/wcj-settings-payment-gateways-currency.php:76
11872
+ #: includes/settings/wcj-settings-price-by-country.php:425
11873
  msgid "Exchange Rates Updates"
11874
  msgstr ""
11875
 
11983
  msgstr ""
11984
 
11985
  #: includes/settings/wcj-settings-currency-exchange-rates.php:192
11986
+ #: includes/settings/wcj-settings-price-by-country.php:420
11987
  msgid "Exchange Rates"
11988
  msgstr ""
11989
 
12003
  #: includes/settings/wcj-settings-multicurrency-base-price.php:151
12004
  #: includes/settings/wcj-settings-multicurrency.php:322
12005
  #: includes/settings/wcj-settings-multicurrency.php:366
12006
+ #: includes/settings/wcj-settings-price-by-country.php:397
12007
  #: includes/settings/wcj-settings-price-formats.php:68
12008
  msgid "Currency"
12009
  msgstr ""
12076
  #: includes/settings/wcj-settings-multicurrency-base-price.php:31
12077
  #: includes/settings/wcj-settings-multicurrency.php:32
12078
  #: includes/settings/wcj-settings-payment-gateways-currency.php:81
12079
+ #: includes/settings/wcj-settings-price-by-country.php:430
12080
  msgid "Enter Rates Manually"
12081
  msgstr ""
12082
 
12084
  #: includes/settings/wcj-settings-multicurrency-base-price.php:32
12085
  #: includes/settings/wcj-settings-multicurrency.php:33
12086
  #: includes/settings/wcj-settings-payment-gateways-currency.php:82
12087
+ #: includes/settings/wcj-settings-price-by-country.php:431
12088
  msgid "Automatically via Currency Exchange Rates module"
12089
  msgstr ""
12090
 
12092
  #: includes/settings/wcj-settings-multicurrency-base-price.php:35
12093
  #: includes/settings/wcj-settings-multicurrency.php:36
12094
  #: includes/settings/wcj-settings-payment-gateways-currency.php:85
12095
+ #: includes/settings/wcj-settings-price-by-country.php:434
12096
  msgid "Visit"
12097
  msgstr ""
12098
 
12100
  #: includes/settings/wcj-settings-multicurrency-base-price.php:35
12101
  #: includes/settings/wcj-settings-multicurrency.php:36
12102
  #: includes/settings/wcj-settings-payment-gateways-currency.php:87
12103
+ #: includes/settings/wcj-settings-price-by-country.php:434
12104
  msgid "Currency Exchange Rates module"
12105
  msgstr ""
12106
 
12259
  msgid "System Info"
12260
  msgstr ""
12261
 
12262
+ #: includes/settings/wcj-settings-debug-tools.php:57
12263
  msgid "Show extended info"
12264
  msgstr ""
12265
 
12650
  msgstr ""
12651
 
12652
  #: includes/settings/wcj-settings-export.php:23
12653
+ #: includes/settings/wcj-settings-pdf-invoicing-advanced.php:249
12654
  msgid "CSV Separator"
12655
  msgstr ""
12656
 
13082
 
13083
  #: includes/settings/wcj-settings-global-discount.php:114
13084
  #: includes/settings/wcj-settings-multicurrency.php:84
13085
+ #: includes/settings/wcj-settings-price-by-country.php:102
13086
  #: includes/settings/wcj-settings-product-price-by-formula.php:79
13087
  #: includes/shipping/class-wc-shipping-wcj-custom-with-shipping-zones.php:256
13088
  msgid "Round"
13209
  #: includes/settings/wcj-settings-global-discount.php:231
13210
  #: includes/settings/wcj-settings-multicurrency-base-price.php:80
13211
  #: includes/settings/wcj-settings-multicurrency.php:259
13212
+ #: includes/settings/wcj-settings-price-by-country.php:262
13213
  #: includes/settings/wcj-settings-price-by-user-role.php:115
13214
  #: includes/settings/wcj-settings-product-addons.php:279
13215
  #: includes/settings/wcj-settings-product-price-by-formula.php:136
13219
  #: includes/settings/wcj-settings-global-discount.php:232
13220
  #: includes/settings/wcj-settings-multicurrency-base-price.php:81
13221
  #: includes/settings/wcj-settings-multicurrency.php:260
13222
+ #: includes/settings/wcj-settings-price-by-country.php:263
13223
  #: includes/settings/wcj-settings-price-by-user-role.php:116
13224
  #: includes/settings/wcj-settings-product-addons.php:280
13225
  #: includes/settings/wcj-settings-product-price-by-formula.php:137
13446
 
13447
  #: includes/settings/wcj-settings-multicurrency-base-price.php:72
13448
  #: includes/settings/wcj-settings-multicurrency.php:274
13449
+ #: includes/settings/wcj-settings-price-by-country.php:290
13450
  #: includes/settings/wcj-settings-product-price-by-formula.php:143
13451
  msgid "Save Calculated Products Prices"
13452
  msgstr ""
13463
  #: includes/settings/wcj-settings-order-min-amount.php:119
13464
  #: includes/settings/wcj-settings-order-numbers.php:143
13465
  #: includes/settings/wcj-settings-payment-gateways-min-max.php:72
13466
+ #: includes/settings/wcj-settings-price-by-country.php:170
13467
  #: includes/settings/wcj-settings-price-by-user-role.php:135
13468
  #: includes/settings/wcj-settings-product-msrp.php:116
13469
  msgid "Compatibility"
13561
  msgstr ""
13562
 
13563
  #: includes/settings/wcj-settings-multicurrency.php:83
13564
+ #: includes/settings/wcj-settings-price-by-country.php:101
13565
  #: includes/shipping/class-wc-shipping-wcj-custom-with-shipping-zones.php:255
13566
  msgid "No rounding"
13567
  msgstr ""
13568
 
13569
  #: includes/settings/wcj-settings-multicurrency.php:85
13570
+ #: includes/settings/wcj-settings-price-by-country.php:104
13571
  #: includes/settings/wcj-settings-product-price-by-formula.php:80
13572
  #: includes/shipping/class-wc-shipping-wcj-custom-with-shipping-zones.php:257
13573
  msgid "Round up"
13574
  msgstr ""
13575
 
13576
  #: includes/settings/wcj-settings-multicurrency.php:86
13577
+ #: includes/settings/wcj-settings-price-by-country.php:103
13578
  #: includes/settings/wcj-settings-product-price-by-formula.php:81
13579
  #: includes/shipping/class-wc-shipping-wcj-custom-with-shipping-zones.php:258
13580
  msgid "Round down"
13606
  msgstr ""
13607
 
13608
  #: includes/settings/wcj-settings-multicurrency.php:125
13609
+ #: includes/settings/wcj-settings-price-by-country.php:216
13610
  msgid "Free Shipping"
13611
  msgstr ""
13612
 
13613
  #: includes/settings/wcj-settings-multicurrency.php:128
13614
+ #: includes/settings/wcj-settings-price-by-country.php:219
13615
  msgid "Converts minimum amount from WooCommerce Free Shipping native method."
13616
  msgstr ""
13617
 
13620
  msgstr ""
13621
 
13622
  #: includes/settings/wcj-settings-multicurrency.php:136
13623
+ #: includes/settings/wcj-settings-price-by-country.php:227
13624
  msgid ""
13625
  "When a fixed coupon is used its value changes according to the current "
13626
  "currency."
13760
  msgstr ""
13761
 
13762
  #: includes/settings/wcj-settings-multicurrency.php:275
13763
+ #: includes/settings/wcj-settings-price-by-country.php:291
13764
  #: includes/settings/wcj-settings-product-price-by-formula.php:144
13765
  msgid ""
13766
  "This may help if you are experiencing compatibility issues with other plugins."
15603
  msgid "Fonts Manager"
15604
  msgstr ""
15605
 
15606
+ #: includes/settings/wcj-settings-pdf-invoicing-advanced.php:176
15607
  msgid "Re-download"
15608
  msgstr ""
15609
 
15610
+ #: includes/settings/wcj-settings-pdf-invoicing-advanced.php:176
15611
  msgid "Download"
15612
  msgstr ""
15613
 
15614
+ #: includes/settings/wcj-settings-pdf-invoicing-advanced.php:181
15615
  msgid "Disable Fonts Download"
15616
  msgstr ""
15617
 
15618
+ #: includes/settings/wcj-settings-pdf-invoicing-advanced.php:192
15619
  msgid "General Display Options"
15620
  msgstr ""
15621
 
15622
+ #: includes/settings/wcj-settings-pdf-invoicing-advanced.php:197
15623
  msgid "Add PDF Invoices Meta Box to Admin Edit Order Page"
15624
  msgstr ""
15625
 
15626
+ #: includes/settings/wcj-settings-pdf-invoicing-advanced.php:204
15627
  msgid "Open docs in new window"
15628
  msgstr ""
15629
 
15630
+ #: includes/settings/wcj-settings-pdf-invoicing-advanced.php:210
15631
  msgid "Add editable numbers and dates"
15632
  msgstr ""
15633
 
15634
+ #: includes/settings/wcj-settings-pdf-invoicing-advanced.php:220
15635
  msgid "Report Tool Options"
15636
  msgstr ""
15637
 
15638
+ #: includes/settings/wcj-settings-pdf-invoicing-advanced.php:225
15639
  msgid "Reports Filename"
15640
  msgstr ""
15641
 
15642
+ #: includes/settings/wcj-settings-pdf-invoicing-advanced.php:233
15643
  msgid "Report Columns"
15644
  msgstr ""
15645
 
15646
+ #: includes/settings/wcj-settings-pdf-invoicing-advanced.php:234
15647
  msgid "Leave blank to show all columns."
15648
  msgstr ""
15649
 
15650
+ #: includes/settings/wcj-settings-pdf-invoicing-advanced.php:242
15651
  msgid "Tax Percent Precision"
15652
  msgstr ""
15653
 
15654
+ #: includes/settings/wcj-settings-pdf-invoicing-advanced.php:255
15655
  msgid "CSV UTF-8 BOM"
15656
  msgstr ""
15657
 
15658
+ #: includes/settings/wcj-settings-pdf-invoicing-advanced.php:262
15659
  msgid "Replace Periods with Commas in CSV Data"
15660
  msgstr ""
15661
 
15662
+ #: includes/settings/wcj-settings-pdf-invoicing-advanced.php:263
15663
  #: includes/settings/wcj-settings-product-open-pricing.php:183
15664
  msgid "Replace"
15665
  msgstr ""
15666
 
15667
  #: includes/settings/wcj-settings-pdf-invoicing-display.php:30
15668
+ #: includes/settings/wcj-settings-price-by-country.php:404
15669
  #: includes/settings/wcj-settings-shipping.php:34
15670
  msgid "Admin Title"
15671
  msgstr ""
16008
  msgid "Available in Booster Plus only."
16009
  msgstr ""
16010
 
16011
+ #: includes/settings/wcj-settings-price-by-country.php:33
16012
  msgid ""
16013
  "All existing country groups will be deleted and new groups will be created. "
16014
  "Are you sure?"
16015
  msgstr ""
16016
 
16017
+ #: includes/settings/wcj-settings-price-by-country.php:41
16018
  msgid "Price by Country Options"
16019
  msgstr ""
16020
 
16021
+ #: includes/settings/wcj-settings-price-by-country.php:43
16022
  msgid ""
16023
  "Change product's price and currency by customer's country. Customer's country "
16024
  "is detected automatically by IP, or selected by customer manually."
16025
  msgstr ""
16026
 
16027
+ #: includes/settings/wcj-settings-price-by-country.php:47
16028
  msgid "Customer Country Detection Method"
16029
  msgstr ""
16030
 
16031
+ #: includes/settings/wcj-settings-price-by-country.php:49
16032
  msgid ""
16033
  "If you choose \"by user selection\", use [wcj_country_select_drop_down_list] "
16034
  "shortcode to display country selection list on frontend."
16035
  msgstr ""
16036
 
16037
+ #: includes/settings/wcj-settings-price-by-country.php:53
16038
  msgid "by IP"
16039
  msgstr ""
16040
 
16041
+ #: includes/settings/wcj-settings-price-by-country.php:54
16042
  msgid "by IP, then by user selection"
16043
  msgstr ""
16044
 
16045
+ #: includes/settings/wcj-settings-price-by-country.php:55
16046
  msgid "by user selection"
16047
  msgstr ""
16048
 
16049
+ #: includes/settings/wcj-settings-price-by-country.php:59
16050
  msgid "Override Country Options"
16051
  msgstr ""
16052
 
16053
+ #: includes/settings/wcj-settings-price-by-country.php:64
16054
  msgid "No Override"
16055
  msgstr ""
16056
 
16057
+ #: includes/settings/wcj-settings-price-by-country.php:65
16058
  msgid "Override Country with Customer's Checkout Billing Country"
16059
  msgstr ""
16060
 
16061
+ #: includes/settings/wcj-settings-price-by-country.php:66
16062
  msgid "Override Country with Customer's Checkout Shipping Country"
16063
  msgstr ""
16064
 
16065
+ #: includes/settings/wcj-settings-price-by-country.php:70
16066
  msgid "Override Scope"
16067
  msgstr ""
16068
 
16069
+ #: includes/settings/wcj-settings-price-by-country.php:75
16070
  msgid "All site"
16071
  msgstr ""
16072
 
16073
+ #: includes/settings/wcj-settings-price-by-country.php:76
16074
  msgid "Checkout only"
16075
  msgstr ""
16076
 
16077
+ #: includes/settings/wcj-settings-price-by-country.php:80
16078
  msgid "Revert Currency to Default on Checkout"
16079
  msgstr ""
16080
 
16081
+ #: includes/settings/wcj-settings-price-by-country.php:85
16082
  msgid ""
16083
  "If selected currency is &#8364; and your shop currency is &#36;, So if you "
16084
  "want to show &#36; on the checkout page you can enable the option."
16085
  msgstr ""
16086
 
16087
+ #: includes/settings/wcj-settings-price-by-country.php:88
16088
  msgid "Auto set default checkout billing country"
16089
  msgstr ""
16090
 
16091
+ #: includes/settings/wcj-settings-price-by-country.php:95
16092
  msgid "Price Rounding"
16093
  msgstr ""
16094
 
16095
+ #: includes/settings/wcj-settings-price-by-country.php:96
16096
  msgid "If you choose to multiply price, set rounding options here."
16097
  msgstr ""
16098
 
16099
+ #: includes/settings/wcj-settings-price-by-country.php:108
16100
  msgid "Make Pretty Price"
16101
  msgstr ""
16102
 
16103
+ #: includes/settings/wcj-settings-price-by-country.php:110
16104
  msgid ""
16105
  "If enabled, this will be applied if exchange rates are used. Final converted "
16106
  "price will be rounded, then decreased by smallest possible value. For "
16109
  "above zero."
16110
  msgstr ""
16111
 
16112
+ #: includes/settings/wcj-settings-price-by-country.php:116
16113
  msgid "Discount Min Amount Multiplier"
16114
  msgstr ""
16115
 
16116
+ #: includes/settings/wcj-settings-price-by-country.php:117
16117
  msgid ""
16118
  "If \"Make Pretty Price\" is enabled, here you can set by how many smallest "
16119
  "possible values (e.g. cents) final price should be decreased."
16120
  msgstr ""
16121
 
16122
+ #: includes/settings/wcj-settings-price-by-country.php:124
16123
  msgid "Price by Country on per Product Basis"
16124
  msgstr ""
16125
 
16126
+ #: includes/settings/wcj-settings-price-by-country.php:126
16127
  msgid "This will add product data fields in product edit."
16128
  msgstr ""
16129
 
16130
+ #: includes/settings/wcj-settings-price-by-country.php:132
16131
  msgid "Per product options - backend style"
16132
  msgstr ""
16133
 
16134
+ #: includes/settings/wcj-settings-price-by-country.php:137
16135
  #: includes/settings/wcj-settings-product-msrp.php:107
16136
  msgid "Inline"
16137
  msgstr ""
16138
 
16139
+ #: includes/settings/wcj-settings-price-by-country.php:138
16140
  msgid "Separate meta box"
16141
  msgstr ""
16142
 
16143
+ #: includes/settings/wcj-settings-price-by-country.php:142
16144
  msgid "Per product options - backend user role visibility"
16145
  msgstr ""
16146
 
16147
+ #: includes/settings/wcj-settings-price-by-country.php:143
16148
  msgid "Leave empty to show to all user roles."
16149
  msgstr ""
16150
 
16151
+ #: includes/settings/wcj-settings-price-by-country.php:151
16152
  msgid "Add Countries Flags Images to Select Drop-Down Box"
16153
  msgstr ""
16154
 
16155
+ #: includes/settings/wcj-settings-price-by-country.php:153
16156
  msgid ""
16157
  "If you are using [wcj_country_select_drop_down_list] shortcode or \"Booster: "
16158
  "Country Switcher\" widget, this will add country flags to these select boxes."
16159
  msgstr ""
16160
 
16161
+ #: includes/settings/wcj-settings-price-by-country.php:159
16162
  #: includes/settings/wcj-settings-price-by-user-role.php:65
16163
  msgid "Search Engine Bots"
16164
  msgstr ""
16165
 
16166
+ #: includes/settings/wcj-settings-price-by-country.php:160
16167
  msgid "Disable Price by Country for Bots"
16168
  msgstr ""
16169
 
16170
+ #: includes/settings/wcj-settings-price-by-country.php:175
16171
  msgid "Active Webtofee subscription Section"
16172
  msgstr ""
16173
 
16174
+ #: includes/settings/wcj-settings-price-by-country.php:176
16175
  msgid "Compatibility with Webtofee subscription PLugin"
16176
  msgstr ""
16177
 
16178
+ #: includes/settings/wcj-settings-price-by-country.php:182
16179
+ #: includes/settings/wcj-settings-price-by-country.php:183
16180
  msgid "Active B2B Plugin Price Section"
16181
  msgstr ""
16182
 
16183
+ #: includes/settings/wcj-settings-price-by-country.php:189
16184
  #: includes/settings/wcj-settings-product-price-by-formula.php:117
16185
  msgid "Disable Quick Edit Product For Admin Scope"
16186
  msgstr ""
16187
 
16188
+ #: includes/settings/wcj-settings-price-by-country.php:190
16189
  #: includes/settings/wcj-settings-product-price-by-formula.php:118
16190
  msgid "Disable For Admin Quick Edit Scope."
16191
  msgstr ""
16192
 
16193
+ #: includes/settings/wcj-settings-price-by-country.php:191
16194
  msgid "Disable module on Edit Product For Admin scope."
16195
  msgstr ""
16196
 
16197
+ #: includes/settings/wcj-settings-price-by-country.php:191
16198
  #: includes/settings/wcj-settings-product-price-by-formula.php:119
16199
  msgid ""
16200
  "For example if you use Quick Edit Product and donot want change the deafult "
16201
  "price then the box ticked"
16202
  msgstr ""
16203
 
16204
+ #: includes/settings/wcj-settings-price-by-country.php:198
16205
  msgid "Price Filter Widget and Sorting by Price Support"
16206
  msgstr ""
16207
 
16208
+ #: includes/settings/wcj-settings-price-by-country.php:210
16209
  msgid "Recalculate price filter widget and sorting by price product prices."
16210
  msgstr ""
16211
 
16212
+ #: includes/settings/wcj-settings-price-by-country.php:225
16213
  msgid "WooCommerce Coupons"
16214
  msgstr ""
16215
 
16216
+ #: includes/settings/wcj-settings-price-by-country.php:233
16217
  msgid "Woo Discount Rules"
16218
  msgstr ""
16219
 
16220
+ #: includes/settings/wcj-settings-price-by-country.php:237
16221
  #, php-format
16222
  msgid ""
16223
  "Adds compatibility with <a href=\"%s\" target=\"_blank\">Woo Discount Rules</"
16224
  "a> plugin."
16225
  msgstr ""
16226
 
16227
+ #: includes/settings/wcj-settings-price-by-country.php:237
16228
  #, php-format
16229
  msgid ""
16230
  "If it doesn't work properly try to enable <a href=\"%s\">redirect to the cart "
16231
  "page after successful addition</a> option."
16232
  msgstr ""
16233
 
16234
+ #: includes/settings/wcj-settings-price-by-country.php:243
16235
  msgid "WooCommerce Points and Rewards"
16236
  msgstr ""
16237
 
16238
+ #: includes/settings/wcj-settings-price-by-country.php:247
16239
  #, php-format
16240
  msgid ""
16241
  "Adds compatibility with <a href=\"%s\" target=\"_blank\">WooCommerce Points "
16242
  "and Rewards</a> plugin."
16243
  msgstr ""
16244
 
16245
+ #: includes/settings/wcj-settings-price-by-country.php:269
16246
  msgid "User IP Detection Method"
16247
  msgstr ""
16248
 
16249
+ #: includes/settings/wcj-settings-price-by-country.php:279
16250
  msgid "Price Format Method"
16251
  msgstr ""
16252
 
16253
+ #: includes/settings/wcj-settings-price-by-country.php:280
16254
  msgid "The moment \"Pretty Price\" and \"Rounding\" will be applied"
16255
  msgstr ""
16256
 
16257
+ #: includes/settings/wcj-settings-price-by-country.php:285
16258
  msgid "get_price()"
16259
  msgstr ""
16260
 
16261
+ #: includes/settings/wcj-settings-price-by-country.php:286
16262
  msgid "wc_get_price_to_display()"
16263
  msgstr ""
16264
 
16265
+ #: includes/settings/wcj-settings-price-by-country.php:298
16266
  msgid "Save Country Group ID"
16267
  msgstr ""
16268
 
16269
+ #: includes/settings/wcj-settings-price-by-country.php:299
16270
  msgid ""
16271
  "Try to disable it if the country detection is not correct, most probably if "
16272
  "\"Override Country Options\" is enabled."
16273
  msgstr ""
16274
 
16275
+ #: includes/settings/wcj-settings-price-by-country.php:310
16276
  msgid "Country Groups"
16277
  msgstr ""
16278
 
16279
+ #: includes/settings/wcj-settings-price-by-country.php:315
16280
  msgid "Countries Selection"
16281
  msgstr ""
16282
 
16283
+ #: includes/settings/wcj-settings-price-by-country.php:316
16284
  msgid "Choose how do you want to enter countries groups in admin."
16285
  msgstr ""
16286
 
16287
+ #: includes/settings/wcj-settings-price-by-country.php:321
16288
  msgid "Comma separated list"
16289
  msgstr ""
16290
 
16291
+ #: includes/settings/wcj-settings-price-by-country.php:322
16292
  msgid "Multiselect"
16293
  msgstr ""
16294
 
16295
+ #: includes/settings/wcj-settings-price-by-country.php:323
16296
  #: includes/settings/wcj-settings-product-by-condition.php:90
16297
  #: includes/settings/wcj-settings-related-products.php:181
16298
  msgid "Chosen select"
16299
  msgstr ""
16300
 
16301
+ #: includes/settings/wcj-settings-price-by-country.php:327
16302
  msgid "Autogenerate Groups"
16303
  msgstr ""
16304
 
16305
+ #: includes/settings/wcj-settings-price-by-country.php:333
16306
  msgid "Groups Number"
16307
  msgstr ""
16308
 
16309
+ #: includes/settings/wcj-settings-price-by-country.php:362
16310
  msgid ""
16311
  "Countries. List of comma separated country codes.<br>For country codes and "
16312
  "predefined sets visit <a href=\"https://booster.io/country-codes/\" target="
16313
  "\"_blank\">https://booster.io/country-codes/</a>"
16314
  msgstr ""
16315
 
16316
+ #: includes/settings/wcj-settings-price-by-country.php:457
16317
  msgid "Multiply Price by"
16318
  msgstr ""
16319
 
17344
 
17345
  #: includes/settings/wcj-settings-product-by-user.php:18
17346
  #: includes/shortcodes/class-wcj-products-add-form-shortcodes.php:192
17347
+ #: includes/shortcodes/class-wcj-products-add-form-shortcodes.php:397
17348
  msgid "Image"
17349
  msgstr ""
17350
 
17393
  msgstr ""
17394
 
17395
  #: includes/settings/wcj-settings-product-by-user.php:130
17396
+ #: includes/shortcodes/class-wcj-products-add-form-shortcodes.php:314
17397
  msgid "\"%product_title%\" successfully added!"
17398
  msgstr ""
17399
 
17402
  msgstr ""
17403
 
17404
  #: includes/settings/wcj-settings-product-by-user.php:137
17405
+ #: includes/shortcodes/class-wcj-products-add-form-shortcodes.php:322
17406
  msgid "\"%product_title%\" successfully edited!"
17407
  msgstr ""
17408
 
20621
  msgid "Attribute \"name\" is required!"
20622
  msgstr ""
20623
 
20624
+ #: includes/shortcodes/class-wcj-orders-shortcodes.php:397
20625
  #, php-format
20626
  msgid "Refund #%1$s - %2$s"
20627
  msgstr ""
20639
  msgstr ""
20640
 
20641
  #: includes/shortcodes/class-wcj-products-add-form-shortcodes.php:195
20642
+ #: includes/shortcodes/class-wcj-products-add-form-shortcodes.php:423
20643
  msgid "Product URL"
20644
  msgstr ""
20645
 
20652
  msgid "Sale price must be less than the regular price!"
20653
  msgstr ""
20654
 
20655
+ #: includes/shortcodes/class-wcj-products-add-form-shortcodes.php:306
20656
  msgid "Error!"
20657
  msgstr ""
20658
 
20659
+ #: includes/shortcodes/class-wcj-products-add-form-shortcodes.php:349
20660
  msgid "Add New Product"
20661
  msgstr ""
20662
 
20663
+ #: includes/shortcodes/class-wcj-products-add-form-shortcodes.php:349
20664
  msgid "Edit Product"
20665
  msgstr ""
20666
 
20685
  msgid "This product is currently out of stock and unavailable."
20686
  msgstr ""
20687
 
20688
+ #: includes/tools/class-wcj-eu-countries-vat-rates-tool.php:55
20689
+ #: includes/tools/class-wcj-eu-countries-vat-rates-tool.php:88
20690
  msgid "VAT"
20691
  msgstr ""
20692
 
20693
+ #: includes/tools/class-wcj-eu-countries-vat-rates-tool.php:96
20694
  msgid "Add EU Countries VAT Rates"
20695
  msgstr ""
20696
 
20698
  msgid "Note: will add duplicates."
20699
  msgstr ""
20700
 
20701
+ #: includes/tools/class-wcj-eu-countries-vat-rates-tool.php:108
20702
  msgid "List of EU VAT rates to be added"
20703
  msgstr ""
20704
 
20705
+ #: includes/tools/class-wcj-eu-countries-vat-rates-tool.php:114
20706
+ #: includes/tools/class-wcj-eu-countries-vat-rates-tool.php:134
20707
  msgid "Rate"
20708
  msgstr ""
20709
 
20710
+ #: includes/tools/class-wcj-eu-countries-vat-rates-tool.php:128
20711
  msgid "Current standard tax rates"
20712
  msgstr ""
20713
 
20889
  msgid "Product custom visibility"
20890
  msgstr ""
20891
 
20892
+ #: tracking/class-plugin-usage-tracker.php:217
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
20893
  msgid "Once Monthly"
20894
  msgstr ""
20895
 
20896
+ #: tracking/class-plugin-usage-tracker.php:419
20897
  msgid ""
20898
  "We can't detect any product information. This is most probably because you "
20899
  "have not included the code snippet."
20900
  msgstr ""
20901
 
20902
+ #: tracking/class-plugin-usage-tracker.php:958
20903
  #, php-format
20904
  msgid ""
20905
  "Thank you for installing our %1$s. We would like to track its usage on your "
20908
  "improvements to the %1$s. Tracking is completely optional."
20909
  msgstr ""
20910
 
20911
+ #: tracking/class-plugin-usage-tracker.php:965
20912
  #, php-format
20913
  msgid ""
20914
  "Thank you for installing our %1$s. We'd like your permission to track its "
20917
  "help us make improvements to the %1$s. Tracking is completely optional."
20918
  msgstr ""
20919
 
20920
+ #: tracking/class-plugin-usage-tracker.php:976
20921
  msgid "Allow"
20922
  msgstr ""
20923
 
20924
+ #: tracking/class-plugin-usage-tracker.php:977
20925
  msgid "Do Not Allow"
20926
  msgstr ""
20927
 
20928
+ #: tracking/class-plugin-usage-tracker.php:1026
20929
  #, php-format
20930
  msgid ""
20931
  "Thank you for opting in to tracking. Would you like to receive occasional "
20932
  "news about this %s, including details of new features and special offers?"
20933
  msgstr ""
20934
 
20935
+ #: tracking/class-plugin-usage-tracker.php:1036
20936
  msgid "Yes Please"
20937
  msgstr ""
20938
 
20939
+ #: tracking/class-plugin-usage-tracker.php:1037
20940
  msgid "No Thank You"
20941
  msgstr ""
20942
 
20943
+ #: tracking/class-plugin-usage-tracker.php:1072
20944
  msgid "Sorry to see you go"
20945
  msgstr ""
20946
 
20947
+ #: tracking/class-plugin-usage-tracker.php:1073
20948
  msgid ""
20949
  "Before you deactivate the plugin, would you quickly give us your reason for "
20950
  "doing so?"
20951
  msgstr ""
20952
 
20953
+ #: tracking/class-plugin-usage-tracker.php:1075
20954
  msgid "Set up is too difficult"
20955
  msgstr ""
20956
 
20957
+ #: tracking/class-plugin-usage-tracker.php:1076
20958
  msgid "Lack of documentation"
20959
  msgstr ""
20960
 
20961
+ #: tracking/class-plugin-usage-tracker.php:1077
20962
  msgid "Not the features I wanted"
20963
  msgstr ""
20964
 
20965
+ #: tracking/class-plugin-usage-tracker.php:1078
20966
  msgid "Found a better plugin"
20967
  msgstr ""
20968
 
20969
+ #: tracking/class-plugin-usage-tracker.php:1079
20970
  msgid "Installed by mistake"
20971
  msgstr ""
20972
 
20973
+ #: tracking/class-plugin-usage-tracker.php:1080
20974
  msgid "Only required temporarily"
20975
  msgstr ""
20976
 
20977
+ #: tracking/class-plugin-usage-tracker.php:1081
20978
  msgid "Didn't work"
20979
  msgstr ""
20980
 
20981
+ #: tracking/class-plugin-usage-tracker.php:1083
20982
  msgid "Details (optional)"
20983
  msgstr ""
20984
 
20985
+ #: tracking/class-plugin-usage-tracker.php:1124
20986
  msgid "Submitting form"
20987
  msgstr ""
20988
 
20989
+ #: tracking/class-plugin-usage-tracker.php:1184
20990
  msgid "Submit and Deactivate"
20991
  msgstr ""
20992
 
20993
+ #: tracking/class-plugin-usage-tracker.php:1184
20994
  msgid "Just Deactivate"
20995
  msgstr ""
readme.txt CHANGED
@@ -1,10 +1,10 @@
1
  === Booster for WooCommerce ===
2
  Contributors: anbinder, karzin, pluggabl
3
  Tags: woocommerce customization, woocommerce bundle, woocommerce product addon, woocommerce integration, ecommerce plugin
4
- Requires at least: 4.4
5
- Tested up to: 6.0.3
6
  Requires PHP: 7.2
7
- Stable tag: 5.6.7
8
  License: GNU General Public License v3.0
9
  License URI: http://www.gnu.org/licenses/gpl-3.0.html
10
 
@@ -275,6 +275,21 @@ To unlock all Booster for WooCommerce features, please install additional paid B
275
 
276
  == Changelog ==
277
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
278
  = 5.6.7 27/10/2022 =
279
 
280
  * FIXED - PAYMENT GATEWAYS - Gateways Currency Converter - Fixed the issue of currency on the cart page.
1
  === Booster for WooCommerce ===
2
  Contributors: anbinder, karzin, pluggabl
3
  Tags: woocommerce customization, woocommerce bundle, woocommerce product addon, woocommerce integration, ecommerce plugin
4
+ Requires at least: 5.8
5
+ Tested up to: 6.1
6
  Requires PHP: 7.2
7
+ Stable tag: 5.6.8
8
  License: GNU General Public License v3.0
9
  License URI: http://www.gnu.org/licenses/gpl-3.0.html
10
 
275
 
276
  == Changelog ==
277
 
278
+ = 5.6.8 16/11/2022 =
279
+
280
+ * FIXED - CART & CHECKOUT - EU VAT Number - Replace endpoint to validate EU VAT number for without soap method.
281
+ * FIXED - CART & CHECKOUT - EU VAT Number - Fixed tools UI.
282
+ * FIXED - EMAILS & MISC. - Admin Tools - Fixed admin order page issue when order item value is array.
283
+ * FIXED - EMAILS & MISC. - Reports - Fixed Product Sales (Monthly) report not highlight selected year.
284
+ * FIXED - BUTTON & PRICE LABELS - Custom Price Labels- Escape the HTML content from the "per page product meta box" value.
285
+ * FIXED - SHIPPING & ORDERS- Order Quantities - Fixed Maximum allowed quantity issue.
286
+ * FIXED - Added Security vulnerability fixes - Multiple CSRF.
287
+ * FIXED - Added Security vulnerability fixes.
288
+ * FIXED - Current timestamp issue - Created new function wcj_get_timestamp_date_from_gmt() and replace with gmdate( 'U' ).
289
+ * FIXED - PHP Warning: asort() expects parameter 1 to be array, string given in .../includes/shortcodes/class-wcj-general-shortcodes.php on line 501
290
+ * WooCommerce 7.1.0 tested
291
+ * WordPress 6.1 Tested
292
+
293
  = 5.6.7 27/10/2022 =
294
 
295
  * FIXED - PAYMENT GATEWAYS - Gateways Currency Converter - Fixed the issue of currency on the cart page.
tracking/README.md DELETED
@@ -1 +0,0 @@
1
- put class-plugin-usage-tracker.php into a subfolder called tracking
 
tracking/class-example-settings.php DELETED
@@ -1,203 +0,0 @@
1
- <?php
2
- /**
3
- * Discussion Board admin class
4
- *
5
- * @package Booster_For_WooCommerce/tracking
6
-
7
- // this file is used to demonstrate how to add a setting to your own theme
8
- // or plugin that will allow the user to opt in or out
9
- // of tracking after they've made their initial choice on installation.
10
-
11
- // Exit if accessed directly
12
- if ( ! defined( 'ABSPATH' ) ) {
13
- exit;
14
- }
15
-
16
- /**
17
- * Plugin admin class.
18
- */
19
-
20
- if ( ! class_exists( 'PUT_Example_Settings' ) ) { // Don't initialise if there's already a Discussion Board activated.
21
-
22
- /**
23
- * PUT_Example_Settings
24
- *
25
- * @since 1.0.0
26
- */
27
- class PUT_Example_Settings {
28
- /**
29
- * Construct
30
- *
31
- * @since 1.0.0
32
- */
33
- public function __construct() {
34
- }
35
-
36
- /**
37
- * Initialize the class and start calling our hooks and filters.
38
- *
39
- * @since 1.0.0
40
- */
41
- public function init() {
42
- add_action( 'admin_menu', array( $this, 'add_settings_submenu' ) );
43
- add_action( 'admin_init', array( $this, 'register_options_init' ) );
44
- add_action( 'admin_init', array( $this, 'save_registered_setting' ) );
45
- }
46
-
47
- /**
48
- * We save this artificially to let the tracker know that we're allowed to export this option's data
49
- */
50
- public function save_registered_setting() {
51
- $options = get_option( 'wisdom_example_options_settings' );
52
- $options['wisdom_registered_setting'] = 1;
53
- update_option( 'wisdom_example_options_settings', $options );
54
- }
55
-
56
- /**
57
- * Add_settings_submenu
58
- */
59
- public function add_settings_submenu() {
60
- add_submenu_page( 'options-general.php', __( 'Example Settings', 'plugin-usage-tracker' ), __( 'Example Settings', 'plugin-usage-tracker' ), 'manage_options', 'example-settings-page', array( $this, 'options_page' ) );
61
- }
62
- /**
63
- * Register_options_init
64
- */
65
- public function register_options_init() {
66
-
67
- register_setting( 'wisdom_example_options', 'wisdom_example_options_settings' );
68
-
69
- add_settings_section(
70
- 'wisdom_example_options_section',
71
- __( 'Example Settings', 'plugin-usage-tracker' ),
72
- array( $this, 'example_settings_section_callback' ),
73
- 'wisdom_example_options'
74
- );
75
- add_settings_field(
76
- 'text_field_example',
77
- __( 'Text field:', 'plugin-usage-tracker' ),
78
- array( $this, 'text_field_example_render' ),
79
- 'wisdom_example_options',
80
- 'wisdom_example_options_section'
81
- );
82
- add_settings_field(
83
- 'checkbox_example',
84
- __( 'Checkbox', 'plugin-usage-tracker' ),
85
- array( $this, 'checkbox_example_render' ),
86
- 'wisdom_example_options',
87
- 'wisdom_example_options_section'
88
- );
89
- add_settings_field(
90
- 'select_example',
91
- __( 'Select', 'plugin-usage-tracker' ),
92
- array( $this, 'select_example_render' ),
93
- 'wisdom_example_options',
94
- 'wisdom_example_options_section'
95
- );
96
- add_settings_field(
97
- 'wisdom_opt_out',
98
- __( 'Opt out', 'plugin-usage-tracker' ),
99
- array( $this, 'opt_out_example_render' ),
100
- 'wisdom_example_options',
101
- 'wisdom_example_options_section'
102
- );
103
-
104
- // Set default options.
105
- $options = get_option( 'wisdom_example_options_settings' );
106
- if ( false === $options ) {
107
- // Get defaults.
108
- $defaults = $this->get_default_options_settings();
109
- update_option( 'wisdom_example_options_settings', $defaults );
110
- }
111
-
112
- }
113
- /**
114
- * Get_default_options_settings
115
- */
116
- public function get_default_options_settings() {
117
- $defaults = array(
118
- 'text_field_example' => __( 'Default setting', 'plugin-usage-tracker' ),
119
- 'checkbox_example' => 1,
120
- 'select_example' => 'option-1',
121
- 'wisdom_opt_out' => '',
122
- 'wisdom_registered_setting' => 1, // For plugin-usage-tracker.
123
- );
124
- return $defaults;
125
- }
126
- /**
127
- * Text_field_example_render
128
- */
129
- public function text_field_example_render() {
130
- $options = get_option( 'wisdom_example_options_settings' );
131
- $value = '';
132
- if ( isset( $options['text_field_example'] ) ) {
133
- $value = $options['text_field_example'];
134
- }
135
- ?>
136
- <input type='text' name='wisdom_example_options_settings[text_field_example]' value="<?php echo wp_kses_post( $value ); ?>" />
137
- <?php
138
- }
139
- /**
140
- * Checkbox_example_render
141
- */
142
- public function checkbox_example_render() {
143
- $options = get_option( 'wisdom_example_options_settings' );
144
- ?>
145
- <input type='checkbox' name='wisdom_example_options_settings[checkbox_example]' <?php checked( ! empty( $options['checkbox_example'] ), 1 ); ?> value='1'>
146
- <?php
147
- }
148
- /**
149
- * Opt_out_example_render
150
- */
151
- public function opt_out_example_render() {
152
- $options = get_option( 'wisdom_example_options_settings' );
153
- ?>
154
- <input type='checkbox' name='wisdom_example_options_settings[wisdom_opt_out]' <?php checked( ! empty( $options['wisdom_opt_out'] ), 1 ); ?> value='1'>
155
- <p class="description"><?php wp_kses_post( 'You previously opted in to sending tracking details. You can change that setting here.', 'plugin-usage-tracker' ); ?></p>
156
- <?php
157
- }
158
- /**
159
- * Select_example_render
160
- */
161
- public function select_example_render() {
162
- $options = get_option( 'wisdom_example_options_settings' );
163
- $value = '';
164
- if ( isset( $options['select_example'] ) ) {
165
- $value = $options['select_example'];
166
- }
167
- ?>
168
- <select name='wisdom_example_options_settings[select_example]'>
169
- <option value="option-1" <?php selected( esc_attr( $value ), 'option-1' ); ?>><?php wp_kses_post( 'Option 1', 'plugin-usage-tracker' ); ?></option>
170
- <option value="option-2" <?php selected( esc_attr( $value ), 'option-2' ); ?>><?php wp_kses_post( 'Option 2', 'plugin-usage-tracker' ); ?></option>
171
- <option value="option-3" <?php selected( esc_attr( $value ), 'option-3' ); ?>><?php wp_kses_post( 'Option 3', 'plugin-usage-tracker' ); ?></option>
172
- </select>
173
- <?php
174
- }
175
- /**
176
- * Example_settings_section_callback
177
- */
178
- public function example_settings_section_callback() {
179
- echo '<p>' . wp_kses_post( 'These settings are for example only.', 'plugin-usage-tracker' ) . '</p>';
180
- }
181
- /**
182
- * Options_page
183
- */
184
- public function options_page() {
185
- ?>
186
-
187
- <div class="wrap">
188
- <form action='options.php' method='post'>
189
- <?php
190
- settings_fields( 'wisdom_example_options' );
191
- do_settings_sections( 'wisdom_example_options' );
192
- submit_button();
193
- ?>
194
- </form>
195
- </div>
196
- <?php
197
- }
198
- }
199
-
200
- }
201
-
202
- $put_example_settings = new PUT_Example_Settings();
203
- $put_example_settings->init();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
tracking/class-plugin-usage-tracker.php CHANGED
@@ -3,7 +3,7 @@
3
  * This is the class that sends all the data back to the home site
4
  * It also handles opting in and deactivation
5
  *
6
- * @version 5.6.5
7
  * @package Booster_For_WooCommerce/tracking
8
  */
9
 
@@ -13,37 +13,91 @@ if ( ! defined( 'ABSPATH' ) ) {
13
  }
14
 
15
  if ( ! class_exists( 'Plugin_Usage_Tracker' ) ) {
 
 
 
 
 
 
16
  /**
17
- * Plugin_Usage_Tracker
18
  *
19
- * @since 1.0.0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
20
  */
21
- class Plugin_Usage_Tracker {
22
-
23
- private $wisdom_version = '1.2.4';
24
- private $home_url = '';
25
- private $plugin_file = '';
26
- private $plugin_name = '';
27
- private $options = array();
28
- private $require_optin = true;
29
- private $include_goodbye_form = true;
30
- private $marketing = false;
31
- private $collect_email = false;
32
- private $what_am_i = 'plugin';
33
  private $theme_allows_tracking = 0;
34
 
35
  /**
36
  * Class constructor.
37
  *
38
- * @param $_home_url The URL to the site we're sending data to
39
- * @param $_plugin_file The file path for this plugin
40
- * @param $_options Plugin options to track
41
- * @param $_require_optin Whether user opt-in is required (always required on WordPress.org)
42
- * @param $_include_goodbye_form Whether to include a form when the user deactivates
43
- * @param $_marketing Marketing method:
44
- * 0: Don't collect email addresses
45
- * 1: Request permission same time as tracking opt-in
46
- * 2: Request permission after opt-in
47
  */
48
  public function __construct(
49
  $_plugin_file,
@@ -62,8 +116,9 @@ if ( ! class_exists( 'Plugin_Usage_Tracker' ) ) {
62
  } else {
63
  $this->what_am_i = 'theme';
64
  $theme = wp_get_theme();
65
- if ( $theme->Name ) {
66
- $this->plugin_name = sanitize_text_field( $theme->Name );
 
67
  }
68
  }
69
 
@@ -150,6 +205,7 @@ if ( ! class_exists( 'Plugin_Usage_Tracker' ) ) {
150
  * Create weekly schedule.
151
  *
152
  * @since 1.2.3
 
153
  */
154
  public function schedule_weekly_event( $schedules ) {
155
  $schedules['weekly'] = array(
@@ -181,7 +237,7 @@ if ( ! class_exists( 'Plugin_Usage_Tracker' ) ) {
181
  * Then send it back
182
  *
183
  * @since 1.0.0
184
- * @param $force Force tracking if it's not time
185
  */
186
  public function do_tracking( $force = false ) {
187
 
@@ -223,6 +279,7 @@ if ( ! class_exists( 'Plugin_Usage_Tracker' ) ) {
223
  * Send the data to the home site.
224
  *
225
  * @since 1.0.0
 
226
  */
227
  public function send_data( $body ) {
228
 
@@ -252,6 +309,7 @@ if ( ! class_exists( 'Plugin_Usage_Tracker' ) ) {
252
  *
253
  * @version 1.0.0
254
  * @since 3.2.4
 
255
  */
256
  public function add_tracking_module( $modules_array ) {
257
 
@@ -308,7 +366,7 @@ if ( ! class_exists( 'Plugin_Usage_Tracker' ) ) {
308
  }
309
  $body['marketing_method'] = $this->marketing;
310
 
311
- $body['server'] = isset( $_SERVER['SERVER_SOFTWARE'] ) ? $_SERVER['SERVER_SOFTWARE'] : '';
312
 
313
  // Extra PHP fields.
314
  $body['memory_limit'] = ini_get( 'memory_limit' );
@@ -327,7 +385,7 @@ if ( ! class_exists( 'Plugin_Usage_Tracker' ) ) {
327
  $active_plugins = get_option( 'active_plugins', array() );
328
 
329
  foreach ( $plugins as $key => $plugin ) {
330
- if ( in_array( $plugin, $active_plugins ) ) {
331
  // Remove active plugins from list so we can show active and inactive separately.
332
  unset( $plugins[ $key ] );
333
  }
@@ -396,15 +454,18 @@ if ( ! class_exists( 'Plugin_Usage_Tracker' ) ) {
396
  *
397
  * @since 1.0.0
398
  */
399
- $theme = wp_get_theme();
400
- if ( $theme->Name ) {
401
- $body['theme'] = sanitize_text_field( $theme->Name );
 
 
 
402
  }
403
- if ( $theme->Version ) {
404
- $body['theme_version'] = sanitize_text_field( $theme->Version );
405
  }
406
- if ( $theme->Template ) {
407
- $body['theme_parent'] = sanitize_text_field( $theme->Template );
408
  }
409
 
410
  global $wpdb;
@@ -415,14 +476,14 @@ if ( ! class_exists( 'Plugin_Usage_Tracker' ) ) {
415
  }
416
  $names = implode( '\', \'', $tracked_module );
417
 
418
- $boosterActivePlugins = $wpdb->get_results( "SELECT `option_name` FROM $wpdb->options WHERE `autoload` = 'yes' AND `option_value` = 'yes' AND `option_name` IN ('.$names.')" );
419
 
420
  $booster_active_plugin = array();
421
- foreach ( $boosterActivePlugins as $boosterPlugin ) {
422
- $boosterPlugin = str_replace( 'wcj_', '', $boosterPlugin->option_name );
423
- $boosterPluginTitle = str_replace( '_enabled', '', $boosterPlugin );
424
- $pluginTitle = str_replace( '_', ' ', $boosterPluginTitle );
425
- $booster_active_plugin[] = ucwords( $pluginTitle );
426
  }
427
 
428
  $booster_active_plugin = implode( ',', $booster_active_plugin );
@@ -530,7 +591,8 @@ if ( ! class_exists( 'Plugin_Usage_Tracker' ) ) {
530
  * More than one plugin may be using the tracker
531
  *
532
  * @since 1.0.0
533
- * @param $is_allowed Boolean true if tracking is allowed, false if not.
 
534
  */
535
  public function set_is_tracking_allowed( $is_allowed, $plugin = null ) {
536
 
@@ -694,6 +756,7 @@ if ( ! class_exists( 'Plugin_Usage_Tracker' ) ) {
694
  * Option is an array of all plugins that have received a response from the user.
695
  *
696
  * @since 1.0.0
 
697
  */
698
  public function update_block_notice( $plugin = null ) {
699
  if ( empty( $plugin ) ) {
@@ -731,7 +794,8 @@ if ( ! class_exists( 'Plugin_Usage_Tracker' ) ) {
731
  * More than one plugin may be using the tracker.
732
  *
733
  * @since 1.0.0
734
- * @param $can_collect Boolean true if collection is allowed, false if not.
 
735
  */
736
  public function set_can_collect_email( $can_collect, $plugin = null ) {
737
  if ( empty( $plugin ) ) {
@@ -777,8 +841,8 @@ if ( ! class_exists( 'Plugin_Usage_Tracker' ) ) {
777
  * There might be more than one admin on the site
778
  * So we only use the first admin's email address
779
  *
780
- * @param $email Email address to set
781
- * @param $plugin Plugin name to set email address for
782
  * @since 1.1.2
783
  */
784
  public function set_admin_email( $email = null, $plugin = null ) {
@@ -812,9 +876,10 @@ if ( ! class_exists( 'Plugin_Usage_Tracker' ) ) {
812
  */
813
  public function optin_notice() {
814
  // Check for plugin args.
815
- if ( isset( $_GET['plugin'] ) && isset( $_GET['plugin_action'] ) ) {
816
- $plugin = sanitize_text_field( $_GET['plugin'] );
817
- $action = sanitize_text_field( $_GET['plugin_action'] );
 
818
  if ( 'yes' === $action ) {
819
  $this->set_is_tracking_allowed( true, $plugin );
820
  // Run this straightaway.
@@ -861,8 +926,9 @@ if ( ! class_exists( 'Plugin_Usage_Tracker' ) ) {
861
 
862
  // Args to add to query if user opts in to tracking.
863
  $yes_args = array(
864
- 'plugin' => $this->plugin_name,
865
- 'plugin_action' => 'yes',
 
866
  );
867
 
868
  // Decide how to request permission to collect email addresses.
@@ -877,8 +943,9 @@ if ( ! class_exists( 'Plugin_Usage_Tracker' ) ) {
877
  $url_no = esc_url(
878
  add_query_arg(
879
  array(
880
- 'plugin' => $this->plugin_name,
881
- 'plugin_action' => 'no',
 
882
  )
883
  )
884
  );
@@ -906,8 +973,8 @@ if ( ! class_exists( 'Plugin_Usage_Tracker' ) ) {
906
  <p><?php echo '<strong>' . esc_html( $plugin_name ) . '</strong>'; ?></p>
907
  <p><?php echo esc_html( $notice_text ); ?></p>
908
  <p>
909
- <a href="<?php echo esc_url( $url_yes ); ?>" class="button-secondary"><?php _e( 'Allow', 'singularity' ); ?></a>
910
- <a href="<?php echo esc_url( $url_no ); ?>" class="button-secondary"><?php _e( 'Do Not Allow', 'singularity' ); ?></a>
911
  </p>
912
  </div>
913
  <?php
@@ -922,10 +989,11 @@ if ( ! class_exists( 'Plugin_Usage_Tracker' ) ) {
922
  * @since 1.0.0
923
  */
924
  public function marketing_notice() {
 
925
  // Check if user has opted in to marketing.
926
- if ( isset( $_GET['marketing_optin'] ) ) {
927
  // Set marketing optin.
928
- $this->set_can_collect_email( sanitize_text_field( $_GET['marketing_optin'] ), $this->plugin_name );
929
  // Do tracking.
930
  $this->do_tracking( true );
931
  } elseif ( isset( $_GET['marketing'] ) && 'yes' === $_GET['marketing'] ) {
@@ -937,16 +1005,18 @@ if ( ! class_exists( 'Plugin_Usage_Tracker' ) ) {
937
  $url_yes = esc_url(
938
  add_query_arg(
939
  array(
940
- 'plugin' => $this->plugin_name,
941
- 'marketing_optin' => 'yes',
 
942
  )
943
  )
944
  );
945
  $url_no = esc_url(
946
  add_query_arg(
947
  array(
948
- 'plugin' => $this->plugin_name,
949
- 'marketing_optin' => 'no',
 
950
  )
951
  )
952
  );
@@ -963,8 +1033,8 @@ if ( ! class_exists( 'Plugin_Usage_Tracker' ) ) {
963
  <p><?php echo '<strong>' . esc_html( $plugin_name ) . '</strong>'; ?></p>
964
  <p><?php echo esc_html( $marketing_text ); ?></p>
965
  <p>
966
- <a href="<?php echo esc_url( $url_yes ); ?>" data-putnotice="yes" class="button-secondary"><?php _e( 'Yes Please', 'singularity' ); ?></a>
967
- <a href="<?php echo esc_url( $url_no ); ?>" data-putnotice="no" class="button-secondary"><?php _e( 'No Thank You', 'singularity' ); ?></a>
968
  </p>
969
  </div>
970
  <?php
@@ -975,6 +1045,7 @@ if ( ! class_exists( 'Plugin_Usage_Tracker' ) ) {
975
  * Filter the deactivation link to allow us to present a form when the user deactivates the plugin.
976
  *
977
  * @since 1.0.0
 
978
  */
979
  public function filter_action_links( $links ) {
980
  // Check to see if the user has opted in to tracking.
@@ -1110,7 +1181,7 @@ if ( ! class_exists( 'Plugin_Usage_Tracker' ) ) {
1110
  var url = document.getElementById("put-goodbye-link-<?php echo esc_attr( $this->plugin_name ); ?>");
1111
  $('body').toggleClass('put-form-active');
1112
  $("#put-goodbye-form-<?php echo esc_attr( $this->plugin_name ); ?>").fadeIn();
1113
- $("#put-goodbye-form-<?php echo esc_attr( $this->plugin_name ); ?>").html( '<?php echo $html; ?>' + '<div class="put-goodbye-form-footer"><p><a id="put-submit-form" class="button primary" href="#"><?php _e( 'Submit and Deactivate', 'singularity' ); ?></a>&nbsp;<a class="secondary button" href="'+url+'"><?php _e( 'Just Deactivate', 'singularity' ); ?></a></p></div>');
1114
  $('#put-submit-form').on('click', function(e){
1115
  // As soon as we click, the body of the form should disappear.
1116
  $("#put-goodbye-form-<?php echo esc_attr( $this->plugin_name ); ?> .put-goodbye-form-body").fadeOut();
@@ -1127,7 +1198,7 @@ if ( ! class_exists( 'Plugin_Usage_Tracker' ) ) {
1127
  'action': 'goodbye_form',
1128
  'values': values,
1129
  'details': details,
1130
- 'security': "<?php echo wp_create_nonce( 'wisdom_goodbye_form' ); ?>",
1131
  'dataType': "json"
1132
  }
1133
  $.post(
@@ -1158,11 +1229,11 @@ if ( ! class_exists( 'Plugin_Usage_Tracker' ) ) {
1158
  public function goodbye_form_callback() {
1159
  check_ajax_referer( 'wisdom_goodbye_form', 'security' );
1160
  if ( isset( $_POST['values'] ) ) {
1161
- $values = json_encode( wp_unslash( $_POST['values'] ) );
1162
  update_option( 'wisdom_deactivation_reason_' . $this->plugin_name, $values );
1163
  }
1164
  if ( isset( $_POST['details'] ) ) {
1165
- $details = sanitize_text_field( $_POST['details'] );
1166
  update_option( 'wisdom_deactivation_details_' . $this->plugin_name, $details );
1167
  }
1168
  $this->do_tracking(); // Run this straightaway.
3
  * This is the class that sends all the data back to the home site
4
  * It also handles opting in and deactivation
5
  *
6
+ * @version 5.6.8
7
  * @package Booster_For_WooCommerce/tracking
8
  */
9
 
13
  }
14
 
15
  if ( ! class_exists( 'Plugin_Usage_Tracker' ) ) {
16
+ /**
17
+ * Plugin_Usage_Tracker
18
+ *
19
+ * @since 5.6.8
20
+ */
21
+ class Plugin_Usage_Tracker {
22
  /**
23
+ * Wisdom version.
24
  *
25
+ * @var string
26
+ */
27
+ private $wisdom_version = '1.2.4';
28
+ /**
29
+ * Home url.
30
+ *
31
+ * @var string
32
+ */
33
+ private $home_url = '';
34
+ /**
35
+ * Plugin file.
36
+ *
37
+ * @var string
38
+ */
39
+ private $plugin_file = '';
40
+ /**
41
+ * Plugin name.
42
+ *
43
+ * @var string
44
+ */
45
+ private $plugin_name = '';
46
+ /**
47
+ * Options.
48
+ *
49
+ * @var array
50
+ */
51
+ private $options = array();
52
+ /**
53
+ * Require optin.
54
+ *
55
+ * @var string
56
+ */
57
+ private $require_optin = true;
58
+ /**
59
+ * Include goodbye form.
60
+ *
61
+ * @var string
62
+ */
63
+ private $include_goodbye_form = true;
64
+ /**
65
+ * Marketing.
66
+ *
67
+ * @var string
68
+ */
69
+ private $marketing = false;
70
+ /**
71
+ * Collect email.
72
+ *
73
+ * @var string
74
+ */
75
+ private $collect_email = false;
76
+ /**
77
+ * What am i.
78
+ *
79
+ * @var string
80
+ */
81
+ private $what_am_i = 'plugin';
82
+ /**
83
+ * Theme allows tracking.
84
+ *
85
+ * @var int
86
  */
 
 
 
 
 
 
 
 
 
 
 
 
87
  private $theme_allows_tracking = 0;
88
 
89
  /**
90
  * Class constructor.
91
  *
92
+ * @param string $_plugin_file The file path for this plugin.
93
+ * @param string $_home_url The URL to the site we're sending data to.
94
+ * @param string $_options Plugin options to track.
95
+ * @param string $_require_optin Whether user opt-in is required (always required on WordPress.org).
96
+ * @param string $_include_goodbye_form Whether to include a form when the user deactivates.
97
+ * @param string $_marketing Marketing method:.
98
+ * 0: Don't collect email addresses.
99
+ * 1: Request permission same time as tracking opt-in.
100
+ * 2: Request permission after opt-in.
101
  */
102
  public function __construct(
103
  $_plugin_file,
116
  } else {
117
  $this->what_am_i = 'theme';
118
  $theme = wp_get_theme();
119
+ $t_name = 'Name';
120
+ if ( $theme->$t_name ) {
121
+ $this->plugin_name = sanitize_text_field( $theme->$t_name );
122
  }
123
  }
124
 
205
  * Create weekly schedule.
206
  *
207
  * @since 1.2.3
208
+ * @param string $schedules defines the cron schedules.
209
  */
210
  public function schedule_weekly_event( $schedules ) {
211
  $schedules['weekly'] = array(
237
  * Then send it back
238
  *
239
  * @since 1.0.0
240
+ * @param bool $force Force tracking if it's not time.
241
  */
242
  public function do_tracking( $force = false ) {
243
 
279
  * Send the data to the home site.
280
  *
281
  * @since 1.0.0
282
+ * @param array $body body data of the request.
283
  */
284
  public function send_data( $body ) {
285
 
309
  *
310
  * @version 1.0.0
311
  * @since 3.2.4
312
+ * @param array $modules_array array of the modules.
313
  */
314
  public function add_tracking_module( $modules_array ) {
315
 
366
  }
367
  $body['marketing_method'] = $this->marketing;
368
 
369
+ $body['server'] = getenv( 'SERVER_SOFTWARE' );
370
 
371
  // Extra PHP fields.
372
  $body['memory_limit'] = ini_get( 'memory_limit' );
385
  $active_plugins = get_option( 'active_plugins', array() );
386
 
387
  foreach ( $plugins as $key => $plugin ) {
388
+ if ( in_array( $plugin, $active_plugins, true ) ) {
389
  // Remove active plugins from list so we can show active and inactive separately.
390
  unset( $plugins[ $key ] );
391
  }
454
  *
455
  * @since 1.0.0
456
  */
457
+ $theme = wp_get_theme();
458
+ $t_name = 'Name';
459
+ $t_version = 'Version';
460
+ $t_template = 'Template';
461
+ if ( $theme->$t_name ) {
462
+ $body['theme'] = sanitize_text_field( $theme->$t_name );
463
  }
464
+ if ( $theme->$t_version ) {
465
+ $body['theme_version'] = sanitize_text_field( $theme->$t_version );
466
  }
467
+ if ( $theme->$t_template ) {
468
+ $body['theme_parent'] = sanitize_text_field( $theme->$t_template );
469
  }
470
 
471
  global $wpdb;
476
  }
477
  $names = implode( '\', \'', $tracked_module );
478
 
479
+ $booster_active_plugins = $wpdb->get_results( "SELECT `option_name` FROM $wpdb->options WHERE `autoload` = 'yes' AND `option_value` = 'yes' AND `option_name` IN ('.$names.')" ); // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.PreparedSQL.InterpolatedNotPrepared
480
 
481
  $booster_active_plugin = array();
482
+ foreach ( $booster_active_plugins as $booster_plugin ) {
483
+ $booster_plugin = str_replace( 'wcj_', '', $booster_plugin->option_name );
484
+ $booster_plugin_title = str_replace( '_enabled', '', $booster_plugin );
485
+ $plugin_title = str_replace( '_', ' ', $booster_plugin_title );
486
+ $booster_active_plugin[] = ucwords( $plugin_title );
487
  }
488
 
489
  $booster_active_plugin = implode( ',', $booster_active_plugin );
591
  * More than one plugin may be using the tracker
592
  *
593
  * @since 1.0.0
594
+ * @param bool $is_allowed true if tracking is allowed, false if not.
595
+ * @param string $plugin plugin name.
596
  */
597
  public function set_is_tracking_allowed( $is_allowed, $plugin = null ) {
598
 
756
  * Option is an array of all plugins that have received a response from the user.
757
  *
758
  * @since 1.0.0
759
+ * @param string $plugin plugin name.
760
  */
761
  public function update_block_notice( $plugin = null ) {
762
  if ( empty( $plugin ) ) {
794
  * More than one plugin may be using the tracker.
795
  *
796
  * @since 1.0.0
797
+ * @param boolean $can_collect true if collection is allowed, false if not.
798
+ * @param string $plugin plugin name.
799
  */
800
  public function set_can_collect_email( $can_collect, $plugin = null ) {
801
  if ( empty( $plugin ) ) {
841
  * There might be more than one admin on the site
842
  * So we only use the first admin's email address
843
  *
844
+ * @param string $email Email address to set.
845
+ * @param string $plugin Plugin name to set email address for.
846
  * @since 1.1.2
847
  */
848
  public function set_admin_email( $email = null, $plugin = null ) {
876
  */
877
  public function optin_notice() {
878
  // Check for plugin args.
879
+ $wpnonce = isset( $_REQUEST['plugin_action-nonce'] ) ? wp_verify_nonce( sanitize_key( $_REQUEST['plugin_action-nonce'] ), 'plugin_action' ) : false;
880
+ if ( $wpnonce && isset( $_GET['plugin'] ) && isset( $_GET['plugin_action'] ) ) {
881
+ $plugin = sanitize_text_field( wp_unslash( $_GET['plugin'] ) );
882
+ $action = sanitize_text_field( wp_unslash( $_GET['plugin_action'] ) );
883
  if ( 'yes' === $action ) {
884
  $this->set_is_tracking_allowed( true, $plugin );
885
  // Run this straightaway.
926
 
927
  // Args to add to query if user opts in to tracking.
928
  $yes_args = array(
929
+ 'plugin' => $this->plugin_name,
930
+ 'plugin_action' => 'yes',
931
+ 'plugin_action-nonce' => wp_create_nonce( 'plugin_action' ),
932
  );
933
 
934
  // Decide how to request permission to collect email addresses.
943
  $url_no = esc_url(
944
  add_query_arg(
945
  array(
946
+ 'plugin' => $this->plugin_name,
947
+ 'plugin_action' => 'no',
948
+ 'plugin_action-nonce' => wp_create_nonce( 'plugin_action' ),
949
  )
950
  )
951
  );
973
  <p><?php echo '<strong>' . esc_html( $plugin_name ) . '</strong>'; ?></p>
974
  <p><?php echo esc_html( $notice_text ); ?></p>
975
  <p>
976
+ <a href="<?php echo esc_url( $url_yes ); ?>" class="button-secondary"><?php esc_html_e( 'Allow', 'singularity' ); ?></a>
977
+ <a href="<?php echo esc_url( $url_no ); ?>" class="button-secondary"><?php esc_html_e( 'Do Not Allow', 'singularity' ); ?></a>
978
  </p>
979
  </div>
980
  <?php
989
  * @since 1.0.0
990
  */
991
  public function marketing_notice() {
992
+ $wpnonce = isset( $_REQUEST['marketing_optin-nonce'] ) ? wp_verify_nonce( sanitize_key( $_REQUEST['marketing_optin-nonce'] ), 'marketing_optin' ) : false;
993
  // Check if user has opted in to marketing.
994
+ if ( $wpnonce && isset( $_GET['marketing_optin'] ) ) {
995
  // Set marketing optin.
996
+ $this->set_can_collect_email( sanitize_text_field( wp_unslash( $_GET['marketing_optin'] ) ), $this->plugin_name );
997
  // Do tracking.
998
  $this->do_tracking( true );
999
  } elseif ( isset( $_GET['marketing'] ) && 'yes' === $_GET['marketing'] ) {
1005
  $url_yes = esc_url(
1006
  add_query_arg(
1007
  array(
1008
+ 'plugin' => $this->plugin_name,
1009
+ 'marketing_optin' => 'yes',
1010
+ 'marketing_optin-nonce' => wp_create_nonce( 'marketing_optin' ),
1011
  )
1012
  )
1013
  );
1014
  $url_no = esc_url(
1015
  add_query_arg(
1016
  array(
1017
+ 'plugin' => $this->plugin_name,
1018
+ 'marketing_optin' => 'no',
1019
+ 'marketing_optin-nonce' => wp_create_nonce( 'marketing_optin' ),
1020
  )
1021
  )
1022
  );
1033
  <p><?php echo '<strong>' . esc_html( $plugin_name ) . '</strong>'; ?></p>
1034
  <p><?php echo esc_html( $marketing_text ); ?></p>
1035
  <p>
1036
+ <a href="<?php echo esc_url( $url_yes ); ?>" data-putnotice="yes" class="button-secondary"><?php esc_html_e( 'Yes Please', 'singularity' ); ?></a>
1037
+ <a href="<?php echo esc_url( $url_no ); ?>" data-putnotice="no" class="button-secondary"><?php esc_html_e( 'No Thank You', 'singularity' ); ?></a>
1038
  </p>
1039
  </div>
1040
  <?php
1045
  * Filter the deactivation link to allow us to present a form when the user deactivates the plugin.
1046
  *
1047
  * @since 1.0.0
1048
+ * @param string $links links to set.
1049
  */
1050
  public function filter_action_links( $links ) {
1051
  // Check to see if the user has opted in to tracking.
1181
  var url = document.getElementById("put-goodbye-link-<?php echo esc_attr( $this->plugin_name ); ?>");
1182
  $('body').toggleClass('put-form-active');
1183
  $("#put-goodbye-form-<?php echo esc_attr( $this->plugin_name ); ?>").fadeIn();
1184
+ $("#put-goodbye-form-<?php echo esc_attr( $this->plugin_name ); ?>").html( '<?php echo wp_kses_post( $html ); ?>' + '<div class="put-goodbye-form-footer"><p><a id="put-submit-form" class="button primary" href="#"><?php esc_html_e( 'Submit and Deactivate', 'singularity' ); ?></a>&nbsp;<a class="secondary button" href="'+url+'"><?php esc_html_e( 'Just Deactivate', 'singularity' ); ?></a></p></div>');
1185
  $('#put-submit-form').on('click', function(e){
1186
  // As soon as we click, the body of the form should disappear.
1187
  $("#put-goodbye-form-<?php echo esc_attr( $this->plugin_name ); ?> .put-goodbye-form-body").fadeOut();
1198
  'action': 'goodbye_form',
1199
  'values': values,
1200
  'details': details,
1201
+ 'security': "<?php echo wp_kses_post( wp_create_nonce( 'wisdom_goodbye_form' ) ); ?>",
1202
  'dataType': "json"
1203
  }
1204
  $.post(
1229
  public function goodbye_form_callback() {
1230
  check_ajax_referer( 'wisdom_goodbye_form', 'security' );
1231
  if ( isset( $_POST['values'] ) ) {
1232
+ $values = wp_json_encode( array_map( 'sanitize_text_field', wp_unslash( $_POST['values'] ) ) );
1233
  update_option( 'wisdom_deactivation_reason_' . $this->plugin_name, $values );
1234
  }
1235
  if ( isset( $_POST['details'] ) ) {
1236
+ $details = sanitize_text_field( wp_unslash( $_POST['details'] ) );
1237
  update_option( 'wisdom_deactivation_details_' . $this->plugin_name, $details );
1238
  }
1239
  $this->do_tracking(); // Run this straightaway.
version-details.json CHANGED
@@ -1,6 +1,8 @@
1
  {
2
- "0" : "= 5.6.7 27/10/2022 =",
3
- "1" : "* FIXED - PAYMENT GATEWAYS - Gateways Currency Converter - Fixed the issue of currency on the cart page.",
4
- "2" : "* FIXED - CART & CHECKOUT - Checkout Files Upload - Fixed Security vulnerability for ShopManager + Arbitrary File Download.",
5
- "3" : "* FIXED - CART & CHECKOUT - Checkout Files Upload - Fixed Security vulnerability for Checkout Files Deletion."
 
 
6
  }
1
  {
2
+ "0" : "= 5.6.8 16/11/2022 =",
3
+ "1" : "* FIXED - CART & CHECKOUT - EU VAT Number - Replace endpoint to validate EU VAT number for without soap method",
4
+ "2" : "* FIXED - EMAILS & MISC. - Admin Tools - Fixed admin order page issue when order item value is array.",
5
+ "3" : "* FIXED - Added Security vulnerability fixes",
6
+ "4" : "* WooCommerce 7.1.0 tested",
7
+ "5" : "* WordPress 6.1 Tested"
8
  }
woocommerce-jetpack.php CHANGED
@@ -1,15 +1,15 @@
1
- <?php //phpcs:ignore
2
  /**
3
  * Plugin Name: Booster for WooCommerce
4
  * Plugin URI: https://booster.io
5
  * Description: Supercharge your WooCommerce site with these awesome powerful features. More than 100 modules.All in one WooCommerce plugin.
6
- * Version: 5.6.7
7
  * Author: Pluggabl LLC
8
  * Author URI: https://booster.io
9
  * Text Domain: woocommerce-jetpack
10
  * Domain Path: /langs
11
  * Copyright: © 2020 Pluggabl LLC.
12
- * WC tested up to: 7.0.0
13
  * License: GNU General Public License v3.0
14
  * php version 7.2
15
  * License URI: http://www.gnu.org/licenses/gpl-3.0.html
@@ -65,7 +65,7 @@ if ( ! class_exists( 'WC_Jetpack' ) ) :
65
  * @var string
66
  * @since 2.4.7
67
  */
68
- public $version = '5.6.7';
69
 
70
  /**
71
  * The single instance of the class
1
+ <?php // phpcs:ignore WordPress.Files.FileName
2
  /**
3
  * Plugin Name: Booster for WooCommerce
4
  * Plugin URI: https://booster.io
5
  * Description: Supercharge your WooCommerce site with these awesome powerful features. More than 100 modules.All in one WooCommerce plugin.
6
+ * Version: 5.6.8
7
  * Author: Pluggabl LLC
8
  * Author URI: https://booster.io
9
  * Text Domain: woocommerce-jetpack
10
  * Domain Path: /langs
11
  * Copyright: © 2020 Pluggabl LLC.
12
+ * WC tested up to: 7.1.0
13
  * License: GNU General Public License v3.0
14
  * php version 7.2
15
  * License URI: http://www.gnu.org/licenses/gpl-3.0.html
65
  * @var string
66
  * @since 2.4.7
67
  */
68
+ public $version = '5.6.8';
69
 
70
  /**
71
  * The single instance of the class