Booster for WooCommerce - Version 4.7.0

Version Description

  • 27/12/2019 =
  • Fix - CART & CHECKOUT - Checkout Custom Fields - Preserve select field value when editing the order from admin.
  • Fix - CART & CHECKOUT - EU VAT Number - Set the user agent explicitly, trying to avoid possible SoapClient errors.
  • Fix - PAYMENT GATEWAYS - Gateways Min/Max Amounts - Notices keep being displayed after order is placed.
  • Fix - PRODUCTS - Product Availability by Date - Fix wrong availabilities on non English languages by setting a default number format of 'm/d/Y' on 'wcj_product_by_date_direct_date' option and by improving description.
  • Fix - PRODUCTS - Product Availability by Date - Fix wrong availabilities on non English languages by setting the date properly according to 'wcj_product_by_date_direct_date_format' option and timezone.
  • Fix - PRODUCTS - Products per Page - Sanitize 'wcj_products_per_page' param.
  • Fix - PRODUCTS - SKU - Sort variations in ascending order on get_all_variations() for better results with 'Variable Products Variations' option.
  • Fix - SHIPPING & ORDERS - Custom Shipping - Fix possible Fatal error "Class 'WC_Shipping_WCJ_Custom_Template' not found".
  • Fix - Classes - WCJ_Module_Product_By_Condition - pre_get_posts - Disables pre_get_posts query when exporting products.
  • Dev - PAYMENT GATEWAYS - Custom Gateways - update_custom_payment_gateways_fields_order_meta() now also expects an array as an input value.
  • Dev - PAYMENT GATEWAYS - Custom Gateways - Add 'name_array' as parameter on description replace preventing possible duplicated input fields names.
  • Dev - PDF INVOICING & PACKING SLIPS - Advanced - Add option to set Internal Encoding with mb_internal_encoding().
  • Dev - PRICES & CURRENCIES - Global Discount - Add 'WPML: Get Products in All Languages' option.
  • Dev - PRICES & CURRENCIES - Global Discount - Add 'WPML: Get Terms in All Languages' option.
  • Dev - PRICES & CURRENCIES - Wholesale Price - Add 'WPML: Get Products in All Languages' option.
  • Dev - PRICES & CURRENCIES - Wholesale Price - Add 'WPML: Get Terms in All Languages' option.
  • Dev - SHIPPING & ORDERS - Shipping by Cities - Improve postcode detection trying to read it from WC()->customer->get_shipping_postcode too.
  • Dev - PRODUCTS - Product Addons - Add option to export and import 'wcj_product_addons_per_productenable_by_variation_%' meta.
  • Dev - PRODUCTS - Products per Page - Add option to control form method by POST or GET.
  • Dev - PRODUCTS - SKU - Add option to automatically generate SKU for variations on product save.
  • Dev - PRODUCTS - SKU - Add option to generate SKU using Hashids library.
  • Dev - PRODUCTS - SKU - Add option to manage the numbers of characters on SKU using Hashids.
  • Dev - PRODUCTS - SKU - Add option to control SKU format with numbers or letters using Hashids.
  • Dev - WCJ_Module - Get products in all languages from ajax product search, if corresponding WPML option is enabled.
  • Dev - WCJ_Module - Move remove_wpml_functions_before_get_terms and restore_wpml_functions_after_get_terms from 'Price based on User Role' module making it more flexible to be appliable to any module.
  • Dev - Shortcodes - [wcj_input_field] Add 'data_attributes' param.
  • Dev - Shortcodes - [wcj_input_field] Add 'name_array' param, allowing the input name to be set as an array. e.g. [wcj_input_field name_array="parent" name="test"] -> <input name="parent[test][value]" />.
  • Dev - Functions - General - Create wcj_get_data_attributes_html() function allowing to create a multiple data parameters like data-param_a='value_a' when receiving a associative array.
  • Dev - Functions - Date and Time - Add wcj_timezone() function to get timezone. wp_timezone() already does it but as it was introduced only on version 5.3.0 this was a safer option.
  • Dev - Classes - WCJ_Module_Product_By_Condition - pre_get_posts - Add 'wcj_product_by_condition_pre_get_posts_validation' filter to setup when the query should be disabled.
Download this release

Release Info

Developer algoritmika
Plugin Icon 128x128 Booster for WooCommerce
Version 4.7.0
Comparing to
See all releases

Code changes from version 4.6.1 to 4.7.0

Files changed (36) hide show
  1. includes/class-wcj-checkout-custom-fields.php +5 -2
  2. includes/class-wcj-payment-gateways-min-max.php +64 -19
  3. includes/class-wcj-payment-gateways.php +20 -7
  4. includes/class-wcj-price-by-user-role.php +3 -43
  5. includes/class-wcj-product-addons.php +65 -2
  6. includes/class-wcj-product-by-date.php +11 -3
  7. includes/class-wcj-products-per-page.php +8 -8
  8. includes/class-wcj-shipping-by-cities.php +3 -3
  9. includes/class-wcj-shipping.php +6 -3
  10. includes/class-wcj-sku.php +174 -43
  11. includes/classes/class-wcj-module-product-by-condition.php +28 -4
  12. includes/classes/class-wcj-module.php +152 -1
  13. includes/classes/class-wcj-pdf-invoice.php +13 -5
  14. includes/functions/wcj-functions-date-time.php +29 -1
  15. includes/functions/wcj-functions-eu-vat.php +12 -6
  16. includes/functions/wcj-functions-general.php +60 -1
  17. includes/gateways/class-wc-gateway-wcj-custom.php +3 -3
  18. includes/lib/hashids/src/Hashids.php +420 -0
  19. includes/lib/hashids/src/HashidsException.php +24 -0
  20. includes/lib/hashids/src/HashidsInterface.php +57 -0
  21. includes/lib/hashids/src/Math/Bc.php +123 -0
  22. includes/lib/hashids/src/Math/Gmp.php +123 -0
  23. includes/lib/hashids/src/Math/MathInterface.php +99 -0
  24. includes/settings/meta-box/wcj-settings-meta-box-product-by-date.php +4 -3
  25. includes/settings/wcj-settings-global-discount.php +11 -4
  26. includes/settings/wcj-settings-pdf-invoicing-advanced.php +8 -1
  27. includes/settings/wcj-settings-price-by-user-role.php +4 -14
  28. includes/settings/wcj-settings-product-addons.php +22 -5
  29. includes/settings/wcj-settings-product-by-date.php +3 -3
  30. includes/settings/wcj-settings-products-per-page.php +10 -0
  31. includes/settings/wcj-settings-sku.php +45 -3
  32. includes/settings/wcj-settings-wholesale-price.php +8 -1
  33. includes/shortcodes/class-wcj-shortcodes-input-field.php +27 -5
  34. langs/woocommerce-jetpack.pot +433 -323
  35. readme.txt +34 -2
  36. woocommerce-jetpack.php +2 -2
includes/class-wcj-checkout-custom-fields.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Module - Checkout Custom Fields
4
  *
5
- * @version 4.6.1
6
  * @author Algoritmika Ltd.
7
  */
8
 
@@ -340,7 +340,7 @@ class WCJ_Checkout_Custom_Fields extends WCJ_Module {
340
  /**
341
  * add_woocommerce_admin_fields.
342
  *
343
- * @version 4.4.0
344
  * @todo converting from before version 2.3.0: section?
345
  * @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)
346
  */
@@ -402,6 +402,9 @@ class WCJ_Checkout_Custom_Fields extends WCJ_Module {
402
  'class' => $the_class,
403
  'wrapper_class' => 'form-field-wide',
404
  );
 
 
 
405
  if ( isset( $options ) ) {
406
  add_filter( "woocommerce_order_get__{$section}_{$the_key}", function ( $name ) use ( $options ) {
407
  if ( isset( $options[ $name ] ) ) {
2
  /**
3
  * Booster for WooCommerce - Module - Checkout Custom Fields
4
  *
5
+ * @version 4.7.0
6
  * @author Algoritmika Ltd.
7
  */
8
 
340
  /**
341
  * add_woocommerce_admin_fields.
342
  *
343
+ * @version 4.7.0
344
  * @todo converting from before version 2.3.0: section?
345
  * @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)
346
  */
402
  'class' => $the_class,
403
  'wrapper_class' => 'form-field-wide',
404
  );
405
+ if ( ! empty( $the_meta ) && ! is_array( $the_meta ) ) {
406
+ $fields[ $the_key ]['value'] = $the_meta;
407
+ }
408
  if ( isset( $options ) ) {
409
  add_filter( "woocommerce_order_get__{$section}_{$the_key}", function ( $name ) use ( $options ) {
410
  if ( isset( $options[ $name ] ) ) {
includes/class-wcj-payment-gateways-min-max.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Module - Gateways Min/Max Amounts
4
  *
5
- * @version 4.4.0
6
  * @since 2.4.1
7
  * @author Algoritmika Ltd.
8
  */
@@ -13,10 +13,17 @@ if ( ! class_exists( 'WCJ_Payment_Gateways_Min_Max' ) ) :
13
 
14
  class WCJ_Payment_Gateways_Min_Max extends WCJ_Module {
15
 
 
 
 
 
 
 
 
16
  /**
17
  * Constructor.
18
  *
19
- * @version 2.8.0
20
  * @since 2.4.1
21
  */
22
  function __construct() {
@@ -29,27 +36,56 @@ class WCJ_Payment_Gateways_Min_Max extends WCJ_Module {
29
 
30
  if ( $this->is_enabled() ) {
31
  add_filter( 'woocommerce_available_payment_gateways', array( $this, 'available_payment_gateways' ), PHP_INT_MAX, 1 );
 
32
  }
33
  }
34
 
35
  /**
36
- * available_payment_gateways.
37
  *
38
- * @version 4.4.0
39
- * @since 2.4.1
40
- * @todo (maybe) `wc_clear_notices()`
41
  */
42
- function available_payment_gateways( $_available_gateways ) {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
43
  if ( ! function_exists( 'WC' ) || ! isset( WC()->cart ) ) {
44
- return $_available_gateways;
 
 
 
45
  }
46
  $total_in_cart = WC()->cart->cart_contents_total;
47
  if ( 'no' === get_option( 'wcj_payment_gateways_min_max_exclude_shipping', 'no' ) ) {
48
  $total_in_cart += WC()->cart->shipping_total;
49
  }
50
- $notices = array();
51
- $notices_template_min = get_option( 'wcj_payment_gateways_min_max_notices_template_min', __( 'Minimum amount for %gateway_title% is %min_amount%', 'woocommerce-jetpack') );
52
- $notices_template_max = get_option( 'wcj_payment_gateways_min_max_notices_template_max', __( 'Maximum amount for %gateway_title% is %max_amount%', 'woocommerce-jetpack') );
53
  foreach ( $_available_gateways as $key => $gateway ) {
54
  $min = get_option( 'wcj_payment_gateways_min_' . $key, 0 );
55
  $max = get_option( 'wcj_payment_gateways_max_' . $key, 0 );
@@ -73,14 +109,23 @@ class WCJ_Payment_Gateways_Min_Max extends WCJ_Module {
73
  continue;
74
  }
75
  }
76
- if ( function_exists( 'is_checkout' ) && is_checkout() && 'yes' === get_option( 'wcj_payment_gateways_min_max_notices_enable', 'yes' ) && ! empty( $notices ) ) {
77
- $notice_type = get_option( 'wcj_payment_gateways_min_max_notices_type', 'notice' );
78
- foreach ( $notices as $notice ) {
79
- if ( ! wc_has_notice( $notice, $notice_type ) ) {
80
- wc_add_notice( $notice, $notice_type );
81
- }
82
- }
83
- }
 
 
 
 
 
 
 
 
 
84
  return $_available_gateways;
85
  }
86
 
2
  /**
3
  * Booster for WooCommerce - Module - Gateways Min/Max Amounts
4
  *
5
+ * @version 4.7.0
6
  * @since 2.4.1
7
  * @author Algoritmika Ltd.
8
  */
13
 
14
  class WCJ_Payment_Gateways_Min_Max extends WCJ_Module {
15
 
16
+ /**
17
+ * @version 4.7.0
18
+ *
19
+ * @var array
20
+ */
21
+ private $notices = array();
22
+
23
  /**
24
  * Constructor.
25
  *
26
+ * @version 4.7.0
27
  * @since 2.4.1
28
  */
29
  function __construct() {
36
 
37
  if ( $this->is_enabled() ) {
38
  add_filter( 'woocommerce_available_payment_gateways', array( $this, 'available_payment_gateways' ), PHP_INT_MAX, 1 );
39
+ add_filter( 'woocommerce_before_checkout_form', array( $this, 'add_notices' ), 1 );
40
  }
41
  }
42
 
43
  /**
44
+ * add_notices.
45
  *
46
+ * @version 4.7.0
47
+ * @since 4.7.0
 
48
  */
49
+ function add_notices() {
50
+ if ( ! function_exists( 'WC' ) ) {
51
+ return;
52
+ }
53
+ WC()->payment_gateways->get_available_payment_gateways();
54
+ $notices = $this->notices;
55
+ if ( function_exists( 'is_checkout' ) && is_checkout() && 'yes' === get_option( 'wcj_payment_gateways_min_max_notices_enable', 'yes' ) && ! empty( $notices ) ) {
56
+ $notice_type = get_option( 'wcj_payment_gateways_min_max_notices_type', 'notice' );
57
+ foreach ( $notices as $notice ) {
58
+ if ( ! wc_has_notice( $notice, $notice_type ) ) {
59
+ wc_add_notice( $notice, $notice_type );
60
+ }
61
+ }
62
+ }
63
+ }
64
+
65
+ /**
66
+ * remove_payment_gateways.
67
+ *
68
+ * @version 4.7.0
69
+ * @since 4.7.0
70
+ *
71
+ * @param $_available_gateways
72
+ *
73
+ * @return array
74
+ */
75
+ function remove_payment_gateways( $_available_gateways ) {
76
  if ( ! function_exists( 'WC' ) || ! isset( WC()->cart ) ) {
77
+ return array(
78
+ 'gateways' => $_available_gateways,
79
+ 'notices' => null,
80
+ );
81
  }
82
  $total_in_cart = WC()->cart->cart_contents_total;
83
  if ( 'no' === get_option( 'wcj_payment_gateways_min_max_exclude_shipping', 'no' ) ) {
84
  $total_in_cart += WC()->cart->shipping_total;
85
  }
86
+ $notices = array();
87
+ $notices_template_min = get_option( 'wcj_payment_gateways_min_max_notices_template_min', __( 'Minimum amount for %gateway_title% is %min_amount%', 'woocommerce-jetpack' ) );
88
+ $notices_template_max = get_option( 'wcj_payment_gateways_min_max_notices_template_max', __( 'Maximum amount for %gateway_title% is %max_amount%', 'woocommerce-jetpack' ) );
89
  foreach ( $_available_gateways as $key => $gateway ) {
90
  $min = get_option( 'wcj_payment_gateways_min_' . $key, 0 );
91
  $max = get_option( 'wcj_payment_gateways_max_' . $key, 0 );
109
  continue;
110
  }
111
  }
112
+ return array(
113
+ 'gateways' => $_available_gateways,
114
+ 'notices' => $notices,
115
+ );
116
+ }
117
+
118
+ /**
119
+ * available_payment_gateways.
120
+ *
121
+ * @version 4.7.0
122
+ * @since 2.4.1
123
+ * @todo (maybe) `wc_clear_notices()`
124
+ */
125
+ function available_payment_gateways( $_available_gateways ) {
126
+ $remove_response = $this->remove_payment_gateways( $_available_gateways );
127
+ $_available_gateways = $remove_response['gateways'];
128
+ $this->notices = $remove_response['notices'];
129
  return $_available_gateways;
130
  }
131
 
includes/class-wcj-payment-gateways.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Module - Custom Gateways
4
  *
5
- * @version 3.3.0
6
  * @author Algoritmika Ltd.
7
  */
8
 
@@ -122,7 +122,7 @@ class WCJ_Payment_Gateways extends WCJ_Module {
122
  /**
123
  * update_custom_payment_gateways_fields_order_meta.
124
  *
125
- * @version 2.5.2
126
  * @since 2.5.2
127
  */
128
  function update_custom_payment_gateways_fields_order_meta( $order_id, $posted ) {
@@ -131,11 +131,24 @@ class WCJ_Payment_Gateways extends WCJ_Module {
131
  $input_fields = array();
132
  foreach ( $_POST as $key => $value ) {
133
  if ( 'wcj_input_field_' === substr( $key, 0, 16 ) ) {
134
- if ( isset( $_POST[ 'for_' . $key ] ) && $payment_method === $_POST[ 'for_' . $key ] ) {
135
- if ( isset( $_POST[ 'label_for_' . $key ] ) ) {
136
- $input_fields[ $_POST[ 'label_for_' . $key ] ] = $value;
137
- } else {
138
- $input_fields[ substr( $key, 16 ) ] = $value;
 
 
 
 
 
 
 
 
 
 
 
 
 
139
  }
140
  }
141
  }
2
  /**
3
  * Booster for WooCommerce - Module - Custom Gateways
4
  *
5
+ * @version 4.7.0
6
  * @author Algoritmika Ltd.
7
  */
8
 
122
  /**
123
  * update_custom_payment_gateways_fields_order_meta.
124
  *
125
+ * @version 4.7.0
126
  * @since 2.5.2
127
  */
128
  function update_custom_payment_gateways_fields_order_meta( $order_id, $posted ) {
131
  $input_fields = array();
132
  foreach ( $_POST as $key => $value ) {
133
  if ( 'wcj_input_field_' === substr( $key, 0, 16 ) ) {
134
+ if ( ! is_array( $value ) ) {
135
+ if ( isset( $_POST[ 'for_' . $key ] ) && $payment_method === $_POST[ 'for_' . $key ] ) {
136
+ if ( isset( $_POST[ 'label_for_' . $key ] ) ) {
137
+ $input_fields[ $_POST[ 'label_for_' . $key ] ] = $value;
138
+ } else {
139
+ $input_fields[ substr( $key, 16 ) ] = $value;
140
+ }
141
+ }
142
+ } else {
143
+ if ( $payment_method === substr( $key, 16 ) ) {
144
+ foreach ( $value as $input_name => $input_value ) {
145
+ $label_value = isset( $input_value['label'] ) ? $input_value['label'] : '';
146
+ if ( ! empty( $label_value ) ) {
147
+ $input_fields[ $label_value ] = $input_value['value'];
148
+ } else {
149
+ $input_fields[ $input_name ] = $input_value['value'];
150
+ }
151
+ }
152
  }
153
  }
154
  }
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 4.6.0
6
  * @since 2.5.0
7
  * @author Algoritmika Ltd.
8
  * @todo Fix "Make Empty Price" option for variable products
@@ -17,7 +17,7 @@ class WCJ_Price_By_User_Role extends WCJ_Module {
17
  /**
18
  * Constructor.
19
  *
20
- * @version 4.6.0
21
  * @since 2.5.0
22
  */
23
  function __construct() {
@@ -47,48 +47,8 @@ class WCJ_Price_By_User_Role extends WCJ_Module {
47
  // Admin settings - "copy price" buttons
48
  add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_admin_script' ) );
49
  add_filter( 'woocommerce_hide_invisible_variations', array( $this, 'show_empty_price_variations' ) );
50
- add_action('woocommerce_before_single_variation',array($this,'remove_single_variation_hooks'));
51
- add_action('wcj_before_get_terms',array($this,'remove_wpml_functions_before_get_terms'));
52
- add_action('wcj_after_get_terms',array($this,'remove_wpml_functions_after_get_terms'));
53
- }
54
- }
55
-
56
- /**
57
- * remove_wpml_functions_before_get_terms.
58
- *
59
- * @see https://wpml.org/forums/topic/get-all-terms-of-all-languages-outside-loop/
60
- *
61
- * @version 4.6.0
62
- * @since 4.6.0
63
- */
64
- function remove_wpml_functions_before_get_terms() {
65
- if ( 'no' === get_option( 'wcj_price_by_user_role_wpml_get_terms_all_lang', 'no' ) ) {
66
- return;
67
- }
68
- // remove WPML term filters
69
- global $sitepress;
70
- remove_filter( 'get_terms_args', array( $sitepress, 'get_terms_args_filter' ) );
71
- remove_filter( 'get_term', array( $sitepress, 'get_term_adjust_id' ) );
72
- remove_filter( 'terms_clauses', array( $sitepress, 'terms_clauses' ) );
73
- }
74
-
75
- /**
76
- * remove_wpml_functions_after_get_terms
77
- *
78
- * @see http://support.themeblvd.com/forums/topic/wpml-sitepress-php-error-on-backend-due-to-layout-builder/
79
- *
80
- * @version 4.6.0
81
- * @since 4.6.0
82
- */
83
- function remove_wpml_functions_after_get_terms() {
84
- if ( 'no' === get_option( 'wcj_price_by_user_role_wpml_get_terms_all_lang', 'no' ) ) {
85
- return;
86
  }
87
- // restore WPML term filters
88
- global $sitepress;
89
- add_filter( 'terms_clauses', array( $sitepress, 'terms_clauses' ), 10, 3 );
90
- add_filter( 'get_term', array( $sitepress, 'get_term_adjust_id' ) );
91
- add_filter( 'get_terms_args', array( $sitepress, 'get_terms_args_filter' ), 10, 2 );
92
  }
93
 
94
  /**
2
  /**
3
  * Booster for WooCommerce - Module - Price based on User Role
4
  *
5
+ * @version 4.7.0
6
  * @since 2.5.0
7
  * @author Algoritmika Ltd.
8
  * @todo Fix "Make Empty Price" option for variable products
17
  /**
18
  * Constructor.
19
  *
20
+ * @version 4.7.0
21
  * @since 2.5.0
22
  */
23
  function __construct() {
47
  // Admin settings - "copy price" buttons
48
  add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_admin_script' ) );
49
  add_filter( 'woocommerce_hide_invisible_variations', array( $this, 'show_empty_price_variations' ) );
50
+ add_action( 'woocommerce_before_single_variation', array( $this, 'remove_single_variation_hooks' ) );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
51
  }
 
 
 
 
 
52
  }
53
 
54
  /**
includes/class-wcj-product-addons.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Module - Product Addons
4
  *
5
- * @version 4.6.1
6
  * @since 2.5.3
7
  * @author Algoritmika Ltd.
8
  * @todo admin order view (names)
@@ -18,7 +18,7 @@ class WCJ_Product_Addons extends WCJ_Module {
18
  /**
19
  * Constructor.
20
  *
21
- * @version 4.6.1
22
  * @since 2.5.3
23
  * @todo (maybe) add "in progress" ajax message
24
  * @todo (maybe) for variable products - show addons only if variation is selected (e.g. move to addons from `woocommerce_before_add_to_cart_button` to variation description)
@@ -91,7 +91,70 @@ class WCJ_Product_Addons extends WCJ_Module {
91
  add_action( $qty_trigger, array( $this, 'maybe_reduce_addons_qty' ) );
92
  }
93
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
94
  }
 
 
95
  }
96
 
97
  /**
2
  /**
3
  * Booster for WooCommerce - Module - Product Addons
4
  *
5
+ * @version 4.7.0
6
  * @since 2.5.3
7
  * @author Algoritmika Ltd.
8
  * @todo admin order view (names)
18
  /**
19
  * Constructor.
20
  *
21
+ * @version 4.7.0
22
  * @since 2.5.3
23
  * @todo (maybe) add "in progress" ajax message
24
  * @todo (maybe) for variable products - show addons only if variation is selected (e.g. move to addons from `woocommerce_before_add_to_cart_button` to variation description)
91
  add_action( $qty_trigger, array( $this, 'maybe_reduce_addons_qty' ) );
92
  }
93
  }
94
+
95
+ // Export and import '_wcj_product_addons_per_product_enable_by_variation_%' meta
96
+ add_filter( 'woocommerce_product_export_meta_value', array( $this, 'export_enable_by_variation_meta' ), 10, 4 );
97
+ add_filter( 'woocommerce_product_importer_parsed_data', array( $this, 'import_enable_by_variation_meta' ), 10, 2 );
98
+ }
99
+ }
100
+
101
+ /**
102
+ * import_enable_by_variation_meta.
103
+ *
104
+ * @version 4.7.0
105
+ * @since 4.7.0
106
+ *
107
+ * @param $data
108
+ * @param $raw_data
109
+ *
110
+ * @return mixed
111
+ */
112
+ function import_enable_by_variation_meta( $data, $raw_data ) {
113
+ if (
114
+ 'no' === get_option( 'wcj_product_addons_enable_by_variation_export_import', 'no' ) ||
115
+ ! isset( $data['meta_data'] ) ||
116
+ empty( $data['meta_data'] )
117
+ ) {
118
+ return $data;
119
+ }
120
+ $meta_data_key = - 1;
121
+ foreach ( $data['meta_data'] as $key => $meta_data ) {
122
+ if ( false !== strpos( $meta_data['key'], '_wcj_product_addons_per_product_enable_by_variation_' ) ) {
123
+ $meta_data_key = $key;
124
+ break;
125
+ }
126
+ }
127
+ if ( - 1 != $meta_data_key ) {
128
+ $new_value = array_filter( preg_split( "/\r\n|\n|\r/", $data['meta_data'][ $meta_data_key ]['value'] ) );
129
+ if ( ! empty( $new_value ) ) {
130
+ $data['meta_data'][ $meta_data_key ]['value'] = $new_value;
131
+ }
132
+ }
133
+ return $data;
134
+ }
135
+
136
+ /**
137
+ * export_enable_by_variation_meta.
138
+ *
139
+ * @version 4.7.0
140
+ * @since 4.7.0
141
+ *
142
+ * @param $value
143
+ * @param $meta
144
+ * @param $product
145
+ * @param $row
146
+ *
147
+ * @return string
148
+ */
149
+ function export_enable_by_variation_meta( $value, $meta, $product, $row ) {
150
+ if (
151
+ 'no' === get_option( 'wcj_product_addons_enable_by_variation_export_import', 'no' ) ||
152
+ false === strpos( $meta->get_data()['key'], '_wcj_product_addons_per_product_enable_by_variation_' )
153
+ ) {
154
+ return $value;
155
  }
156
+ $value = implode( "\n", $value );
157
+ return $value;
158
  }
159
 
160
  /**
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 3.6.0
6
  * @since 2.9.1
7
  * @author Algoritmika Ltd.
8
  */
@@ -147,14 +147,22 @@ class WCJ_Product_By_Date extends WCJ_Module {
147
  /**
148
  * check_is_purchasable_by_date.
149
  *
150
- * @version 3.4.0
151
  * @since 2.9.1
152
  * @todo validate `wcj_product_by_date_` option before checking (or even better earlier, when option is saved by admin)
153
  */
154
  function check_is_purchasable_by_date( $purchasable, $_product ) {
155
  if ( $purchasable ) {
156
  if ( false !== ( $direct_date = $this->maybe_get_direct_date( wcj_get_product_id_or_variation_parent_id( $_product ) ) ) ) {
157
- return ( $this->time_now >= strtotime( $direct_date ) );
 
 
 
 
 
 
 
 
158
  } else {
159
  $_date = $this->get_product_availability_this_month( $_product );
160
  if ( '-' === $_date ) {
2
  /**
3
  * Booster for WooCommerce - Module - Product Availability by Date
4
  *
5
+ * @version 4.7.0
6
  * @since 2.9.1
7
  * @author Algoritmika Ltd.
8
  */
147
  /**
148
  * check_is_purchasable_by_date.
149
  *
150
+ * @version 4.7.0
151
  * @since 2.9.1
152
  * @todo validate `wcj_product_by_date_` option before checking (or even better earlier, when option is saved by admin)
153
  */
154
  function check_is_purchasable_by_date( $purchasable, $_product ) {
155
  if ( $purchasable ) {
156
  if ( false !== ( $direct_date = $this->maybe_get_direct_date( wcj_get_product_id_or_variation_parent_id( $_product ) ) ) ) {
157
+ $timestamp = strtotime( $direct_date );
158
+ if ( false === $timestamp ) {
159
+ $date = DateTime::createFromFormat( get_option( 'wcj_product_by_date_direct_date_format', 'm/d/Y' ), $direct_date, wcj_timezone() );
160
+ if ( false === $date ) {
161
+ return false;
162
+ }
163
+ $timestamp = $date->getTimestamp();
164
+ }
165
+ return ( $this->time_now >= $timestamp );
166
  } else {
167
  $_date = $this->get_product_availability_this_month( $_product );
168
  if ( '-' === $_date ) {
includes/class-wcj-products-per-page.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Module - Products per Page
4
  *
5
- * @version 4.1.0
6
  * @since 2.6.0
7
  * @author Algoritmika Ltd.
8
  */
@@ -46,7 +46,7 @@ class WCJ_Products_Per_Page extends WCJ_Module {
46
  /**
47
  * add_products_per_page_form.
48
  *
49
- * @version 3.8.0
50
  * @since 2.5.3
51
  */
52
  function add_products_per_page_form() {
@@ -77,10 +77,10 @@ class WCJ_Products_Per_Page extends WCJ_Module {
77
  }
78
  }
79
  $select_form .= '</select>';
80
-
81
  $html = '';
82
  $html .= get_option( 'wcj_products_per_page_text_before', '<div class="clearfix"></div><div>' );
83
- $html .= '<form action="' . esc_url( remove_query_arg( 'paged' ) ) . '" method="POST">';
84
  $_text = get_option( 'wcj_products_per_page_text',
85
  __( 'Products <strong>%from% - %to%</strong> from <strong>%total%</strong>. Products on page %select_form%', 'woocommerce-jetpack' ) );
86
  $html .= str_replace( array( '%from%', '%to%', '%total%', '%select_form%' ), array( $products_from, $products_to, $products_total, $select_form ), $_text );
@@ -118,15 +118,15 @@ class WCJ_Products_Per_Page extends WCJ_Module {
118
  /**
119
  * get_current_products_per_page_number.
120
  *
121
- * @version 3.8.0
122
  * @since 3.8.0
123
  */
124
  function get_current_products_per_page_number( $do_save ) {
125
- if ( isset( $_REQUEST['wcj_products_per_page'] ) ) {
126
  if ( $do_save ) {
127
- $this->save_products_per_page_number( $_REQUEST['wcj_products_per_page'] );
128
  }
129
- return $_REQUEST['wcj_products_per_page'];
130
  } elseif ( $products_per_page = $this->get_saved_products_per_page_number() ) {
131
  return $products_per_page;
132
  } else {
2
  /**
3
  * Booster for WooCommerce - Module - Products per Page
4
  *
5
+ * @version 4.7.0
6
  * @since 2.6.0
7
  * @author Algoritmika Ltd.
8
  */
46
  /**
47
  * add_products_per_page_form.
48
  *
49
+ * @version 4.7.0
50
  * @since 2.5.3
51
  */
52
  function add_products_per_page_form() {
77
  }
78
  }
79
  $select_form .= '</select>';
80
+ $form_method = get_option( 'wcj_products_per_page_form_method', 'post' );
81
  $html = '';
82
  $html .= get_option( 'wcj_products_per_page_text_before', '<div class="clearfix"></div><div>' );
83
+ $html .= '<form action="' . esc_url( remove_query_arg( 'paged' ) ) . '" method="' . $form_method . '">';
84
  $_text = get_option( 'wcj_products_per_page_text',
85
  __( 'Products <strong>%from% - %to%</strong> from <strong>%total%</strong>. Products on page %select_form%', 'woocommerce-jetpack' ) );
86
  $html .= str_replace( array( '%from%', '%to%', '%total%', '%select_form%' ), array( $products_from, $products_to, $products_total, $select_form ), $_text );
118
  /**
119
  * get_current_products_per_page_number.
120
  *
121
+ * @version 4.7.0
122
  * @since 3.8.0
123
  */
124
  function get_current_products_per_page_number( $do_save ) {
125
+ if ( isset( $_REQUEST['wcj_products_per_page'] ) && ! empty( $_REQUEST['wcj_products_per_page'] ) ) {
126
  if ( $do_save ) {
127
+ $this->save_products_per_page_number( intval( sanitize_text_field( $_REQUEST['wcj_products_per_page'] ) ) );
128
  }
129
+ return intval( sanitize_text_field( $_REQUEST['wcj_products_per_page'] ) );
130
  } elseif ( $products_per_page = $this->get_saved_products_per_page_number() ) {
131
  return $products_per_page;
132
  } else {
includes/class-wcj-shipping-by-cities.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Module - Shipping by Cities
4
  *
5
- * @version 4.0.0
6
  * @since 3.6.0
7
  * @author Algoritmika Ltd.
8
  */
@@ -51,7 +51,7 @@ class WCJ_Shipping_By_Cities extends WCJ_Module_Shipping_By_Condition {
51
  /**
52
  * check.
53
  *
54
- * @version 4.0.0
55
  * @since 3.6.0
56
  * @todo `$_REQUEST['city']` (i.e. billing city)
57
  * @todo `get_base_city()` - do we really need this?
@@ -63,7 +63,7 @@ class WCJ_Shipping_By_Cities extends WCJ_Module_Shipping_By_Condition {
63
  $values = array_map( 'strtoupper', array_map( 'trim', explode( PHP_EOL, $values ) ) );
64
  return in_array( $customer_city, $values );
65
  case 'postcodes':
66
- $customer_postcode = strtoupper( isset( $_REQUEST['s_postcode'] ) ? $_REQUEST['s_postcode'] : WC()->countries->get_base_postcode() );
67
  $postcodes = array_map( 'strtoupper', array_map( 'trim', explode( PHP_EOL, $values ) ) );
68
  return wcj_check_postcode( $customer_postcode, $postcodes );
69
  }
2
  /**
3
  * Booster for WooCommerce - Module - Shipping by Cities
4
  *
5
+ * @version 4.7.0
6
  * @since 3.6.0
7
  * @author Algoritmika Ltd.
8
  */
51
  /**
52
  * check.
53
  *
54
+ * @version 4.7.0
55
  * @since 3.6.0
56
  * @todo `$_REQUEST['city']` (i.e. billing city)
57
  * @todo `get_base_city()` - do we really need this?
63
  $values = array_map( 'strtoupper', array_map( 'trim', explode( PHP_EOL, $values ) ) );
64
  return in_array( $customer_city, $values );
65
  case 'postcodes':
66
+ $customer_postcode = strtoupper( isset( $_REQUEST['s_postcode'] ) ? $_REQUEST['s_postcode'] : ( ! empty( $customer_shipping_postcode = WC()->customer->get_shipping_postcode() ) ? $customer_shipping_postcode : WC()->countries->get_base_postcode() ) );
67
  $postcodes = array_map( 'strtoupper', array_map( 'trim', explode( PHP_EOL, $values ) ) );
68
  return wcj_check_postcode( $customer_postcode, $postcodes );
69
  }
includes/class-wcj-shipping.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Module - Custom Shipping
4
  *
5
- * @version 4.5.0
6
  * @author Algoritmika Ltd.
7
  */
8
 
@@ -58,11 +58,14 @@ if ( ! class_exists( 'WCJ_Shipping' ) ) :
58
  /*
59
  * add_wc_shipping_wcj_custom_class.
60
  *
61
- * @version 2.8.0
62
  */
63
  function add_wc_shipping_wcj_custom_class( $methods ) {
64
  $total_number = get_option( 'wcj_shipping_custom_shipping_total_number', 1 );
65
- for ( $i = 1; $i <= $total_number; $i++ ) {
 
 
 
66
  $the_method = new WC_Shipping_WCJ_Custom_Template();
67
  $the_method->init( $i );
68
  $methods[ $the_method->id ] = $the_method;
2
  /**
3
  * Booster for WooCommerce - Module - Custom Shipping
4
  *
5
+ * @version 4.7.0
6
  * @author Algoritmika Ltd.
7
  */
8
 
58
  /*
59
  * add_wc_shipping_wcj_custom_class.
60
  *
61
+ * @version 4.7.0
62
  */
63
  function add_wc_shipping_wcj_custom_class( $methods ) {
64
  $total_number = get_option( 'wcj_shipping_custom_shipping_total_number', 1 );
65
+ if ( ! class_exists( 'WC_Shipping_WCJ_Custom_Template' ) ) {
66
+ $this->init_template_class();
67
+ }
68
+ for ( $i = 1; $i <= $total_number; $i ++ ) {
69
  $the_method = new WC_Shipping_WCJ_Custom_Template();
70
  $the_method->init( $i );
71
  $methods[ $the_method->id ] = $the_method;
includes/class-wcj-sku.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Module - SKU
4
  *
5
- * @version 3.7.0
6
  * @author Algoritmika Ltd.
7
  */
8
 
@@ -15,7 +15,7 @@ class WCJ_SKU extends WCJ_Module {
15
  /**
16
  * Constructor.
17
  *
18
- * @version 3.4.0
19
  */
20
  function __construct() {
21
 
@@ -61,7 +61,86 @@ class WCJ_SKU extends WCJ_Module {
61
  if ( 'yes' === get_option( 'wcj_sku_disabled', 'no' ) ) {
62
  add_filter( 'wc_product_sku_enabled', '__return_false', PHP_INT_MAX );
63
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
64
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
65
  }
66
 
67
  /**
@@ -132,7 +211,7 @@ class WCJ_SKU extends WCJ_Module {
132
  /**
133
  * get_all_variations.
134
  *
135
- * @version 2.9.0
136
  * @since 2.4.8
137
  */
138
  function get_all_variations( $_product ) {
@@ -142,6 +221,9 @@ class WCJ_SKU extends WCJ_Module {
142
  $all_variations[] = $_product->get_available_variation( $variation );
143
  }
144
  }
 
 
 
145
  return $all_variations;
146
  }
147
 
@@ -171,26 +253,13 @@ class WCJ_SKU extends WCJ_Module {
171
  /**
172
  * set_sku_with_variable.
173
  *
174
- * @version 3.6.0
175
  * @todo `as_variable_with_suffix` - handle cases with more than 26 variations
176
  */
177
  function set_sku_with_variable( $product_id, $is_preview ) {
178
-
179
- switch ( apply_filters( 'booster_option', 'product_id', get_option( 'wcj_sku_number_generation', 'product_id' ) ) ) {
180
- case 'sequential':
181
- $sku_number = $this->get_sequential_counter( $product_id );
182
- break;
183
- case 'hash_crc32':
184
- $sku_number = sprintf( "%u", crc32( $product_id ) );
185
- break;
186
- default: // 'product_id'
187
- $sku_number = $product_id;
188
- break;
189
- }
190
-
191
- $product = wc_get_product( $product_id );
192
-
193
- $this->set_sku( $product_id, $sku_number, '', $is_preview, $product_id, $product );
194
 
195
  // Handling variable products
196
  $variation_handling = apply_filters( 'booster_option', 'as_variable', get_option( 'wcj_sku_variations_handling', 'as_variable' ) );
@@ -198,25 +267,28 @@ class WCJ_SKU extends WCJ_Module {
198
  $variations = $this->get_all_variations( $product );
199
  if ( 'as_variable' === $variation_handling ) {
200
  foreach ( $variations as $variation ) {
201
- $this->set_sku( $variation['variation_id'], $sku_number, '', $is_preview, $product_id, wc_get_product( $variation['variation_id'] ) );
 
202
  }
203
  } elseif ( 'as_variation' === $variation_handling ) {
204
  foreach ( $variations as $variation ) {
205
- if ( 'sequential' === apply_filters( 'booster_option', 'product_id', get_option( 'wcj_sku_number_generation', 'product_id' ) ) ) {
206
- $sku_number = $this->get_sequential_counter( $product_id );
207
- } elseif ( 'hash_crc32' === apply_filters( 'booster_option', 'product_id', get_option( 'wcj_sku_number_generation', 'product_id' ) ) ) {
208
- $sku_number = sprintf( "%u", crc32( $variation['variation_id'] ) );
209
- } else { // if 'product_id'
210
- $sku_number = $variation['variation_id'];
211
- }
212
- $this->set_sku( $variation['variation_id'], $sku_number, '', $is_preview, $product_id, wc_get_product( $variation['variation_id'] ) );
213
  }
214
- }
215
- else if ( 'as_variable_with_suffix' === $variation_handling ) {
216
  $variation_suffixes = 'abcdefghijklmnopqrstuvwxyz';
217
- $abc = 0;
218
  foreach ( $variations as $variation ) {
219
- $this->set_sku( $variation['variation_id'], $sku_number, $variation_suffixes[ $abc++ ], $is_preview, $product_id, wc_get_product( $variation['variation_id'] ) );
 
 
 
 
 
 
 
 
 
220
  if ( 26 == $abc ) {
221
  $abc = 0;
222
  }
@@ -225,6 +297,22 @@ class WCJ_SKU extends WCJ_Module {
225
  }
226
  }
227
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
228
  /**
229
  * get_acronym.
230
  *
@@ -300,15 +388,34 @@ class WCJ_SKU extends WCJ_Module {
300
  }
301
 
302
  /**
303
- * set_sku.
304
  *
305
- * @version 3.7.0
306
- * @todo deprecate `{prefix}` and `{suffix}`
307
- * @todo `{tag_prefix}`, `{tag_suffix}`
308
- * @todo (maybe) remove some "replaced values" that can be replaced by Booster products shortcodes, e.g.: `[wcj_product_slug]` (and update description in settings)
309
- * @todo (maybe) add option to disable shortcodes processing
 
 
 
 
 
310
  */
311
- function set_sku( $product_id, $sku_number, $variation_suffix, $is_preview, $parent_product_id, $_product ) {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
312
 
313
  $format_template = get_option( 'wcj_sku_template',
314
  '{category_prefix}{prefix}{sku_number}{suffix}{category_suffix}{variation_suffix}' );
@@ -321,7 +428,7 @@ class WCJ_SKU extends WCJ_Module {
321
 
322
  $parent_product = wc_get_product( $parent_product_id );
323
 
324
- $old_sku = $_product->get_sku();
325
  $do_generate_new_sku = ( 'no' === get_option( 'wcj_sku_generate_only_for_empty_sku', 'no' ) || '' === $old_sku );
326
 
327
  // {category_prefix} & {category_suffix}
@@ -375,7 +482,7 @@ class WCJ_SKU extends WCJ_Module {
375
  }
376
 
377
  $replace_values = array(
378
- '{parent_sku}' => $parent_product->get_sku(),
379
  '{product_slug}' => $_product->get_slug(),
380
  '{product_slug_acronym}' => $product_slug_acronym,
381
  '{parent_product_slug}' => $parent_product->get_slug(),
@@ -398,11 +505,35 @@ class WCJ_SKU extends WCJ_Module {
398
  $the_sku = $old_sku;
399
  }
400
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
401
  if ( $is_preview ) {
402
  $this->preview_buffer .= '<tr>' .
403
  '<td>' . $this->product_counter++ . '</td>' .
404
  '<td>' . $product_id . '</td>' .
405
- '<td>' . $_product->get_title() . '</td>' .
406
  '<td>' . $product_cat . '</td>' .
407
  '<td>' . $the_sku . '</td>' .
408
  '<td>' . $old_sku . '</td>' .
2
  /**
3
  * Booster for WooCommerce - Module - SKU
4
  *
5
+ * @version 4.7.0
6
  * @author Algoritmika Ltd.
7
  */
8
 
15
  /**
16
  * Constructor.
17
  *
18
+ * @version 4.7.0
19
  */
20
  function __construct() {
21
 
61
  if ( 'yes' === get_option( 'wcj_sku_disabled', 'no' ) ) {
62
  add_filter( 'wc_product_sku_enabled', '__return_false', PHP_INT_MAX );
63
  }
64
+ // Generate sku on product save
65
+ add_action( 'save_post_product', array( $this, 'set_new_sku_on_save' ), PHP_INT_MAX );
66
+
67
+ // Generate default hashids lib salt
68
+ add_action( 'wcj_loaded', array( $this, 'generate_default_hashids_salt' ) );
69
+ }
70
+ }
71
+
72
+ /**
73
+ * generate_default_hashids_salt.
74
+ *
75
+ * @version 4.7.0
76
+ * @since 4.7.0
77
+ */
78
+ function generate_default_hashids_salt(){
79
+ if (
80
+ isset( $_GET['page'] ) && 'wc-settings' === $_GET['page'] &&
81
+ isset( $_GET['tab'] ) && 'jetpack' === $_GET['tab'] &&
82
+ isset( $_GET['wcj-cat'] ) && 'products' === $_GET['wcj-cat'] &&
83
+ isset( $_GET['section'] ) && 'sku' === $_GET['section']
84
+ ) {
85
+ if ( empty( get_option( 'wcj_sku_hashids_salt_default', '' ) ) ) {
86
+ $length = 24;
87
+ $random_string = substr( str_shuffle( str_repeat( $x = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', ceil( $length / strlen( $x ) ) ) ), 1, $length );
88
+ update_option( 'wcj_sku_hashids_salt_default', $random_string );
89
+ }
90
+ }
91
+ }
92
+
93
+ /**
94
+ * load_hashids_lib.
95
+ *
96
+ * @version 4.7.0
97
+ * @since 4.7.0
98
+ *
99
+ * @return Hashids\Hashids
100
+ */
101
+ function get_hashids_lib() {
102
+ if (
103
+ ! is_admin() ||
104
+ 'hashids' !== apply_filters( 'booster_option', 'product_id', get_option( 'wcj_sku_number_generation', 'product_id' ) )
105
+ ) {
106
+ return;
107
+ }
108
+ if ( empty( $this->hashids ) ) {
109
+ require_once( wcj_plugin_path() . '/includes/lib/hashids/src/Hashids.php' );
110
+ $sku_format = get_option( 'wcj_sku_hashids_sku_format', 'letters_and_numbers' );
111
+ $characters_case = get_option( 'wcj_sku_characters_case', 'original' );
112
+ $letters = 'original' == $characters_case ? 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' : ( 'lower' == $characters_case ? 'abcdefghijklmnopqrstuvwxyz' : 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' );
113
+ switch ( $sku_format ) {
114
+ case 'only_numbers':
115
+ $alphabet = '1234567890';
116
+ break;
117
+ case 'only_letters':
118
+ $alphabet = $letters;
119
+ break;
120
+ default:
121
+ $alphabet = $letters . '1234567890';
122
+ break;
123
+ }
124
+ $this->hashids = new Hashids\Hashids( get_option( 'wcj_sku_hashids_salt', get_option( 'wcj_sku_hashids_salt_default', '' ) ), get_option( 'wcj_sku_hashids_sku_length', 6 ), $alphabet );
125
  }
126
+ return $this->hashids;
127
+ }
128
+
129
+ /**
130
+ * set_new_sku_on_save.
131
+ *
132
+ * @version 4.7.0
133
+ * @since 4.7.0
134
+ *
135
+ * @param $post_id
136
+ */
137
+ function set_new_sku_on_save( $post_id ) {
138
+ if ( 'no' === get_option( 'wcj_sku_generate_on_save', 'no' ) ) {
139
+ return;
140
+ }
141
+ $this->maybe_get_sequential_counters();
142
+ $this->set_sku_with_variable( $post_id, false );
143
+ $this->maybe_save_sequential_counters();
144
  }
145
 
146
  /**
211
  /**
212
  * get_all_variations.
213
  *
214
+ * @version 4.7.0
215
  * @since 2.4.8
216
  */
217
  function get_all_variations( $_product ) {
221
  $all_variations[] = $_product->get_available_variation( $variation );
222
  }
223
  }
224
+ usort( $all_variations, function ( $a, $b ) {
225
+ return $a['variation_id'] - $b['variation_id'];
226
+ } );
227
  return $all_variations;
228
  }
229
 
253
  /**
254
  * set_sku_with_variable.
255
  *
256
+ * @version 4.7.0
257
  * @todo `as_variable_with_suffix` - handle cases with more than 26 variations
258
  */
259
  function set_sku_with_variable( $product_id, $is_preview ) {
260
+ $product = wc_get_product( $product_id );
261
+ $sku_object = $this->generate_sku( $product_id, '', $product_id, $product );
262
+ $this->set_sku( $product_id, $sku_object, $is_preview );
 
 
 
 
 
 
 
 
 
 
 
 
 
263
 
264
  // Handling variable products
265
  $variation_handling = apply_filters( 'booster_option', 'as_variable', get_option( 'wcj_sku_variations_handling', 'as_variable' ) );
267
  $variations = $this->get_all_variations( $product );
268
  if ( 'as_variable' === $variation_handling ) {
269
  foreach ( $variations as $variation ) {
270
+ $sku_object = $this->generate_sku( $variation['variation_id'], '', $product_id, wc_get_product( $variation['variation_id'] ) );
271
+ $this->set_sku( $variation['variation_id'], $sku_object, $is_preview );
272
  }
273
  } elseif ( 'as_variation' === $variation_handling ) {
274
  foreach ( $variations as $variation ) {
275
+ $sku_object = $this->generate_sku( $variation['variation_id'], '', $product_id, wc_get_product( $variation['variation_id'] ), false );
276
+ $this->set_sku( $variation['variation_id'], $sku_object, $is_preview );
 
 
 
 
 
 
277
  }
278
+ } else if ( 'as_variable_with_suffix' === $variation_handling ) {
 
279
  $variation_suffixes = 'abcdefghijklmnopqrstuvwxyz';
280
+ $abc = 0;
281
  foreach ( $variations as $variation ) {
282
+ $suffix = $variation_suffixes[ $abc ++ ];
283
+ $sku_object = $this->generate_sku( $variation['variation_id'], $suffix, $product_id, wc_get_product( $variation['variation_id'] ) );
284
+ $variation_id = $variation['variation_id'];
285
+ $variations_excluding_current = array_filter( $variations, function ( $v ) use ( $variation_id ) {
286
+ return $variation_id == $v['variation_id'] ? false : true;
287
+ } );
288
+ if ( $this->has_sku_been_used_in_variations( $sku_object['sku'], $variations_excluding_current ) ) {
289
+ $sku_object = $this->generate_sku( $variation['variation_id'], $suffix . '_' . sprintf( "%u", crc32( $variation['variation_id'] ) ), $product_id, wc_get_product( $variation['variation_id'] ) );
290
+ }
291
+ $this->set_sku( $variation['variation_id'], $sku_object, $is_preview );
292
  if ( 26 == $abc ) {
293
  $abc = 0;
294
  }
297
  }
298
  }
299
 
300
+ /**
301
+ * has_sku_been_used_in_variations.
302
+ *
303
+ * @version 4.7.0
304
+ * @since 4.7.0
305
+ *
306
+ * @param $sku
307
+ * @param $variations
308
+ *
309
+ * @return bool
310
+ */
311
+ function has_sku_been_used_in_variations( $sku, $variations ) {
312
+ $variations_skus = wp_list_pluck( $variations, 'sku' );
313
+ return in_array( $sku, $variations_skus );
314
+ }
315
+
316
  /**
317
  * get_acronym.
318
  *
388
  }
389
 
390
  /**
391
+ * generate_sku.
392
  *
393
+ * @version 4.7.0
394
+ * @since 4.7.0
395
+ *
396
+ * @param $product_id
397
+ * @param $variation_suffix
398
+ * @param $parent_product_id
399
+ * @param $_product
400
+ * @param boolean $get_sku_from_parent
401
+ *
402
+ * @return mixed|string
403
  */
404
+ function generate_sku( $product_id, $variation_suffix, $parent_product_id, $_product, $get_sku_from_parent = true ) {
405
+ switch ( apply_filters( 'booster_option', 'product_id', get_option( 'wcj_sku_number_generation', 'product_id' ) ) ) {
406
+ case 'sequential':
407
+ $sku_number = $this->get_sequential_counter( $parent_product_id );
408
+ break;
409
+ case 'hash_crc32':
410
+ $sku_number = sprintf( "%u", crc32( $get_sku_from_parent ? $parent_product_id : $product_id ) );
411
+ break;
412
+ case 'hashids':
413
+ $sku_number = $this->get_hashids_lib()->encode( $get_sku_from_parent ? $parent_product_id : $product_id );
414
+ break;
415
+ default: // 'product_id'
416
+ $sku_number = $get_sku_from_parent ? $parent_product_id : $product_id;
417
+ break;
418
+ }
419
 
420
  $format_template = get_option( 'wcj_sku_template',
421
  '{category_prefix}{prefix}{sku_number}{suffix}{category_suffix}{variation_suffix}' );
428
 
429
  $parent_product = wc_get_product( $parent_product_id );
430
 
431
+ $old_sku = get_post_meta( $product_id, '_sku', true );
432
  $do_generate_new_sku = ( 'no' === get_option( 'wcj_sku_generate_only_for_empty_sku', 'no' ) || '' === $old_sku );
433
 
434
  // {category_prefix} & {category_suffix}
482
  }
483
 
484
  $replace_values = array(
485
+ '{parent_sku}' => empty( $parent_sku = get_post_meta( $parent_product_id, '_sku', true ) ) ? $parent_product->get_sku() : $parent_sku,
486
  '{product_slug}' => $_product->get_slug(),
487
  '{product_slug_acronym}' => $product_slug_acronym,
488
  '{parent_product_slug}' => $parent_product->get_slug(),
505
  $the_sku = $old_sku;
506
  }
507
 
508
+ return array(
509
+ 'sku' => $the_sku,
510
+ 'old_sku' => $old_sku,
511
+ 'product_cat' => $product_cat,
512
+ 'product' => $_product,
513
+ 'do_generate_new_sku' => $do_generate_new_sku
514
+ );
515
+ }
516
+
517
+ /**
518
+ * set_sku.
519
+ *
520
+ * @version 4.7.0
521
+ * @todo deprecate `{prefix}` and `{suffix}`
522
+ * @todo `{tag_prefix}`, `{tag_suffix}`
523
+ * @todo (maybe) remove some "replaced values" that can be replaced by Booster products shortcodes, e.g.: `[wcj_product_slug]` (and update description in settings)
524
+ * @todo (maybe) add option to disable shortcodes processing
525
+ */
526
+ function set_sku( $product_id, $sku_object, $is_preview ) {
527
+ $old_sku = $sku_object['old_sku'];
528
+ $the_sku = $sku_object['sku'];
529
+ $product_cat = $sku_object['product_cat'];
530
+ $product = $sku_object['product'];
531
+ $do_generate_new_sku = $sku_object['do_generate_new_sku'];
532
  if ( $is_preview ) {
533
  $this->preview_buffer .= '<tr>' .
534
  '<td>' . $this->product_counter++ . '</td>' .
535
  '<td>' . $product_id . '</td>' .
536
+ '<td>' . $product->get_title() . '</td>' .
537
  '<td>' . $product_cat . '</td>' .
538
  '<td>' . $the_sku . '</td>' .
539
  '<td>' . $old_sku . '</td>' .
includes/classes/class-wcj-module-product-by-condition.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Module - Product by Condition
4
  *
5
- * @version 4.5.0
6
  * @since 3.6.0
7
  * @author Algoritmika Ltd.
8
  */
@@ -16,7 +16,7 @@ abstract class WCJ_Module_Product_By_Condition extends WCJ_Module {
16
  /**
17
  * Constructor.
18
  *
19
- * @version 3.6.0
20
  * @since 3.6.0
21
  */
22
  function __construct( $type = 'module' ) {
@@ -61,7 +61,28 @@ abstract class WCJ_Module_Product_By_Condition extends WCJ_Module {
61
  add_filter( 'manage_edit-product_columns', array( $this, 'add_product_columns' ), PHP_INT_MAX );
62
  add_action( 'manage_product_posts_custom_column', array( $this, 'render_product_column' ), PHP_INT_MAX );
63
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
64
  }
 
 
65
  }
66
 
67
  /**
@@ -212,12 +233,15 @@ abstract class WCJ_Module_Product_By_Condition extends WCJ_Module {
212
  /**
213
  * pre_get_posts.
214
  *
215
- * @version 4.5.0
216
  * @since 3.6.0
217
  * @todo [dev] maybe move `if ( ! function_exists( 'is_user_logged_in' ) ) {`
218
  */
219
  function pre_get_posts( $query ) {
220
- if ( is_admin() && ! wp_doing_ajax() ) {
 
 
 
221
  return;
222
  }
223
  if ( ! function_exists( 'is_user_logged_in' ) ) {
2
  /**
3
  * Booster for WooCommerce - Module - Product by Condition
4
  *
5
+ * @version 4.7.0
6
  * @since 3.6.0
7
  * @author Algoritmika Ltd.
8
  */
16
  /**
17
  * Constructor.
18
  *
19
+ * @version 4.7.0
20
  * @since 3.6.0
21
  */
22
  function __construct( $type = 'module' ) {
61
  add_filter( 'manage_edit-product_columns', array( $this, 'add_product_columns' ), PHP_INT_MAX );
62
  add_action( 'manage_product_posts_custom_column', array( $this, 'render_product_column' ), PHP_INT_MAX );
63
  }
64
+
65
+ // Disable pre_get_posts query when exporting products
66
+ add_filter( 'wcj_product_by_condition_pre_get_posts_validation', array( $this, 'disable_pre_get_posts_on_export' ) );
67
+ }
68
+ }
69
+
70
+ /**
71
+ * Disables pre_get_posts query when exporting products.
72
+ *
73
+ * @version 4.7.0
74
+ * @since 4.7.0
75
+ *
76
+ */
77
+ function disable_pre_get_posts_on_export( $validation ) {
78
+ if (
79
+ ! isset( $_REQUEST['action'] ) ||
80
+ 'woocommerce_do_ajax_product_export' !== $_REQUEST['action']
81
+ ) {
82
+ return $validation;
83
  }
84
+ $validation = false;
85
+ return $validation;
86
  }
87
 
88
  /**
233
  /**
234
  * pre_get_posts.
235
  *
236
+ * @version 4.7.0
237
  * @since 3.6.0
238
  * @todo [dev] maybe move `if ( ! function_exists( 'is_user_logged_in' ) ) {`
239
  */
240
  function pre_get_posts( $query ) {
241
+ if (
242
+ ( is_admin() && ! wp_doing_ajax() ) ||
243
+ false === apply_filters( 'wcj_product_by_condition_pre_get_posts_validation', true, $this, $query )
244
+ ) {
245
  return;
246
  }
247
  if ( ! function_exists( 'is_user_logged_in' ) ) {
includes/classes/class-wcj-module.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce Module
4
  *
5
- * @version 4.6.1
6
  * @since 2.2.0
7
  * @author Algoritmika Ltd.
8
  * @todo [dev] maybe should be `abstract` ?
@@ -62,6 +62,157 @@ class WCJ_Module {
62
  $this->reset_settings();
63
  }
64
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
65
  }
66
 
67
  /**
2
  /**
3
  * Booster for WooCommerce Module
4
  *
5
+ * @version 4.7.0
6
  * @since 2.2.0
7
  * @author Algoritmika Ltd.
8
  * @todo [dev] maybe should be `abstract` ?
62
  $this->reset_settings();
63
  }
64
  }
65
+
66
+ // Handle WPML hooks
67
+ if ( $this->is_enabled() ) {
68
+ add_action( 'wcj_before_get_terms', array( $this, 'remove_wpml_functions_before_get_terms' ) );
69
+ add_action( 'wcj_after_get_terms', array( $this, 'restore_wpml_functions_after_get_terms' ) );
70
+ add_action( 'wcj_before_get_products', array( $this, 'add_wpml_args_on_get_products' ) );
71
+ add_action( 'wcj_after_get_products', array( $this, 'restore_wpml_args_on_get_products' ) );
72
+ add_action( 'admin_init', array( $this, 'remove_wpml_hooks' ) );
73
+ }
74
+ }
75
+
76
+ /**
77
+ * remove_wpml_hooks.
78
+ *
79
+ * @version 4.7.0
80
+ * @since 4.7.0
81
+ */
82
+ function remove_wpml_hooks() {
83
+ if ( 'no' === get_option( 'wcj_' . $this->id . '_wpml_get_products_all_lang', 'no' ) ) {
84
+ return;
85
+ }
86
+
87
+ // Remove a WPML filter that filters products by language
88
+ wcj_remove_class_filter( 'woocommerce_json_search_found_products', 'WCML_Products', 'filter_wc_searched_products_on_admin' );
89
+ }
90
+
91
+ /**
92
+ * restore_wpml_args_on_get_products.
93
+ *
94
+ * @version 4.7.0
95
+ * @since 4.7.0
96
+ *
97
+ * @param null $module_id
98
+ */
99
+ function restore_wpml_args_on_get_products( $module_id = null ){
100
+ if ( 'no' === get_option( 'wcj_' . $this->id . '_wpml_get_products_all_lang', 'no' ) ) {
101
+ return;
102
+ }
103
+ remove_action( 'pre_get_posts', array( $this, 'suppress_filters' ) );
104
+ }
105
+
106
+ /**
107
+ * add_wpml_args_on_get_products.
108
+ *
109
+ * @version 4.7.0
110
+ * @since 4.7.0
111
+ *
112
+ * It's necessary to take 2 steps:
113
+ * 1. Add `do_action('wcj_before_get_products', $this->id )` before get_product, wcj_get_products, or wp_query.
114
+ * 2. Add a setting using `$this->get_wpml_products_in_all_languages_setting()`
115
+ *
116
+ * @param null $module_id
117
+ */
118
+ function add_wpml_args_on_get_products( $module_id = null ) {
119
+ if ( 'no' === get_option( 'wcj_' . $this->id . '_wpml_get_products_all_lang', 'no' ) ) {
120
+ return;
121
+ }
122
+ add_action( 'pre_get_posts', array( $this, 'suppress_filters' ) );
123
+ }
124
+
125
+ /**
126
+ * suppress_filters.
127
+ *
128
+ * @version 4.7.0
129
+ * @since 4.7.0
130
+ *
131
+ * @param $query
132
+ */
133
+ function suppress_filters( $query ) {
134
+ $query->query_vars['suppress_filters'] = true;
135
+ }
136
+
137
+ /**
138
+ * get_wpml_terms_in_all_languages_setting.
139
+ *
140
+ * @see WCJ_Module::remove_wpml_functions_before_get_terms().
141
+ * @see WCJ_Module::restore_wpml_args_on_get_products().
142
+ *
143
+ * @version 4.7.0
144
+ * @since 4.7.0
145
+ *
146
+ * @return array
147
+ */
148
+ function get_wpml_terms_in_all_languages_setting() {
149
+ return array(
150
+ 'title' => __( 'WPML: Get Terms in All Languages', 'woocommerce-jetpack' ),
151
+ 'desc' => __( 'Enable', 'woocommerce-jetpack' ),
152
+ 'desc_tip' => __( 'Get tags and taxonomies in all languages', 'woocommerce-jetpack' ),
153
+ 'id' => 'wcj_' . $this->id . '_wpml_get_terms_all_lang',
154
+ 'default' => 'no',
155
+ 'type' => 'checkbox',
156
+ );
157
+ }
158
+
159
+ /**
160
+ * get_wpml_products_in_all_languages_setting.
161
+ *
162
+ * @see WCJ_Module::add_wpml_args_on_get_products().
163
+ *
164
+ * @version 4.7.0
165
+ * @since 4.7.0
166
+ *
167
+ * @return array
168
+ */
169
+ function get_wpml_products_in_all_languages_setting() {
170
+ return array(
171
+ 'title' => __( 'WPML: Get Products in All Languages', 'woocommerce-jetpack' ),
172
+ 'desc' => __( 'Enable', 'woocommerce-jetpack' ),
173
+ 'desc_tip' => __( 'Get products in all languages', 'woocommerce-jetpack' ),
174
+ 'id' => 'wcj_' . $this->id . '_wpml_get_products_all_lang',
175
+ 'default' => 'no',
176
+ 'type' => 'checkbox',
177
+ );
178
+ }
179
+
180
+ /**
181
+ * remove_wpml_functions_before_get_terms.
182
+ *
183
+ * It's necessary to take 2 steps:
184
+ * 1. Add `do_action('wcj_before_get_terms', $this->id )` before get_terms.
185
+ * 2. Add a setting using `$this->get_wpml_terms_in_all_languages_setting()`
186
+ *
187
+ * @see "settings/wcj-settings-global-discount.php"
188
+ *
189
+ * @version 4.7.0
190
+ * @since 4.6.0
191
+ */
192
+ function remove_wpml_functions_before_get_terms( $module_id = null ) {
193
+ if ( 'no' === get_option( 'wcj_' . $this->id . '_wpml_get_terms_all_lang', 'no' ) ) {
194
+ return;
195
+ }
196
+ wcj_remove_wpml_terms_filters();
197
+ }
198
+
199
+ /**
200
+ * restore_wpml_functions_after_get_terms
201
+ *
202
+ * It's necessary to take 2 steps:
203
+ * 1. Add `do_action('wcj_after_get_terms', $this->id )` after get_terms.
204
+ * 2. Add a setting using `$this->get_wpml_terms_in_all_languages_setting()`
205
+ *
206
+ * @see "settings/wcj-settings-global-discount.php"
207
+ *
208
+ * @version 4.7.0
209
+ * @since 4.6.0
210
+ */
211
+ function restore_wpml_functions_after_get_terms( $module_id = null ) {
212
+ if ( 'no' === get_option( 'wcj_' . $this->id . '_wpml_get_terms_all_lang', 'no' ) ) {
213
+ return;
214
+ }
215
+ wcj_add_wpml_terms_filters();
216
  }
217
 
218
  /**
includes/classes/class-wcj-pdf-invoice.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce PDF Invoice
4
  *
5
- * @version 4.2.0
6
  * @author Algoritmika Ltd.
7
  */
8
 
@@ -12,6 +12,8 @@ if ( ! class_exists( 'WCJ_PDF_Invoice' ) ) :
12
 
13
  class WCJ_PDF_Invoice extends WCJ_Invoice {
14
 
 
 
15
  /**
16
  * Constructor.
17
  */
@@ -176,19 +178,23 @@ class WCJ_PDF_Invoice extends WCJ_Invoice {
176
  *
177
  * Gets invoice content HTML.
178
  *
179
- * @version 3.6.0
180
  * @since 3.5.0
181
  * @todo [dev] pass other params (billing_country, payment_method) as global (same as user_id) instead of $_GET
182
  * @todo [fix] `force_balance_tags()` - there are some bugs and performance issues, see http://wordpress.stackexchange.com/questions/89121/why-doesnt-default-wordpress-page-view-use-force-balance-tags
183
  */
184
  function get_html( $order_id, $pdf ) {
 
 
 
 
185
  $_GET['order_id'] = $order_id;
186
- $the_order = wc_get_order( $order_id );
187
  if ( ! isset( $_GET['billing_country'] ) ) {
188
  $_GET['billing_country'] = ( WCJ_IS_WC_VERSION_BELOW_3 ? $the_order->billing_country : $the_order->get_billing_country() );
189
  }
190
  if ( ! isset( $_GET['payment_method'] ) ) {
191
- $_GET['payment_method'] = wcj_order_get_payment_method( $the_order );
192
  }
193
  global $wcj_pdf_invoice_data;
194
  if ( ! isset( $wcj_pdf_invoice_data['user_id'] ) ) {
@@ -197,7 +203,9 @@ class WCJ_PDF_Invoice extends WCJ_Invoice {
197
  $html = do_shortcode( get_option( 'wcj_invoicing_' . $this->invoice_type . '_template',
198
  WCJ()->modules['pdf_invoicing_templates']->get_default_template( $this->invoice_type ) ) );
199
  $html = $this->maybe_replace_tcpdf_method_params( $html, $pdf );
200
- return force_balance_tags( $html );
 
 
201
  }
202
 
203
  /**
2
  /**
3
  * Booster for WooCommerce PDF Invoice
4
  *
5
+ * @version 4.7.0
6
  * @author Algoritmika Ltd.
7
  */
8
 
12
 
13
  class WCJ_PDF_Invoice extends WCJ_Invoice {
14
 
15
+ private $original_internal_coding = '';
16
+
17
  /**
18
  * Constructor.
19
  */
178
  *
179
  * Gets invoice content HTML.
180
  *
181
+ * @version 4.7.0
182
  * @since 3.5.0
183
  * @todo [dev] pass other params (billing_country, payment_method) as global (same as user_id) instead of $_GET
184
  * @todo [fix] `force_balance_tags()` - there are some bugs and performance issues, see http://wordpress.stackexchange.com/questions/89121/why-doesnt-default-wordpress-page-view-use-force-balance-tags
185
  */
186
  function get_html( $order_id, $pdf ) {
187
+ $this->original_internal_coding = mb_internal_encoding();
188
+ if ( ! empty( $internal_encoding = get_option( 'wcj_general_advanced_mb_internal_encoding', '' ) ) ) {
189
+ mb_internal_encoding( $internal_encoding );
190
+ }
191
  $_GET['order_id'] = $order_id;
192
+ $the_order = wc_get_order( $order_id );
193
  if ( ! isset( $_GET['billing_country'] ) ) {
194
  $_GET['billing_country'] = ( WCJ_IS_WC_VERSION_BELOW_3 ? $the_order->billing_country : $the_order->get_billing_country() );
195
  }
196
  if ( ! isset( $_GET['payment_method'] ) ) {
197
+ $_GET['payment_method'] = wcj_order_get_payment_method( $the_order );
198
  }
199
  global $wcj_pdf_invoice_data;
200
  if ( ! isset( $wcj_pdf_invoice_data['user_id'] ) ) {
203
  $html = do_shortcode( get_option( 'wcj_invoicing_' . $this->invoice_type . '_template',
204
  WCJ()->modules['pdf_invoicing_templates']->get_default_template( $this->invoice_type ) ) );
205
  $html = $this->maybe_replace_tcpdf_method_params( $html, $pdf );
206
+ $html = force_balance_tags( $html );
207
+ mb_internal_encoding( $this->original_internal_coding );
208
+ return $html;
209
  }
210
 
211
  /**
includes/functions/wcj-functions-date-time.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Functions - Date and Time
4
  *
5
- * @version 3.9.0
6
  * @since 2.9.0
7
  * @author Algoritmika Ltd.
8
  */
@@ -234,3 +234,31 @@ if ( ! function_exists( 'wcj_date_format_php_to_js' ) ) {
234
  return $jqueryui_format;
235
  }
236
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2
  /**
3
  * Booster for WooCommerce - Functions - Date and Time
4
  *
5
+ * @version 4.7.0
6
  * @since 2.9.0
7
  * @author Algoritmika Ltd.
8
  */
234
  return $jqueryui_format;
235
  }
236
  }
237
+
238
+ if ( ! function_exists( 'wcj_timezone' ) ) {
239
+ /**
240
+ * wcj_timezone.
241
+ *
242
+ * @version 4.7.0
243
+ * @since 4.7.0
244
+ *
245
+ * @return DateTimeZone
246
+ */
247
+ function wcj_timezone() {
248
+ global $wp_version;
249
+ if ( version_compare( $wp_version, '5.3.0', '>=' ) ) {
250
+ return wp_timezone();
251
+ }
252
+ $timezone = get_option( 'timezone_string' );
253
+ if ( ! $timezone ) {
254
+ $offset = (float) get_option( 'gmt_offset' );
255
+ $hours = (int) $offset;
256
+ $minutes = ( $offset - $hours );
257
+ $sign = ( $offset < 0 ) ? '-' : '+';
258
+ $abs_hour = abs( $hours );
259
+ $abs_mins = abs( $minutes * 60 );
260
+ $timezone = sprintf( '%s%02d:%02d', $sign, $abs_hour, $abs_mins );
261
+ }
262
+ return new DateTimeZone( $timezone );
263
+ }
264
+ }
includes/functions/wcj-functions-eu-vat.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Functions - EU VAT
4
  *
5
- * @version 4.6.0
6
  * @since 2.9.0
7
  * @author Algoritmika Ltd.
8
  */
@@ -53,16 +53,22 @@ if ( ! function_exists( 'wcj_validate_vat_soap' ) ) {
53
  /**
54
  * wcj_validate_vat_soap.
55
  *
56
- * @version 2.9.0
57
  * @return mixed: bool on successful checking (can be true or false), null otherwise
58
  */
59
  function wcj_validate_vat_soap( $country_code, $vat_number ) {
60
  try {
61
  if ( class_exists( 'SoapClient' ) ) {
62
- $client = new SoapClient(
63
- 'http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl',
64
- array( 'exceptions' => true )
 
65
  );
 
 
 
 
 
66
  $result = $client->checkVat( array(
67
  'countryCode' => $country_code,
68
  'vatNumber' => $vat_number,
@@ -71,7 +77,7 @@ if ( ! function_exists( 'wcj_validate_vat_soap' ) ) {
71
  } else {
72
  return null;
73
  }
74
- } catch( Exception $exception ) {
75
  return null;
76
  }
77
  }
2
  /**
3
  * Booster for WooCommerce - Functions - EU VAT
4
  *
5
+ * @version 4.7.0
6
  * @since 2.9.0
7
  * @author Algoritmika Ltd.
8
  */
53
  /**
54
  * wcj_validate_vat_soap.
55
  *
56
+ * @version 4.7.0
57
  * @return mixed: bool on successful checking (can be true or false), null otherwise
58
  */
59
  function wcj_validate_vat_soap( $country_code, $vat_number ) {
60
  try {
61
  if ( class_exists( 'SoapClient' ) ) {
62
+ $opts = array(
63
+ 'http' => array(
64
+ 'user_agent' => 'PHPSoapClient'
65
+ )
66
  );
67
+ $client = new SoapClient( 'http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl', array(
68
+ 'exceptions' => true,
69
+ 'stream_context' => stream_context_create( $opts ),
70
+ 'cache_wsdl' => WSDL_CACHE_NONE
71
+ ) );
72
  $result = $client->checkVat( array(
73
  'countryCode' => $country_code,
74
  'vatNumber' => $vat_number,
77
  } else {
78
  return null;
79
  }
80
+ } catch ( Exception $exception ) {
81
  return null;
82
  }
83
  }
includes/functions/wcj-functions-general.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Functions - General
4
  *
5
- * @version 4.6.0
6
  * @author Algoritmika Ltd.
7
  * @todo add `wcj_add_actions()` and `wcj_add_filters()`
8
  */
@@ -901,4 +901,63 @@ if ( ! function_exists( 'wcj_remove_class_filter' ) ) {
901
  function wcj_remove_class_action( $tag, $class_name = '', $method_name = '', $priority = 10 ) {
902
  wcj_remove_class_filter( $tag, $class_name, $method_name, $priority );
903
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
904
  }
2
  /**
3
  * Booster for WooCommerce - Functions - General
4
  *
5
+ * @version 4.7.0
6
  * @author Algoritmika Ltd.
7
  * @todo add `wcj_add_actions()` and `wcj_add_filters()`
8
  */
901
  function wcj_remove_class_action( $tag, $class_name = '', $method_name = '', $priority = 10 ) {
902
  wcj_remove_class_filter( $tag, $class_name, $method_name, $priority );
903
  }
904
+ }
905
+
906
+ if ( ! function_exists( 'wcj_get_data_attributes_html' ) ) {
907
+ /**
908
+ * Get custom data attributes.
909
+ *
910
+ * Passing an associative array like ['param_a'="value_a"] will return a multiple data parameters like data-param_a="value_a".
911
+ *
912
+ * @version 4.7.0
913
+ * @since 4.7.0
914
+ *
915
+ * @param array $data Field data.
916
+ *
917
+ * @return string
918
+ */
919
+ function wcj_get_data_attributes_html( $data ) {
920
+ $custom_attributes = array();
921
+ if ( ! empty( $data ) && is_array( $data ) ) {
922
+ foreach ( $data as $attribute => $attribute_value ) {
923
+ $custom_attributes[] = 'data-' . esc_attr( $attribute ) . '="' . esc_attr( $attribute_value ) . '"';
924
+ }
925
+ }
926
+ return implode( ' ', $custom_attributes );
927
+ }
928
+ }
929
+
930
+ if ( ! function_exists( 'wcj_remove_wpml_terms_filters' ) ) {
931
+ /**
932
+ * wcj_remove_wpml_terms_filters.
933
+ *
934
+ * @see https://wpml.org/forums/topic/get-all-terms-of-all-languages-outside-loop/
935
+ *
936
+ * @version 4.7.0
937
+ * @since 4.7.0
938
+ */
939
+ function wcj_remove_wpml_terms_filters() {
940
+ global $sitepress;
941
+ remove_filter( 'get_terms_args', array( $sitepress, 'get_terms_args_filter' ) );
942
+ remove_filter( 'get_term', array( $sitepress, 'get_term_adjust_id' ) );
943
+ remove_filter( 'terms_clauses', array( $sitepress, 'terms_clauses' ) );
944
+ }
945
+ }
946
+
947
+ if ( ! function_exists( 'wcj_add_wpml_terms_filters' ) ) {
948
+ /**
949
+ * wcj_add_wpml_terms_filters.
950
+ *
951
+ * @see http://support.themeblvd.com/forums/topic/wpml-sitepress-php-error-on-backend-due-to-layout-builder/
952
+ *
953
+ * @version 4.7.0
954
+ * @since 4.7.0
955
+ */
956
+ function wcj_add_wpml_terms_filters() {
957
+ // restore WPML term filters
958
+ global $sitepress;
959
+ add_filter( 'terms_clauses', array( $sitepress, 'terms_clauses' ), 10, 3 );
960
+ add_filter( 'get_term', array( $sitepress, 'get_term_adjust_id' ) );
961
+ add_filter( 'get_terms_args', array( $sitepress, 'get_terms_args_filter' ), 10, 2 );
962
+ }
963
  }
includes/gateways/class-wc-gateway-wcj-custom.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Custom Payment Gateway
4
  *
5
- * @version 3.9.0
6
  * @author Algoritmika Ltd.
7
  */
8
 
@@ -337,7 +337,7 @@ if ( ! function_exists( 'init_wc_gateway_wcj_custom_class' ) ) {
337
  /**
338
  * init.
339
  *
340
- * @version 3.9.0
341
  */
342
  function init( $id_count ) {
343
  $this->id = ( 1 === $id_count ) ? 'jetpack_custom_gateway' : 'jetpack_custom_gateway_' . $id_count;
@@ -351,7 +351,7 @@ if ( ! function_exists( 'init_wc_gateway_wcj_custom_class' ) ) {
351
  $this->init_settings();
352
  // Define user set variables
353
  $this->title = $this->get_option( 'title' );
354
- $this->description = do_shortcode( str_replace( '[wcj_input_field', '[wcj_input_field attach_to="' . $this->id . '"',
355
  $this->get_option( 'description' ) ) );
356
  $this->instructions = $this->get_option( 'instructions', '' );
357
  $this->instructions_in_email = $this->get_option( 'instructions_in_email', '' );
2
  /**
3
  * Booster for WooCommerce - Custom Payment Gateway
4
  *
5
+ * @version 4.7.0
6
  * @author Algoritmika Ltd.
7
  */
8
 
337
  /**
338
  * init.
339
  *
340
+ * @version 4.7.0
341
  */
342
  function init( $id_count ) {
343
  $this->id = ( 1 === $id_count ) ? 'jetpack_custom_gateway' : 'jetpack_custom_gateway_' . $id_count;
351
  $this->init_settings();
352
  // Define user set variables
353
  $this->title = $this->get_option( 'title' );
354
+ $this->description = do_shortcode( str_replace( '[wcj_input_field', '[wcj_input_field name_array="' . $this->id . '" attach_to="' . $this->id . '"',
355
  $this->get_option( 'description' ) ) );
356
  $this->instructions = $this->get_option( 'instructions', '' );
357
  $this->instructions_in_email = $this->get_option( 'instructions_in_email', '' );
includes/lib/hashids/src/Hashids.php ADDED
@@ -0,0 +1,420 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of Hashids.
5
+ *
6
+ * (c) Ivan Akimov <ivan@barreleye.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Hashids;
13
+
14
+ use Hashids\Math\Bc;
15
+ use Hashids\Math\Gmp;
16
+ use RuntimeException;
17
+
18
+ /**
19
+ * This is the hashids class.
20
+ *
21
+ * @author Ivan Akimov <ivan@barreleye.com>
22
+ * @author Vincent Klaiber <hello@vinkla.com>
23
+ * @author Johnson Page <jwpage@gmail.com>
24
+ */
25
+ class Hashids implements HashidsInterface
26
+ {
27
+ /**
28
+ * The seps divider.
29
+ *
30
+ * @var float
31
+ */
32
+ const SEP_DIV = 3.5;
33
+
34
+ /**
35
+ * The guard divider.
36
+ *
37
+ * @var float
38
+ */
39
+ const GUARD_DIV = 12;
40
+
41
+ /**
42
+ * The alphabet string.
43
+ *
44
+ * @var string
45
+ */
46
+ protected $alphabet;
47
+
48
+ /**
49
+ * Shuffled alphabets, referenced by alphabet and salt.
50
+ *
51
+ * @var array
52
+ */
53
+ protected $shuffledAlphabets;
54
+
55
+ /**
56
+ * The seps string.
57
+ *
58
+ * @var string
59
+ */
60
+ protected $seps = 'cfhistuCFHISTU';
61
+
62
+ /**
63
+ * The guards string.
64
+ *
65
+ * @var string
66
+ */
67
+ protected $guards;
68
+
69
+ /**
70
+ * The minimum hash length.
71
+ *
72
+ * @var int
73
+ */
74
+ protected $minHashLength;
75
+
76
+ /**
77
+ * The salt string.
78
+ *
79
+ * @var string
80
+ */
81
+ protected $salt;
82
+
83
+ /**
84
+ * The math class.
85
+ *
86
+ * @var \Hashids\Math\MathInterface
87
+ */
88
+ protected $math;
89
+
90
+ /**
91
+ * Create a new hashids instance.
92
+ *
93
+ * @param string $salt
94
+ * @param int $minHashLength
95
+ * @param string $alphabet
96
+ *
97
+ * @throws \Hashids\HashidsException
98
+ *
99
+ * @return void
100
+ */
101
+ public function __construct($salt = '', $minHashLength = 0, $alphabet = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890')
102
+ {
103
+ $this->salt = $salt;
104
+ $this->minHashLength = $minHashLength;
105
+ $this->alphabet = implode('', array_unique(str_split($alphabet)));
106
+ $this->math = $this->getMathExtension();
107
+
108
+ if (strlen($this->alphabet) < 16) {
109
+ throw new HashidsException('Alphabet must contain at least 16 unique characters.');
110
+ }
111
+
112
+ if (strpos($this->alphabet, ' ') !== false) {
113
+ throw new HashidsException('Alphabet can\'t contain spaces.');
114
+ }
115
+
116
+ $alphabetArray = str_split($this->alphabet);
117
+ $sepsArray = str_split($this->seps);
118
+
119
+ $this->seps = implode('', array_intersect($sepsArray, $alphabetArray));
120
+ $this->alphabet = implode('', array_diff($alphabetArray, $sepsArray));
121
+ $this->seps = $this->shuffle($this->seps, $this->salt);
122
+
123
+ if (!$this->seps || (strlen($this->alphabet) / strlen($this->seps)) > self::SEP_DIV) {
124
+ $sepsLength = (int) ceil(strlen($this->alphabet) / self::SEP_DIV);
125
+
126
+ if ($sepsLength > strlen($this->seps)) {
127
+ $diff = $sepsLength - strlen($this->seps);
128
+ $this->seps .= substr($this->alphabet, 0, $diff);
129
+ $this->alphabet = substr($this->alphabet, $diff);
130
+ }
131
+ }
132
+
133
+ $this->alphabet = $this->shuffle($this->alphabet, $this->salt);
134
+ $guardCount = (int) ceil(strlen($this->alphabet) / self::GUARD_DIV);
135
+
136
+ if (strlen($this->alphabet) < 3) {
137
+ $this->guards = substr($this->seps, 0, $guardCount);
138
+ $this->seps = substr($this->seps, $guardCount);
139
+ } else {
140
+ $this->guards = substr($this->alphabet, 0, $guardCount);
141
+ $this->alphabet = substr($this->alphabet, $guardCount);
142
+ }
143
+ }
144
+
145
+ /**
146
+ * Encode parameters to generate a hash.
147
+ *
148
+ * @param mixed $numbers
149
+ *
150
+ * @return string
151
+ */
152
+ public function encode(...$numbers)
153
+ {
154
+ $ret = '';
155
+
156
+ if (1 === count($numbers) && is_array($numbers[0])) {
157
+ $numbers = $numbers[0];
158
+ }
159
+
160
+ if (!$numbers) {
161
+ return $ret;
162
+ }
163
+
164
+ foreach ($numbers as $number) {
165
+ $isNumber = ctype_digit((string) $number);
166
+
167
+ if (!$isNumber) {
168
+ return $ret;
169
+ }
170
+ }
171
+
172
+ $alphabet = $this->alphabet;
173
+ $numbersSize = count($numbers);
174
+ $numbersHashInt = 0;
175
+
176
+ foreach ($numbers as $i => $number) {
177
+ $numbersHashInt += $this->math->intval($this->math->mod($number, ($i + 100)));
178
+ }
179
+
180
+ $lottery = $ret = $alphabet[$numbersHashInt % strlen($alphabet)];
181
+ foreach ($numbers as $i => $number) {
182
+ $alphabet = $this->shuffle($alphabet, substr($lottery.$this->salt.$alphabet, 0, strlen($alphabet)));
183
+ $ret .= $last = $this->hash($number, $alphabet);
184
+
185
+ if ($i + 1 < $numbersSize) {
186
+ $number %= (ord($last) + $i);
187
+ $sepsIndex = $this->math->intval($this->math->mod($number, strlen($this->seps)));
188
+ $ret .= $this->seps[$sepsIndex];
189
+ }
190
+ }
191
+
192
+ if (strlen($ret) < $this->minHashLength) {
193
+ $guardIndex = ($numbersHashInt + ord($ret[0])) % strlen($this->guards);
194
+
195
+ $guard = $this->guards[$guardIndex];
196
+ $ret = $guard.$ret;
197
+
198
+ if (strlen($ret) < $this->minHashLength) {
199
+ $guardIndex = ($numbersHashInt + ord($ret[2])) % strlen($this->guards);
200
+ $guard = $this->guards[$guardIndex];
201
+
202
+ $ret .= $guard;
203
+ }
204
+ }
205
+
206
+ $halfLength = (int) (strlen($alphabet) / 2);
207
+ while (strlen($ret) < $this->minHashLength) {
208
+ $alphabet = $this->shuffle($alphabet, $alphabet);
209
+ $ret = substr($alphabet, $halfLength).$ret.substr($alphabet, 0, $halfLength);
210
+
211
+ $excess = strlen($ret) - $this->minHashLength;
212
+ if ($excess > 0) {
213
+ $ret = substr($ret, $excess / 2, $this->minHashLength);
214
+ }
215
+ }
216
+
217
+ return $ret;
218
+ }
219
+
220
+ /**
221
+ * Decode a hash to the original parameter values.
222
+ *
223
+ * @param string $hash
224
+ *
225
+ * @return array
226
+ */
227
+ public function decode($hash)
228
+ {
229
+ $ret = [];
230
+
231
+ if (!is_string($hash) || !($hash = trim($hash))) {
232
+ return $ret;
233
+ }
234
+
235
+ $alphabet = $this->alphabet;
236
+
237
+ $ret = [];
238
+
239
+ $hashBreakdown = str_replace(str_split($this->guards), ' ', $hash);
240
+ $hashArray = explode(' ', $hashBreakdown);
241
+
242
+ $i = count($hashArray) == 3 || count($hashArray) == 2 ? 1 : 0;
243
+
244
+ $hashBreakdown = $hashArray[$i];
245
+
246
+ if (isset($hashBreakdown[0])) {
247
+ $lottery = $hashBreakdown[0];
248
+ $hashBreakdown = substr($hashBreakdown, 1);
249
+
250
+ $hashBreakdown = str_replace(str_split($this->seps), ' ', $hashBreakdown);
251
+ $hashArray = explode(' ', $hashBreakdown);
252
+
253
+ foreach ($hashArray as $subHash) {
254
+ $alphabet = $this->shuffle($alphabet, substr($lottery.$this->salt.$alphabet, 0, strlen($alphabet)));
255
+ $result = $this->unhash($subHash, $alphabet);
256
+ if ($this->math->greaterThan($result, PHP_INT_MAX)) {
257
+ $ret[] = $this->math->strval($result);
258
+ } else {
259
+ $ret[] = $this->math->intval($result);
260
+ }
261
+ }
262
+
263
+ if ($this->encode($ret) != $hash) {
264
+ $ret = [];
265
+ }
266
+ }
267
+
268
+ return $ret;
269
+ }
270
+
271
+ /**
272
+ * Encode hexadecimal values and generate a hash string.
273
+ *
274
+ * @param string $str
275
+ *
276
+ * @return string
277
+ */
278
+ public function encodeHex($str)
279
+ {
280
+ if (!ctype_xdigit((string) $str)) {
281
+ return '';
282
+ }
283
+
284
+ $numbers = trim(chunk_split($str, 12, ' '));
285
+ $numbers = explode(' ', $numbers);
286
+
287
+ foreach ($numbers as $i => $number) {
288
+ $numbers[$i] = hexdec('1'.$number);
289
+ }
290
+
291
+ return call_user_func_array([$this, 'encode'], $numbers);
292
+ }
293
+
294
+ /**
295
+ * Decode a hexadecimal hash.
296
+ *
297
+ * @param string $hash
298
+ *
299
+ * @return string
300
+ */
301
+ public function decodeHex($hash)
302
+ {
303
+ $ret = '';
304
+ $numbers = $this->decode($hash);
305
+
306
+ foreach ($numbers as $i => $number) {
307
+ $ret .= substr(dechex($number), 1);
308
+ }
309
+
310
+ return $ret;
311
+ }
312
+
313
+ /**
314
+ * Shuffle alphabet by given salt.
315
+ *
316
+ * @param string $alphabet
317
+ * @param string $salt
318
+ *
319
+ * @return string
320
+ */
321
+ protected function shuffle($alphabet, $salt)
322
+ {
323
+ $key = $alphabet.' '.$salt;
324
+
325
+ if (isset($this->shuffledAlphabets[$key])) {
326
+ return $this->shuffledAlphabets[$key];
327
+ }
328
+
329
+ $saltLength = strlen($salt);
330
+
331
+ if (!$saltLength) {
332
+ return $alphabet;
333
+ }
334
+
335
+ for ($i = strlen($alphabet) - 1, $v = 0, $p = 0; $i > 0; $i--, $v++) {
336
+ $v %= $saltLength;
337
+ $p += $int = ord($salt[$v]);
338
+ $j = ($int + $v + $p) % $i;
339
+
340
+ $temp = $alphabet[$j];
341
+ $alphabet[$j] = $alphabet[$i];
342
+ $alphabet[$i] = $temp;
343
+ }
344
+
345
+ $this->shuffledAlphabets[$key] = $alphabet;
346
+
347
+ return $alphabet;
348
+ }
349
+
350
+ /**
351
+ * Hash given input value.
352
+ *
353
+ * @param string $input
354
+ * @param string $alphabet
355
+ *
356
+ * @return string
357
+ */
358
+ protected function hash($input, $alphabet)
359
+ {
360
+ $hash = '';
361
+ $alphabetLength = strlen($alphabet);
362
+
363
+ do {
364
+ $hash = $alphabet[$this->math->intval($this->math->mod($input, $alphabetLength))].$hash;
365
+
366
+ $input = $this->math->divide($input, $alphabetLength);
367
+ } while ($this->math->greaterThan($input, 0));
368
+
369
+ return $hash;
370
+ }
371
+
372
+ /**
373
+ * Unhash given input value.
374
+ *
375
+ * @param string $input
376
+ * @param string $alphabet
377
+ *
378
+ * @return int
379
+ */
380
+ protected function unhash($input, $alphabet)
381
+ {
382
+ $number = 0;
383
+ $inputLength = strlen($input);
384
+
385
+ if ($inputLength && $alphabet) {
386
+ $alphabetLength = strlen($alphabet);
387
+ $inputChars = str_split($input);
388
+
389
+ foreach ($inputChars as $char) {
390
+ $position = strpos($alphabet, $char);
391
+ $number = $this->math->multiply($number, $alphabetLength);
392
+ $number = $this->math->add($number, $position);
393
+ }
394
+ }
395
+
396
+ return $number;
397
+ }
398
+
399
+ /**
400
+ * Get BC Math or GMP extension.
401
+ *
402
+ * @codeCoverageIgnore
403
+ *
404
+ * @throws \RuntimeException
405
+ *
406
+ * @return \Hashids\Math\Bc|\Hashids\Math\Gmp
407
+ */
408
+ protected function getMathExtension()
409
+ {
410
+ if (extension_loaded('gmp')) {
411
+ return new Gmp();
412
+ }
413
+
414
+ if (extension_loaded('bcmath')) {
415
+ return new Bc();
416
+ }
417
+
418
+ throw new RuntimeException('Missing BC Math or GMP extension.');
419
+ }
420
+ }
includes/lib/hashids/src/HashidsException.php ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of Hashids.
5
+ *
6
+ * (c) Ivan Akimov <ivan@barreleye.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Hashids;
13
+
14
+ use InvalidArgumentException;
15
+
16
+ /**
17
+ * This is the hashids exception class.
18
+ *
19
+ * @author Vincent Klaiber <hello@vinkla.com>
20
+ */
21
+ class HashidsException extends InvalidArgumentException
22
+ {
23
+ //
24
+ }
includes/lib/hashids/src/HashidsInterface.php ADDED
@@ -0,0 +1,57 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of Hashids.
5
+ *
6
+ * (c) Ivan Akimov <ivan@barreleye.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Hashids;
13
+
14
+ /**
15
+ * This is the hashids interface.
16
+ *
17
+ * @author Ivan Akimov <ivan@barreleye.com>
18
+ * @author Vincent Klaiber <hello@vinkla.com>
19
+ */
20
+ interface HashidsInterface
21
+ {
22
+ /**
23
+ * Encode parameters to generate a hash.
24
+ *
25
+ * @param mixed $numbers
26
+ *
27
+ * @return string
28
+ */
29
+ public function encode(...$numbers);
30
+
31
+ /**
32
+ * Decode a hash to the original parameter values.
33
+ *
34
+ * @param string $hash
35
+ *
36
+ * @return array
37
+ */
38
+ public function decode($hash);
39
+
40
+ /**
41
+ * Encode hexadecimal values and generate a hash string.
42
+ *
43
+ * @param string $str
44
+ *
45
+ * @return string
46
+ */
47
+ public function encodeHex($str);
48
+
49
+ /**
50
+ * Decode a hexadecimal hash.
51
+ *
52
+ * @param string $hash
53
+ *
54
+ * @return string
55
+ */
56
+ public function decodeHex($hash);
57
+ }
includes/lib/hashids/src/Math/Bc.php ADDED
@@ -0,0 +1,123 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of Hashids.
5
+ *
6
+ * (c) Ivan Akimov <ivan@barreleye.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Hashids\Math;
13
+
14
+ /**
15
+ * This is the Bc math class.
16
+ *
17
+ * @author Vincent Klaiber <hello@vinkla.com>
18
+ * @author Jakub Kramarz <lenwe@lenwe.net>
19
+ * @author Johnson Page <jwpage@gmail.com>
20
+ */
21
+ class Bc implements MathInterface
22
+ {
23
+ /**
24
+ * Add two arbitrary-length integers.
25
+ *
26
+ * @param string $a
27
+ * @param string $b
28
+ *
29
+ * @return string
30
+ */
31
+ public function add($a, $b)
32
+ {
33
+ return bcadd($a, $b, 0);
34
+ }
35
+
36
+ /**
37
+ * Multiply two arbitrary-length integers.
38
+ *
39
+ * @param string $a
40
+ * @param string $b
41
+ *
42
+ * @return string
43
+ */
44
+ public function multiply($a, $b)
45
+ {
46
+ return bcmul($a, $b, 0);
47
+ }
48
+
49
+ /**
50
+ * Divide two arbitrary-length integers.
51
+ *
52
+ * @param string $a
53
+ * @param string $b
54
+ *
55
+ * @return string
56
+ */
57
+ public function divide($a, $b)
58
+ {
59
+ return bcdiv($a, $b, 0);
60
+ }
61
+
62
+ /**
63
+ * Compute arbitrary-length integer modulo.
64
+ *
65
+ * @param string $n
66
+ * @param string $d
67
+ *
68
+ * @return string
69
+ */
70
+ public function mod($n, $d)
71
+ {
72
+ return bcmod($n, $d);
73
+ }
74
+
75
+ /**
76
+ * Compares two arbitrary-length integers.
77
+ *
78
+ * @param string $a
79
+ * @param string $b
80
+ *
81
+ * @return bool
82
+ */
83
+ public function greaterThan($a, $b)
84
+ {
85
+ return bccomp($a, $b, 0) > 0;
86
+ }
87
+
88
+ /**
89
+ * Converts arbitrary-length integer to PHP integer.
90
+ *
91
+ * @param string $a
92
+ *
93
+ * @return int
94
+ */
95
+ public function intval($a)
96
+ {
97
+ return intval($a);
98
+ }
99
+
100
+ /**
101
+ * Converts arbitrary-length integer to PHP string.
102
+ *
103
+ * @param string $a
104
+ *
105
+ * @return string
106
+ */
107
+ public function strval($a)
108
+ {
109
+ return $a;
110
+ }
111
+
112
+ /**
113
+ * Converts PHP integer to arbitrary-length integer.
114
+ *
115
+ * @param int $a
116
+ *
117
+ * @return string
118
+ */
119
+ public function get($a)
120
+ {
121
+ return $a;
122
+ }
123
+ }
includes/lib/hashids/src/Math/Gmp.php ADDED
@@ -0,0 +1,123 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of Hashids.
5
+ *
6
+ * (c) Ivan Akimov <ivan@barreleye.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Hashids\Math;
13
+
14
+ /**
15
+ * This is the Gmp math class.
16
+ *
17
+ * @author Vincent Klaiber <hello@vinkla.com>
18
+ * @author Jakub Kramarz <lenwe@lenwe.net>
19
+ * @author Johnson Page <jwpage@gmail.com>
20
+ */
21
+ class Gmp implements MathInterface
22
+ {
23
+ /**
24
+ * Add two arbitrary-length integers.
25
+ *
26
+ * @param string $a
27
+ * @param string $b
28
+ *
29
+ * @return string
30
+ */
31
+ public function add($a, $b)
32
+ {
33
+ return gmp_add($a, $b);
34
+ }
35
+
36
+ /**
37
+ * Multiply two arbitrary-length integers.
38
+ *
39
+ * @param string $a
40
+ * @param string $b
41
+ *
42
+ * @return string
43
+ */
44
+ public function multiply($a, $b)
45
+ {
46
+ return gmp_mul($a, $b);
47
+ }
48
+
49
+ /**
50
+ * Divide two arbitrary-length integers.
51
+ *
52
+ * @param string $a
53
+ * @param string $b
54
+ *
55
+ * @return string
56
+ */
57
+ public function divide($a, $b)
58
+ {
59
+ return gmp_div_q($a, $b);
60
+ }
61
+
62
+ /**
63
+ * Compute arbitrary-length integer modulo.
64
+ *
65
+ * @param string $n
66
+ * @param string $d
67
+ *
68
+ * @return string
69
+ */
70
+ public function mod($n, $d)
71
+ {
72
+ return gmp_mod($n, $d);
73
+ }
74
+
75
+ /**
76
+ * Compares two arbitrary-length integers.
77
+ *
78
+ * @param string $a
79
+ * @param string $b
80
+ *
81
+ * @return bool
82
+ */
83
+ public function greaterThan($a, $b)
84
+ {
85
+ return gmp_cmp($a, $b) > 0;
86
+ }
87
+
88
+ /**
89
+ * Converts arbitrary-length integer to PHP integer.
90
+ *
91
+ * @param string $a
92
+ *
93
+ * @return int
94
+ */
95
+ public function intval($a)
96
+ {
97
+ return gmp_intval($a);
98
+ }
99
+
100
+ /**
101
+ * Converts arbitrary-length integer to PHP string.
102
+ *
103
+ * @param string $a
104
+ *
105
+ * @return string
106
+ */
107
+ public function strval($a)
108
+ {
109
+ return gmp_strval($a);
110
+ }
111
+
112
+ /**
113
+ * Converts PHP integer to arbitrary-length integer.
114
+ *
115
+ * @param int $a
116
+ *
117
+ * @return string
118
+ */
119
+ public function get($a)
120
+ {
121
+ return gmp_init($a);
122
+ }
123
+ }
includes/lib/hashids/src/Math/MathInterface.php ADDED
@@ -0,0 +1,99 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of Hashids.
5
+ *
6
+ * (c) Ivan Akimov <ivan@barreleye.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Hashids\Math;
13
+
14
+ /**
15
+ * Interface for different math extensions.
16
+ *
17
+ * @author Vincent Klaiber <hello@vinkla.com>
18
+ * @author Jakub Kramarz <lenwe@lenwe.net>
19
+ * @author Johnson Page <jwpage@gmail.com>
20
+ */
21
+ interface MathInterface
22
+ {
23
+ /**
24
+ * Add two arbitrary-length integers.
25
+ *
26
+ * @param string $a
27
+ * @param string $b
28
+ *
29
+ * @return string
30
+ */
31
+ public function add($a, $b);
32
+
33
+ /**
34
+ * Multiply two arbitrary-length integers.
35
+ *
36
+ * @param string $a
37
+ * @param string $b
38
+ *
39
+ * @return string
40
+ */
41
+ public function multiply($a, $b);
42
+
43
+ /**
44
+ * Divide two arbitrary-length integers.
45
+ *
46
+ * @param string $a
47
+ * @param string $b
48
+ *
49
+ * @return string
50
+ */
51
+ public function divide($a, $b);
52
+
53
+ /**
54
+ * Compute arbitrary-length integer modulo.
55
+ *
56
+ * @param string $n
57
+ * @param string $d
58
+ *
59
+ * @return string
60
+ */
61
+ public function mod($n, $d);
62
+
63
+ /**
64
+ * Compares two arbitrary-length integers.
65
+ *
66
+ * @param string $a
67
+ * @param string $b
68
+ *
69
+ * @return bool
70
+ */
71
+ public function greaterThan($a, $b);
72
+
73
+ /**
74
+ * Converts arbitrary-length integer to PHP integer.
75
+ *
76
+ * @param string $a
77
+ *
78
+ * @return int
79
+ */
80
+ public function intval($a);
81
+
82
+ /**
83
+ * Converts arbitrary-length integer to PHP string.
84
+ *
85
+ * @param string $a
86
+ *
87
+ * @return string
88
+ */
89
+ public function strval($a);
90
+
91
+ /**
92
+ * Converts PHP integer to arbitrary-length integer.
93
+ *
94
+ * @param int $a
95
+ *
96
+ * @return string
97
+ */
98
+ public function get($a);
99
+ }
includes/settings/meta-box/wcj-settings-meta-box-product-by-date.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Settings Meta Box - Product Availability by Date
4
  *
5
- * @version 3.6.0
6
  * @since 2.9.1
7
  * @author Algoritmika Ltd.
8
  * @todo (maybe) Direct Date: all products
@@ -30,8 +30,9 @@ $settings = array(
30
  'default' => '',
31
  'type' => 'date',
32
  'tooltip' => __( 'Fill this if you want to set one date from which the product will be available.', 'woocommerce-jetpack' ) . ' ' .
33
- __( 'If this field is filled in, monthly settings fields are ignored.', 'woocommerce-jetpack' ),
34
- 'custom_attributes' => ( '' != ( $format = get_option( 'wcj_product_by_date_direct_date_format', '' ) ) ?
 
35
  'dateformat="' . wcj_date_format_php_to_js( $format ) . '"' : '' ),
36
  ),
37
  );
2
  /**
3
  * Booster for WooCommerce - Settings Meta Box - Product Availability by Date
4
  *
5
+ * @version 4.7.0
6
  * @since 2.9.1
7
  * @author Algoritmika Ltd.
8
  * @todo (maybe) Direct Date: all products
30
  'default' => '',
31
  'type' => 'date',
32
  'tooltip' => __( 'Fill this if you want to set one date from which the product will be available.', 'woocommerce-jetpack' ) . ' ' .
33
+ __( 'If this field is filled in, monthly settings fields are ignored.', 'woocommerce-jetpack' ) . '<br /><br />' .
34
+ __( 'If you are not using english, please set some numeric format like m/d/Y on "Direct Date Admin Input Date Format" option', 'woocommerce-jetpack' ),
35
+ 'custom_attributes' => ( '' != ( $format = get_option( 'wcj_product_by_date_direct_date_format', 'm/d/Y' ) ) ?
36
  'dateformat="' . wcj_date_format_php_to_js( $format ) . '"' : '' ),
37
  ),
38
  );
includes/settings/wcj-settings-global-discount.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Settings - Global Discount
4
  *
5
- * @version 4.0.0
6
  * @since 2.8.0
7
  * @author Algoritmika Ltd.
8
  */
@@ -10,9 +10,14 @@
10
  if ( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly
11
 
12
  $is_multiselect_products = ( 'yes' === get_option( 'wcj_list_for_products', 'yes' ) );
13
- $products = ( $is_multiselect_products ? wcj_get_products() : false );
14
- $product_cats = wcj_get_terms( 'product_cat' );
15
- $product_tags = wcj_get_terms( 'product_tag' );
 
 
 
 
 
16
 
17
  $settings = array(
18
  array(
@@ -191,6 +196,8 @@ $settings = array_merge( $settings, array(
191
  'default' => 0,
192
  'type' => 'number',
193
  ),
 
 
194
  array(
195
  'type' => 'sectionend',
196
  'id' => 'wcj_global_discount_advanced_options',
2
  /**
3
  * Booster for WooCommerce - Settings - Global Discount
4
  *
5
+ * @version 4.7.0
6
  * @since 2.8.0
7
  * @author Algoritmika Ltd.
8
  */
10
  if ( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly
11
 
12
  $is_multiselect_products = ( 'yes' === get_option( 'wcj_list_for_products', 'yes' ) );
13
+
14
+ do_action( 'wcj_before_get_terms', $this->id );
15
+ do_action( 'wcj_before_get_products', $this->id );
16
+ $products = ( $is_multiselect_products ? wcj_get_products() : false );
17
+ do_action( 'wcj_after_get_products', $this->id );
18
+ $product_cats = wcj_get_terms( 'product_cat' );
19
+ $product_tags = wcj_get_terms( 'product_tag' );
20
+ do_action( 'wcj_after_get_terms', $this->id );
21
 
22
  $settings = array(
23
  array(
196
  'default' => 0,
197
  'type' => 'number',
198
  ),
199
+ $this->get_wpml_terms_in_all_languages_setting(),
200
+ $this->get_wpml_products_in_all_languages_setting(),
201
  array(
202
  'type' => 'sectionend',
203
  'id' => 'wcj_global_discount_advanced_options',
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 4.3.1
6
  * @since 3.3.0
7
  * @author Algoritmika Ltd.
8
  * @todo (maybe) create "Tools (Options)" submodule
@@ -93,6 +93,13 @@ return array(
93
  'default' => 'no',
94
  'type' => 'checkbox',
95
  ),
 
 
 
 
 
 
 
96
  array(
97
  'type' => 'sectionend',
98
  'id' => 'wcj_pdf_invoicing_advanced_options',
2
  /**
3
  * Booster for WooCommerce - Settings - PDF Invoicing - Advanced
4
  *
5
+ * @version 4.7.0
6
  * @since 3.3.0
7
  * @author Algoritmika Ltd.
8
  * @todo (maybe) create "Tools (Options)" submodule
93
  'default' => 'no',
94
  'type' => 'checkbox',
95
  ),
96
+ array(
97
+ 'title' => __( 'Internal Encoding', 'woocommerce-jetpack' ),
98
+ 'desc_tip' => __( 'Sets internal character encoding.', 'woocommerce-jetpack' ).'<br />'.__( 'e.g: UTF-8, iso-8859-1', 'woocommerce-jetpack' ),
99
+ 'id' => 'wcj_general_advanced_mb_internal_encoding',
100
+ 'default' => '',
101
+ 'type' => 'text',
102
+ ),
103
  array(
104
  'type' => 'sectionend',
105
  'id' => 'wcj_pdf_invoicing_advanced_options',
includes/settings/wcj-settings-price-by-user-role.php CHANGED
@@ -2,13 +2,12 @@
2
  /**
3
  * Booster for WooCommerce - Settings - Price based on User Role
4
  *
5
- * @version 4.6.0
6
  * @since 2.8.0
7
  * @author Algoritmika Ltd.
8
  */
9
 
10
  if ( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly
11
-
12
  $settings = array(
13
  array(
14
  'title' => __( 'Options', 'woocommerce-jetpack' ),
@@ -114,20 +113,11 @@ $settings = array(
114
  'default' => 'no',
115
  'type' => 'checkbox',
116
  ),
117
- array(
118
- 'title' => __( 'WPML: Get Terms in All Languages', 'woocommerce-jetpack' ),
119
- 'desc' => __( 'Enable', 'woocommerce-jetpack' ),
120
- 'desc_tip' => __( 'Get tags and taxonomies in all languages', 'woocommerce-jetpack' ),
121
- 'id' => 'wcj_price_by_user_role_wpml_get_terms_all_lang',
122
- 'default' => 'no',
123
- 'type' => 'checkbox',
124
- ),
125
  array(
126
  'type' => 'sectionend',
127
  'id' => 'wcj_price_by_user_role_options_adv',
128
  ),
129
-
130
-
131
  array(
132
  'title' => __( 'Roles & Multipliers', 'woocommerce-jetpack' ),
133
  'type' => 'title',
@@ -181,7 +171,7 @@ $taxonomies = array(
181
  ),
182
  );
183
 
184
- do_action('wcj_before_get_terms');
185
  foreach ( $taxonomies as $taxonomy ) {
186
  $product_taxonomies_options = array();
187
  $product_taxonomies = get_terms( $taxonomy['id'], 'orderby=name&hide_empty=0' );
@@ -238,6 +228,6 @@ foreach ( $taxonomies as $taxonomy ) {
238
  ),
239
  ) );
240
  }
241
- do_action('wcj_after_get_terms');
242
 
243
  return $settings;
2
  /**
3
  * Booster for WooCommerce - Settings - Price based on User Role
4
  *
5
+ * @version 4.7.0
6
  * @since 2.8.0
7
  * @author Algoritmika Ltd.
8
  */
9
 
10
  if ( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly
 
11
  $settings = array(
12
  array(
13
  'title' => __( 'Options', 'woocommerce-jetpack' ),
113
  'default' => 'no',
114
  'type' => 'checkbox',
115
  ),
116
+ $this->get_wpml_terms_in_all_languages_setting(),
 
 
 
 
 
 
 
117
  array(
118
  'type' => 'sectionend',
119
  'id' => 'wcj_price_by_user_role_options_adv',
120
  ),
 
 
121
  array(
122
  'title' => __( 'Roles & Multipliers', 'woocommerce-jetpack' ),
123
  'type' => 'title',
171
  ),
172
  );
173
 
174
+ do_action( 'wcj_before_get_terms', $this->id );
175
  foreach ( $taxonomies as $taxonomy ) {
176
  $product_taxonomies_options = array();
177
  $product_taxonomies = get_terms( $taxonomy['id'], 'orderby=name&hide_empty=0' );
228
  ),
229
  ) );
230
  }
231
+ do_action('wcj_after_get_terms', $this->id );
232
 
233
  return $settings;
includes/settings/wcj-settings-product-addons.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Settings - Product Addons
4
  *
5
- * @version 4.6.0
6
  * @since 2.8.0
7
  * @author Algoritmika Ltd.
8
  * @todo (maybe) add `woocommerce_payment_complete` to `$qty_triggers` (also maybe add this trigger to "PDF Invoicing" module)
@@ -223,7 +223,16 @@ $settings = array_merge( $settings, array(
223
  'type' => 'number',
224
  ),
225
  array(
226
- 'title' => __( 'Advanced: Apply Price Filter', 'woocommerce-jetpack' ),
 
 
 
 
 
 
 
 
 
227
  'id' => 'wcj_product_addons_apply_price_filters',
228
  'default' => 'by_module',
229
  'type' => 'select',
@@ -246,23 +255,31 @@ $settings = array_merge( $settings, array(
246
  ),
247
  ),
248
  array(
249
- 'title' => __( 'Advanced: Price Filters Priority', 'woocommerce-jetpack' ),
250
  'desc_tip' => __( 'Priority for all module\'s price filters. Set to zero to use default priority.' ),
251
  'id' => 'wcj_product_addons_advanced_price_hooks_priority',
252
  'default' => 0,
253
  'type' => 'number',
254
  ),
255
  array(
256
- 'title' => __( 'Advanced: Check for Outputted Data', 'woocommerce-jetpack' ),
257
  'desc' => __( 'Enable', 'woocommerce-jetpack' ),
258
  'desc_tip' => __( 'Ensures that data outputted only once. Enable this if you see data outputted on frontend twice. Disable if you see no data outputted.', 'woocommerce-jetpack' ),
259
  'id' => 'wcj_product_addons_check_for_outputted_data',
260
  'default' => 'yes',
261
  'type' => 'checkbox',
262
  ),
 
 
 
 
 
 
 
 
263
  array(
264
  'type' => 'sectionend',
265
- 'id' => 'wcj_product_addons_options',
266
  ),
267
  array(
268
  'title' => __( 'Frontend Templates', 'woocommerce-jetpack' ),
2
  /**
3
  * Booster for WooCommerce - Settings - Product Addons
4
  *
5
+ * @version 4.7.0
6
  * @since 2.8.0
7
  * @author Algoritmika Ltd.
8
  * @todo (maybe) add `woocommerce_payment_complete` to `$qty_triggers` (also maybe add this trigger to "PDF Invoicing" module)
223
  'type' => 'number',
224
  ),
225
  array(
226
+ 'type' => 'sectionend',
227
+ 'id' => 'wcj_product_addons_options',
228
+ ),
229
+ array(
230
+ 'title' => __( 'Advanced', 'woocommerce-jetpack' ),
231
+ 'type' => 'title',
232
+ 'id' => 'wcj_product_addons_advanced_options',
233
+ ),
234
+ array(
235
+ 'title' => __( 'Apply Price Filter', 'woocommerce-jetpack' ),
236
  'id' => 'wcj_product_addons_apply_price_filters',
237
  'default' => 'by_module',
238
  'type' => 'select',
255
  ),
256
  ),
257
  array(
258
+ 'title' => __( 'Price Filters Priority', 'woocommerce-jetpack' ),
259
  'desc_tip' => __( 'Priority for all module\'s price filters. Set to zero to use default priority.' ),
260
  'id' => 'wcj_product_addons_advanced_price_hooks_priority',
261
  'default' => 0,
262
  'type' => 'number',
263
  ),
264
  array(
265
+ 'title' => __( 'Check for Outputted Data', 'woocommerce-jetpack' ),
266
  'desc' => __( 'Enable', 'woocommerce-jetpack' ),
267
  'desc_tip' => __( 'Ensures that data outputted only once. Enable this if you see data outputted on frontend twice. Disable if you see no data outputted.', 'woocommerce-jetpack' ),
268
  'id' => 'wcj_product_addons_check_for_outputted_data',
269
  'default' => 'yes',
270
  'type' => 'checkbox',
271
  ),
272
+ array(
273
+ 'title' => __( 'Export and Import "Enable by Variation"', 'woocommerce-jetpack' ),
274
+ 'desc' => __( 'Enable', 'woocommerce-jetpack' ),
275
+ 'desc_tip' => __( 'Exports/Imports "Enable by Variation" meta when using WooCommerce product Exporter/Importer', 'woocommerce-jetpack' ),
276
+ 'id' => 'wcj_product_addons_enable_by_variation_export_import',
277
+ 'default' => 'no',
278
+ 'type' => 'checkbox',
279
+ ),
280
  array(
281
  'type' => 'sectionend',
282
+ 'id' => 'wcj_product_addons_advanced_options',
283
  ),
284
  array(
285
  'title' => __( 'Frontend Templates', 'woocommerce-jetpack' ),
includes/settings/wcj-settings-product-by-date.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Settings - Product Availability by Date
4
  *
5
- * @version 3.6.0
6
  * @since 2.9.1
7
  * @author Algoritmika Ltd.
8
  */
@@ -59,9 +59,9 @@ $settings = array_merge( $settings, array(
59
  array(
60
  'title' => __( 'Direct Date Admin Input Date Format', 'woocommerce-jetpack' ),
61
  'desc' => sprintf( __( 'E.g. %s.', 'woocommerce-jetpack' ), '<code>Y-m-d</code>' ),
62
- 'desc_tip' => __( 'Leave blank to use the default date format.', 'woocommerce-jetpack' ),
63
  'id' => 'wcj_product_by_date_direct_date_format',
64
- 'default' => '',
65
  'type' => 'text',
66
  ),
67
  array(
2
  /**
3
  * Booster for WooCommerce - Settings - Product Availability by Date
4
  *
5
+ * @version 4.7.0
6
  * @since 2.9.1
7
  * @author Algoritmika Ltd.
8
  */
59
  array(
60
  'title' => __( 'Direct Date Admin Input Date Format', 'woocommerce-jetpack' ),
61
  'desc' => sprintf( __( 'E.g. %s.', 'woocommerce-jetpack' ), '<code>Y-m-d</code>' ),
62
+ 'desc_tip' => __( 'Leave blank to use the default date format.', 'woocommerce-jetpack' ) . '<br /><br />' . __( 'If you are not using english, please set some numeric format like m/d/Y', 'woocommerce-jetpack' ),
63
  'id' => 'wcj_product_by_date_direct_date_format',
64
+ 'default' => 'm/d/Y',
65
  'type' => 'text',
66
  ),
67
  array(
includes/settings/wcj-settings-products-per-page.php CHANGED
@@ -71,6 +71,16 @@ return array(
71
  'type' => 'custom_textarea',
72
  'css' => 'width:100%',
73
  ),
 
 
 
 
 
 
 
 
 
 
74
  array(
75
  'title' => __( 'Saving Method', 'woocommerce-jetpack' ),
76
  'id' => 'wcj_products_per_page_saving_method',
71
  'type' => 'custom_textarea',
72
  'css' => 'width:100%',
73
  ),
74
+ array(
75
+ 'title' => __( 'Form Method', 'woocommerce-jetpack' ),
76
+ 'id' => 'wcj_products_per_page_form_method',
77
+ 'default' => 'post',
78
+ 'type' => 'select',
79
+ 'options' => array(
80
+ 'post' => __( 'POST', 'woocommerce-jetpack' ),
81
+ 'get' => __( 'GET', 'woocommerce-jetpack' ),
82
+ )
83
+ ),
84
  array(
85
  'title' => __( 'Saving Method', 'woocommerce-jetpack' ),
86
  'id' => 'wcj_products_per_page_saving_method',
includes/settings/wcj-settings-sku.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Settings - SKU
4
  *
5
- * @version 3.7.0
6
  * @since 2.8.0
7
  * @author Algoritmika Ltd.
8
  * @todo deprecate `wcj_sku_prefix` and `wcj_sku_suffix` (as user can now add it directly to "Template")
@@ -27,9 +27,10 @@ $settings = array(
27
  'product_id' => __( 'From product ID', 'woocommerce-jetpack' ),
28
  'sequential' => __( 'Sequential', 'woocommerce-jetpack' ),
29
  'hash_crc32' => __( 'Pseudorandom - Hash (max 10 digits)', 'woocommerce-jetpack' ),
 
30
  ),
31
  'desc_tip' => __( 'Number generation method.', 'woocommerce-jetpack' ) . ' ' .
32
- __( 'Possible values: from product ID, sequential or pseudorandom.', 'woocommerce-jetpack' ),
33
  'desc' => apply_filters( 'booster_message', '', 'desc' ),
34
  'custom_attributes' => apply_filters( 'booster_message', '', 'disabled' ),
35
  ),
@@ -143,6 +144,39 @@ $settings = array(
143
  'type' => 'sectionend',
144
  'id' => 'wcj_sku_format_options',
145
  ),
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
146
  );
147
  $settings = array_merge( $settings, array(
148
  array(
@@ -214,11 +248,19 @@ $settings = array_merge( $settings, array(
214
  array(
215
  'title' => __( 'Automatically Generate SKU for New Products', 'woocommerce-jetpack' ),
216
  'desc' => __( 'Enable', 'woocommerce-jetpack' ),
217
- 'desc_tip' => __( 'Alternatively you can use Autogenerate SKUs tool.', 'woocommerce-jetpack' ),
218
  'id' => 'wcj_sku_new_products_generate_enabled',
219
  'default' => 'yes',
220
  'type' => 'checkbox',
221
  ),
 
 
 
 
 
 
 
 
222
  array(
223
  'title' => __( 'Generate SKU for New Products Only on First Publish', 'woocommerce-jetpack' ),
224
  'desc' => __( 'Enable', 'woocommerce-jetpack' ),
2
  /**
3
  * Booster for WooCommerce - Settings - SKU
4
  *
5
+ * @version 4.7.0
6
  * @since 2.8.0
7
  * @author Algoritmika Ltd.
8
  * @todo deprecate `wcj_sku_prefix` and `wcj_sku_suffix` (as user can now add it directly to "Template")
27
  'product_id' => __( 'From product ID', 'woocommerce-jetpack' ),
28
  'sequential' => __( 'Sequential', 'woocommerce-jetpack' ),
29
  'hash_crc32' => __( 'Pseudorandom - Hash (max 10 digits)', 'woocommerce-jetpack' ),
30
+ 'hashids' => __( 'Hashids - Advanced options', 'woocommerce-jetpack' ),
31
  ),
32
  'desc_tip' => __( 'Number generation method.', 'woocommerce-jetpack' ) . ' ' .
33
+ __( 'Possible values: from product ID, sequential, pseudorandom or Hashids.', 'woocommerce-jetpack' ) . '<br />' . __( 'If using Hashids please take a look at Hashids options below.', 'woocommerce-jetpack' ),
34
  'desc' => apply_filters( 'booster_message', '', 'desc' ),
35
  'custom_attributes' => apply_filters( 'booster_message', '', 'disabled' ),
36
  ),
144
  'type' => 'sectionend',
145
  'id' => 'wcj_sku_format_options',
146
  ),
147
+ array(
148
+ 'title' => __( 'Hashids options', 'woocommerce-jetpack' ),
149
+ 'type' => 'title',
150
+ 'id' => 'wcj_sku_hashids_options',
151
+ ),
152
+ array(
153
+ 'title' => __( 'Salt', 'woocommerce-jetpack' ),
154
+ 'desc_tip' => __( 'A random string that will make your SKUs really unique.', 'woocommerce-jetpack' ),
155
+ 'id' => 'wcj_sku_hashids_salt',
156
+ 'default' => get_option( 'wcj_sku_hashids_salt_default', '' ),
157
+ 'type' => 'text',
158
+ ),
159
+ array(
160
+ 'title' => __( 'Numbers of characters in SKU', 'woocommerce-jetpack' ),
161
+ 'id' => 'wcj_sku_hashids_sku_length',
162
+ 'default' => 6,
163
+ 'type' => 'number',
164
+ ),
165
+ array(
166
+ 'title' => __( 'SKU Format', 'woocommerce-jetpack' ),
167
+ 'type' => 'select',
168
+ 'options' => array(
169
+ 'only_numbers' => __( 'Only Numbers, e.g.: 836237', 'woocommerce-jetpack' ),
170
+ 'only_letters' => __( 'Only Letters, e.g.: HFuAbQ', 'woocommerce-jetpack' ),
171
+ 'letters_and_numbers' => __( 'Letters and Numbers, e.g.: 8a3M19 ', 'woocommerce-jetpack' ),
172
+ ),
173
+ 'default' => 'letters_and_numbers',
174
+ 'id' => 'wcj_sku_hashids_sku_format',
175
+ ),
176
+ array(
177
+ 'type' => 'sectionend',
178
+ 'id' => 'wcj_sku_hashids_options',
179
+ )
180
  );
181
  $settings = array_merge( $settings, array(
182
  array(
248
  array(
249
  'title' => __( 'Automatically Generate SKU for New Products', 'woocommerce-jetpack' ),
250
  'desc' => __( 'Enable', 'woocommerce-jetpack' ),
251
+ 'desc_tip' => __( 'Alternatively you can use Autogenerate SKUs tool.', 'woocommerce-jetpack' ) . '<br />' . __( 'If you want to generate SKU for variations, please try "Automatically Generate SKU for Variations on Product Save" option.', 'woocommerce-jetpack' ),
252
  'id' => 'wcj_sku_new_products_generate_enabled',
253
  'default' => 'yes',
254
  'type' => 'checkbox',
255
  ),
256
+ array(
257
+ 'title' => __( 'Automatically Generate SKU for Variations on Product Save', 'woocommerce-jetpack' ),
258
+ 'desc' => __( 'Enable', 'woocommerce-jetpack' ),
259
+ 'desc_tip' => __( 'Once enabled it\'s recommended to be used with "Generate SKUs Only for Products with Empty SKU" option or else the SKUs will be replaced on product save.', 'woocommerce-jetpack' ),
260
+ 'id' => 'wcj_sku_generate_on_save',
261
+ 'default' => 'no',
262
+ 'type' => 'checkbox',
263
+ ),
264
  array(
265
  'title' => __( 'Generate SKU for New Products Only on First Publish', 'woocommerce-jetpack' ),
266
  'desc' => __( 'Enable', 'woocommerce-jetpack' ),
includes/settings/wcj-settings-wholesale-price.php CHANGED
@@ -2,14 +2,17 @@
2
  /**
3
  * Booster for WooCommerce - Settings - Wholesale Price
4
  *
5
- * @version 4.3.0
6
  * @since 2.8.0
7
  * @author Algoritmika Ltd.
8
  */
9
 
10
  if ( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly
11
 
 
 
12
  $product_cats = wcj_get_terms( 'product_cat' );
 
13
  $settings = array(
14
  array(
15
  'title' => __( 'Options', 'woocommerce-jetpack' ),
@@ -123,6 +126,8 @@ $settings = array(
123
  'default' => 0,
124
  'type' => 'number',
125
  ),
 
 
126
  array(
127
  'type' => 'sectionend',
128
  'id' => 'wcj_wholesale_price_general_options',
@@ -229,4 +234,6 @@ $settings = array_merge( $settings, array(
229
  'id' => 'wcj_wholesale_price_by_user_role_options',
230
  ),
231
  ) );
 
 
232
  return $settings;
2
  /**
3
  * Booster for WooCommerce - Settings - Wholesale Price
4
  *
5
+ * @version 4.7.0
6
  * @since 2.8.0
7
  * @author Algoritmika Ltd.
8
  */
9
 
10
  if ( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly
11
 
12
+ do_action( 'wcj_before_get_products', $this->id );
13
+ do_action( 'wcj_before_get_terms', $this->id );
14
  $product_cats = wcj_get_terms( 'product_cat' );
15
+
16
  $settings = array(
17
  array(
18
  'title' => __( 'Options', 'woocommerce-jetpack' ),
126
  'default' => 0,
127
  'type' => 'number',
128
  ),
129
+ $this->get_wpml_terms_in_all_languages_setting(),
130
+ $this->get_wpml_products_in_all_languages_setting(),
131
  array(
132
  'type' => 'sectionend',
133
  'id' => 'wcj_wholesale_price_general_options',
234
  'id' => 'wcj_wholesale_price_by_user_role_options',
235
  ),
236
  ) );
237
+ do_action( 'wcj_after_get_products', $this->id );
238
+ do_action( 'wcj_after_get_terms', $this->id );
239
  return $settings;
includes/shortcodes/class-wcj-shortcodes-input-field.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Shortcodes - Input Field
4
  *
5
- * @version 3.0.1
6
  * @since 2.5.2
7
  * @author Algoritmika Ltd.
8
  */
@@ -43,27 +43,49 @@ class WCJ_Input_Field_Shortcodes extends WCJ_Shortcodes {
43
  /**
44
  * wcj_input_field.
45
  *
46
- * @version 3.0.1
47
  * @since 2.5.2
48
  */
49
  function wcj_input_field( $atts, $content ) {
50
  if ( '' == $atts['name'] ) {
51
  return __( 'Attribute "name" is required!', 'woocommerce-jetpack' );
52
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
53
  $the_field = '';
54
- $the_field .= '<input' .
 
55
  ' type="' . $atts['type'] . '"' .
56
  ' class="' . $atts['class'] . '"' .
57
  ' value="' . $atts['value'] . '"' .
58
  ' placeholder="' . $atts['placeholder'] . '"' .
59
- ' name="wcj_input_field_' . $atts['name'] . '"' .
60
  ' id="wcj_input_field_' . $atts['name'] . '">';
61
  if ( '' != $atts['attach_to'] ) {
62
  $the_field .= '<input type="hidden" name="for_wcj_input_field_' . $atts['name'] . '" value="' . $atts['attach_to'] . '">';
63
  }
 
 
64
  if ( '' != $atts['label'] ) {
65
- $the_field .= '<input type="hidden" name="label_for_wcj_input_field_' . $atts['name'] . '" value="' . $atts['label'] . '">';
 
 
 
 
66
  }
 
67
  if ( 'yes' == $atts['required'] ) {
68
  $the_field .= '<input type="hidden" name="wcj_input_field_' . $atts['name'] . '_required" value="yes">';
69
  }
2
  /**
3
  * Booster for WooCommerce - Shortcodes - Input Field
4
  *
5
+ * @version 4.7.0
6
  * @since 2.5.2
7
  * @author Algoritmika Ltd.
8
  */
43
  /**
44
  * wcj_input_field.
45
  *
46
+ * @version 4.7.0
47
  * @since 2.5.2
48
  */
49
  function wcj_input_field( $atts, $content ) {
50
  if ( '' == $atts['name'] ) {
51
  return __( 'Attribute "name" is required!', 'woocommerce-jetpack' );
52
  }
53
+
54
+ // Custom data attributes
55
+ $data_attributes = null;
56
+ if ( isset( $atts['data_attributes'] ) && ! empty( $atts['data_attributes'] ) ) {
57
+ $data_attributes = wp_parse_args( $atts['data_attributes'] );
58
+ }
59
+ $data_attributes_html = wcj_get_data_attributes_html( $data_attributes );
60
+
61
+ // Name
62
+ $name_html = ' name="wcj_input_field_' . $atts['name'] . '"';
63
+ if ( isset( $atts['name_array'] ) && ! empty( $atts['name_array'] ) ) {
64
+ $name_html = ' name="wcj_input_field_' . $atts['name_array'] . '[' . $atts['name'] . '][value]"';
65
+ }
66
+
67
  $the_field = '';
68
+ $the_field .= '<input' .' '.
69
+ $data_attributes_html .
70
  ' type="' . $atts['type'] . '"' .
71
  ' class="' . $atts['class'] . '"' .
72
  ' value="' . $atts['value'] . '"' .
73
  ' placeholder="' . $atts['placeholder'] . '"' .
74
+ $name_html.
75
  ' id="wcj_input_field_' . $atts['name'] . '">';
76
  if ( '' != $atts['attach_to'] ) {
77
  $the_field .= '<input type="hidden" name="for_wcj_input_field_' . $atts['name'] . '" value="' . $atts['attach_to'] . '">';
78
  }
79
+
80
+ //Label
81
  if ( '' != $atts['label'] ) {
82
+ $label_name_html = ' name="label_for_wcj_input_field_' . $atts['name'] . '"';
83
+ if ( isset( $atts['name_array'] ) && ! empty( $atts['name_array'] ) ) {
84
+ $label_name_html = ' name="wcj_input_field_' . $atts['name_array'] . '[' . $atts['name'] . '][label]"';
85
+ }
86
+ $the_field .= '<input type="hidden" ' . $label_name_html . ' value="' . $atts['label'] . '">';
87
  }
88
+
89
  if ( 'yes' == $atts['required'] ) {
90
  $the_field .= '<input type="hidden" name="wcj_input_field_' . $atts['name'] . '_required" value="yes">';
91
  }
langs/woocommerce-jetpack.pot CHANGED
@@ -43,8 +43,8 @@ msgstr ""
43
  #: includes/class-wcj-payment-gateways.php:91
44
  #: includes/class-wcj-track-users.php:163
45
  #: includes/class-wcj-track-users.php:251
46
- #: includes/classes/class-wcj-module.php:381
47
- #: includes/classes/class-wcj-module.php:581
48
  #: includes/settings/wcj-settings-price-by-country.php:178
49
  msgid "Booster"
50
  msgstr ""
@@ -187,7 +187,7 @@ msgstr ""
187
 
188
  #: includes/admin/class-wc-settings-jetpack.php:416
189
  #: includes/class-wcj-admin-bar.php:172
190
- #: includes/classes/class-wcj-module.php:721
191
  msgid "Documentation"
192
  msgstr ""
193
 
@@ -242,7 +242,7 @@ msgstr ""
242
 
243
  #: includes/admin/class-wc-settings-jetpack.php:486
244
  #: includes/class-wcj-global-discount.php:27
245
- #: includes/settings/wcj-settings-product-addons.php:245
246
  msgid "Global Discount"
247
  msgstr ""
248
 
@@ -515,7 +515,7 @@ msgstr ""
515
 
516
  #: includes/class-wcj-admin-bar.php:245 includes/class-wcj-admin-bar.php:288
517
  #: includes/class-wcj-admin-bar.php:632
518
- #: includes/classes/class-wcj-module.php:554
519
  #: includes/settings/wcj-settings-wpml.php:82
520
  msgid "Tools"
521
  msgstr ""
@@ -652,7 +652,7 @@ msgstr ""
652
 
653
  #: includes/class-wcj-admin-bar.php:478
654
  #: includes/class-wcj-product-bulk-price-converter.php:149
655
- #: includes/class-wcj-sku.php:538
656
  #: includes/export/class-wcj-fields-helper.php:318
657
  #: includes/settings/wcj-settings-product-by-user.php:19
658
  #: includes/shortcodes/class-wcj-shortcodes-products-add-form.php:182
@@ -716,7 +716,7 @@ msgstr ""
716
  #: includes/settings/wcj-settings-checkout-custom-fields.php:193
717
  #: includes/settings/wcj-settings-checkout-custom-info.php:57
718
  #: includes/settings/wcj-settings-left-to-free-shipping.php:115
719
- #: includes/settings/wcj-settings-price-by-user-role.php:46
720
  msgid "Shipping"
721
  msgstr ""
722
 
@@ -886,7 +886,7 @@ msgstr ""
886
  #: includes/class-wcj-admin-tools.php:265
887
  #: includes/class-wcj-product-bulk-meta-editor.php:339
888
  #: includes/class-wcj-product-bulk-price-converter.php:148
889
- #: includes/class-wcj-sku.php:537
890
  #: includes/reports/wcj-class-reports-sales.php:197
891
  #: includes/reports/wcj-class-reports-stock.php:269
892
  msgid "Product"
@@ -1102,10 +1102,10 @@ msgstr ""
1102
  #: includes/class-wcj-checkout-files-upload.php:746
1103
  #: includes/class-wcj-checkout-files-upload.php:747
1104
  #: includes/settings/wcj-settings-checkout-files-upload.php:103
1105
- #: includes/settings/wcj-settings-price-by-user-role.php:78
1106
- #: includes/settings/wcj-settings-price-by-user-role.php:86
1107
  #: includes/settings/wcj-settings-product-open-pricing.php:166
1108
- #: includes/settings/wcj-settings-sku.php:275
1109
  #: includes/settings/wcj-settings-sorting.php:144
1110
  #: includes/settings/wcj-settings-stock.php:206
1111
  msgid "Remove"
@@ -1869,7 +1869,7 @@ msgid "Role %s successfully deleted!"
1869
  msgstr ""
1870
 
1871
  #: includes/class-wcj-general.php:218 includes/class-wcj-general.php:233
1872
- #: includes/class-wcj-sku.php:536
1873
  #: includes/reports/wcj-class-reports-sales.php:196
1874
  #: includes/settings/wcj-settings-cross-sells.php:43
1875
  #: includes/settings/wcj-settings-order-numbers.php:150
@@ -1894,7 +1894,7 @@ msgstr ""
1894
 
1895
  #: includes/class-wcj-general.php:218
1896
  #: includes/class-wcj-product-by-user.php:197
1897
- #: includes/settings/wcj-settings-pdf-invoicing-advanced.php:107
1898
  #: includes/tools/class-wcj-order-statuses-tool.php:145
1899
  #: includes/tools/class-wcj-order-statuses-tool.php:221
1900
  msgid "Actions"
@@ -1937,8 +1937,8 @@ msgstr ""
1937
  #: includes/settings/wcj-settings-order-min-amount.php:53
1938
  #: includes/settings/wcj-settings-orders.php:132
1939
  #: includes/settings/wcj-settings-orders.php:159
1940
- #: includes/settings/wcj-settings-pdf-invoicing-advanced.php:132
1941
- #: includes/settings/wcj-settings-pdf-invoicing-advanced.php:190
1942
  #: includes/settings/wcj-settings-product-by-condition.php:107
1943
  #: includes/settings/wcj-settings-product-by-user.php:114
1944
  #: includes/settings/wcj-settings-product-open-pricing.php:123
@@ -1947,8 +1947,8 @@ msgstr ""
1947
  #: includes/settings/wcj-settings-purchase-data.php:154
1948
  #: includes/settings/wcj-settings-purchase-data.php:173
1949
  #: includes/settings/wcj-settings-purchase-data.php:180
1950
- #: includes/settings/wcj-settings-sku.php:240
1951
- #: includes/settings/wcj-settings-sku.php:267
1952
  #: includes/shortcodes/class-wcj-shortcodes-products-add-form.php:422
1953
  #: includes/tools/class-wcj-order-statuses-tool.php:236
1954
  msgid "Add"
@@ -2057,7 +2057,7 @@ msgid "Set \"Place order\" button label."
2057
  msgstr ""
2058
 
2059
  #: includes/class-wcj-multicurrency-product-base-price.php:25
2060
- #: includes/settings/wcj-settings-product-addons.php:243
2061
  msgid "Multicurrency Product Base Price"
2062
  msgstr ""
2063
 
@@ -2066,7 +2066,7 @@ msgid "Enter prices for products in different currencies."
2066
  msgstr ""
2067
 
2068
  #: includes/class-wcj-multicurrency.php:30
2069
- #: includes/settings/wcj-settings-product-addons.php:244
2070
  msgid "Multicurrency (Currency Switcher)"
2071
  msgstr ""
2072
 
@@ -2165,7 +2165,7 @@ msgstr ""
2165
  #: includes/class-wcj-product-by-user.php:206
2166
  #: includes/class-wcj-purchase-data.php:94
2167
  #: includes/class-wcj-track-users.php:334
2168
- #: includes/classes/class-wcj-module.php:690
2169
  #: includes/functions/wcj-functions-general.php:189
2170
  #: includes/functions/wcj-functions-html.php:117
2171
  #: includes/reports/wcj-class-reports-monthly-sales.php:351
@@ -2644,20 +2644,20 @@ msgid ""
2644
  "payment gateway."
2645
  msgstr ""
2646
 
2647
- #: includes/class-wcj-payment-gateways-min-max.php:25
2648
  msgid "Gateways Min/Max Amounts"
2649
  msgstr ""
2650
 
2651
- #: includes/class-wcj-payment-gateways-min-max.php:26
2652
  msgid "Add min/max amounts for payment gateways to show up."
2653
  msgstr ""
2654
 
2655
- #: includes/class-wcj-payment-gateways-min-max.php:51
2656
  #: includes/settings/wcj-settings-payment-gateways-min-max.php:37
2657
  msgid "Minimum amount for %gateway_title% is %min_amount%"
2658
  msgstr ""
2659
 
2660
- #: includes/class-wcj-payment-gateways-min-max.php:52
2661
  #: includes/settings/wcj-settings-payment-gateways-min-max.php:45
2662
  msgid "Maximum amount for %gateway_title% is %max_amount%"
2663
  msgstr ""
@@ -2784,24 +2784,24 @@ msgstr ""
2784
  msgid "Display products prices by user roles."
2785
  msgstr ""
2786
 
2787
- #: includes/class-wcj-price-by-user-role.php:143
2788
  msgid "user roles & variations"
2789
  msgstr ""
2790
 
2791
- #: includes/class-wcj-price-by-user-role.php:147
2792
  msgid "variations"
2793
  msgstr ""
2794
 
2795
- #: includes/class-wcj-price-by-user-role.php:151
2796
  msgid "user roles"
2797
  msgstr ""
2798
 
2799
- #: includes/class-wcj-price-by-user-role.php:164
2800
  #, php-format
2801
  msgid "Copy price to all %s"
2802
  msgstr ""
2803
 
2804
- #: includes/class-wcj-price-by-user-role.php:244
2805
  msgid ""
2806
  "Booster: Free plugin's version is limited to only one price by user role per "
2807
  "products settings product enabled at a time. You will need to get <a href="
@@ -2849,6 +2849,8 @@ msgstr ""
2849
  #: includes/class-wcj-product-info.php:235
2850
  #: includes/class-wcj-shipping-by-products.php:195
2851
  #: includes/class-wcj-shipping-options.php:121
 
 
2852
  #: includes/settings/meta-box/wcj-settings-meta-box-product-add-to-cart.php:68
2853
  #: includes/settings/meta-box/wcj-settings-meta-box-product-addons.php:73
2854
  #: includes/settings/meta-box/wcj-settings-meta-box-related-products.php:19
@@ -2912,8 +2914,8 @@ msgstr ""
2912
  #: includes/settings/wcj-settings-general.php:73
2913
  #: includes/settings/wcj-settings-general.php:146
2914
  #: includes/settings/wcj-settings-general.php:197
2915
- #: includes/settings/wcj-settings-global-discount.php:52
2916
- #: includes/settings/wcj-settings-global-discount.php:181
2917
  #: includes/settings/wcj-settings-left-to-free-shipping.php:28
2918
  #: includes/settings/wcj-settings-left-to-free-shipping.php:57
2919
  #: includes/settings/wcj-settings-left-to-free-shipping.php:91
@@ -2969,9 +2971,8 @@ msgstr ""
2969
  #: includes/settings/wcj-settings-price-by-country.php:106
2970
  #: includes/settings/wcj-settings-price-by-country.php:133
2971
  #: includes/settings/wcj-settings-price-by-country.php:142
2972
- #: includes/settings/wcj-settings-price-by-user-role.php:20
2973
- #: includes/settings/wcj-settings-price-by-user-role.php:47
2974
- #: includes/settings/wcj-settings-price-by-user-role.php:119
2975
  #: includes/settings/wcj-settings-price-formats.php:21
2976
  #: includes/settings/wcj-settings-price-labels.php:23
2977
  #: includes/settings/wcj-settings-product-add-to-cart.php:25
@@ -2989,7 +2990,8 @@ msgstr ""
2989
  #: includes/settings/wcj-settings-product-addons.php:50
2990
  #: includes/settings/wcj-settings-product-addons.php:74
2991
  #: includes/settings/wcj-settings-product-addons.php:179
2992
- #: includes/settings/wcj-settings-product-addons.php:257
 
2993
  #: includes/settings/wcj-settings-product-bookings.php:107
2994
  #: includes/settings/wcj-settings-product-bulk-meta-editor.php:21
2995
  #: includes/settings/wcj-settings-product-bulk-meta-editor.php:29
@@ -3045,11 +3047,12 @@ msgstr ""
3045
  #: includes/settings/wcj-settings-shipping-time.php:31
3046
  #: includes/settings/wcj-settings-shipping-time.php:40
3047
  #: includes/settings/wcj-settings-shipping.php:24
3048
- #: includes/settings/wcj-settings-sku.php:51
3049
- #: includes/settings/wcj-settings-sku.php:216
3050
- #: includes/settings/wcj-settings-sku.php:224
3051
- #: includes/settings/wcj-settings-sku.php:232
3052
- #: includes/settings/wcj-settings-sku.php:259
 
3053
  #: includes/settings/wcj-settings-stock.php:27
3054
  #: includes/settings/wcj-settings-stock.php:64
3055
  #: includes/settings/wcj-settings-stock.php:94
@@ -3058,9 +3061,9 @@ msgstr ""
3058
  #: includes/settings/wcj-settings-stock.php:154
3059
  #: includes/settings/wcj-settings-track-users.php:47
3060
  #: includes/settings/wcj-settings-upsells.php:81
3061
- #: includes/settings/wcj-settings-wholesale-price.php:24
3062
- #: includes/settings/wcj-settings-wholesale-price.php:42
3063
- #: includes/settings/wcj-settings-wholesale-price.php:51
3064
  #: includes/settings/wcj-settings-wpml.php:28
3065
  #: includes/settings/wcj-settings-wpml.php:35
3066
  #: includes/settings/wcj-settings-wpml.php:53
@@ -3164,11 +3167,11 @@ msgstr ""
3164
  msgid "Add (paid/free/discount) addons to products."
3165
  msgstr ""
3166
 
3167
- #: includes/class-wcj-product-addons.php:220
3168
  msgid "Some of the required addons are not selected!"
3169
  msgstr ""
3170
 
3171
- #: includes/class-wcj-product-addons.php:235
3172
  msgid ""
3173
  "Booster: Free plugin's version is limited to only three products with per "
3174
  "product addons enabled at a time. You will need to get <a href=\"https://"
@@ -3281,9 +3284,9 @@ msgstr ""
3281
  #: includes/class-wcj-product-bulk-meta-editor.php:232
3282
  #: includes/settings/meta-box/wcj-settings-meta-box-add-to-cart-button-visibility.php:19
3283
  #: includes/settings/meta-box/wcj-settings-meta-box-add-to-cart-button-visibility.php:38
3284
- #: includes/settings/wcj-settings-price-by-user-role.php:70
3285
  #: includes/settings/wcj-settings-product-msrp.php:31
3286
- #: includes/settings/wcj-settings-wholesale-price.php:58
3287
  msgid "Show"
3288
  msgstr ""
3289
 
@@ -3306,7 +3309,7 @@ msgstr ""
3306
  #: includes/settings/wcj-settings-export.php:91
3307
  #: includes/settings/wcj-settings-export.php:162
3308
  #: includes/settings/wcj-settings-export.php:241
3309
- #: includes/settings/wcj-settings-global-discount.php:69
3310
  msgid "Value"
3311
  msgstr ""
3312
 
@@ -3415,7 +3418,7 @@ msgid "Any"
3415
  msgstr ""
3416
 
3417
  #: includes/class-wcj-product-bulk-price-converter.php:264
3418
- #: includes/settings/wcj-settings-global-discount.php:84
3419
  msgid "None"
3420
  msgstr ""
3421
 
@@ -3714,11 +3717,11 @@ msgstr ""
3714
  #: includes/settings/wcj-settings-custom-php.php:16
3715
  #: includes/settings/wcj-settings-empty-cart.php:14
3716
  #: includes/settings/wcj-settings-eu-vat-number.php:15
3717
- #: includes/settings/wcj-settings-global-discount.php:19
3718
  #: includes/settings/wcj-settings-multicurrency-base-price.php:17
3719
  #: includes/settings/wcj-settings-payment-gateways-currency.php:63
3720
  #: includes/settings/wcj-settings-payment-gateways-icons.php:14
3721
- #: includes/settings/wcj-settings-price-by-user-role.php:14
3722
  #: includes/settings/wcj-settings-product-addons.php:173
3723
  #: includes/settings/wcj-settings-product-bookings.php:86
3724
  #: includes/settings/wcj-settings-product-by-user.php:59
@@ -3730,7 +3733,7 @@ msgstr ""
3730
  #: includes/settings/wcj-settings-track-users.php:14
3731
  #: includes/settings/wcj-settings-upsells.php:14
3732
  #: includes/settings/wcj-settings-url-coupons.php:14
3733
- #: includes/settings/wcj-settings-wholesale-price.php:15
3734
  msgid "Options"
3735
  msgstr ""
3736
 
@@ -4057,7 +4060,7 @@ msgstr ""
4057
  #: includes/settings/meta-box/wcj-settings-meta-box-wholesale-price.php:32
4058
  #: includes/settings/wcj-settings-admin-orders-list.php:84
4059
  #: includes/settings/wcj-settings-checkout-custom-fields.php:265
4060
- #: includes/settings/wcj-settings-product-addons.php:233
4061
  #: includes/settings/wcj-settings-related-products.php:176
4062
  #: includes/widgets/class-wcj-widget-country-switcher.php:82
4063
  msgid "No"
@@ -4095,7 +4098,7 @@ msgstr ""
4095
  #: includes/settings/wcj-settings-eu-vat-number.php:124
4096
  #: includes/settings/wcj-settings-eu-vat-number.php:135
4097
  #: includes/settings/wcj-settings-eu-vat-number.php:154
4098
- #: includes/settings/wcj-settings-product-addons.php:232
4099
  #: includes/settings/wcj-settings-related-products.php:175
4100
  #: includes/widgets/class-wcj-widget-country-switcher.php:83
4101
  msgid "Yes"
@@ -4512,7 +4515,7 @@ msgstr ""
4512
  #: includes/class-wcj-shipping-by-user-role.php:33
4513
  #: includes/settings/wcj-settings-multicurrency.php:261
4514
  #: includes/settings/wcj-settings-order-min-amount.php:104
4515
- #: includes/settings/wcj-settings-price-by-user-role.php:134
4516
  #, php-format
4517
  msgid ""
4518
  "Custom roles can be added via \"Add/Manage Custom Roles\" tool in Booster's "
@@ -4623,7 +4626,7 @@ msgstr ""
4623
  msgid "Add multiple custom shipping methods to WooCommerce."
4624
  msgstr ""
4625
 
4626
- #: includes/class-wcj-sku.php:23 includes/class-wcj-sku.php:539
4627
  #: includes/export/class-wcj-fields-helper.php:283
4628
  msgid "SKU"
4629
  msgstr ""
@@ -4640,33 +4643,33 @@ msgstr ""
4640
  msgid "The tool generates and sets product SKUs for existing products."
4641
  msgstr ""
4642
 
4643
- #: includes/class-wcj-sku.php:540
4644
  msgid "Old SKU"
4645
  msgstr ""
4646
 
4647
- #: includes/class-wcj-sku.php:546
4648
  msgid "SKUs generated and set successfully!"
4649
  msgstr ""
4650
 
4651
- #: includes/class-wcj-sku.php:556
4652
  msgid "Preview SKUs"
4653
  msgstr ""
4654
 
4655
- #: includes/class-wcj-sku.php:558
4656
  msgid "Set SKUs"
4657
  msgstr ""
4658
 
4659
- #: includes/class-wcj-sku.php:561
4660
  msgid ""
4661
  "You can optionally limit affected products by main product's ID (set option "
4662
  "to zero to ignore):"
4663
  msgstr ""
4664
 
4665
- #: includes/class-wcj-sku.php:563
4666
  msgid "Min ID"
4667
  msgstr ""
4668
 
4669
- #: includes/class-wcj-sku.php:566
4670
  msgid "Max ID"
4671
  msgstr ""
4672
 
@@ -4840,21 +4843,37 @@ msgstr ""
4840
  msgid "File wpml-config.xml successfully regenerated!"
4841
  msgstr ""
4842
 
4843
- #: includes/classes/class-wcj-module-product-by-condition.php:116
4844
  msgid "— No change —"
4845
  msgstr ""
4846
 
4847
- #: includes/classes/class-wcj-module-product-by-condition.php:123
4848
  #: includes/settings/meta-box/wcj-settings-meta-box-product-by-condition.php:29
4849
  msgid "Visible"
4850
  msgstr ""
4851
 
4852
- #: includes/classes/class-wcj-module-product-by-condition.php:132
4853
  #: includes/settings/meta-box/wcj-settings-meta-box-product-by-condition.php:41
4854
  msgid "Invisible"
4855
  msgstr ""
4856
 
4857
- #: includes/classes/class-wcj-module.php:153
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4858
  #, php-format
4859
  msgid ""
4860
  "Booster: Free plugin's version is limited to only one \"%1$s\" product with "
@@ -4863,30 +4882,30 @@ msgid ""
4863
  "\"%1$s\" products."
4864
  msgstr ""
4865
 
4866
- #: includes/classes/class-wcj-module.php:473
4867
  #, php-format
4868
  msgid "Selected: %s."
4869
  msgstr ""
4870
 
4871
- #: includes/classes/class-wcj-module.php:542
4872
  msgid "Back to Module Settings"
4873
  msgstr ""
4874
 
4875
- #: includes/classes/class-wcj-module.php:560
4876
  #: includes/settings/wcj-settings-wpml.php:87
4877
  msgid "Module Tools"
4878
  msgstr ""
4879
 
4880
- #: includes/classes/class-wcj-module.php:633
4881
  #: includes/settings/wcj-settings-checkout-core-fields.php:64
4882
  msgid "enabled"
4883
  msgstr ""
4884
 
4885
- #: includes/classes/class-wcj-module.php:634
4886
  msgid "disabled"
4887
  msgstr ""
4888
 
4889
- #: includes/classes/class-wcj-module.php:642
4890
  #: includes/settings/wcj-settings-product-tabs.php:172
4891
  #: includes/settings/wcj-settings-product-tabs.php:184
4892
  #: includes/settings/wcj-settings-product-tabs.php:196
@@ -4894,36 +4913,36 @@ msgstr ""
4894
  msgid "Deprecated"
4895
  msgstr ""
4896
 
4897
- #: includes/classes/class-wcj-module.php:680
4898
  msgid "Reset Settings"
4899
  msgstr ""
4900
 
4901
- #: includes/classes/class-wcj-module.php:686
4902
  msgid "Reset Module to Default Settings"
4903
  msgstr ""
4904
 
4905
- #: includes/classes/class-wcj-module.php:687
4906
  msgid "Reset Submodule to Default Settings"
4907
  msgstr ""
4908
 
4909
- #: includes/classes/class-wcj-module.php:691
4910
  msgid "Reset settings"
4911
  msgstr ""
4912
 
4913
- #: includes/classes/class-wcj-module.php:725
4914
  msgid "Module Options"
4915
  msgstr ""
4916
 
4917
- #: includes/classes/class-wcj-module.php:732
4918
  msgid "Enable Module"
4919
  msgstr ""
4920
 
4921
- #: includes/classes/class-wcj-pdf-invoice.php:88
4922
  #: includes/settings/wcj-settings-pdf-invoicing-header.php:61
4923
  msgid "Company Name"
4924
  msgstr ""
4925
 
4926
- #: includes/classes/class-wcj-pdf-invoice.php:251
4927
  #: includes/functions/wcj-functions-general.php:145
4928
  #: includes/pdf-invoices/class-wcj-pdf-invoicing-report-tool.php:245
4929
  msgid "Unexpected error"
@@ -5485,7 +5504,7 @@ msgstr ""
5485
  #: includes/settings/wcj-settings-export.php:81
5486
  #: includes/settings/wcj-settings-export.php:149
5487
  #: includes/settings/wcj-settings-export.php:231
5488
- #: includes/settings/wcj-settings-global-discount.php:58
5489
  #: includes/settings/wcj-settings-product-addons.php:80
5490
  #: includes/settings/wcj-settings-purchase-data.php:84
5491
  #: includes/settings/wcj-settings-shipping-options.php:77
@@ -7158,7 +7177,7 @@ msgstr ""
7158
  #: includes/settings/wcj-settings-export.php:70
7159
  #: includes/settings/wcj-settings-export.php:138
7160
  #: includes/settings/wcj-settings-export.php:220
7161
- #: includes/settings/wcj-settings-global-discount.php:50
7162
  #: includes/settings/wcj-settings-product-by-user.php:149
7163
  #: includes/settings/wcj-settings-products-xml.php:76
7164
  msgid "Enabled"
@@ -7597,7 +7616,8 @@ msgstr ""
7597
  #: includes/settings/wcj-settings-multicurrency.php:162
7598
  #: includes/settings/wcj-settings-order-min-amount.php:69
7599
  #: includes/settings/wcj-settings-price-by-country.php:160
7600
- #: includes/settings/wcj-settings-price-by-user-role.php:98
 
7601
  msgid "Advanced"
7602
  msgstr ""
7603
 
@@ -8161,7 +8181,7 @@ msgstr ""
8161
  #: includes/settings/wcj-settings-my-account.php:209
8162
  #: includes/settings/wcj-settings-order-custom-statuses.php:63
8163
  #: includes/settings/wcj-settings-pdf-invoicing-advanced.php:48
8164
- #: includes/settings/wcj-settings-product-addons.php:274
8165
  #: includes/settings/wcj-settings-product-bookings.php:100
8166
  #: includes/settings/wcj-settings-product-images.php:20
8167
  #: includes/settings/wcj-settings-product-images.php:27
@@ -8280,8 +8300,8 @@ msgstr ""
8280
 
8281
  #: includes/settings/meta-box/wcj-settings-meta-box-multicurrency.php:63
8282
  #: includes/settings/meta-box/wcj-settings-meta-box-price-by-user-role.php:136
8283
- #: includes/settings/wcj-settings-price-by-user-role.php:156
8284
- #: includes/settings/wcj-settings-price-by-user-role.php:225
8285
  msgid "Make Empty Price"
8286
  msgstr ""
8287
 
@@ -8382,7 +8402,7 @@ msgid "Per Product Settings (press Update after changing)"
8382
  msgstr ""
8383
 
8384
  #: includes/settings/meta-box/wcj-settings-meta-box-price-by-user-role.php:113
8385
- #: includes/settings/wcj-settings-price-by-user-role.php:33
8386
  msgid "Multiplier"
8387
  msgstr ""
8388
 
@@ -8425,12 +8445,12 @@ msgstr ""
8425
  #: includes/settings/wcj-settings-general.php:122
8426
  #: includes/settings/wcj-settings-general.php:130
8427
  #: includes/settings/wcj-settings-pdf-invoicing-advanced.php:84
8428
- #: includes/settings/wcj-settings-pdf-invoicing-advanced.php:116
8429
- #: includes/settings/wcj-settings-price-by-user-role.php:56
8430
- #: includes/settings/wcj-settings-price-by-user-role.php:140
8431
  #: includes/settings/wcj-settings-product-add-to-cart.php:131
8432
  #: includes/settings/wcj-settings-product-open-pricing.php:95
8433
- #: includes/settings/wcj-settings-sku.php:283
8434
  msgid "Disable"
8435
  msgstr ""
8436
 
@@ -8555,6 +8575,12 @@ msgstr ""
8555
  msgid "If this field is filled in, monthly settings fields are ignored."
8556
  msgstr ""
8557
 
 
 
 
 
 
 
8558
  #: includes/settings/meta-box/wcj-settings-meta-box-product-images.php:17
8559
  msgid "Replace image with custom HTML on single product page"
8560
  msgstr ""
@@ -8671,20 +8697,20 @@ msgstr ""
8671
 
8672
  #: includes/settings/meta-box/wcj-settings-meta-box-wholesale-price.php:18
8673
  #: includes/settings/wcj-settings-checkout-fees.php:72
8674
- #: includes/settings/wcj-settings-global-discount.php:64
8675
  #: includes/settings/wcj-settings-payment-gateways-fees.php:38
8676
  #: includes/settings/wcj-settings-purchase-data.php:89
8677
- #: includes/settings/wcj-settings-wholesale-price.php:77
8678
  msgid "Percent"
8679
  msgstr ""
8680
 
8681
  #: includes/settings/meta-box/wcj-settings-meta-box-wholesale-price.php:19
8682
  #: includes/settings/wcj-settings-checkout-fees.php:71
8683
- #: includes/settings/wcj-settings-global-discount.php:65
8684
  #: includes/settings/wcj-settings-payment-gateways-fees.php:37
8685
- #: includes/settings/wcj-settings-price-by-user-role.php:32
8686
  #: includes/settings/wcj-settings-purchase-data.php:88
8687
- #: includes/settings/wcj-settings-wholesale-price.php:78
8688
  msgid "Fixed"
8689
  msgstr ""
8690
 
@@ -8697,7 +8723,7 @@ msgid "Enable per Product Levels"
8697
  msgstr ""
8698
 
8699
  #: includes/settings/meta-box/wcj-settings-meta-box-wholesale-price.php:41
8700
- #: includes/settings/wcj-settings-wholesale-price.php:72
8701
  msgid "Discount Type"
8702
  msgstr ""
8703
 
@@ -8727,10 +8753,10 @@ msgstr ""
8727
 
8728
  #: includes/settings/meta-box/wcj-settings-meta-box-wholesale-price.php:72
8729
  #: includes/settings/meta-box/wcj-settings-meta-box-wholesale-price.php:108
8730
- #: includes/settings/wcj-settings-wholesale-price.php:158
8731
- #: includes/settings/wcj-settings-wholesale-price.php:159
8732
- #: includes/settings/wcj-settings-wholesale-price.php:215
8733
- #: includes/settings/wcj-settings-wholesale-price.php:216
8734
  msgid "Discount"
8735
  msgstr ""
8736
 
@@ -9239,7 +9265,7 @@ msgid "Default columns order"
9239
  msgstr ""
9240
 
9241
  #: includes/settings/wcj-settings-admin-products-list.php:27
9242
- #: includes/settings/wcj-settings-price-by-user-role.php:201
9243
  #: includes/settings/wcj-settings-shipping.php:51
9244
  msgid ""
9245
  "Save module's settings after changing this option to see new settings fields."
@@ -9859,7 +9885,7 @@ msgid ""
9859
  msgstr ""
9860
 
9861
  #: includes/settings/wcj-settings-checkout-custom-fields.php:360
9862
- #: includes/settings/wcj-settings-global-discount.php:158
9863
  #: includes/settings/wcj-settings-payment-gateways-fees.php:125
9864
  #: includes/settings/wcj-settings-product-addons.php:149
9865
  #: includes/settings/wcj-settings-related-products.php:244
@@ -9871,7 +9897,7 @@ msgid "Hide this field if there is a selected product in cart."
9871
  msgstr ""
9872
 
9873
  #: includes/settings/wcj-settings-checkout-custom-fields.php:369
9874
- #: includes/settings/wcj-settings-global-discount.php:147
9875
  #: includes/settings/wcj-settings-related-products.php:233
9876
  msgid "Include Products"
9877
  msgstr ""
@@ -10508,8 +10534,8 @@ msgstr ""
10508
  #: includes/settings/wcj-settings-checkout-files-upload.php:298
10509
  #: includes/settings/wcj-settings-checkout-files-upload.php:352
10510
  #: includes/settings/wcj-settings-checkout-files-upload.php:393
10511
- #: includes/settings/wcj-settings-product-addons.php:346
10512
- #: includes/settings/wcj-settings-product-addons.php:377
10513
  msgid "Before"
10514
  msgstr ""
10515
 
@@ -10531,8 +10557,8 @@ msgstr ""
10531
  #: includes/settings/wcj-settings-checkout-files-upload.php:321
10532
  #: includes/settings/wcj-settings-checkout-files-upload.php:367
10533
  #: includes/settings/wcj-settings-checkout-files-upload.php:408
10534
- #: includes/settings/wcj-settings-product-addons.php:361
10535
- #: includes/settings/wcj-settings-product-addons.php:392
10536
  msgid "After"
10537
  msgstr ""
10538
 
@@ -11574,7 +11600,7 @@ msgid "Export Options"
11574
  msgstr ""
11575
 
11576
  #: includes/settings/wcj-settings-export.php:20
11577
- #: includes/settings/wcj-settings-pdf-invoicing-advanced.php:183
11578
  msgid "CSV Separator"
11579
  msgstr ""
11580
 
@@ -11889,7 +11915,7 @@ msgstr ""
11889
  #: includes/settings/wcj-settings-max-products-per-user.php:44
11890
  #: includes/settings/wcj-settings-product-by-date.php:54
11891
  #: includes/settings/wcj-settings-product-by-time.php:54
11892
- #: includes/settings/wcj-settings-wholesale-price.php:23
11893
  msgid "This will add new meta box to each product's edit page."
11894
  msgstr ""
11895
 
@@ -11950,44 +11976,44 @@ msgstr ""
11950
  msgid "seconds."
11951
  msgstr ""
11952
 
11953
- #: includes/settings/wcj-settings-global-discount.php:24
11954
  msgid "Total Groups"
11955
  msgstr ""
11956
 
11957
- #: includes/settings/wcj-settings-global-discount.php:28
11958
  #: includes/settings/wcj-settings-product-by-user.php:138
11959
  #: includes/settings/wcj-settings-products-xml.php:29
11960
  #: includes/shipping/class-wc-shipping-wcj-custom.php:148
11961
  msgid "Press Save changes after you change this number."
11962
  msgstr ""
11963
 
11964
- #: includes/settings/wcj-settings-global-discount.php:45
11965
  msgid "Discount Group"
11966
  msgstr ""
11967
 
11968
- #: includes/settings/wcj-settings-global-discount.php:51
11969
  msgid "Enabled/disables the discount group."
11970
  msgstr ""
11971
 
11972
- #: includes/settings/wcj-settings-global-discount.php:59
11973
  msgid "Can be fixed or percent."
11974
  msgstr ""
11975
 
11976
- #: includes/settings/wcj-settings-global-discount.php:70
11977
  msgid "Must be negative number."
11978
  msgstr ""
11979
 
11980
- #: includes/settings/wcj-settings-global-discount.php:77
11981
  msgid "Final Correction"
11982
  msgstr ""
11983
 
11984
- #: includes/settings/wcj-settings-global-discount.php:78
11985
  #, php-format
11986
  msgid ""
11987
  "Will apply selected function and coefficient to the final price, e.g.: %s."
11988
  msgstr ""
11989
 
11990
- #: includes/settings/wcj-settings-global-discount.php:85
11991
  #: includes/settings/wcj-settings-multicurrency.php:79
11992
  #: includes/settings/wcj-settings-price-by-country.php:83
11993
  #: includes/settings/wcj-settings-product-price-by-formula.php:70
@@ -11995,131 +12021,132 @@ msgstr ""
11995
  msgid "Round"
11996
  msgstr ""
11997
 
11998
- #: includes/settings/wcj-settings-global-discount.php:86
11999
  msgid "Ceil"
12000
  msgstr ""
12001
 
12002
- #: includes/settings/wcj-settings-global-discount.php:87
12003
  msgid "Floor"
12004
  msgstr ""
12005
 
12006
- #: includes/settings/wcj-settings-global-discount.php:91
12007
  msgid "Final correction coefficient"
12008
  msgstr ""
12009
 
12010
- #: includes/settings/wcj-settings-global-discount.php:98
12011
  msgid "Product Scope"
12012
  msgstr ""
12013
 
12014
- #: includes/settings/wcj-settings-global-discount.php:99
12015
  msgid ""
12016
  "Possible values: all products, only products that are already on sale, only "
12017
  "products that are not on sale."
12018
  msgstr ""
12019
 
12020
- #: includes/settings/wcj-settings-global-discount.php:104
12021
  #: includes/settings/wcj-settings-product-add-to-cart.php:65
12022
  #: includes/settings/wcj-settings-products-xml.php:207
12023
  msgid "All products"
12024
  msgstr ""
12025
 
12026
- #: includes/settings/wcj-settings-global-discount.php:105
12027
  msgid "Only products that are already on sale"
12028
  msgstr ""
12029
 
12030
- #: includes/settings/wcj-settings-global-discount.php:106
12031
  #: includes/settings/wcj-settings-products-xml.php:209
12032
  msgid "Only products that are not on sale"
12033
  msgstr ""
12034
 
12035
- #: includes/settings/wcj-settings-global-discount.php:110
12036
  #: includes/settings/wcj-settings-related-products.php:196
12037
  msgid "Include Product Categories"
12038
  msgstr ""
12039
 
12040
- #: includes/settings/wcj-settings-global-discount.php:111
12041
  msgid ""
12042
  "Set this field to apply discount to selected product categories only. Leave "
12043
  "blank to apply to all products."
12044
  msgstr ""
12045
 
12046
- #: includes/settings/wcj-settings-global-discount.php:119
12047
  #: includes/settings/wcj-settings-related-products.php:205
12048
  msgid "Exclude Product Categories"
12049
  msgstr ""
12050
 
12051
- #: includes/settings/wcj-settings-global-discount.php:120
12052
  msgid ""
12053
  "Set this field to NOT apply discount to selected product categories. Leave "
12054
  "blank to apply to all products."
12055
  msgstr ""
12056
 
12057
- #: includes/settings/wcj-settings-global-discount.php:128
12058
  #: includes/settings/wcj-settings-related-products.php:214
12059
  msgid "Include Product Tags"
12060
  msgstr ""
12061
 
12062
- #: includes/settings/wcj-settings-global-discount.php:129
12063
  msgid ""
12064
  "Set this field to apply discount to selected product tags only. Leave blank "
12065
  "to apply to all products."
12066
  msgstr ""
12067
 
12068
- #: includes/settings/wcj-settings-global-discount.php:137
12069
  #: includes/settings/wcj-settings-related-products.php:223
12070
  msgid "Exclude Product Tags"
12071
  msgstr ""
12072
 
12073
- #: includes/settings/wcj-settings-global-discount.php:138
12074
  msgid ""
12075
  "Set this field to NOT apply discount to selected product tags. Leave blank "
12076
  "to apply to all products."
12077
  msgstr ""
12078
 
12079
- #: includes/settings/wcj-settings-global-discount.php:148
12080
  msgid ""
12081
  "Set this field to apply discount to selected products only. Leave blank to "
12082
  "apply to all products."
12083
  msgstr ""
12084
 
12085
- #: includes/settings/wcj-settings-global-discount.php:159
12086
  msgid ""
12087
  "Set this field to NOT apply discount to selected products. Leave blank to "
12088
  "apply to all products."
12089
  msgstr ""
12090
 
12091
- #: includes/settings/wcj-settings-global-discount.php:175
12092
  #: includes/settings/wcj-settings-product-price-by-formula.php:95
12093
  msgid "Advanced Settings"
12094
  msgstr ""
12095
 
12096
- #: includes/settings/wcj-settings-global-discount.php:180
12097
  msgid "Global Discount in Admin"
12098
  msgstr ""
12099
 
12100
- #: includes/settings/wcj-settings-global-discount.php:182
12101
  msgid ""
12102
  "This will enable \"global discount\" product pricing in backend. It will "
12103
  "also affect some modules, e.g.: \"Products XML Feeds\" module."
12104
  msgstr ""
12105
 
12106
- #: includes/settings/wcj-settings-global-discount.php:188
12107
  #: includes/settings/wcj-settings-multicurrency-base-price.php:76
12108
  #: includes/settings/wcj-settings-multicurrency.php:176
12109
  #: includes/settings/wcj-settings-price-by-country.php:165
12110
- #: includes/settings/wcj-settings-price-by-user-role.php:103
 
12111
  #: includes/settings/wcj-settings-product-price-by-formula.php:100
12112
  msgid "Price Filters Priority"
12113
  msgstr ""
12114
 
12115
- #: includes/settings/wcj-settings-global-discount.php:189
12116
  #: includes/settings/wcj-settings-multicurrency-base-price.php:77
12117
  #: includes/settings/wcj-settings-multicurrency.php:177
12118
  #: includes/settings/wcj-settings-price-by-country.php:166
12119
- #: includes/settings/wcj-settings-price-by-user-role.php:104
12120
- #: includes/settings/wcj-settings-product-addons.php:250
12121
  #: includes/settings/wcj-settings-product-price-by-formula.php:101
12122
- #: includes/settings/wcj-settings-wholesale-price.php:121
12123
  msgid ""
12124
  "Priority for all module's price filters. Set to zero to use default priority."
12125
  msgstr ""
@@ -12564,7 +12591,7 @@ msgid "Roles"
12564
  msgstr ""
12565
 
12566
  #: includes/settings/wcj-settings-multicurrency.php:267
12567
- #: includes/settings/wcj-settings-wholesale-price.php:180
12568
  msgid "Save settings after you change this option. Leave blank to disable."
12569
  msgstr ""
12570
 
@@ -14153,67 +14180,79 @@ msgstr ""
14153
  msgid "Returns the content of output buffering instead of displaying it"
14154
  msgstr ""
14155
 
14156
- #: includes/settings/wcj-settings-pdf-invoicing-advanced.php:101
 
 
 
 
 
 
 
 
 
 
 
 
14157
  msgid "Fonts Manager"
14158
  msgstr ""
14159
 
14160
- #: includes/settings/wcj-settings-pdf-invoicing-advanced.php:110
14161
  msgid "Re-download"
14162
  msgstr ""
14163
 
14164
- #: includes/settings/wcj-settings-pdf-invoicing-advanced.php:110
14165
  msgid "Download"
14166
  msgstr ""
14167
 
14168
- #: includes/settings/wcj-settings-pdf-invoicing-advanced.php:115
14169
  msgid "Disable Fonts Download"
14170
  msgstr ""
14171
 
14172
- #: includes/settings/wcj-settings-pdf-invoicing-advanced.php:126
14173
  msgid "General Display Options"
14174
  msgstr ""
14175
 
14176
- #: includes/settings/wcj-settings-pdf-invoicing-advanced.php:131
14177
  msgid "Add PDF Invoices Meta Box to Admin Edit Order Page"
14178
  msgstr ""
14179
 
14180
- #: includes/settings/wcj-settings-pdf-invoicing-advanced.php:138
14181
  msgid "Open docs in new window"
14182
  msgstr ""
14183
 
14184
- #: includes/settings/wcj-settings-pdf-invoicing-advanced.php:144
14185
  msgid "Add editable numbers and dates"
14186
  msgstr ""
14187
 
14188
- #: includes/settings/wcj-settings-pdf-invoicing-advanced.php:154
14189
  msgid "Report Tool Options"
14190
  msgstr ""
14191
 
14192
- #: includes/settings/wcj-settings-pdf-invoicing-advanced.php:159
14193
  msgid "Reports Filename"
14194
  msgstr ""
14195
 
14196
- #: includes/settings/wcj-settings-pdf-invoicing-advanced.php:167
14197
  msgid "Report Columns"
14198
  msgstr ""
14199
 
14200
- #: includes/settings/wcj-settings-pdf-invoicing-advanced.php:168
14201
  msgid "Leave blank to show all columns."
14202
  msgstr ""
14203
 
14204
- #: includes/settings/wcj-settings-pdf-invoicing-advanced.php:176
14205
  msgid "Tax Percent Precision"
14206
  msgstr ""
14207
 
14208
- #: includes/settings/wcj-settings-pdf-invoicing-advanced.php:189
14209
  msgid "CSV UTF-8 BOM"
14210
  msgstr ""
14211
 
14212
- #: includes/settings/wcj-settings-pdf-invoicing-advanced.php:196
14213
  msgid "Replace Periods with Commas in CSV Data"
14214
  msgstr ""
14215
 
14216
- #: includes/settings/wcj-settings-pdf-invoicing-advanced.php:197
14217
  #: includes/settings/wcj-settings-product-open-pricing.php:174
14218
  msgid "Replace"
14219
  msgstr ""
@@ -14400,19 +14439,19 @@ msgid "Counter Width"
14400
  msgstr ""
14401
 
14402
  #: includes/settings/wcj-settings-pdf-invoicing-numbering.php:41
14403
- #: includes/settings/wcj-settings-sku.php:58
14404
- #: includes/settings/wcj-settings-sku.php:178
14405
  msgid "Prefix"
14406
  msgstr ""
14407
 
14408
  #: includes/settings/wcj-settings-pdf-invoicing-numbering.php:47
14409
- #: includes/settings/wcj-settings-sku.php:72
14410
- #: includes/settings/wcj-settings-sku.php:187
14411
  msgid "Suffix"
14412
  msgstr ""
14413
 
14414
  #: includes/settings/wcj-settings-pdf-invoicing-numbering.php:53
14415
- #: includes/settings/wcj-settings-sku.php:101
14416
  msgid "Template"
14417
  msgstr ""
14418
 
@@ -14687,7 +14726,7 @@ msgid ""
14687
  msgstr ""
14688
 
14689
  #: includes/settings/wcj-settings-price-by-country.php:149
14690
- #: includes/settings/wcj-settings-price-by-user-role.php:62
14691
  msgid "Search Engine Bots"
14692
  msgstr ""
14693
 
@@ -14760,124 +14799,116 @@ msgstr ""
14760
  msgid "Multiply Price by"
14761
  msgstr ""
14762
 
14763
- #: includes/settings/wcj-settings-price-by-user-role.php:19
14764
  msgid "Enable per Product Settings"
14765
  msgstr ""
14766
 
14767
- #: includes/settings/wcj-settings-price-by-user-role.php:21
14768
  msgid ""
14769
  "When enabled, this will add new \"Booster: Price based on User Role\" meta "
14770
  "box to each product's edit page."
14771
  msgstr ""
14772
 
14773
- #: includes/settings/wcj-settings-price-by-user-role.php:27
14774
  msgid "Per Product Settings Type"
14775
  msgstr ""
14776
 
14777
- #: includes/settings/wcj-settings-price-by-user-role.php:37
14778
  msgid "Show Roles on per Product Settings"
14779
  msgstr ""
14780
 
14781
- #: includes/settings/wcj-settings-price-by-user-role.php:38
14782
  msgid ""
14783
  "If per product settings are enabled, you can choose which roles to show on "
14784
  "product's edit page. Leave blank to show all roles."
14785
  msgstr ""
14786
 
14787
- #: includes/settings/wcj-settings-price-by-user-role.php:48
14788
  msgid ""
14789
  "When enabled, this will apply user role multipliers to shipping calculations."
14790
  msgstr ""
14791
 
14792
- #: includes/settings/wcj-settings-price-by-user-role.php:54
14793
  msgid "Disable Price based on User Role for Regular Price"
14794
  msgstr ""
14795
 
14796
- #: includes/settings/wcj-settings-price-by-user-role.php:55
14797
  msgid ""
14798
  "Disable price by user role for regular price when using multipliers (global "
14799
  "or per product)."
14800
  msgstr ""
14801
 
14802
- #: includes/settings/wcj-settings-price-by-user-role.php:63
14803
  msgid "Disable Price based on User Role for Bots"
14804
  msgstr ""
14805
 
14806
- #: includes/settings/wcj-settings-price-by-user-role.php:69
14807
  msgid "Show Empty Price Variations"
14808
  msgstr ""
14809
 
14810
- #: includes/settings/wcj-settings-price-by-user-role.php:71
14811
  msgid ""
14812
  "Show \"empty price\" variations. This will also hide out of stock messages."
14813
  msgstr ""
14814
 
14815
- #: includes/settings/wcj-settings-price-by-user-role.php:77
14816
  msgid "Remove Empty Price Variation Callback"
14817
  msgstr ""
14818
 
14819
- #: includes/settings/wcj-settings-price-by-user-role.php:79
14820
  msgid ""
14821
  "Remove \"woocommerce_single_variation\" callback from "
14822
  "\"woocommerce_single_variation\" hook on \"empty price\" variations."
14823
  msgstr ""
14824
 
14825
- #: includes/settings/wcj-settings-price-by-user-role.php:85
14826
  msgid "Remove Empty Price Add to Cart Button Callback"
14827
  msgstr ""
14828
 
14829
- #: includes/settings/wcj-settings-price-by-user-role.php:87
14830
  msgid ""
14831
  "Remove \"woocommerce_single_variation_add_to_cart_button\" callback from "
14832
  "\"woocommerce_single_variation\" hook on \"empty price\" variations."
14833
  msgstr ""
14834
 
14835
- #: includes/settings/wcj-settings-price-by-user-role.php:110
14836
  msgid "Price Changes"
14837
  msgstr ""
14838
 
14839
- #: includes/settings/wcj-settings-price-by-user-role.php:111
14840
  msgid "Disable price based on user role for products with \"Price Changes\""
14841
  msgstr ""
14842
 
14843
- #: includes/settings/wcj-settings-price-by-user-role.php:112
14844
  #: includes/settings/wcj-settings-product-open-pricing.php:149
14845
- #: includes/settings/wcj-settings-wholesale-price.php:114
14846
  msgid ""
14847
  "Try enabling this checkbox, if you are having compatibility issues with "
14848
  "other plugins."
14849
  msgstr ""
14850
 
14851
- #: includes/settings/wcj-settings-price-by-user-role.php:118
14852
- msgid "WPML: Get Terms in All Languages"
14853
- msgstr ""
14854
-
14855
- #: includes/settings/wcj-settings-price-by-user-role.php:120
14856
- msgid "Get tags and taxonomies in all languages"
14857
- msgstr ""
14858
-
14859
- #: includes/settings/wcj-settings-price-by-user-role.php:132
14860
  msgid "Roles & Multipliers"
14861
  msgstr ""
14862
 
14863
- #: includes/settings/wcj-settings-price-by-user-role.php:139
14864
  msgid "Disable Price based on User Role for Products on Sale"
14865
  msgstr ""
14866
 
14867
- #: includes/settings/wcj-settings-price-by-user-role.php:171
14868
  msgid "Products Categories"
14869
  msgstr ""
14870
 
14871
- #: includes/settings/wcj-settings-price-by-user-role.php:177
14872
  msgid "Products Tags"
14873
  msgstr ""
14874
 
14875
- #: includes/settings/wcj-settings-price-by-user-role.php:195
14876
  #, php-format
14877
  msgid "Price based on User Role by %s"
14878
  msgstr ""
14879
 
14880
- #: includes/settings/wcj-settings-price-by-user-role.php:218
14881
  msgid ""
14882
  "Multiplier is ignored if set to negative number (e.g.: -1). Global "
14883
  "multiplier will be used instead."
@@ -15326,33 +15357,27 @@ msgstr ""
15326
  msgid "Set to zero to use the default priority."
15327
  msgstr ""
15328
 
15329
- #: includes/settings/wcj-settings-product-addons.php:226
15330
- msgid "Advanced: Apply Price Filter"
15331
  msgstr ""
15332
 
15333
- #: includes/settings/wcj-settings-product-addons.php:231
15334
  msgid "By module"
15335
  msgstr ""
15336
 
15337
- #: includes/settings/wcj-settings-product-addons.php:237
15338
  msgid ""
15339
  "If you have selected \"By module\" for \"Advanced: Apply Price Filter\" "
15340
  "option, you can set which modules to apply here. Leave empty to apply all "
15341
  "modules."
15342
  msgstr ""
15343
 
15344
- #: includes/settings/wcj-settings-product-addons.php:249
15345
- #: includes/settings/wcj-settings-wholesale-price.php:120
15346
- msgid "Advanced: Price Filters Priority"
15347
- msgstr ""
15348
-
15349
- #: includes/settings/wcj-settings-product-addons.php:256
15350
- #: includes/settings/wcj-settings-product-bookings.php:106
15351
- #: includes/settings/wcj-settings-product-open-pricing.php:139
15352
- msgid "Advanced: Check for Outputted Data"
15353
  msgstr ""
15354
 
15355
- #: includes/settings/wcj-settings-product-addons.php:258
15356
  #: includes/settings/wcj-settings-product-bookings.php:108
15357
  #: includes/settings/wcj-settings-product-input-fields.php:355
15358
  #: includes/settings/wcj-settings-product-open-pricing.php:141
@@ -15361,56 +15386,66 @@ msgid ""
15361
  "on frontend twice. Disable if you see no data outputted."
15362
  msgstr ""
15363
 
15364
- #: includes/settings/wcj-settings-product-addons.php:268
 
 
 
 
 
 
 
 
 
 
15365
  msgid "Frontend Templates"
15366
  msgstr ""
15367
 
15368
- #: includes/settings/wcj-settings-product-addons.php:273
15369
  msgid "Hide Percentage Price"
15370
  msgstr ""
15371
 
15372
- #: includes/settings/wcj-settings-product-addons.php:275
15373
  msgid "Hide percentage price when % is set on prices"
15374
  msgstr ""
15375
 
15376
- #: includes/settings/wcj-settings-product-addons.php:281
15377
  msgid "Each Addon - Title"
15378
  msgstr ""
15379
 
15380
- #: includes/settings/wcj-settings-product-addons.php:289
15381
  msgid "Each Addon - Type: Checkbox"
15382
  msgstr ""
15383
 
15384
- #: includes/settings/wcj-settings-product-addons.php:297
15385
  msgid "Each Addon - Type: Text"
15386
  msgstr ""
15387
 
15388
- #: includes/settings/wcj-settings-product-addons.php:305
15389
  msgid "Each Addon - Type: Select Box"
15390
  msgstr ""
15391
 
15392
- #: includes/settings/wcj-settings-product-addons.php:313
15393
  msgid "Each Addon - Type: Select Box (Each Option)"
15394
  msgstr ""
15395
 
15396
- #: includes/settings/wcj-settings-product-addons.php:321
15397
  msgid "Each Addon - Type: Radio Button (Each)"
15398
  msgstr ""
15399
 
15400
- #: includes/settings/wcj-settings-product-addons.php:329
15401
  msgid "All Addons - Final"
15402
  msgstr ""
15403
 
15404
- #: includes/settings/wcj-settings-product-addons.php:341
15405
  msgid "Cart Template"
15406
  msgstr ""
15407
 
15408
- #: includes/settings/wcj-settings-product-addons.php:353
15409
- #: includes/settings/wcj-settings-product-addons.php:384
15410
  msgid "Each Addon"
15411
  msgstr ""
15412
 
15413
- #: includes/settings/wcj-settings-product-addons.php:372
15414
  msgid "Order Details Table Template"
15415
  msgstr ""
15416
 
@@ -15461,6 +15496,11 @@ msgstr ""
15461
  msgid "Hide Quantity Selector for Bookings Products"
15462
  msgstr ""
15463
 
 
 
 
 
 
15464
  #: includes/settings/wcj-settings-product-bookings.php:118
15465
  msgid "Datepicker Options"
15466
  msgstr ""
@@ -15645,6 +15685,10 @@ msgstr ""
15645
  msgid "Leave blank to use the default date format."
15646
  msgstr ""
15647
 
 
 
 
 
15648
  #: includes/settings/wcj-settings-product-by-date.php:72
15649
  #: includes/settings/wcj-settings-product-by-time.php:64
15650
  msgid "Frontend Messages Options"
@@ -15836,7 +15880,7 @@ msgid "Inside product title"
15836
  msgstr ""
15837
 
15838
  #: includes/settings/wcj-settings-product-custom-info.php:130
15839
- #: includes/settings/wcj-settings-wholesale-price.php:95
15840
  msgid "Product Categories to Include"
15841
  msgstr ""
15842
 
@@ -15850,7 +15894,7 @@ msgid "Leave blank to disable the option."
15850
  msgstr ""
15851
 
15852
  #: includes/settings/wcj-settings-product-custom-info.php:138
15853
- #: includes/settings/wcj-settings-wholesale-price.php:104
15854
  msgid "Product Categories to Exclude"
15855
  msgstr ""
15856
 
@@ -15864,13 +15908,13 @@ msgstr ""
15864
 
15865
  #: includes/settings/wcj-settings-product-custom-info.php:162
15866
  #: includes/settings/wcj-settings-products-xml.php:147
15867
- #: includes/settings/wcj-settings-wholesale-price.php:82
15868
  msgid "Products to Include"
15869
  msgstr ""
15870
 
15871
  #: includes/settings/wcj-settings-product-custom-info.php:170
15872
  #: includes/settings/wcj-settings-products-xml.php:157
15873
- #: includes/settings/wcj-settings-wholesale-price.php:89
15874
  msgid "Products to Exclude"
15875
  msgstr ""
15876
 
@@ -16095,8 +16139,8 @@ msgstr ""
16095
  #: includes/settings/wcj-settings-product-input-fields.php:145
16096
  #: includes/settings/wcj-settings-product-input-fields.php:157
16097
  #: includes/settings/wcj-settings-product-input-fields.php:169
16098
- #: includes/settings/wcj-settings-wholesale-price.php:83
16099
- #: includes/settings/wcj-settings-wholesale-price.php:96
16100
  msgid "Leave blank to include all products."
16101
  msgstr ""
16102
 
@@ -16228,10 +16272,6 @@ msgid ""
16228
  "Preserves line breaks on admin, making some inputs like textarea more legible"
16229
  msgstr ""
16230
 
16231
- #: includes/settings/wcj-settings-product-input-fields.php:353
16232
- msgid "Check for Outputted Data"
16233
- msgstr ""
16234
-
16235
  #: includes/settings/wcj-settings-product-input-fields.php:361
16236
  msgid "Strip Slashes"
16237
  msgstr ""
@@ -16483,7 +16523,7 @@ msgid "Allow price entering in switched currency"
16483
  msgstr ""
16484
 
16485
  #: includes/settings/wcj-settings-product-open-pricing.php:147
16486
- #: includes/settings/wcj-settings-wholesale-price.php:112
16487
  msgid "Advanced: Price Changes"
16488
  msgstr ""
16489
 
@@ -16826,14 +16866,27 @@ msgid "Template - After Form"
16826
  msgstr ""
16827
 
16828
  #: includes/settings/wcj-settings-products-per-page.php:75
16829
- msgid "Saving Method"
 
16830
  msgstr ""
16831
 
16832
  #: includes/settings/wcj-settings-products-per-page.php:80
16833
- msgid "Cookie"
16834
  msgstr ""
16835
 
16836
  #: includes/settings/wcj-settings-products-per-page.php:81
 
 
 
 
 
 
 
 
 
 
 
 
16837
  msgid "Session"
16838
  msgstr ""
16839
 
@@ -17079,7 +17132,7 @@ msgid ""
17079
  msgstr ""
17080
 
17081
  #: includes/settings/wcj-settings-purchase-data.php:190
17082
- #: includes/settings/wcj-settings-sku.php:210
17083
  #: includes/settings/wcj-settings-stock.php:199
17084
  msgid "More Options"
17085
  msgstr ""
@@ -17677,87 +17730,95 @@ msgstr ""
17677
  msgid "From product ID"
17678
  msgstr ""
17679
 
17680
- #: includes/settings/wcj-settings-sku.php:31
17681
- msgid "Number generation method."
17682
  msgstr ""
17683
 
17684
  #: includes/settings/wcj-settings-sku.php:32
17685
- msgid "Possible values: from product ID, sequential or pseudorandom."
17686
  msgstr ""
17687
 
17688
- #: includes/settings/wcj-settings-sku.php:37
17689
- msgid "Sequential Number Generation - Counter"
 
 
 
 
17690
  msgstr ""
17691
 
17692
  #: includes/settings/wcj-settings-sku.php:38
 
 
 
 
17693
  msgid ""
17694
  "If you choose to use sequential number inside SKU, you can set current "
17695
  "sequential number counter here."
17696
  msgstr ""
17697
 
17698
- #: includes/settings/wcj-settings-sku.php:49
17699
  msgid "Sequential Number Generation - By Category"
17700
  msgstr ""
17701
 
17702
- #: includes/settings/wcj-settings-sku.php:50
17703
  msgid "Enables sequential number generation by category."
17704
  msgstr ""
17705
 
17706
- #: includes/settings/wcj-settings-sku.php:59
17707
  msgid "SKU prefix."
17708
  msgstr ""
17709
 
17710
- #: includes/settings/wcj-settings-sku.php:65
17711
  msgid "Minimum Number Length"
17712
  msgstr ""
17713
 
17714
- #: includes/settings/wcj-settings-sku.php:66
17715
  msgid "Minimum length for SKU number part."
17716
  msgstr ""
17717
 
17718
- #: includes/settings/wcj-settings-sku.php:73
17719
  msgid "SKU suffix."
17720
  msgstr ""
17721
 
17722
- #: includes/settings/wcj-settings-sku.php:79
17723
  msgid "Attributes Separator"
17724
  msgstr ""
17725
 
17726
- #: includes/settings/wcj-settings-sku.php:80
17727
  #, php-format
17728
  msgid "Used in %s, %s, %s and %s."
17729
  msgstr ""
17730
 
17731
- #: includes/settings/wcj-settings-sku.php:90
17732
  msgid "Characters Case"
17733
  msgstr ""
17734
 
17735
- #: includes/settings/wcj-settings-sku.php:95
17736
  msgid "Original (no changes)"
17737
  msgstr ""
17738
 
17739
- #: includes/settings/wcj-settings-sku.php:96
17740
  msgid "Convert to lowercase"
17741
  msgstr ""
17742
 
17743
- #: includes/settings/wcj-settings-sku.php:97
17744
  msgid "Convert to uppercase"
17745
  msgstr ""
17746
 
17747
- #: includes/settings/wcj-settings-sku.php:102
17748
  msgid "SKU template."
17749
  msgstr ""
17750
 
17751
- #: includes/settings/wcj-settings-sku.php:118
17752
  #, php-format
17753
  msgid "You can also use shortcodes here, e.g.: %s etc."
17754
  msgstr ""
17755
 
17756
- #: includes/settings/wcj-settings-sku.php:128
17757
  msgid "Variable Products Variations"
17758
  msgstr ""
17759
 
17760
- #: includes/settings/wcj-settings-sku.php:129
17761
  msgid ""
17762
  "SKU generation for variations. Please note, that if \"Generate SKU for New "
17763
  "Products Only on First Publish\" option below is not checked, then on new "
@@ -17766,136 +17827,185 @@ msgid ""
17766
  "\"Autogenerate SKUs\" tool manually."
17767
  msgstr ""
17768
 
17769
- #: includes/settings/wcj-settings-sku.php:130
17770
  msgid ""
17771
  "Possible values: SKU same as parent's product; Generate different SKU for "
17772
  "each variation; SKU same as parent's product + variation letter suffix."
17773
  msgstr ""
17774
 
17775
- #: includes/settings/wcj-settings-sku.php:135
17776
  msgid "SKU same as parent's product"
17777
  msgstr ""
17778
 
17779
- #: includes/settings/wcj-settings-sku.php:136
17780
  msgid "Generate different SKU for each variation"
17781
  msgstr ""
17782
 
17783
- #: includes/settings/wcj-settings-sku.php:137
17784
  msgid "SKU same as parent's product + variation letter suffix"
17785
  msgstr ""
17786
 
17787
- #: includes/settings/wcj-settings-sku.php:149
17788
- msgid "Categories Options"
 
 
 
 
17789
  msgstr ""
17790
 
17791
  #: includes/settings/wcj-settings-sku.php:154
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
17792
  msgid "Multiple Categories"
17793
  msgstr ""
17794
 
17795
- #: includes/settings/wcj-settings-sku.php:155
17796
  msgid ""
17797
  "This options defines how to handle category prefixes and suffixes, if "
17798
  "product has multiple categories."
17799
  msgstr ""
17800
 
17801
- #: includes/settings/wcj-settings-sku.php:160
17802
  msgid "Use first category"
17803
  msgstr ""
17804
 
17805
- #: includes/settings/wcj-settings-sku.php:161
17806
  msgid "\"Glue\" categories"
17807
  msgstr ""
17808
 
17809
- #: includes/settings/wcj-settings-sku.php:165
17810
  msgid "Category separator (i.e. \"glue\")"
17811
  msgstr ""
17812
 
17813
- #: includes/settings/wcj-settings-sku.php:166
17814
  msgid "Ignored if \"Use first category\" is selected above."
17815
  msgstr ""
17816
 
17817
- #: includes/settings/wcj-settings-sku.php:194
17818
  msgid "Counter (Sequential)"
17819
  msgstr ""
17820
 
17821
- #: includes/settings/wcj-settings-sku.php:215
17822
  msgid "Automatically Generate SKU for New Products"
17823
  msgstr ""
17824
 
17825
- #: includes/settings/wcj-settings-sku.php:217
17826
  msgid "Alternatively you can use Autogenerate SKUs tool."
17827
  msgstr ""
17828
 
17829
- #: includes/settings/wcj-settings-sku.php:223
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
17830
  msgid "Generate SKU for New Products Only on First Publish"
17831
  msgstr ""
17832
 
17833
- #: includes/settings/wcj-settings-sku.php:225
17834
  msgid ""
17835
  "This is important if, for example, you are using category prefix and don't "
17836
  "want SKU generated too early, before you set the category."
17837
  msgstr ""
17838
 
17839
- #: includes/settings/wcj-settings-sku.php:231
17840
  msgid "Allow Duplicate SKUs"
17841
  msgstr ""
17842
 
17843
- #: includes/settings/wcj-settings-sku.php:233
17844
  msgid ""
17845
  "If you wish to set SKUs manually, and you need to have same SKUs for "
17846
  "different products, you can enable allow duplicate SKUs option here (which "
17847
  "is disabled in WooCommerce by default)."
17848
  msgstr ""
17849
 
17850
- #: includes/settings/wcj-settings-sku.php:239
17851
  msgid "Search by SKU"
17852
  msgstr ""
17853
 
17854
- #: includes/settings/wcj-settings-sku.php:241
17855
  msgid "Add product searching by SKU on frontend."
17856
  msgstr ""
17857
 
17858
- #: includes/settings/wcj-settings-sku.php:247
17859
  msgid "Advanced: Search by SKU Hook"
17860
  msgstr ""
17861
 
17862
- #: includes/settings/wcj-settings-sku.php:248
17863
  msgid ""
17864
  "If you are experiencing any issues with searching by SKU, try changing this "
17865
  "option."
17866
  msgstr ""
17867
 
17868
- #: includes/settings/wcj-settings-sku.php:258
17869
  msgid "Generate SKUs Only for Products with Empty SKU"
17870
  msgstr ""
17871
 
17872
- #: includes/settings/wcj-settings-sku.php:260
17873
  msgid ""
17874
  "This may help if you are going to use Autogenerate SKUs tool, but don't want "
17875
  "to change your existing SKUs."
17876
  msgstr ""
17877
 
17878
- #: includes/settings/wcj-settings-sku.php:266
17879
  msgid "Add SKU to Customer Emails"
17880
  msgstr ""
17881
 
17882
- #: includes/settings/wcj-settings-sku.php:268
17883
  msgid "Adds product SKU to customer's emails."
17884
  msgstr ""
17885
 
17886
- #: includes/settings/wcj-settings-sku.php:274
17887
  msgid "Remove SKU from Admin Emails"
17888
  msgstr ""
17889
 
17890
- #: includes/settings/wcj-settings-sku.php:276
17891
  msgid "Removes product SKU from admin's emails."
17892
  msgstr ""
17893
 
17894
- #: includes/settings/wcj-settings-sku.php:282
17895
  msgid "Disable SKUs"
17896
  msgstr ""
17897
 
17898
- #: includes/settings/wcj-settings-sku.php:284
17899
  msgid ""
17900
  "Enable this option if you are not going to use SKUs in your shop at all."
17901
  msgstr ""
@@ -18422,92 +18532,96 @@ msgstr ""
18422
  msgid "Automatically add coupon's products to the cart"
18423
  msgstr ""
18424
 
18425
- #: includes/settings/wcj-settings-wholesale-price.php:17
18426
  #, php-format
18427
  msgid "If you want to display prices table on frontend, use %s shortcode."
18428
  msgstr ""
18429
 
18430
- #: includes/settings/wcj-settings-wholesale-price.php:22
18431
  msgid "Enable per Product"
18432
  msgstr ""
18433
 
18434
- #: includes/settings/wcj-settings-wholesale-price.php:30
18435
  msgid "Quantity Calculation"
18436
  msgstr ""
18437
 
18438
- #: includes/settings/wcj-settings-wholesale-price.php:35
18439
  msgid "Product quantity"
18440
  msgstr ""
18441
 
18442
- #: includes/settings/wcj-settings-wholesale-price.php:36
18443
  msgid "Total cart quantity (wholesale products only)"
18444
  msgstr ""
18445
 
18446
- #: includes/settings/wcj-settings-wholesale-price.php:37
18447
  msgid "Total cart quantity"
18448
  msgstr ""
18449
 
18450
- #: includes/settings/wcj-settings-wholesale-price.php:41
18451
  msgid "Exclusive Use Only"
18452
  msgstr ""
18453
 
18454
- #: includes/settings/wcj-settings-wholesale-price.php:43
18455
  msgid "Apply wholesale discount only if no other cart discounts were applied."
18456
  msgstr ""
18457
 
18458
- #: includes/settings/wcj-settings-wholesale-price.php:49
18459
  msgid "Round Single Product Price"
18460
  msgstr ""
18461
 
18462
- #: includes/settings/wcj-settings-wholesale-price.php:50
18463
  msgid ""
18464
  "If enabled will round single product price with precision set in WooCommerce "
18465
  "> Settings > General > Number of decimals."
18466
  msgstr ""
18467
 
18468
- #: includes/settings/wcj-settings-wholesale-price.php:57
18469
  msgid "Discount Info on Cart Page"
18470
  msgstr ""
18471
 
18472
- #: includes/settings/wcj-settings-wholesale-price.php:64
18473
  msgid "If show discount info on cart page is enabled, set format here."
18474
  msgstr ""
18475
 
18476
- #: includes/settings/wcj-settings-wholesale-price.php:113
18477
  msgid "Disable wholesale pricing for products with \"Price Changes\""
18478
  msgstr ""
18479
 
18480
- #: includes/settings/wcj-settings-wholesale-price.php:131
18481
- msgid "Wholesale Levels Options"
18482
  msgstr ""
18483
 
18484
  #: includes/settings/wcj-settings-wholesale-price.php:136
18485
- #: includes/settings/wcj-settings-wholesale-price.php:193
 
 
 
 
18486
  msgid "Number of Levels"
18487
  msgstr ""
18488
 
18489
- #: includes/settings/wcj-settings-wholesale-price.php:150
18490
- #: includes/settings/wcj-settings-wholesale-price.php:207
18491
  msgid "Min Quantity"
18492
  msgstr ""
18493
 
18494
- #: includes/settings/wcj-settings-wholesale-price.php:151
18495
- #: includes/settings/wcj-settings-wholesale-price.php:208
18496
  msgid "Minimum quantity to apply discount"
18497
  msgstr ""
18498
 
18499
- #: includes/settings/wcj-settings-wholesale-price.php:173
18500
  msgid "Additional User Roles Options"
18501
  msgstr ""
18502
 
18503
- #: includes/settings/wcj-settings-wholesale-price.php:175
18504
  msgid ""
18505
  "If you want to set different wholesale pricing options for different user "
18506
  "roles, fill this section. Please note that you can also use Booster's "
18507
  "\"Price based on User Role\" module without filling this section."
18508
  msgstr ""
18509
 
18510
- #: includes/settings/wcj-settings-wholesale-price.php:179
18511
  msgid "User Roles Settings"
18512
  msgstr ""
18513
 
@@ -18925,10 +19039,6 @@ msgstr ""
18925
  msgid "Link list"
18926
  msgstr ""
18927
 
18928
- #: includes/widgets/class-wcj-widget-multicurrency.php:88
18929
- msgid "Form Method"
18930
- msgstr ""
18931
-
18932
  #: includes/widgets/class-wcj-widget-multicurrency.php:89
18933
  msgid "HTML form method for \"Drop down\" and \"Radio list\" types."
18934
  msgstr ""
43
  #: includes/class-wcj-payment-gateways.php:91
44
  #: includes/class-wcj-track-users.php:163
45
  #: includes/class-wcj-track-users.php:251
46
+ #: includes/classes/class-wcj-module.php:532
47
+ #: includes/classes/class-wcj-module.php:732
48
  #: includes/settings/wcj-settings-price-by-country.php:178
49
  msgid "Booster"
50
  msgstr ""
187
 
188
  #: includes/admin/class-wc-settings-jetpack.php:416
189
  #: includes/class-wcj-admin-bar.php:172
190
+ #: includes/classes/class-wcj-module.php:872
191
  msgid "Documentation"
192
  msgstr ""
193
 
242
 
243
  #: includes/admin/class-wc-settings-jetpack.php:486
244
  #: includes/class-wcj-global-discount.php:27
245
+ #: includes/settings/wcj-settings-product-addons.php:254
246
  msgid "Global Discount"
247
  msgstr ""
248
 
515
 
516
  #: includes/class-wcj-admin-bar.php:245 includes/class-wcj-admin-bar.php:288
517
  #: includes/class-wcj-admin-bar.php:632
518
+ #: includes/classes/class-wcj-module.php:705
519
  #: includes/settings/wcj-settings-wpml.php:82
520
  msgid "Tools"
521
  msgstr ""
652
 
653
  #: includes/class-wcj-admin-bar.php:478
654
  #: includes/class-wcj-product-bulk-price-converter.php:149
655
+ #: includes/class-wcj-sku.php:669
656
  #: includes/export/class-wcj-fields-helper.php:318
657
  #: includes/settings/wcj-settings-product-by-user.php:19
658
  #: includes/shortcodes/class-wcj-shortcodes-products-add-form.php:182
716
  #: includes/settings/wcj-settings-checkout-custom-fields.php:193
717
  #: includes/settings/wcj-settings-checkout-custom-info.php:57
718
  #: includes/settings/wcj-settings-left-to-free-shipping.php:115
719
+ #: includes/settings/wcj-settings-price-by-user-role.php:45
720
  msgid "Shipping"
721
  msgstr ""
722
 
886
  #: includes/class-wcj-admin-tools.php:265
887
  #: includes/class-wcj-product-bulk-meta-editor.php:339
888
  #: includes/class-wcj-product-bulk-price-converter.php:148
889
+ #: includes/class-wcj-sku.php:668
890
  #: includes/reports/wcj-class-reports-sales.php:197
891
  #: includes/reports/wcj-class-reports-stock.php:269
892
  msgid "Product"
1102
  #: includes/class-wcj-checkout-files-upload.php:746
1103
  #: includes/class-wcj-checkout-files-upload.php:747
1104
  #: includes/settings/wcj-settings-checkout-files-upload.php:103
1105
+ #: includes/settings/wcj-settings-price-by-user-role.php:77
1106
+ #: includes/settings/wcj-settings-price-by-user-role.php:85
1107
  #: includes/settings/wcj-settings-product-open-pricing.php:166
1108
+ #: includes/settings/wcj-settings-sku.php:317
1109
  #: includes/settings/wcj-settings-sorting.php:144
1110
  #: includes/settings/wcj-settings-stock.php:206
1111
  msgid "Remove"
1869
  msgstr ""
1870
 
1871
  #: includes/class-wcj-general.php:218 includes/class-wcj-general.php:233
1872
+ #: includes/class-wcj-sku.php:667
1873
  #: includes/reports/wcj-class-reports-sales.php:196
1874
  #: includes/settings/wcj-settings-cross-sells.php:43
1875
  #: includes/settings/wcj-settings-order-numbers.php:150
1894
 
1895
  #: includes/class-wcj-general.php:218
1896
  #: includes/class-wcj-product-by-user.php:197
1897
+ #: includes/settings/wcj-settings-pdf-invoicing-advanced.php:114
1898
  #: includes/tools/class-wcj-order-statuses-tool.php:145
1899
  #: includes/tools/class-wcj-order-statuses-tool.php:221
1900
  msgid "Actions"
1937
  #: includes/settings/wcj-settings-order-min-amount.php:53
1938
  #: includes/settings/wcj-settings-orders.php:132
1939
  #: includes/settings/wcj-settings-orders.php:159
1940
+ #: includes/settings/wcj-settings-pdf-invoicing-advanced.php:139
1941
+ #: includes/settings/wcj-settings-pdf-invoicing-advanced.php:197
1942
  #: includes/settings/wcj-settings-product-by-condition.php:107
1943
  #: includes/settings/wcj-settings-product-by-user.php:114
1944
  #: includes/settings/wcj-settings-product-open-pricing.php:123
1947
  #: includes/settings/wcj-settings-purchase-data.php:154
1948
  #: includes/settings/wcj-settings-purchase-data.php:173
1949
  #: includes/settings/wcj-settings-purchase-data.php:180
1950
+ #: includes/settings/wcj-settings-sku.php:282
1951
+ #: includes/settings/wcj-settings-sku.php:309
1952
  #: includes/shortcodes/class-wcj-shortcodes-products-add-form.php:422
1953
  #: includes/tools/class-wcj-order-statuses-tool.php:236
1954
  msgid "Add"
2057
  msgstr ""
2058
 
2059
  #: includes/class-wcj-multicurrency-product-base-price.php:25
2060
+ #: includes/settings/wcj-settings-product-addons.php:252
2061
  msgid "Multicurrency Product Base Price"
2062
  msgstr ""
2063
 
2066
  msgstr ""
2067
 
2068
  #: includes/class-wcj-multicurrency.php:30
2069
+ #: includes/settings/wcj-settings-product-addons.php:253
2070
  msgid "Multicurrency (Currency Switcher)"
2071
  msgstr ""
2072
 
2165
  #: includes/class-wcj-product-by-user.php:206
2166
  #: includes/class-wcj-purchase-data.php:94
2167
  #: includes/class-wcj-track-users.php:334
2168
+ #: includes/classes/class-wcj-module.php:841
2169
  #: includes/functions/wcj-functions-general.php:189
2170
  #: includes/functions/wcj-functions-html.php:117
2171
  #: includes/reports/wcj-class-reports-monthly-sales.php:351
2644
  "payment gateway."
2645
  msgstr ""
2646
 
2647
+ #: includes/class-wcj-payment-gateways-min-max.php:32
2648
  msgid "Gateways Min/Max Amounts"
2649
  msgstr ""
2650
 
2651
+ #: includes/class-wcj-payment-gateways-min-max.php:33
2652
  msgid "Add min/max amounts for payment gateways to show up."
2653
  msgstr ""
2654
 
2655
+ #: includes/class-wcj-payment-gateways-min-max.php:87
2656
  #: includes/settings/wcj-settings-payment-gateways-min-max.php:37
2657
  msgid "Minimum amount for %gateway_title% is %min_amount%"
2658
  msgstr ""
2659
 
2660
+ #: includes/class-wcj-payment-gateways-min-max.php:88
2661
  #: includes/settings/wcj-settings-payment-gateways-min-max.php:45
2662
  msgid "Maximum amount for %gateway_title% is %max_amount%"
2663
  msgstr ""
2784
  msgid "Display products prices by user roles."
2785
  msgstr ""
2786
 
2787
+ #: includes/class-wcj-price-by-user-role.php:103
2788
  msgid "user roles & variations"
2789
  msgstr ""
2790
 
2791
+ #: includes/class-wcj-price-by-user-role.php:107
2792
  msgid "variations"
2793
  msgstr ""
2794
 
2795
+ #: includes/class-wcj-price-by-user-role.php:111
2796
  msgid "user roles"
2797
  msgstr ""
2798
 
2799
+ #: includes/class-wcj-price-by-user-role.php:124
2800
  #, php-format
2801
  msgid "Copy price to all %s"
2802
  msgstr ""
2803
 
2804
+ #: includes/class-wcj-price-by-user-role.php:204
2805
  msgid ""
2806
  "Booster: Free plugin's version is limited to only one price by user role per "
2807
  "products settings product enabled at a time. You will need to get <a href="
2849
  #: includes/class-wcj-product-info.php:235
2850
  #: includes/class-wcj-shipping-by-products.php:195
2851
  #: includes/class-wcj-shipping-options.php:121
2852
+ #: includes/classes/class-wcj-module.php:151
2853
+ #: includes/classes/class-wcj-module.php:172
2854
  #: includes/settings/meta-box/wcj-settings-meta-box-product-add-to-cart.php:68
2855
  #: includes/settings/meta-box/wcj-settings-meta-box-product-addons.php:73
2856
  #: includes/settings/meta-box/wcj-settings-meta-box-related-products.php:19
2914
  #: includes/settings/wcj-settings-general.php:73
2915
  #: includes/settings/wcj-settings-general.php:146
2916
  #: includes/settings/wcj-settings-general.php:197
2917
+ #: includes/settings/wcj-settings-global-discount.php:57
2918
+ #: includes/settings/wcj-settings-global-discount.php:186
2919
  #: includes/settings/wcj-settings-left-to-free-shipping.php:28
2920
  #: includes/settings/wcj-settings-left-to-free-shipping.php:57
2921
  #: includes/settings/wcj-settings-left-to-free-shipping.php:91
2971
  #: includes/settings/wcj-settings-price-by-country.php:106
2972
  #: includes/settings/wcj-settings-price-by-country.php:133
2973
  #: includes/settings/wcj-settings-price-by-country.php:142
2974
+ #: includes/settings/wcj-settings-price-by-user-role.php:19
2975
+ #: includes/settings/wcj-settings-price-by-user-role.php:46
 
2976
  #: includes/settings/wcj-settings-price-formats.php:21
2977
  #: includes/settings/wcj-settings-price-labels.php:23
2978
  #: includes/settings/wcj-settings-product-add-to-cart.php:25
2990
  #: includes/settings/wcj-settings-product-addons.php:50
2991
  #: includes/settings/wcj-settings-product-addons.php:74
2992
  #: includes/settings/wcj-settings-product-addons.php:179
2993
+ #: includes/settings/wcj-settings-product-addons.php:266
2994
+ #: includes/settings/wcj-settings-product-addons.php:274
2995
  #: includes/settings/wcj-settings-product-bookings.php:107
2996
  #: includes/settings/wcj-settings-product-bulk-meta-editor.php:21
2997
  #: includes/settings/wcj-settings-product-bulk-meta-editor.php:29
3047
  #: includes/settings/wcj-settings-shipping-time.php:31
3048
  #: includes/settings/wcj-settings-shipping-time.php:40
3049
  #: includes/settings/wcj-settings-shipping.php:24
3050
+ #: includes/settings/wcj-settings-sku.php:52
3051
+ #: includes/settings/wcj-settings-sku.php:250
3052
+ #: includes/settings/wcj-settings-sku.php:258
3053
+ #: includes/settings/wcj-settings-sku.php:266
3054
+ #: includes/settings/wcj-settings-sku.php:274
3055
+ #: includes/settings/wcj-settings-sku.php:301
3056
  #: includes/settings/wcj-settings-stock.php:27
3057
  #: includes/settings/wcj-settings-stock.php:64
3058
  #: includes/settings/wcj-settings-stock.php:94
3061
  #: includes/settings/wcj-settings-stock.php:154
3062
  #: includes/settings/wcj-settings-track-users.php:47
3063
  #: includes/settings/wcj-settings-upsells.php:81
3064
+ #: includes/settings/wcj-settings-wholesale-price.php:27
3065
+ #: includes/settings/wcj-settings-wholesale-price.php:45
3066
+ #: includes/settings/wcj-settings-wholesale-price.php:54
3067
  #: includes/settings/wcj-settings-wpml.php:28
3068
  #: includes/settings/wcj-settings-wpml.php:35
3069
  #: includes/settings/wcj-settings-wpml.php:53
3167
  msgid "Add (paid/free/discount) addons to products."
3168
  msgstr ""
3169
 
3170
+ #: includes/class-wcj-product-addons.php:283
3171
  msgid "Some of the required addons are not selected!"
3172
  msgstr ""
3173
 
3174
+ #: includes/class-wcj-product-addons.php:298
3175
  msgid ""
3176
  "Booster: Free plugin's version is limited to only three products with per "
3177
  "product addons enabled at a time. You will need to get <a href=\"https://"
3284
  #: includes/class-wcj-product-bulk-meta-editor.php:232
3285
  #: includes/settings/meta-box/wcj-settings-meta-box-add-to-cart-button-visibility.php:19
3286
  #: includes/settings/meta-box/wcj-settings-meta-box-add-to-cart-button-visibility.php:38
3287
+ #: includes/settings/wcj-settings-price-by-user-role.php:69
3288
  #: includes/settings/wcj-settings-product-msrp.php:31
3289
+ #: includes/settings/wcj-settings-wholesale-price.php:61
3290
  msgid "Show"
3291
  msgstr ""
3292
 
3309
  #: includes/settings/wcj-settings-export.php:91
3310
  #: includes/settings/wcj-settings-export.php:162
3311
  #: includes/settings/wcj-settings-export.php:241
3312
+ #: includes/settings/wcj-settings-global-discount.php:74
3313
  msgid "Value"
3314
  msgstr ""
3315
 
3418
  msgstr ""
3419
 
3420
  #: includes/class-wcj-product-bulk-price-converter.php:264
3421
+ #: includes/settings/wcj-settings-global-discount.php:89
3422
  msgid "None"
3423
  msgstr ""
3424
 
3717
  #: includes/settings/wcj-settings-custom-php.php:16
3718
  #: includes/settings/wcj-settings-empty-cart.php:14
3719
  #: includes/settings/wcj-settings-eu-vat-number.php:15
3720
+ #: includes/settings/wcj-settings-global-discount.php:24
3721
  #: includes/settings/wcj-settings-multicurrency-base-price.php:17
3722
  #: includes/settings/wcj-settings-payment-gateways-currency.php:63
3723
  #: includes/settings/wcj-settings-payment-gateways-icons.php:14
3724
+ #: includes/settings/wcj-settings-price-by-user-role.php:13
3725
  #: includes/settings/wcj-settings-product-addons.php:173
3726
  #: includes/settings/wcj-settings-product-bookings.php:86
3727
  #: includes/settings/wcj-settings-product-by-user.php:59
3733
  #: includes/settings/wcj-settings-track-users.php:14
3734
  #: includes/settings/wcj-settings-upsells.php:14
3735
  #: includes/settings/wcj-settings-url-coupons.php:14
3736
+ #: includes/settings/wcj-settings-wholesale-price.php:18
3737
  msgid "Options"
3738
  msgstr ""
3739
 
4060
  #: includes/settings/meta-box/wcj-settings-meta-box-wholesale-price.php:32
4061
  #: includes/settings/wcj-settings-admin-orders-list.php:84
4062
  #: includes/settings/wcj-settings-checkout-custom-fields.php:265
4063
+ #: includes/settings/wcj-settings-product-addons.php:242
4064
  #: includes/settings/wcj-settings-related-products.php:176
4065
  #: includes/widgets/class-wcj-widget-country-switcher.php:82
4066
  msgid "No"
4098
  #: includes/settings/wcj-settings-eu-vat-number.php:124
4099
  #: includes/settings/wcj-settings-eu-vat-number.php:135
4100
  #: includes/settings/wcj-settings-eu-vat-number.php:154
4101
+ #: includes/settings/wcj-settings-product-addons.php:241
4102
  #: includes/settings/wcj-settings-related-products.php:175
4103
  #: includes/widgets/class-wcj-widget-country-switcher.php:83
4104
  msgid "Yes"
4515
  #: includes/class-wcj-shipping-by-user-role.php:33
4516
  #: includes/settings/wcj-settings-multicurrency.php:261
4517
  #: includes/settings/wcj-settings-order-min-amount.php:104
4518
+ #: includes/settings/wcj-settings-price-by-user-role.php:124
4519
  #, php-format
4520
  msgid ""
4521
  "Custom roles can be added via \"Add/Manage Custom Roles\" tool in Booster's "
4626
  msgid "Add multiple custom shipping methods to WooCommerce."
4627
  msgstr ""
4628
 
4629
+ #: includes/class-wcj-sku.php:23 includes/class-wcj-sku.php:670
4630
  #: includes/export/class-wcj-fields-helper.php:283
4631
  msgid "SKU"
4632
  msgstr ""
4643
  msgid "The tool generates and sets product SKUs for existing products."
4644
  msgstr ""
4645
 
4646
+ #: includes/class-wcj-sku.php:671
4647
  msgid "Old SKU"
4648
  msgstr ""
4649
 
4650
+ #: includes/class-wcj-sku.php:677
4651
  msgid "SKUs generated and set successfully!"
4652
  msgstr ""
4653
 
4654
+ #: includes/class-wcj-sku.php:687
4655
  msgid "Preview SKUs"
4656
  msgstr ""
4657
 
4658
+ #: includes/class-wcj-sku.php:689
4659
  msgid "Set SKUs"
4660
  msgstr ""
4661
 
4662
+ #: includes/class-wcj-sku.php:692
4663
  msgid ""
4664
  "You can optionally limit affected products by main product's ID (set option "
4665
  "to zero to ignore):"
4666
  msgstr ""
4667
 
4668
+ #: includes/class-wcj-sku.php:694
4669
  msgid "Min ID"
4670
  msgstr ""
4671
 
4672
+ #: includes/class-wcj-sku.php:697
4673
  msgid "Max ID"
4674
  msgstr ""
4675
 
4843
  msgid "File wpml-config.xml successfully regenerated!"
4844
  msgstr ""
4845
 
4846
+ #: includes/classes/class-wcj-module-product-by-condition.php:137
4847
  msgid "— No change —"
4848
  msgstr ""
4849
 
4850
+ #: includes/classes/class-wcj-module-product-by-condition.php:144
4851
  #: includes/settings/meta-box/wcj-settings-meta-box-product-by-condition.php:29
4852
  msgid "Visible"
4853
  msgstr ""
4854
 
4855
+ #: includes/classes/class-wcj-module-product-by-condition.php:153
4856
  #: includes/settings/meta-box/wcj-settings-meta-box-product-by-condition.php:41
4857
  msgid "Invisible"
4858
  msgstr ""
4859
 
4860
+ #: includes/classes/class-wcj-module.php:150
4861
+ msgid "WPML: Get Terms in All Languages"
4862
+ msgstr ""
4863
+
4864
+ #: includes/classes/class-wcj-module.php:152
4865
+ msgid "Get tags and taxonomies in all languages"
4866
+ msgstr ""
4867
+
4868
+ #: includes/classes/class-wcj-module.php:171
4869
+ msgid "WPML: Get Products in All Languages"
4870
+ msgstr ""
4871
+
4872
+ #: includes/classes/class-wcj-module.php:173
4873
+ msgid "Get products in all languages"
4874
+ msgstr ""
4875
+
4876
+ #: includes/classes/class-wcj-module.php:304
4877
  #, php-format
4878
  msgid ""
4879
  "Booster: Free plugin's version is limited to only one \"%1$s\" product with "
4882
  "\"%1$s\" products."
4883
  msgstr ""
4884
 
4885
+ #: includes/classes/class-wcj-module.php:624
4886
  #, php-format
4887
  msgid "Selected: %s."
4888
  msgstr ""
4889
 
4890
+ #: includes/classes/class-wcj-module.php:693
4891
  msgid "Back to Module Settings"
4892
  msgstr ""
4893
 
4894
+ #: includes/classes/class-wcj-module.php:711
4895
  #: includes/settings/wcj-settings-wpml.php:87
4896
  msgid "Module Tools"
4897
  msgstr ""
4898
 
4899
+ #: includes/classes/class-wcj-module.php:784
4900
  #: includes/settings/wcj-settings-checkout-core-fields.php:64
4901
  msgid "enabled"
4902
  msgstr ""
4903
 
4904
+ #: includes/classes/class-wcj-module.php:785
4905
  msgid "disabled"
4906
  msgstr ""
4907
 
4908
+ #: includes/classes/class-wcj-module.php:793
4909
  #: includes/settings/wcj-settings-product-tabs.php:172
4910
  #: includes/settings/wcj-settings-product-tabs.php:184
4911
  #: includes/settings/wcj-settings-product-tabs.php:196
4913
  msgid "Deprecated"
4914
  msgstr ""
4915
 
4916
+ #: includes/classes/class-wcj-module.php:831
4917
  msgid "Reset Settings"
4918
  msgstr ""
4919
 
4920
+ #: includes/classes/class-wcj-module.php:837
4921
  msgid "Reset Module to Default Settings"
4922
  msgstr ""
4923
 
4924
+ #: includes/classes/class-wcj-module.php:838
4925
  msgid "Reset Submodule to Default Settings"
4926
  msgstr ""
4927
 
4928
+ #: includes/classes/class-wcj-module.php:842
4929
  msgid "Reset settings"
4930
  msgstr ""
4931
 
4932
+ #: includes/classes/class-wcj-module.php:876
4933
  msgid "Module Options"
4934
  msgstr ""
4935
 
4936
+ #: includes/classes/class-wcj-module.php:883
4937
  msgid "Enable Module"
4938
  msgstr ""
4939
 
4940
+ #: includes/classes/class-wcj-pdf-invoice.php:90
4941
  #: includes/settings/wcj-settings-pdf-invoicing-header.php:61
4942
  msgid "Company Name"
4943
  msgstr ""
4944
 
4945
+ #: includes/classes/class-wcj-pdf-invoice.php:259
4946
  #: includes/functions/wcj-functions-general.php:145
4947
  #: includes/pdf-invoices/class-wcj-pdf-invoicing-report-tool.php:245
4948
  msgid "Unexpected error"
5504
  #: includes/settings/wcj-settings-export.php:81
5505
  #: includes/settings/wcj-settings-export.php:149
5506
  #: includes/settings/wcj-settings-export.php:231
5507
+ #: includes/settings/wcj-settings-global-discount.php:63
5508
  #: includes/settings/wcj-settings-product-addons.php:80
5509
  #: includes/settings/wcj-settings-purchase-data.php:84
5510
  #: includes/settings/wcj-settings-shipping-options.php:77
7177
  #: includes/settings/wcj-settings-export.php:70
7178
  #: includes/settings/wcj-settings-export.php:138
7179
  #: includes/settings/wcj-settings-export.php:220
7180
+ #: includes/settings/wcj-settings-global-discount.php:55
7181
  #: includes/settings/wcj-settings-product-by-user.php:149
7182
  #: includes/settings/wcj-settings-products-xml.php:76
7183
  msgid "Enabled"
7616
  #: includes/settings/wcj-settings-multicurrency.php:162
7617
  #: includes/settings/wcj-settings-order-min-amount.php:69
7618
  #: includes/settings/wcj-settings-price-by-country.php:160
7619
+ #: includes/settings/wcj-settings-price-by-user-role.php:97
7620
+ #: includes/settings/wcj-settings-product-addons.php:230
7621
  msgid "Advanced"
7622
  msgstr ""
7623
 
8181
  #: includes/settings/wcj-settings-my-account.php:209
8182
  #: includes/settings/wcj-settings-order-custom-statuses.php:63
8183
  #: includes/settings/wcj-settings-pdf-invoicing-advanced.php:48
8184
+ #: includes/settings/wcj-settings-product-addons.php:291
8185
  #: includes/settings/wcj-settings-product-bookings.php:100
8186
  #: includes/settings/wcj-settings-product-images.php:20
8187
  #: includes/settings/wcj-settings-product-images.php:27
8300
 
8301
  #: includes/settings/meta-box/wcj-settings-meta-box-multicurrency.php:63
8302
  #: includes/settings/meta-box/wcj-settings-meta-box-price-by-user-role.php:136
8303
+ #: includes/settings/wcj-settings-price-by-user-role.php:146
8304
+ #: includes/settings/wcj-settings-price-by-user-role.php:215
8305
  msgid "Make Empty Price"
8306
  msgstr ""
8307
 
8402
  msgstr ""
8403
 
8404
  #: includes/settings/meta-box/wcj-settings-meta-box-price-by-user-role.php:113
8405
+ #: includes/settings/wcj-settings-price-by-user-role.php:32
8406
  msgid "Multiplier"
8407
  msgstr ""
8408
 
8445
  #: includes/settings/wcj-settings-general.php:122
8446
  #: includes/settings/wcj-settings-general.php:130
8447
  #: includes/settings/wcj-settings-pdf-invoicing-advanced.php:84
8448
+ #: includes/settings/wcj-settings-pdf-invoicing-advanced.php:123
8449
+ #: includes/settings/wcj-settings-price-by-user-role.php:55
8450
+ #: includes/settings/wcj-settings-price-by-user-role.php:130
8451
  #: includes/settings/wcj-settings-product-add-to-cart.php:131
8452
  #: includes/settings/wcj-settings-product-open-pricing.php:95
8453
+ #: includes/settings/wcj-settings-sku.php:325
8454
  msgid "Disable"
8455
  msgstr ""
8456
 
8575
  msgid "If this field is filled in, monthly settings fields are ignored."
8576
  msgstr ""
8577
 
8578
+ #: includes/settings/meta-box/wcj-settings-meta-box-product-by-date.php:34
8579
+ msgid ""
8580
+ "If you are not using english, please set some numeric format like m/d/Y on "
8581
+ "\"Direct Date Admin Input Date Format\" option"
8582
+ msgstr ""
8583
+
8584
  #: includes/settings/meta-box/wcj-settings-meta-box-product-images.php:17
8585
  msgid "Replace image with custom HTML on single product page"
8586
  msgstr ""
8697
 
8698
  #: includes/settings/meta-box/wcj-settings-meta-box-wholesale-price.php:18
8699
  #: includes/settings/wcj-settings-checkout-fees.php:72
8700
+ #: includes/settings/wcj-settings-global-discount.php:69
8701
  #: includes/settings/wcj-settings-payment-gateways-fees.php:38
8702
  #: includes/settings/wcj-settings-purchase-data.php:89
8703
+ #: includes/settings/wcj-settings-wholesale-price.php:80
8704
  msgid "Percent"
8705
  msgstr ""
8706
 
8707
  #: includes/settings/meta-box/wcj-settings-meta-box-wholesale-price.php:19
8708
  #: includes/settings/wcj-settings-checkout-fees.php:71
8709
+ #: includes/settings/wcj-settings-global-discount.php:70
8710
  #: includes/settings/wcj-settings-payment-gateways-fees.php:37
8711
+ #: includes/settings/wcj-settings-price-by-user-role.php:31
8712
  #: includes/settings/wcj-settings-purchase-data.php:88
8713
+ #: includes/settings/wcj-settings-wholesale-price.php:81
8714
  msgid "Fixed"
8715
  msgstr ""
8716
 
8723
  msgstr ""
8724
 
8725
  #: includes/settings/meta-box/wcj-settings-meta-box-wholesale-price.php:41
8726
+ #: includes/settings/wcj-settings-wholesale-price.php:75
8727
  msgid "Discount Type"
8728
  msgstr ""
8729
 
8753
 
8754
  #: includes/settings/meta-box/wcj-settings-meta-box-wholesale-price.php:72
8755
  #: includes/settings/meta-box/wcj-settings-meta-box-wholesale-price.php:108
8756
+ #: includes/settings/wcj-settings-wholesale-price.php:163
8757
+ #: includes/settings/wcj-settings-wholesale-price.php:164
8758
+ #: includes/settings/wcj-settings-wholesale-price.php:220
8759
+ #: includes/settings/wcj-settings-wholesale-price.php:221
8760
  msgid "Discount"
8761
  msgstr ""
8762
 
9265
  msgstr ""
9266
 
9267
  #: includes/settings/wcj-settings-admin-products-list.php:27
9268
+ #: includes/settings/wcj-settings-price-by-user-role.php:191
9269
  #: includes/settings/wcj-settings-shipping.php:51
9270
  msgid ""
9271
  "Save module's settings after changing this option to see new settings fields."
9885
  msgstr ""
9886
 
9887
  #: includes/settings/wcj-settings-checkout-custom-fields.php:360
9888
+ #: includes/settings/wcj-settings-global-discount.php:163
9889
  #: includes/settings/wcj-settings-payment-gateways-fees.php:125
9890
  #: includes/settings/wcj-settings-product-addons.php:149
9891
  #: includes/settings/wcj-settings-related-products.php:244
9897
  msgstr ""
9898
 
9899
  #: includes/settings/wcj-settings-checkout-custom-fields.php:369
9900
+ #: includes/settings/wcj-settings-global-discount.php:152
9901
  #: includes/settings/wcj-settings-related-products.php:233
9902
  msgid "Include Products"
9903
  msgstr ""
10534
  #: includes/settings/wcj-settings-checkout-files-upload.php:298
10535
  #: includes/settings/wcj-settings-checkout-files-upload.php:352
10536
  #: includes/settings/wcj-settings-checkout-files-upload.php:393
10537
+ #: includes/settings/wcj-settings-product-addons.php:363
10538
+ #: includes/settings/wcj-settings-product-addons.php:394
10539
  msgid "Before"
10540
  msgstr ""
10541
 
10557
  #: includes/settings/wcj-settings-checkout-files-upload.php:321
10558
  #: includes/settings/wcj-settings-checkout-files-upload.php:367
10559
  #: includes/settings/wcj-settings-checkout-files-upload.php:408
10560
+ #: includes/settings/wcj-settings-product-addons.php:378
10561
+ #: includes/settings/wcj-settings-product-addons.php:409
10562
  msgid "After"
10563
  msgstr ""
10564
 
11600
  msgstr ""
11601
 
11602
  #: includes/settings/wcj-settings-export.php:20
11603
+ #: includes/settings/wcj-settings-pdf-invoicing-advanced.php:190
11604
  msgid "CSV Separator"
11605
  msgstr ""
11606
 
11915
  #: includes/settings/wcj-settings-max-products-per-user.php:44
11916
  #: includes/settings/wcj-settings-product-by-date.php:54
11917
  #: includes/settings/wcj-settings-product-by-time.php:54
11918
+ #: includes/settings/wcj-settings-wholesale-price.php:26
11919
  msgid "This will add new meta box to each product's edit page."
11920
  msgstr ""
11921
 
11976
  msgid "seconds."
11977
  msgstr ""
11978
 
11979
+ #: includes/settings/wcj-settings-global-discount.php:29
11980
  msgid "Total Groups"
11981
  msgstr ""
11982
 
11983
+ #: includes/settings/wcj-settings-global-discount.php:33
11984
  #: includes/settings/wcj-settings-product-by-user.php:138
11985
  #: includes/settings/wcj-settings-products-xml.php:29
11986
  #: includes/shipping/class-wc-shipping-wcj-custom.php:148
11987
  msgid "Press Save changes after you change this number."
11988
  msgstr ""
11989
 
11990
+ #: includes/settings/wcj-settings-global-discount.php:50
11991
  msgid "Discount Group"
11992
  msgstr ""
11993
 
11994
+ #: includes/settings/wcj-settings-global-discount.php:56
11995
  msgid "Enabled/disables the discount group."
11996
  msgstr ""
11997
 
11998
+ #: includes/settings/wcj-settings-global-discount.php:64
11999
  msgid "Can be fixed or percent."
12000
  msgstr ""
12001
 
12002
+ #: includes/settings/wcj-settings-global-discount.php:75
12003
  msgid "Must be negative number."
12004
  msgstr ""
12005
 
12006
+ #: includes/settings/wcj-settings-global-discount.php:82
12007
  msgid "Final Correction"
12008
  msgstr ""
12009
 
12010
+ #: includes/settings/wcj-settings-global-discount.php:83
12011
  #, php-format
12012
  msgid ""
12013
  "Will apply selected function and coefficient to the final price, e.g.: %s."
12014
  msgstr ""
12015
 
12016
+ #: includes/settings/wcj-settings-global-discount.php:90
12017
  #: includes/settings/wcj-settings-multicurrency.php:79
12018
  #: includes/settings/wcj-settings-price-by-country.php:83
12019
  #: includes/settings/wcj-settings-product-price-by-formula.php:70
12021
  msgid "Round"
12022
  msgstr ""
12023
 
12024
+ #: includes/settings/wcj-settings-global-discount.php:91
12025
  msgid "Ceil"
12026
  msgstr ""
12027
 
12028
+ #: includes/settings/wcj-settings-global-discount.php:92
12029
  msgid "Floor"
12030
  msgstr ""
12031
 
12032
+ #: includes/settings/wcj-settings-global-discount.php:96
12033
  msgid "Final correction coefficient"
12034
  msgstr ""
12035
 
12036
+ #: includes/settings/wcj-settings-global-discount.php:103
12037
  msgid "Product Scope"
12038
  msgstr ""
12039
 
12040
+ #: includes/settings/wcj-settings-global-discount.php:104
12041
  msgid ""
12042
  "Possible values: all products, only products that are already on sale, only "
12043
  "products that are not on sale."
12044
  msgstr ""
12045
 
12046
+ #: includes/settings/wcj-settings-global-discount.php:109
12047
  #: includes/settings/wcj-settings-product-add-to-cart.php:65
12048
  #: includes/settings/wcj-settings-products-xml.php:207
12049
  msgid "All products"
12050
  msgstr ""
12051
 
12052
+ #: includes/settings/wcj-settings-global-discount.php:110
12053
  msgid "Only products that are already on sale"
12054
  msgstr ""
12055
 
12056
+ #: includes/settings/wcj-settings-global-discount.php:111
12057
  #: includes/settings/wcj-settings-products-xml.php:209
12058
  msgid "Only products that are not on sale"
12059
  msgstr ""
12060
 
12061
+ #: includes/settings/wcj-settings-global-discount.php:115
12062
  #: includes/settings/wcj-settings-related-products.php:196
12063
  msgid "Include Product Categories"
12064
  msgstr ""
12065
 
12066
+ #: includes/settings/wcj-settings-global-discount.php:116
12067
  msgid ""
12068
  "Set this field to apply discount to selected product categories only. Leave "
12069
  "blank to apply to all products."
12070
  msgstr ""
12071
 
12072
+ #: includes/settings/wcj-settings-global-discount.php:124
12073
  #: includes/settings/wcj-settings-related-products.php:205
12074
  msgid "Exclude Product Categories"
12075
  msgstr ""
12076
 
12077
+ #: includes/settings/wcj-settings-global-discount.php:125
12078
  msgid ""
12079
  "Set this field to NOT apply discount to selected product categories. Leave "
12080
  "blank to apply to all products."
12081
  msgstr ""
12082
 
12083
+ #: includes/settings/wcj-settings-global-discount.php:133
12084
  #: includes/settings/wcj-settings-related-products.php:214
12085
  msgid "Include Product Tags"
12086
  msgstr ""
12087
 
12088
+ #: includes/settings/wcj-settings-global-discount.php:134
12089
  msgid ""
12090
  "Set this field to apply discount to selected product tags only. Leave blank "
12091
  "to apply to all products."
12092
  msgstr ""
12093
 
12094
+ #: includes/settings/wcj-settings-global-discount.php:142
12095
  #: includes/settings/wcj-settings-related-products.php:223
12096
  msgid "Exclude Product Tags"
12097
  msgstr ""
12098
 
12099
+ #: includes/settings/wcj-settings-global-discount.php:143
12100
  msgid ""
12101
  "Set this field to NOT apply discount to selected product tags. Leave blank "
12102
  "to apply to all products."
12103
  msgstr ""
12104
 
12105
+ #: includes/settings/wcj-settings-global-discount.php:153
12106
  msgid ""
12107
  "Set this field to apply discount to selected products only. Leave blank to "
12108
  "apply to all products."
12109
  msgstr ""
12110
 
12111
+ #: includes/settings/wcj-settings-global-discount.php:164
12112
  msgid ""
12113
  "Set this field to NOT apply discount to selected products. Leave blank to "
12114
  "apply to all products."
12115
  msgstr ""
12116
 
12117
+ #: includes/settings/wcj-settings-global-discount.php:180
12118
  #: includes/settings/wcj-settings-product-price-by-formula.php:95
12119
  msgid "Advanced Settings"
12120
  msgstr ""
12121
 
12122
+ #: includes/settings/wcj-settings-global-discount.php:185
12123
  msgid "Global Discount in Admin"
12124
  msgstr ""
12125
 
12126
+ #: includes/settings/wcj-settings-global-discount.php:187
12127
  msgid ""
12128
  "This will enable \"global discount\" product pricing in backend. It will "
12129
  "also affect some modules, e.g.: \"Products XML Feeds\" module."
12130
  msgstr ""
12131
 
12132
+ #: includes/settings/wcj-settings-global-discount.php:193
12133
  #: includes/settings/wcj-settings-multicurrency-base-price.php:76
12134
  #: includes/settings/wcj-settings-multicurrency.php:176
12135
  #: includes/settings/wcj-settings-price-by-country.php:165
12136
+ #: includes/settings/wcj-settings-price-by-user-role.php:102
12137
+ #: includes/settings/wcj-settings-product-addons.php:258
12138
  #: includes/settings/wcj-settings-product-price-by-formula.php:100
12139
  msgid "Price Filters Priority"
12140
  msgstr ""
12141
 
12142
+ #: includes/settings/wcj-settings-global-discount.php:194
12143
  #: includes/settings/wcj-settings-multicurrency-base-price.php:77
12144
  #: includes/settings/wcj-settings-multicurrency.php:177
12145
  #: includes/settings/wcj-settings-price-by-country.php:166
12146
+ #: includes/settings/wcj-settings-price-by-user-role.php:103
12147
+ #: includes/settings/wcj-settings-product-addons.php:259
12148
  #: includes/settings/wcj-settings-product-price-by-formula.php:101
12149
+ #: includes/settings/wcj-settings-wholesale-price.php:124
12150
  msgid ""
12151
  "Priority for all module's price filters. Set to zero to use default priority."
12152
  msgstr ""
12591
  msgstr ""
12592
 
12593
  #: includes/settings/wcj-settings-multicurrency.php:267
12594
+ #: includes/settings/wcj-settings-wholesale-price.php:185
12595
  msgid "Save settings after you change this option. Leave blank to disable."
12596
  msgstr ""
12597
 
14180
  msgid "Returns the content of output buffering instead of displaying it"
14181
  msgstr ""
14182
 
14183
+ #: includes/settings/wcj-settings-pdf-invoicing-advanced.php:97
14184
+ msgid "Internal Encoding"
14185
+ msgstr ""
14186
+
14187
+ #: includes/settings/wcj-settings-pdf-invoicing-advanced.php:98
14188
+ msgid "Sets internal character encoding."
14189
+ msgstr ""
14190
+
14191
+ #: includes/settings/wcj-settings-pdf-invoicing-advanced.php:98
14192
+ msgid "e.g: UTF-8, iso-8859-1"
14193
+ msgstr ""
14194
+
14195
+ #: includes/settings/wcj-settings-pdf-invoicing-advanced.php:108
14196
  msgid "Fonts Manager"
14197
  msgstr ""
14198
 
14199
+ #: includes/settings/wcj-settings-pdf-invoicing-advanced.php:117
14200
  msgid "Re-download"
14201
  msgstr ""
14202
 
14203
+ #: includes/settings/wcj-settings-pdf-invoicing-advanced.php:117
14204
  msgid "Download"
14205
  msgstr ""
14206
 
14207
+ #: includes/settings/wcj-settings-pdf-invoicing-advanced.php:122
14208
  msgid "Disable Fonts Download"
14209
  msgstr ""
14210
 
14211
+ #: includes/settings/wcj-settings-pdf-invoicing-advanced.php:133
14212
  msgid "General Display Options"
14213
  msgstr ""
14214
 
14215
+ #: includes/settings/wcj-settings-pdf-invoicing-advanced.php:138
14216
  msgid "Add PDF Invoices Meta Box to Admin Edit Order Page"
14217
  msgstr ""
14218
 
14219
+ #: includes/settings/wcj-settings-pdf-invoicing-advanced.php:145
14220
  msgid "Open docs in new window"
14221
  msgstr ""
14222
 
14223
+ #: includes/settings/wcj-settings-pdf-invoicing-advanced.php:151
14224
  msgid "Add editable numbers and dates"
14225
  msgstr ""
14226
 
14227
+ #: includes/settings/wcj-settings-pdf-invoicing-advanced.php:161
14228
  msgid "Report Tool Options"
14229
  msgstr ""
14230
 
14231
+ #: includes/settings/wcj-settings-pdf-invoicing-advanced.php:166
14232
  msgid "Reports Filename"
14233
  msgstr ""
14234
 
14235
+ #: includes/settings/wcj-settings-pdf-invoicing-advanced.php:174
14236
  msgid "Report Columns"
14237
  msgstr ""
14238
 
14239
+ #: includes/settings/wcj-settings-pdf-invoicing-advanced.php:175
14240
  msgid "Leave blank to show all columns."
14241
  msgstr ""
14242
 
14243
+ #: includes/settings/wcj-settings-pdf-invoicing-advanced.php:183
14244
  msgid "Tax Percent Precision"
14245
  msgstr ""
14246
 
14247
+ #: includes/settings/wcj-settings-pdf-invoicing-advanced.php:196
14248
  msgid "CSV UTF-8 BOM"
14249
  msgstr ""
14250
 
14251
+ #: includes/settings/wcj-settings-pdf-invoicing-advanced.php:203
14252
  msgid "Replace Periods with Commas in CSV Data"
14253
  msgstr ""
14254
 
14255
+ #: includes/settings/wcj-settings-pdf-invoicing-advanced.php:204
14256
  #: includes/settings/wcj-settings-product-open-pricing.php:174
14257
  msgid "Replace"
14258
  msgstr ""
14439
  msgstr ""
14440
 
14441
  #: includes/settings/wcj-settings-pdf-invoicing-numbering.php:41
14442
+ #: includes/settings/wcj-settings-sku.php:59
14443
+ #: includes/settings/wcj-settings-sku.php:212
14444
  msgid "Prefix"
14445
  msgstr ""
14446
 
14447
  #: includes/settings/wcj-settings-pdf-invoicing-numbering.php:47
14448
+ #: includes/settings/wcj-settings-sku.php:73
14449
+ #: includes/settings/wcj-settings-sku.php:221
14450
  msgid "Suffix"
14451
  msgstr ""
14452
 
14453
  #: includes/settings/wcj-settings-pdf-invoicing-numbering.php:53
14454
+ #: includes/settings/wcj-settings-sku.php:102
14455
  msgid "Template"
14456
  msgstr ""
14457
 
14726
  msgstr ""
14727
 
14728
  #: includes/settings/wcj-settings-price-by-country.php:149
14729
+ #: includes/settings/wcj-settings-price-by-user-role.php:61
14730
  msgid "Search Engine Bots"
14731
  msgstr ""
14732
 
14799
  msgid "Multiply Price by"
14800
  msgstr ""
14801
 
14802
+ #: includes/settings/wcj-settings-price-by-user-role.php:18
14803
  msgid "Enable per Product Settings"
14804
  msgstr ""
14805
 
14806
+ #: includes/settings/wcj-settings-price-by-user-role.php:20
14807
  msgid ""
14808
  "When enabled, this will add new \"Booster: Price based on User Role\" meta "
14809
  "box to each product's edit page."
14810
  msgstr ""
14811
 
14812
+ #: includes/settings/wcj-settings-price-by-user-role.php:26
14813
  msgid "Per Product Settings Type"
14814
  msgstr ""
14815
 
14816
+ #: includes/settings/wcj-settings-price-by-user-role.php:36
14817
  msgid "Show Roles on per Product Settings"
14818
  msgstr ""
14819
 
14820
+ #: includes/settings/wcj-settings-price-by-user-role.php:37
14821
  msgid ""
14822
  "If per product settings are enabled, you can choose which roles to show on "
14823
  "product's edit page. Leave blank to show all roles."
14824
  msgstr ""
14825
 
14826
+ #: includes/settings/wcj-settings-price-by-user-role.php:47
14827
  msgid ""
14828
  "When enabled, this will apply user role multipliers to shipping calculations."
14829
  msgstr ""
14830
 
14831
+ #: includes/settings/wcj-settings-price-by-user-role.php:53
14832
  msgid "Disable Price based on User Role for Regular Price"
14833
  msgstr ""
14834
 
14835
+ #: includes/settings/wcj-settings-price-by-user-role.php:54
14836
  msgid ""
14837
  "Disable price by user role for regular price when using multipliers (global "
14838
  "or per product)."
14839
  msgstr ""
14840
 
14841
+ #: includes/settings/wcj-settings-price-by-user-role.php:62
14842
  msgid "Disable Price based on User Role for Bots"
14843
  msgstr ""
14844
 
14845
+ #: includes/settings/wcj-settings-price-by-user-role.php:68
14846
  msgid "Show Empty Price Variations"
14847
  msgstr ""
14848
 
14849
+ #: includes/settings/wcj-settings-price-by-user-role.php:70
14850
  msgid ""
14851
  "Show \"empty price\" variations. This will also hide out of stock messages."
14852
  msgstr ""
14853
 
14854
+ #: includes/settings/wcj-settings-price-by-user-role.php:76
14855
  msgid "Remove Empty Price Variation Callback"
14856
  msgstr ""
14857
 
14858
+ #: includes/settings/wcj-settings-price-by-user-role.php:78
14859
  msgid ""
14860
  "Remove \"woocommerce_single_variation\" callback from "
14861
  "\"woocommerce_single_variation\" hook on \"empty price\" variations."
14862
  msgstr ""
14863
 
14864
+ #: includes/settings/wcj-settings-price-by-user-role.php:84
14865
  msgid "Remove Empty Price Add to Cart Button Callback"
14866
  msgstr ""
14867
 
14868
+ #: includes/settings/wcj-settings-price-by-user-role.php:86
14869
  msgid ""
14870
  "Remove \"woocommerce_single_variation_add_to_cart_button\" callback from "
14871
  "\"woocommerce_single_variation\" hook on \"empty price\" variations."
14872
  msgstr ""
14873
 
14874
+ #: includes/settings/wcj-settings-price-by-user-role.php:109
14875
  msgid "Price Changes"
14876
  msgstr ""
14877
 
14878
+ #: includes/settings/wcj-settings-price-by-user-role.php:110
14879
  msgid "Disable price based on user role for products with \"Price Changes\""
14880
  msgstr ""
14881
 
14882
+ #: includes/settings/wcj-settings-price-by-user-role.php:111
14883
  #: includes/settings/wcj-settings-product-open-pricing.php:149
14884
+ #: includes/settings/wcj-settings-wholesale-price.php:117
14885
  msgid ""
14886
  "Try enabling this checkbox, if you are having compatibility issues with "
14887
  "other plugins."
14888
  msgstr ""
14889
 
14890
+ #: includes/settings/wcj-settings-price-by-user-role.php:122
 
 
 
 
 
 
 
 
14891
  msgid "Roles & Multipliers"
14892
  msgstr ""
14893
 
14894
+ #: includes/settings/wcj-settings-price-by-user-role.php:129
14895
  msgid "Disable Price based on User Role for Products on Sale"
14896
  msgstr ""
14897
 
14898
+ #: includes/settings/wcj-settings-price-by-user-role.php:161
14899
  msgid "Products Categories"
14900
  msgstr ""
14901
 
14902
+ #: includes/settings/wcj-settings-price-by-user-role.php:167
14903
  msgid "Products Tags"
14904
  msgstr ""
14905
 
14906
+ #: includes/settings/wcj-settings-price-by-user-role.php:185
14907
  #, php-format
14908
  msgid "Price based on User Role by %s"
14909
  msgstr ""
14910
 
14911
+ #: includes/settings/wcj-settings-price-by-user-role.php:208
14912
  msgid ""
14913
  "Multiplier is ignored if set to negative number (e.g.: -1). Global "
14914
  "multiplier will be used instead."
15357
  msgid "Set to zero to use the default priority."
15358
  msgstr ""
15359
 
15360
+ #: includes/settings/wcj-settings-product-addons.php:235
15361
+ msgid "Apply Price Filter"
15362
  msgstr ""
15363
 
15364
+ #: includes/settings/wcj-settings-product-addons.php:240
15365
  msgid "By module"
15366
  msgstr ""
15367
 
15368
+ #: includes/settings/wcj-settings-product-addons.php:246
15369
  msgid ""
15370
  "If you have selected \"By module\" for \"Advanced: Apply Price Filter\" "
15371
  "option, you can set which modules to apply here. Leave empty to apply all "
15372
  "modules."
15373
  msgstr ""
15374
 
15375
+ #: includes/settings/wcj-settings-product-addons.php:265
15376
+ #: includes/settings/wcj-settings-product-input-fields.php:353
15377
+ msgid "Check for Outputted Data"
 
 
 
 
 
 
15378
  msgstr ""
15379
 
15380
+ #: includes/settings/wcj-settings-product-addons.php:267
15381
  #: includes/settings/wcj-settings-product-bookings.php:108
15382
  #: includes/settings/wcj-settings-product-input-fields.php:355
15383
  #: includes/settings/wcj-settings-product-open-pricing.php:141
15386
  "on frontend twice. Disable if you see no data outputted."
15387
  msgstr ""
15388
 
15389
+ #: includes/settings/wcj-settings-product-addons.php:273
15390
+ msgid "Export and Import \"Enable by Variation\""
15391
+ msgstr ""
15392
+
15393
+ #: includes/settings/wcj-settings-product-addons.php:275
15394
+ msgid ""
15395
+ "Exports/Imports \"Enable by Variation\" meta when using WooCommerce product "
15396
+ "Exporter/Importer"
15397
+ msgstr ""
15398
+
15399
+ #: includes/settings/wcj-settings-product-addons.php:285
15400
  msgid "Frontend Templates"
15401
  msgstr ""
15402
 
15403
+ #: includes/settings/wcj-settings-product-addons.php:290
15404
  msgid "Hide Percentage Price"
15405
  msgstr ""
15406
 
15407
+ #: includes/settings/wcj-settings-product-addons.php:292
15408
  msgid "Hide percentage price when % is set on prices"
15409
  msgstr ""
15410
 
15411
+ #: includes/settings/wcj-settings-product-addons.php:298
15412
  msgid "Each Addon - Title"
15413
  msgstr ""
15414
 
15415
+ #: includes/settings/wcj-settings-product-addons.php:306
15416
  msgid "Each Addon - Type: Checkbox"
15417
  msgstr ""
15418
 
15419
+ #: includes/settings/wcj-settings-product-addons.php:314
15420
  msgid "Each Addon - Type: Text"
15421
  msgstr ""
15422
 
15423
+ #: includes/settings/wcj-settings-product-addons.php:322
15424
  msgid "Each Addon - Type: Select Box"
15425
  msgstr ""
15426
 
15427
+ #: includes/settings/wcj-settings-product-addons.php:330
15428
  msgid "Each Addon - Type: Select Box (Each Option)"
15429
  msgstr ""
15430
 
15431
+ #: includes/settings/wcj-settings-product-addons.php:338
15432
  msgid "Each Addon - Type: Radio Button (Each)"
15433
  msgstr ""
15434
 
15435
+ #: includes/settings/wcj-settings-product-addons.php:346
15436
  msgid "All Addons - Final"
15437
  msgstr ""
15438
 
15439
+ #: includes/settings/wcj-settings-product-addons.php:358
15440
  msgid "Cart Template"
15441
  msgstr ""
15442
 
15443
+ #: includes/settings/wcj-settings-product-addons.php:370
15444
+ #: includes/settings/wcj-settings-product-addons.php:401
15445
  msgid "Each Addon"
15446
  msgstr ""
15447
 
15448
+ #: includes/settings/wcj-settings-product-addons.php:389
15449
  msgid "Order Details Table Template"
15450
  msgstr ""
15451
 
15496
  msgid "Hide Quantity Selector for Bookings Products"
15497
  msgstr ""
15498
 
15499
+ #: includes/settings/wcj-settings-product-bookings.php:106
15500
+ #: includes/settings/wcj-settings-product-open-pricing.php:139
15501
+ msgid "Advanced: Check for Outputted Data"
15502
+ msgstr ""
15503
+
15504
  #: includes/settings/wcj-settings-product-bookings.php:118
15505
  msgid "Datepicker Options"
15506
  msgstr ""
15685
  msgid "Leave blank to use the default date format."
15686
  msgstr ""
15687
 
15688
+ #: includes/settings/wcj-settings-product-by-date.php:62
15689
+ msgid "If you are not using english, please set some numeric format like m/d/Y"
15690
+ msgstr ""
15691
+
15692
  #: includes/settings/wcj-settings-product-by-date.php:72
15693
  #: includes/settings/wcj-settings-product-by-time.php:64
15694
  msgid "Frontend Messages Options"
15880
  msgstr ""
15881
 
15882
  #: includes/settings/wcj-settings-product-custom-info.php:130
15883
+ #: includes/settings/wcj-settings-wholesale-price.php:98
15884
  msgid "Product Categories to Include"
15885
  msgstr ""
15886
 
15894
  msgstr ""
15895
 
15896
  #: includes/settings/wcj-settings-product-custom-info.php:138
15897
+ #: includes/settings/wcj-settings-wholesale-price.php:107
15898
  msgid "Product Categories to Exclude"
15899
  msgstr ""
15900
 
15908
 
15909
  #: includes/settings/wcj-settings-product-custom-info.php:162
15910
  #: includes/settings/wcj-settings-products-xml.php:147
15911
+ #: includes/settings/wcj-settings-wholesale-price.php:85
15912
  msgid "Products to Include"
15913
  msgstr ""
15914
 
15915
  #: includes/settings/wcj-settings-product-custom-info.php:170
15916
  #: includes/settings/wcj-settings-products-xml.php:157
15917
+ #: includes/settings/wcj-settings-wholesale-price.php:92
15918
  msgid "Products to Exclude"
15919
  msgstr ""
15920
 
16139
  #: includes/settings/wcj-settings-product-input-fields.php:145
16140
  #: includes/settings/wcj-settings-product-input-fields.php:157
16141
  #: includes/settings/wcj-settings-product-input-fields.php:169
16142
+ #: includes/settings/wcj-settings-wholesale-price.php:86
16143
+ #: includes/settings/wcj-settings-wholesale-price.php:99
16144
  msgid "Leave blank to include all products."
16145
  msgstr ""
16146
 
16272
  "Preserves line breaks on admin, making some inputs like textarea more legible"
16273
  msgstr ""
16274
 
 
 
 
 
16275
  #: includes/settings/wcj-settings-product-input-fields.php:361
16276
  msgid "Strip Slashes"
16277
  msgstr ""
16523
  msgstr ""
16524
 
16525
  #: includes/settings/wcj-settings-product-open-pricing.php:147
16526
+ #: includes/settings/wcj-settings-wholesale-price.php:115
16527
  msgid "Advanced: Price Changes"
16528
  msgstr ""
16529
 
16866
  msgstr ""
16867
 
16868
  #: includes/settings/wcj-settings-products-per-page.php:75
16869
+ #: includes/widgets/class-wcj-widget-multicurrency.php:88
16870
+ msgid "Form Method"
16871
  msgstr ""
16872
 
16873
  #: includes/settings/wcj-settings-products-per-page.php:80
16874
+ msgid "POST"
16875
  msgstr ""
16876
 
16877
  #: includes/settings/wcj-settings-products-per-page.php:81
16878
+ msgid "GET"
16879
+ msgstr ""
16880
+
16881
+ #: includes/settings/wcj-settings-products-per-page.php:85
16882
+ msgid "Saving Method"
16883
+ msgstr ""
16884
+
16885
+ #: includes/settings/wcj-settings-products-per-page.php:90
16886
+ msgid "Cookie"
16887
+ msgstr ""
16888
+
16889
+ #: includes/settings/wcj-settings-products-per-page.php:91
16890
  msgid "Session"
16891
  msgstr ""
16892
 
17132
  msgstr ""
17133
 
17134
  #: includes/settings/wcj-settings-purchase-data.php:190
17135
+ #: includes/settings/wcj-settings-sku.php:244
17136
  #: includes/settings/wcj-settings-stock.php:199
17137
  msgid "More Options"
17138
  msgstr ""
17730
  msgid "From product ID"
17731
  msgstr ""
17732
 
17733
+ #: includes/settings/wcj-settings-sku.php:30
17734
+ msgid "Hashids - Advanced options"
17735
  msgstr ""
17736
 
17737
  #: includes/settings/wcj-settings-sku.php:32
17738
+ msgid "Number generation method."
17739
  msgstr ""
17740
 
17741
+ #: includes/settings/wcj-settings-sku.php:33
17742
+ msgid "Possible values: from product ID, sequential, pseudorandom or Hashids."
17743
+ msgstr ""
17744
+
17745
+ #: includes/settings/wcj-settings-sku.php:33
17746
+ msgid "If using Hashids please take a look at Hashids options below."
17747
  msgstr ""
17748
 
17749
  #: includes/settings/wcj-settings-sku.php:38
17750
+ msgid "Sequential Number Generation - Counter"
17751
+ msgstr ""
17752
+
17753
+ #: includes/settings/wcj-settings-sku.php:39
17754
  msgid ""
17755
  "If you choose to use sequential number inside SKU, you can set current "
17756
  "sequential number counter here."
17757
  msgstr ""
17758
 
17759
+ #: includes/settings/wcj-settings-sku.php:50
17760
  msgid "Sequential Number Generation - By Category"
17761
  msgstr ""
17762
 
17763
+ #: includes/settings/wcj-settings-sku.php:51
17764
  msgid "Enables sequential number generation by category."
17765
  msgstr ""
17766
 
17767
+ #: includes/settings/wcj-settings-sku.php:60
17768
  msgid "SKU prefix."
17769
  msgstr ""
17770
 
17771
+ #: includes/settings/wcj-settings-sku.php:66
17772
  msgid "Minimum Number Length"
17773
  msgstr ""
17774
 
17775
+ #: includes/settings/wcj-settings-sku.php:67
17776
  msgid "Minimum length for SKU number part."
17777
  msgstr ""
17778
 
17779
+ #: includes/settings/wcj-settings-sku.php:74
17780
  msgid "SKU suffix."
17781
  msgstr ""
17782
 
17783
+ #: includes/settings/wcj-settings-sku.php:80
17784
  msgid "Attributes Separator"
17785
  msgstr ""
17786
 
17787
+ #: includes/settings/wcj-settings-sku.php:81
17788
  #, php-format
17789
  msgid "Used in %s, %s, %s and %s."
17790
  msgstr ""
17791
 
17792
+ #: includes/settings/wcj-settings-sku.php:91
17793
  msgid "Characters Case"
17794
  msgstr ""
17795
 
17796
+ #: includes/settings/wcj-settings-sku.php:96
17797
  msgid "Original (no changes)"
17798
  msgstr ""
17799
 
17800
+ #: includes/settings/wcj-settings-sku.php:97
17801
  msgid "Convert to lowercase"
17802
  msgstr ""
17803
 
17804
+ #: includes/settings/wcj-settings-sku.php:98
17805
  msgid "Convert to uppercase"
17806
  msgstr ""
17807
 
17808
+ #: includes/settings/wcj-settings-sku.php:103
17809
  msgid "SKU template."
17810
  msgstr ""
17811
 
17812
+ #: includes/settings/wcj-settings-sku.php:119
17813
  #, php-format
17814
  msgid "You can also use shortcodes here, e.g.: %s etc."
17815
  msgstr ""
17816
 
17817
+ #: includes/settings/wcj-settings-sku.php:129
17818
  msgid "Variable Products Variations"
17819
  msgstr ""
17820
 
17821
+ #: includes/settings/wcj-settings-sku.php:130
17822
  msgid ""
17823
  "SKU generation for variations. Please note, that if \"Generate SKU for New "
17824
  "Products Only on First Publish\" option below is not checked, then on new "
17827
  "\"Autogenerate SKUs\" tool manually."
17828
  msgstr ""
17829
 
17830
+ #: includes/settings/wcj-settings-sku.php:131
17831
  msgid ""
17832
  "Possible values: SKU same as parent's product; Generate different SKU for "
17833
  "each variation; SKU same as parent's product + variation letter suffix."
17834
  msgstr ""
17835
 
17836
+ #: includes/settings/wcj-settings-sku.php:136
17837
  msgid "SKU same as parent's product"
17838
  msgstr ""
17839
 
17840
+ #: includes/settings/wcj-settings-sku.php:137
17841
  msgid "Generate different SKU for each variation"
17842
  msgstr ""
17843
 
17844
+ #: includes/settings/wcj-settings-sku.php:138
17845
  msgid "SKU same as parent's product + variation letter suffix"
17846
  msgstr ""
17847
 
17848
+ #: includes/settings/wcj-settings-sku.php:148
17849
+ msgid "Hashids options"
17850
+ msgstr ""
17851
+
17852
+ #: includes/settings/wcj-settings-sku.php:153
17853
+ msgid "Salt"
17854
  msgstr ""
17855
 
17856
  #: includes/settings/wcj-settings-sku.php:154
17857
+ msgid "A random string that will make your SKUs really unique."
17858
+ msgstr ""
17859
+
17860
+ #: includes/settings/wcj-settings-sku.php:160
17861
+ msgid "Numbers of characters in SKU"
17862
+ msgstr ""
17863
+
17864
+ #: includes/settings/wcj-settings-sku.php:166
17865
+ msgid "SKU Format"
17866
+ msgstr ""
17867
+
17868
+ #: includes/settings/wcj-settings-sku.php:169
17869
+ msgid "Only Numbers, e.g.: 836237"
17870
+ msgstr ""
17871
+
17872
+ #: includes/settings/wcj-settings-sku.php:170
17873
+ msgid "Only Letters, e.g.: HFuAbQ"
17874
+ msgstr ""
17875
+
17876
+ #: includes/settings/wcj-settings-sku.php:171
17877
+ msgid "Letters and Numbers, e.g.: 8a3M19 "
17878
+ msgstr ""
17879
+
17880
+ #: includes/settings/wcj-settings-sku.php:183
17881
+ msgid "Categories Options"
17882
+ msgstr ""
17883
+
17884
+ #: includes/settings/wcj-settings-sku.php:188
17885
  msgid "Multiple Categories"
17886
  msgstr ""
17887
 
17888
+ #: includes/settings/wcj-settings-sku.php:189
17889
  msgid ""
17890
  "This options defines how to handle category prefixes and suffixes, if "
17891
  "product has multiple categories."
17892
  msgstr ""
17893
 
17894
+ #: includes/settings/wcj-settings-sku.php:194
17895
  msgid "Use first category"
17896
  msgstr ""
17897
 
17898
+ #: includes/settings/wcj-settings-sku.php:195
17899
  msgid "\"Glue\" categories"
17900
  msgstr ""
17901
 
17902
+ #: includes/settings/wcj-settings-sku.php:199
17903
  msgid "Category separator (i.e. \"glue\")"
17904
  msgstr ""
17905
 
17906
+ #: includes/settings/wcj-settings-sku.php:200
17907
  msgid "Ignored if \"Use first category\" is selected above."
17908
  msgstr ""
17909
 
17910
+ #: includes/settings/wcj-settings-sku.php:228
17911
  msgid "Counter (Sequential)"
17912
  msgstr ""
17913
 
17914
+ #: includes/settings/wcj-settings-sku.php:249
17915
  msgid "Automatically Generate SKU for New Products"
17916
  msgstr ""
17917
 
17918
+ #: includes/settings/wcj-settings-sku.php:251
17919
  msgid "Alternatively you can use Autogenerate SKUs tool."
17920
  msgstr ""
17921
 
17922
+ #: includes/settings/wcj-settings-sku.php:251
17923
+ msgid ""
17924
+ "If you want to generate SKU for variations, please try \"Automatically "
17925
+ "Generate SKU for Variations on Product Save\" option."
17926
+ msgstr ""
17927
+
17928
+ #: includes/settings/wcj-settings-sku.php:257
17929
+ msgid "Automatically Generate SKU for Variations on Product Save"
17930
+ msgstr ""
17931
+
17932
+ #: includes/settings/wcj-settings-sku.php:259
17933
+ msgid ""
17934
+ "Once enabled it's recommended to be used with \"Generate SKUs Only for "
17935
+ "Products with Empty SKU\" option or else the SKUs will be replaced on "
17936
+ "product save."
17937
+ msgstr ""
17938
+
17939
+ #: includes/settings/wcj-settings-sku.php:265
17940
  msgid "Generate SKU for New Products Only on First Publish"
17941
  msgstr ""
17942
 
17943
+ #: includes/settings/wcj-settings-sku.php:267
17944
  msgid ""
17945
  "This is important if, for example, you are using category prefix and don't "
17946
  "want SKU generated too early, before you set the category."
17947
  msgstr ""
17948
 
17949
+ #: includes/settings/wcj-settings-sku.php:273
17950
  msgid "Allow Duplicate SKUs"
17951
  msgstr ""
17952
 
17953
+ #: includes/settings/wcj-settings-sku.php:275
17954
  msgid ""
17955
  "If you wish to set SKUs manually, and you need to have same SKUs for "
17956
  "different products, you can enable allow duplicate SKUs option here (which "
17957
  "is disabled in WooCommerce by default)."
17958
  msgstr ""
17959
 
17960
+ #: includes/settings/wcj-settings-sku.php:281
17961
  msgid "Search by SKU"
17962
  msgstr ""
17963
 
17964
+ #: includes/settings/wcj-settings-sku.php:283
17965
  msgid "Add product searching by SKU on frontend."
17966
  msgstr ""
17967
 
17968
+ #: includes/settings/wcj-settings-sku.php:289
17969
  msgid "Advanced: Search by SKU Hook"
17970
  msgstr ""
17971
 
17972
+ #: includes/settings/wcj-settings-sku.php:290
17973
  msgid ""
17974
  "If you are experiencing any issues with searching by SKU, try changing this "
17975
  "option."
17976
  msgstr ""
17977
 
17978
+ #: includes/settings/wcj-settings-sku.php:300
17979
  msgid "Generate SKUs Only for Products with Empty SKU"
17980
  msgstr ""
17981
 
17982
+ #: includes/settings/wcj-settings-sku.php:302
17983
  msgid ""
17984
  "This may help if you are going to use Autogenerate SKUs tool, but don't want "
17985
  "to change your existing SKUs."
17986
  msgstr ""
17987
 
17988
+ #: includes/settings/wcj-settings-sku.php:308
17989
  msgid "Add SKU to Customer Emails"
17990
  msgstr ""
17991
 
17992
+ #: includes/settings/wcj-settings-sku.php:310
17993
  msgid "Adds product SKU to customer's emails."
17994
  msgstr ""
17995
 
17996
+ #: includes/settings/wcj-settings-sku.php:316
17997
  msgid "Remove SKU from Admin Emails"
17998
  msgstr ""
17999
 
18000
+ #: includes/settings/wcj-settings-sku.php:318
18001
  msgid "Removes product SKU from admin's emails."
18002
  msgstr ""
18003
 
18004
+ #: includes/settings/wcj-settings-sku.php:324
18005
  msgid "Disable SKUs"
18006
  msgstr ""
18007
 
18008
+ #: includes/settings/wcj-settings-sku.php:326
18009
  msgid ""
18010
  "Enable this option if you are not going to use SKUs in your shop at all."
18011
  msgstr ""
18532
  msgid "Automatically add coupon's products to the cart"
18533
  msgstr ""
18534
 
18535
+ #: includes/settings/wcj-settings-wholesale-price.php:20
18536
  #, php-format
18537
  msgid "If you want to display prices table on frontend, use %s shortcode."
18538
  msgstr ""
18539
 
18540
+ #: includes/settings/wcj-settings-wholesale-price.php:25
18541
  msgid "Enable per Product"
18542
  msgstr ""
18543
 
18544
+ #: includes/settings/wcj-settings-wholesale-price.php:33
18545
  msgid "Quantity Calculation"
18546
  msgstr ""
18547
 
18548
+ #: includes/settings/wcj-settings-wholesale-price.php:38
18549
  msgid "Product quantity"
18550
  msgstr ""
18551
 
18552
+ #: includes/settings/wcj-settings-wholesale-price.php:39
18553
  msgid "Total cart quantity (wholesale products only)"
18554
  msgstr ""
18555
 
18556
+ #: includes/settings/wcj-settings-wholesale-price.php:40
18557
  msgid "Total cart quantity"
18558
  msgstr ""
18559
 
18560
+ #: includes/settings/wcj-settings-wholesale-price.php:44
18561
  msgid "Exclusive Use Only"
18562
  msgstr ""
18563
 
18564
+ #: includes/settings/wcj-settings-wholesale-price.php:46
18565
  msgid "Apply wholesale discount only if no other cart discounts were applied."
18566
  msgstr ""
18567
 
18568
+ #: includes/settings/wcj-settings-wholesale-price.php:52
18569
  msgid "Round Single Product Price"
18570
  msgstr ""
18571
 
18572
+ #: includes/settings/wcj-settings-wholesale-price.php:53
18573
  msgid ""
18574
  "If enabled will round single product price with precision set in WooCommerce "
18575
  "> Settings > General > Number of decimals."
18576
  msgstr ""
18577
 
18578
+ #: includes/settings/wcj-settings-wholesale-price.php:60
18579
  msgid "Discount Info on Cart Page"
18580
  msgstr ""
18581
 
18582
+ #: includes/settings/wcj-settings-wholesale-price.php:67
18583
  msgid "If show discount info on cart page is enabled, set format here."
18584
  msgstr ""
18585
 
18586
+ #: includes/settings/wcj-settings-wholesale-price.php:116
18587
  msgid "Disable wholesale pricing for products with \"Price Changes\""
18588
  msgstr ""
18589
 
18590
+ #: includes/settings/wcj-settings-wholesale-price.php:123
18591
+ msgid "Advanced: Price Filters Priority"
18592
  msgstr ""
18593
 
18594
  #: includes/settings/wcj-settings-wholesale-price.php:136
18595
+ msgid "Wholesale Levels Options"
18596
+ msgstr ""
18597
+
18598
+ #: includes/settings/wcj-settings-wholesale-price.php:141
18599
+ #: includes/settings/wcj-settings-wholesale-price.php:198
18600
  msgid "Number of Levels"
18601
  msgstr ""
18602
 
18603
+ #: includes/settings/wcj-settings-wholesale-price.php:155
18604
+ #: includes/settings/wcj-settings-wholesale-price.php:212
18605
  msgid "Min Quantity"
18606
  msgstr ""
18607
 
18608
+ #: includes/settings/wcj-settings-wholesale-price.php:156
18609
+ #: includes/settings/wcj-settings-wholesale-price.php:213
18610
  msgid "Minimum quantity to apply discount"
18611
  msgstr ""
18612
 
18613
+ #: includes/settings/wcj-settings-wholesale-price.php:178
18614
  msgid "Additional User Roles Options"
18615
  msgstr ""
18616
 
18617
+ #: includes/settings/wcj-settings-wholesale-price.php:180
18618
  msgid ""
18619
  "If you want to set different wholesale pricing options for different user "
18620
  "roles, fill this section. Please note that you can also use Booster's "
18621
  "\"Price based on User Role\" module without filling this section."
18622
  msgstr ""
18623
 
18624
+ #: includes/settings/wcj-settings-wholesale-price.php:184
18625
  msgid "User Roles Settings"
18626
  msgstr ""
18627
 
19039
  msgid "Link list"
19040
  msgstr ""
19041
 
 
 
 
 
19042
  #: includes/widgets/class-wcj-widget-multicurrency.php:89
19043
  msgid "HTML form method for \"Drop down\" and \"Radio list\" types."
19044
  msgstr ""
readme.txt CHANGED
@@ -3,7 +3,7 @@ Contributors: algoritmika, anbinder, debugeris, karzin
3
  Tags: woocommerce, booster for woocommerce, woocommerce jetpack
4
  Requires at least: 4.4
5
  Tested up to: 5.3
6
- Stable tag: 4.6.1
7
  License: GNU General Public License v3.0
8
  License URI: http://www.gnu.org/licenses/gpl-3.0.html
9
 
@@ -193,14 +193,46 @@ You can see the differences between versions in this [table](https://booster.io/
193
 
194
  == Changelog ==
195
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
196
  = 4.6.1 - 15/11/2019 =
197
  * Fix - CART & CHECKOUT - Checkout Custom Fields - Preserve checkbox field value when updating order status.
198
  * Fix - CART & CHECKOUT - EU VAT Number - Check if EU VAT number is valid during 'woocommerce_after_checkout_validation' hook instead of trying to get the result from session.
199
  * Fix - CART & CHECKOUT - EU VAT Number - Fix possible white space in `wcj_validate_eu_vat_number()` response from ajax by using wp_send_json().
200
  * Fix - EMAILS & MISC. - Custom Emails - Fix bug when sending email to multiple orders at the same time using the bulk editor and when there were multiple recipients including %customer%.
201
- * Fix - Core - `WCJ_Modules` - Also check if Meta-box option is an array.
202
  * Fix - SHIPPING & ORDERS - Replace empty translation text with only empty text due to POT file update.
203
  * Fix - PRODUCTS - Add to Cart - Replace empty translation text with only empty text due to POT file update.
 
204
  * Dev - CART & CHECKOUT - Checkout Fees - Change "Cart Min" and "Max" options to "Cart Minimum" and "Maximum Quantity".
205
  * Dev - CART & CHECKOUT - Checkout Fees - Create "Cart Minimum" and "Maximum Total" options as Plus features.
206
  * Dev - CART & CHECKOUT - EU VAT Number - Add new option to show VAT field for EU countries only.
3
  Tags: woocommerce, booster for woocommerce, woocommerce jetpack
4
  Requires at least: 4.4
5
  Tested up to: 5.3
6
+ Stable tag: 4.7.0
7
  License: GNU General Public License v3.0
8
  License URI: http://www.gnu.org/licenses/gpl-3.0.html
9
 
193
 
194
  == Changelog ==
195
 
196
+ = 4.7.0 - 27/12/2019 =
197
+ * Fix - CART & CHECKOUT - Checkout Custom Fields - Preserve select field value when editing the order from admin.
198
+ * Fix - CART & CHECKOUT - EU VAT Number - Set the user agent explicitly, trying to avoid possible SoapClient errors.
199
+ * Fix - PAYMENT GATEWAYS - Gateways Min/Max Amounts - Notices keep being displayed after order is placed.
200
+ * Fix - PRODUCTS - Product Availability by Date - Fix wrong availabilities on non English languages by setting a default number format of 'm/d/Y' on 'wcj_product_by_date_direct_date' option and by improving description.
201
+ * Fix - PRODUCTS - Product Availability by Date - Fix wrong availabilities on non English languages by setting the date properly according to 'wcj_product_by_date_direct_date_format' option and timezone.
202
+ * Fix - PRODUCTS - Products per Page - Sanitize 'wcj_products_per_page' param.
203
+ * Fix - PRODUCTS - SKU - Sort variations in ascending order on `get_all_variations()` for better results with 'Variable Products Variations' option.
204
+ * Fix - SHIPPING & ORDERS - Custom Shipping - Fix possible Fatal error "Class 'WC_Shipping_WCJ_Custom_Template' not found".
205
+ * Fix - Classes - `WCJ_Module_Product_By_Condition` - `pre_get_posts` - Disables pre_get_posts query when exporting products.
206
+ * Dev - PAYMENT GATEWAYS - Custom Gateways - `update_custom_payment_gateways_fields_order_meta()` now also expects an array as an input value.
207
+ * Dev - PAYMENT GATEWAYS - Custom Gateways - Add 'name_array' as parameter on description replace preventing possible duplicated input fields names.
208
+ * Dev - PDF INVOICING & PACKING SLIPS - Advanced - Add option to set Internal Encoding with `mb_internal_encoding()`.
209
+ * Dev - PRICES & CURRENCIES - Global Discount - Add 'WPML: Get Products in All Languages' option.
210
+ * Dev - PRICES & CURRENCIES - Global Discount - Add 'WPML: Get Terms in All Languages' option.
211
+ * Dev - PRICES & CURRENCIES - Wholesale Price - Add 'WPML: Get Products in All Languages' option.
212
+ * Dev - PRICES & CURRENCIES - Wholesale Price - Add 'WPML: Get Terms in All Languages' option.
213
+ * Dev - SHIPPING & ORDERS - Shipping by Cities - Improve postcode detection trying to read it from `WC()->customer->get_shipping_postcode` too.
214
+ * Dev - PRODUCTS - Product Addons - Add option to export and import '_wcj_product_addons_per_product_enable_by_variation_%' meta.
215
+ * Dev - PRODUCTS - Products per Page - Add option to control form method by POST or GET.
216
+ * Dev - PRODUCTS - SKU - Add option to automatically generate SKU for variations on product save.
217
+ * Dev - PRODUCTS - SKU - Add option to generate SKU using Hashids library.
218
+ * Dev - PRODUCTS - SKU - Add option to manage the numbers of characters on SKU using Hashids.
219
+ * Dev - PRODUCTS - SKU - Add option to control SKU format with numbers or letters using Hashids.
220
+ * Dev - `WCJ_Module` - Get products in all languages from ajax product search, if corresponding WPML option is enabled.
221
+ * Dev - `WCJ_Module` - Move `remove_wpml_functions_before_get_terms` and `restore_wpml_functions_after_get_terms` from 'Price based on User Role' module making it more flexible to be appliable to any module.
222
+ * Dev - Shortcodes - `[wcj_input_field]` Add 'data_attributes' param.
223
+ * Dev - Shortcodes - `[wcj_input_field]` Add 'name_array' param, allowing the input name to be set as an array. e.g. `[wcj_input_field name_array="parent" name="test"]` -> `<input name="parent[test][value]" />`.
224
+ * Dev - Functions - General - Create `wcj_get_data_attributes_html()` function allowing to create a multiple data parameters like `data-param_a='value_a'` when receiving a associative array.
225
+ * Dev - Functions - Date and Time - Add `wcj_timezone()` function to get timezone. `wp_timezone()` already does it but as it was introduced only on version 5.3.0 this was a safer option.
226
+ * Dev - Classes - `WCJ_Module_Product_By_Condition` - `pre_get_posts` - Add 'wcj_product_by_condition_pre_get_posts_validation' filter to setup when the query should be disabled.
227
+
228
  = 4.6.1 - 15/11/2019 =
229
  * Fix - CART & CHECKOUT - Checkout Custom Fields - Preserve checkbox field value when updating order status.
230
  * Fix - CART & CHECKOUT - EU VAT Number - Check if EU VAT number is valid during 'woocommerce_after_checkout_validation' hook instead of trying to get the result from session.
231
  * Fix - CART & CHECKOUT - EU VAT Number - Fix possible white space in `wcj_validate_eu_vat_number()` response from ajax by using wp_send_json().
232
  * Fix - EMAILS & MISC. - Custom Emails - Fix bug when sending email to multiple orders at the same time using the bulk editor and when there were multiple recipients including %customer%.
 
233
  * Fix - SHIPPING & ORDERS - Replace empty translation text with only empty text due to POT file update.
234
  * Fix - PRODUCTS - Add to Cart - Replace empty translation text with only empty text due to POT file update.
235
+ * Fix - Core - `WCJ_Modules` - Also check if Meta-box option is an array.
236
  * Dev - CART & CHECKOUT - Checkout Fees - Change "Cart Min" and "Max" options to "Cart Minimum" and "Maximum Quantity".
237
  * Dev - CART & CHECKOUT - Checkout Fees - Create "Cart Minimum" and "Maximum Total" options as Plus features.
238
  * Dev - CART & CHECKOUT - EU VAT Number - Add new option to show VAT field for EU countries only.
woocommerce-jetpack.php CHANGED
@@ -3,7 +3,7 @@
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: 4.6.1
7
  Author: Algoritmika Ltd
8
  Author URI: https://booster.io
9
  Text Domain: woocommerce-jetpack
@@ -57,7 +57,7 @@ final class WC_Jetpack {
57
  * @var string
58
  * @since 2.4.7
59
  */
60
- public $version = '4.6.1';
61
 
62
  /**
63
  * @var WC_Jetpack The single instance of the class
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: 4.7.0
7
  Author: Algoritmika Ltd
8
  Author URI: https://booster.io
9
  Text Domain: woocommerce-jetpack
57
  * @var string
58
  * @since 2.4.7
59
  */
60
+ public $version = '4.7.0';
61
 
62
  /**
63
  * @var WC_Jetpack The single instance of the class