Booster for WooCommerce - Version 6.0.0

Version Description

30/11/2022 =

  • FIXED - PDF INVOICING & PACKING SLIPS - PDF Invoicing - Fixed error PHP Deprecated: Function WC_Order_Item_Product::offsetSet is deprecated since version...
  • FIXED - PDF INVOICING & PACKING SLIPS - PDF Invoicing - Fixed calculation issue in wcj_order_item_total_refunded shortcode.
  • FIXED - PRICES & CURRENCIES - Currency Exchange Rates - Fixed exchange rate issue for European Central Bank (ECB) exchange rate server response.
  • FIXED - PRICES & CURRENCIES - Currency Exchange Rates - "Always Use cURL" option removed.
  • FIXED - PRICES & CURRENCIES - Multicurrency (Currency Switcher) - Fixed Default Currency and Role Defaults conflict.
  • FIXED - PRICES & CURRENCIES - Product Price by Formula - Fixed verify nonce issue.
  • FIXED - EMAILS & MISC. - General - Added missing images for jquery-ui.css
  • FIXED - Added Security vulnerability fixes - Multiple CSRF.
  • FIXED - Added Security vulnerability fixes.
  • WooCommerce 7.1.0 tested
  • WordPress 6.1 tested
Download this release

Release Info

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

Code changes from version 5.6.8 to 6.0.0

Files changed (62) hide show
  1. includes/admin/class-wcj-settings-custom-fields.php +7 -5
  2. includes/admin/class-wcj-settings-manager.php +5 -5
  3. includes/class-wcj-currency-exchange-rates.php +6 -2
  4. includes/class-wcj-emails-verification.php +12 -10
  5. includes/class-wcj-export-import.php +12 -9
  6. includes/class-wcj-multicurrency.php +15 -5
  7. includes/class-wcj-old-slugs.php +3 -3
  8. includes/class-wcj-order-custom-statuses.php +3 -3
  9. includes/class-wcj-pdf-invoicing.php +5 -5
  10. includes/class-wcj-product-price-by-formula.php +5 -6
  11. includes/class-wcj-products-xml.php +8 -4
  12. includes/class-wcj-track-users.php +9 -7
  13. includes/classes/class-wcj-module-product-by-condition.php +11 -11
  14. includes/classes/class-wcj-module.php +24 -15
  15. includes/classes/class-wcj-pdf-invoice.php +12 -18
  16. includes/classes/class-wcj-shortcodes.php +12 -10
  17. includes/core/wcj-loader.php +2 -2
  18. includes/css/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  19. includes/css/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
  20. includes/css/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
  21. includes/css/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  22. includes/css/images/ui-bg_glass_75_dadada_1x400.png +0 -0
  23. includes/css/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
  24. includes/css/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  25. includes/css/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
  26. includes/css/images/ui-icons_222222_256x240.png +0 -0
  27. includes/css/images/ui-icons_2e83ff_256x240.png +0 -0
  28. includes/css/images/ui-icons_454545_256x240.png +0 -0
  29. includes/css/images/ui-icons_888888_256x240.png +0 -0
  30. includes/css/images/ui-icons_cd0a0a_256x240.png +0 -0
  31. includes/css/wcj-admin.css +30 -1
  32. includes/emails/class-wc-email-wcj-custom.php +3 -3
  33. includes/emails/email-html.php +10 -1
  34. includes/emails/email-plain.php +10 -1
  35. includes/exchange-rates/class-wcj-exchange-rates.php +24 -15
  36. includes/export/class-wcj-exporter-customers.php +3 -3
  37. includes/export/class-wcj-exporter-orders.php +7 -3
  38. includes/functions/wcj-functions-booster-core.php +3 -3
  39. includes/functions/wcj-functions-debug.php +6 -4
  40. includes/functions/wcj-functions-exchange-rates.php +10 -13
  41. includes/functions/wcj-functions-general.php +24 -57
  42. includes/functions/wcj-functions-number-to-words-lt.php +3 -3
  43. includes/functions/wcj-functions-number-to-words.php +3 -3
  44. includes/functions/wcj-functions-reports.php +3 -3
  45. includes/js/wcj-ajax-exchange-rates-average.js +2 -1
  46. includes/pdf-invoices/class-wcj-pdf-invoicing-renumerate-tool.php +10 -8
  47. includes/pdf-invoices/class-wcj-pdf-invoicing-report-tool.php +15 -24
  48. includes/reports/class-wcj-reports-customers.php +6 -5
  49. includes/reports/class-wcj-reports-monthly-sales.php +13 -17
  50. includes/reports/class-wcj-reports-product-sales-daily.php +26 -24
  51. includes/reports/class-wcj-reports-sales-gateways.php +22 -21
  52. includes/reports/class-wcj-reports-sales.php +12 -15
  53. includes/reports/class-wcj-reports-stock.php +24 -20
  54. includes/settings/wcj-settings-currency-exchange-rates.php +1 -9
  55. includes/shortcodes/class-wcj-general-shortcodes.php +7 -6
  56. includes/shortcodes/class-wcj-order-items-shortcodes.php +20 -11
  57. includes/shortcodes/class-wcj-orders-shortcodes.php +3 -3
  58. includes/templates/wcj-radio-for-variations.php +4 -4
  59. langs/woocommerce-jetpack.pot +138 -167
  60. readme.txt +15 -1
  61. version-details.json +3 -3
  62. woocommerce-jetpack.php +2 -2
includes/admin/class-wcj-settings-custom-fields.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Settings Custom Fields
4
  *
5
- * @version 5.6.8
6
  * @since 2.8.0
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/admin
@@ -156,7 +156,7 @@ if ( ! class_exists( 'WCJ_Settings_Custom_Fields' ) ) :
156
  /**
157
  * Output_wcj_number_plus_checkbox_start.
158
  *
159
- * @version 5.6.2
160
  * @since 2.8.0
161
  * @param Array $value Get values.
162
  */
@@ -170,7 +170,8 @@ if ( ! class_exists( 'WCJ_Settings_Custom_Fields' ) ) :
170
  }
171
  // Description handling.
172
  $field_description = WC_Admin_Settings::get_field_description( $value );
173
- extract( $field_description ); //phpcs:ignore
 
174
  // Option value.
175
  $option_value = WC_Admin_Settings::get_option( $value['id'], $value['default'] );
176
  // Output.
@@ -198,7 +199,7 @@ if ( ! class_exists( 'WCJ_Settings_Custom_Fields' ) ) :
198
  /**
199
  * Output_wcj_number_plus_checkbox_end.
200
  *
201
- * @version 2.8.0
202
  * @since 2.8.0
203
  * @param Array $value Get values.
204
  */
@@ -212,7 +213,8 @@ if ( ! class_exists( 'WCJ_Settings_Custom_Fields' ) ) :
212
  }
213
  // Description handling.
214
  $field_description = WC_Admin_Settings::get_field_description( $value );
215
- extract( $field_description ); //phpcs:ignore
 
216
  // Option value.
217
  $option_value = WC_Admin_Settings::get_option( $value['id'], $value['default'] );
218
  // Output.
2
  /**
3
  * Booster for WooCommerce - Settings Custom Fields
4
  *
5
+ * @version 6.0.0
6
  * @since 2.8.0
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/admin
156
  /**
157
  * Output_wcj_number_plus_checkbox_start.
158
  *
159
+ * @version 6.0.0
160
  * @since 2.8.0
161
  * @param Array $value Get values.
162
  */
170
  }
171
  // Description handling.
172
  $field_description = WC_Admin_Settings::get_field_description( $value );
173
+ $description = $field_description['description'];
174
+ $tooltip_html = $field_description['tooltip_html'];
175
  // Option value.
176
  $option_value = WC_Admin_Settings::get_option( $value['id'], $value['default'] );
177
  // Output.
199
  /**
200
  * Output_wcj_number_plus_checkbox_end.
201
  *
202
+ * @version 6.0.0
203
  * @since 2.8.0
204
  * @param Array $value Get values.
205
  */
213
  }
214
  // Description handling.
215
  $field_description = WC_Admin_Settings::get_field_description( $value );
216
+ $description = $field_description['description'];
217
+ $tooltip_html = $field_description['tooltip_html'];
218
  // Option value.
219
  $option_value = WC_Admin_Settings::get_option( $value['id'], $value['default'] );
220
  // Output.
includes/admin/class-wcj-settings-manager.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Settings Manager - Import / Export / Reset Booster's settings
4
  *
5
- * @version 5.6.8
6
  * @since 2.9.0
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/admin
@@ -150,7 +150,7 @@ if ( ! class_exists( 'WCJ_Settings_Manager' ) ) :
150
  /**
151
  * Manage_options_reset_meta.
152
  *
153
- * @version 5.6.2
154
  * @since 3.4.0
155
  * @todo order items meta
156
  * @todo `... LIKE 'wcj_%'`
@@ -158,7 +158,7 @@ if ( ! class_exists( 'WCJ_Settings_Manager' ) ) :
158
  public function manage_options_reset_meta() {
159
  global $wpdb, $wcj_notice;
160
  $delete_counter_meta = 0;
161
- $plugin_meta = $wpdb->get_results( "SELECT * FROM $wpdb->postmeta WHERE meta_key LIKE '_wcj_%'" ); // WPCS: db call ok and cache ok.
162
  foreach ( $plugin_meta as $meta ) {
163
  delete_post_meta( $meta->post_id, $meta->meta_key );
164
  $delete_counter_meta++;
@@ -170,13 +170,13 @@ if ( ! class_exists( 'WCJ_Settings_Manager' ) ) :
170
  /**
171
  * Manage_options_reset.
172
  *
173
- * @version 5.6.2
174
  * @since 2.5.2
175
  */
176
  public function manage_options_reset() {
177
  global $wpdb, $wcj_notice;
178
  $delete_counter_options = 0;
179
- $plugin_options = $wpdb->get_results( "SELECT option_name FROM $wpdb->options WHERE option_name LIKE 'wcj_%'" ); // WPCS: db call ok and cache ok.
180
  foreach ( $plugin_options as $option ) {
181
  delete_option( $option->option_name );
182
  delete_site_option( $option->option_name );
2
  /**
3
  * Booster for WooCommerce - Settings Manager - Import / Export / Reset Booster's settings
4
  *
5
+ * @version 6.0.0
6
  * @since 2.9.0
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/admin
150
  /**
151
  * Manage_options_reset_meta.
152
  *
153
+ * @version 6.0.0
154
  * @since 3.4.0
155
  * @todo order items meta
156
  * @todo `... LIKE 'wcj_%'`
158
  public function manage_options_reset_meta() {
159
  global $wpdb, $wcj_notice;
160
  $delete_counter_meta = 0;
161
+ $plugin_meta = $wpdb->get_results( "SELECT * FROM $wpdb->postmeta WHERE meta_key LIKE '_wcj_%'" ); // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching
162
  foreach ( $plugin_meta as $meta ) {
163
  delete_post_meta( $meta->post_id, $meta->meta_key );
164
  $delete_counter_meta++;
170
  /**
171
  * Manage_options_reset.
172
  *
173
+ * @version 6.0.0
174
  * @since 2.5.2
175
  */
176
  public function manage_options_reset() {
177
  global $wpdb, $wcj_notice;
178
  $delete_counter_options = 0;
179
+ $plugin_options = $wpdb->get_results( "SELECT option_name FROM $wpdb->options WHERE option_name LIKE 'wcj_%'" ); // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching
180
  foreach ( $plugin_options as $option ) {
181
  delete_option( $option->option_name );
182
  delete_site_option( $option->option_name );
includes/class-wcj-currency-exchange-rates.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Module - Currency Exchange Rates
4
  *
5
- * @version 5.6.8
6
  * @since 2.3.0
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/includes
@@ -21,7 +21,7 @@ if ( ! class_exists( 'WCJ_Currency_Exchange_Rates' ) ) :
21
  /**
22
  * Constructor.
23
  *
24
- * @version 5.2.0
25
  */
26
  public function __construct() {
27
 
@@ -39,6 +39,10 @@ if ( ! class_exists( 'WCJ_Currency_Exchange_Rates' ) ) :
39
  include_once 'exchange-rates/class-wcj-exchange-rates-crons.php';
40
  add_action( 'admin_init', array( $this, 'maybe_update_all_rates' ) );
41
  add_filter( 'wcj_currency_exchange_rate', array( $this, 'force_dot_as_exchange_rate_decimal_separator' ) );
 
 
 
 
42
  }
43
  include_once 'exchange-rates/class-wcj-exchange-rates.php';
44
  }
2
  /**
3
  * Booster for WooCommerce - Module - Currency Exchange Rates
4
  *
5
+ * @version 6.0.0
6
  * @since 2.3.0
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/includes
21
  /**
22
  * Constructor.
23
  *
24
+ * @version 6.0.0
25
  */
26
  public function __construct() {
27
 
39
  include_once 'exchange-rates/class-wcj-exchange-rates-crons.php';
40
  add_action( 'admin_init', array( $this, 'maybe_update_all_rates' ) );
41
  add_filter( 'wcj_currency_exchange_rate', array( $this, 'force_dot_as_exchange_rate_decimal_separator' ) );
42
+ $deprecated_option = wcj_get_option( 'wcj_currency_exchange_rates_always_curl' );
43
+ if ( $deprecated_option && '' !== $deprecated_option ) {
44
+ delete_option( 'wcj_currency_exchange_rates_always_curl' );
45
+ }
46
  }
47
  include_once 'exchange-rates/class-wcj-exchange-rates.php';
48
  }
includes/class-wcj-emails-verification.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Module - Email Verification
4
  *
5
- * @version 5.6.8
6
  * @since 2.8.0
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/includes
@@ -147,13 +147,13 @@ if ( ! class_exists( 'WCJ_Emails_Verification' ) ) :
147
  /**
148
  * Prevent_user_login_automatically_after_register.
149
  *
150
- * @version 5.5.9
151
  * @since 2.8.0
152
  * @param string $redirect_to defines the redirect_to.
153
  */
154
  public function prevent_user_login_automatically_after_register( $redirect_to ) {
155
  wp_logout();
156
- return esc_url( add_query_arg( 'wcj_activate_account_message', '', $redirect_to ) );
157
  }
158
 
159
  /**
@@ -191,7 +191,7 @@ if ( ! class_exists( 'WCJ_Emails_Verification' ) ) :
191
  /**
192
  * Reset_and_mail_activation_link.
193
  *
194
- * @version 5.6.8
195
  * @since 2.8.0
196
  * @todo %site_name% etc. in `wcj_emails_verification_email_subject`
197
  * @param int $user_id defines the user_id.
@@ -202,7 +202,7 @@ if ( ! class_exists( 'WCJ_Emails_Verification' ) ) :
202
  $url = wp_nonce_url(
203
  add_query_arg(
204
  'wcj_verify_email',
205
- base64_encode(
206
  wp_json_encode(
207
  array(
208
  'id' => $user_id,
@@ -211,7 +211,8 @@ if ( ! class_exists( 'WCJ_Emails_Verification' ) ) :
211
  )
212
  ),
213
  wc_get_page_permalink( 'myaccount' )
214
- )
 
215
  );
216
  $email_content = do_shortcode(
217
  apply_filters(
@@ -248,13 +249,14 @@ if ( ! class_exists( 'WCJ_Emails_Verification' ) ) :
248
  /**
249
  * Process_email_verification.
250
  *
251
- * @version 5.6.8
252
  * @since 2.8.0
253
  */
254
  public function process_email_verification() {
 
255
  if ( isset( $_GET['wcj_verified_email'] ) ) {
256
  if ( function_exists( 'wc_add_notice' ) ) {
257
- $data = json_decode( base64_decode( sanitize_email( wp_unslash( $_GET['wcj_verified_email'] ) ) ), true );
258
  if ( ! empty( $data['id'] ) && ! empty( $data['code'] ) && get_user_meta( $data['id'], 'wcj_activation_code', true ) === $data['code'] ) {
259
  wc_add_notice(
260
  do_shortcode(
@@ -266,8 +268,8 @@ if ( ! class_exists( 'WCJ_Emails_Verification' ) ) :
266
  );
267
  }
268
  }
269
- } elseif ( isset( $_GET['wcj_verify_email'] ) ) {
270
- $data = json_decode( base64_decode( sanitize_text_field( wp_unslash( $_GET['wcj_verify_email'] ) ) ), true );
271
  if ( ! empty( $data['id'] ) && ! empty( $data['code'] ) && get_user_meta( $data['id'], 'wcj_activation_code', true ) === $data['code'] ) {
272
  update_user_meta( $data['id'], 'wcj_is_activated', '1' );
273
  if ( 'yes' === wcj_get_option( 'wcj_emails_verification_redirect_on_success', 'yes' ) ) {
2
  /**
3
  * Booster for WooCommerce - Module - Email Verification
4
  *
5
+ * @version 6.0.0
6
  * @since 2.8.0
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/includes
147
  /**
148
  * Prevent_user_login_automatically_after_register.
149
  *
150
+ * @version 6.0.0
151
  * @since 2.8.0
152
  * @param string $redirect_to defines the redirect_to.
153
  */
154
  public function prevent_user_login_automatically_after_register( $redirect_to ) {
155
  wp_logout();
156
+ return esc_url_raw( add_query_arg( 'wcj_activate_account_message', '', $redirect_to ) );
157
  }
158
 
159
  /**
191
  /**
192
  * Reset_and_mail_activation_link.
193
  *
194
+ * @version 6.0.0
195
  * @since 2.8.0
196
  * @todo %site_name% etc. in `wcj_emails_verification_email_subject`
197
  * @param int $user_id defines the user_id.
202
  $url = wp_nonce_url(
203
  add_query_arg(
204
  'wcj_verify_email',
205
+ base64_encode( // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions.obfuscation_base64_encode
206
  wp_json_encode(
207
  array(
208
  'id' => $user_id,
211
  )
212
  ),
213
  wc_get_page_permalink( 'myaccount' )
214
+ ),
215
+ 'wcj_verify_email'
216
  );
217
  $email_content = do_shortcode(
218
  apply_filters(
249
  /**
250
  * Process_email_verification.
251
  *
252
+ * @version 6.0.0
253
  * @since 2.8.0
254
  */
255
  public function process_email_verification() {
256
+ $wcj_verify_email_wpnonce = isset( $_GET['_wpnonce'] ) ? wp_verify_nonce( sanitize_key( $_GET['_wpnonce'] ), 'wcj_verify_email' ) : false;
257
  if ( isset( $_GET['wcj_verified_email'] ) ) {
258
  if ( function_exists( 'wc_add_notice' ) ) {
259
+ $data = json_decode( base64_decode( sanitize_text_field( wp_unslash( $_GET['wcj_verified_email'] ) ) ), true ); // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions.obfuscation_base64_decode
260
  if ( ! empty( $data['id'] ) && ! empty( $data['code'] ) && get_user_meta( $data['id'], 'wcj_activation_code', true ) === $data['code'] ) {
261
  wc_add_notice(
262
  do_shortcode(
268
  );
269
  }
270
  }
271
+ } elseif ( $wcj_verify_email_wpnonce && isset( $_GET['wcj_verify_email'] ) ) {
272
+ $data = json_decode( base64_decode( sanitize_text_field( wp_unslash( $_GET['wcj_verify_email'] ) ) ), true ); // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions.obfuscation_base64_decode
273
  if ( ! empty( $data['id'] ) && ! empty( $data['code'] ) && get_user_meta( $data['id'], 'wcj_activation_code', true ) === $data['code'] ) {
274
  update_user_meta( $data['id'], 'wcj_is_activated', '1' );
275
  if ( 'yes' === wcj_get_option( 'wcj_emails_verification_redirect_on_success', 'yes' ) ) {
includes/class-wcj-export-import.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Module - Export
4
  *
5
- * @version 5.6.8
6
  * @since 2.5.4
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/includes
@@ -126,12 +126,15 @@ if ( ! class_exists( 'WCJ_Export_Import' ) ) :
126
  /**
127
  * Export_xml.
128
  *
129
- * @version 5.6.8
130
  * @since 2.5.9
131
  * @todo [dev] templates for xml_start, xml_end, xml_item.
132
  * @todo [dev] `strip_tags`
133
  */
134
  public function export_xml() {
 
 
 
135
  $wpnonce = isset( $_REQUEST['wcj_tools_nonce'] ) ? wp_verify_nonce( sanitize_key( $_REQUEST['wcj_tools_nonce'] ), 'wcj_tools' ) : false;
136
  if ( $wpnonce && isset( $_POST['wcj_export_xml'] ) ) {
137
  $data = $this->export( sanitize_text_field( wp_unslash( $_POST['wcj_export_xml'] ) ) );
@@ -152,11 +155,11 @@ if ( ! class_exists( 'WCJ_Export_Import' ) ) :
152
  $xml .= '</item>' . PHP_EOL;
153
  }
154
  $xml .= '</root>';
155
- header( 'Content-Disposition: attachment; filename=' . sanitize_text_field( wp_unslash( $_POST['wcj_export_xml'] ) ) . '.xml' );
156
- header( 'Content-Type: Content-Type: text/html; charset=utf-8' );
157
- header( 'Content-Description: File Transfer' );
158
- header( 'Content-Length: ' . strlen( $xml ) );
159
- echo $xml; // phpcs:ignore WordPress.Security.EscapeOutput
160
  die();
161
  }
162
  }
@@ -322,7 +325,7 @@ if ( ! class_exists( 'WCJ_Export_Import' ) ) :
322
  /**
323
  * Create_export_tool.
324
  *
325
- * @version 5.6.8
326
  * @since 2.4.8
327
  * @param int $tool_id defines the tool_id.
328
  */
@@ -353,7 +356,7 @@ if ( ! class_exists( 'WCJ_Export_Import' ) ) :
353
  echo '</p>';
354
  echo '</form>';
355
  $data = $this->export( $tool_id );
356
- echo is_array( $data ) ? wcj_get_table_html( $data, array( 'table_class' => 'widefat striped' ) ) : ( $data ); // phpcs:ignore WordPress.Security.EscapeOutput
357
  echo '</div>';
358
  }
359
 
2
  /**
3
  * Booster for WooCommerce - Module - Export
4
  *
5
+ * @version 6.0.0
6
  * @since 2.5.4
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/includes
126
  /**
127
  * Export_xml.
128
  *
129
+ * @version 6.0.0
130
  * @since 2.5.9
131
  * @todo [dev] templates for xml_start, xml_end, xml_item.
132
  * @todo [dev] `strip_tags`
133
  */
134
  public function export_xml() {
135
+ global $wp_filesystem;
136
+ require_once ABSPATH . '/wp-admin/includes/file.php';
137
+ WP_Filesystem();
138
  $wpnonce = isset( $_REQUEST['wcj_tools_nonce'] ) ? wp_verify_nonce( sanitize_key( $_REQUEST['wcj_tools_nonce'] ), 'wcj_tools' ) : false;
139
  if ( $wpnonce && isset( $_POST['wcj_export_xml'] ) ) {
140
  $data = $this->export( sanitize_text_field( wp_unslash( $_POST['wcj_export_xml'] ) ) );
155
  $xml .= '</item>' . PHP_EOL;
156
  }
157
  $xml .= '</root>';
158
+
159
+ $file_name = sanitize_text_field( wp_unslash( $_POST['wcj_export_xml'] ) ) . '.xml';
160
+ $file_path = wp_tempnam();
161
+ $wp_filesystem->put_contents( $file_path, $xml, FS_CHMOD_FILE );
162
+ WC_Download_Handler::download_file_force( $file_path, $file_name );
163
  die();
164
  }
165
  }
325
  /**
326
  * Create_export_tool.
327
  *
328
+ * @version 6.0.0
329
  * @since 2.4.8
330
  * @param int $tool_id defines the tool_id.
331
  */
356
  echo '</p>';
357
  echo '</form>';
358
  $data = $this->export( $tool_id );
359
+ echo is_array( $data ) ? wp_kses_post( wcj_get_table_html( $data, array( 'table_class' => 'widefat striped' ) ) ) : wp_kses_post( $data );
360
  echo '</div>';
361
  }
362
 
includes/class-wcj-multicurrency.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Module - Multicurrency (Currency Switcher)
4
  *
5
- * @version 5.6.8
6
  * @since 2.4.3
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/includes
@@ -917,7 +917,7 @@ if ( ! class_exists( 'WCJ_Multicurrency' ) ) :
917
  /**
918
  * Gets all products, or products with variations containing meta '_wcj_multicurrency_per_product_regular_price_{currency}' or '_wcj_multicurrency_per_product_sale_price_{currency}'.
919
  *
920
- * @version 5.6.2
921
  * @since 4.5.0
922
  *
923
  * @param int | string $currency defines the currency.
@@ -930,7 +930,7 @@ if ( ! class_exists( 'WCJ_Multicurrency' ) ) :
930
  }
931
 
932
  global $wpdb;
933
- $product_ids = $wpdb->get_col(
934
  $wpdb->prepare(
935
  "SELECT p.ID
936
  FROM {$wpdb->posts} AS p
@@ -942,7 +942,7 @@ if ( ! class_exists( 'WCJ_Multicurrency' ) ) :
942
  '_wcj_multicurrency_per_product_regular_price_' . esc_html( $currency ),
943
  '_wcj_multicurrency_per_product_sale_price_' . esc_html( $currency )
944
  )
945
- ); // WPCS: db call ok and cache ok.
946
 
947
  return $product_ids;
948
  }
@@ -1053,12 +1053,22 @@ if ( ! class_exists( 'WCJ_Multicurrency' ) ) :
1053
  /**
1054
  * Get_default_currency.
1055
  *
1056
- * @version 5.3.4
1057
  * @since 5.3.4
1058
  *
1059
  * @return bool
1060
  */
1061
  public function get_default_currency() {
 
 
 
 
 
 
 
 
 
 
1062
  $default_currency_number = wcj_get_option( 'wcj_multicurrency_default_currency', 1 );
1063
  $currency = wcj_get_option( 'wcj_multicurrency_currency_' . $default_currency_number, apply_filters( 'woocommerce_currency', get_option( 'woocommerce_currency' ) ) );
1064
  return $currency;
2
  /**
3
  * Booster for WooCommerce - Module - Multicurrency (Currency Switcher)
4
  *
5
+ * @version 6.0.0
6
  * @since 2.4.3
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/includes
917
  /**
918
  * Gets all products, or products with variations containing meta '_wcj_multicurrency_per_product_regular_price_{currency}' or '_wcj_multicurrency_per_product_sale_price_{currency}'.
919
  *
920
+ * @version 6.0.0
921
  * @since 4.5.0
922
  *
923
  * @param int | string $currency defines the currency.
930
  }
931
 
932
  global $wpdb;
933
+ $product_ids = $wpdb->get_col( // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching
934
  $wpdb->prepare(
935
  "SELECT p.ID
936
  FROM {$wpdb->posts} AS p
942
  '_wcj_multicurrency_per_product_regular_price_' . esc_html( $currency ),
943
  '_wcj_multicurrency_per_product_sale_price_' . esc_html( $currency )
944
  )
945
+ );
946
 
947
  return $product_ids;
948
  }
1053
  /**
1054
  * Get_default_currency.
1055
  *
1056
+ * @version 6.0.0
1057
  * @since 5.3.4
1058
  *
1059
  * @return bool
1060
  */
1061
  public function get_default_currency() {
1062
+ $module_roles = wcj_get_option( 'wcj_multicurrency_role_defaults_roles', '' );
1063
+ if ( ! empty( $module_roles ) ) {
1064
+ $current_user_role = wcj_get_current_user_first_role();
1065
+ if ( in_array( $current_user_role, $module_roles, true ) ) {
1066
+ $currency = wcj_get_option( 'wcj_multicurrency_role_defaults_' . $current_user_role, '' );
1067
+ if ( '' !== $currency && null !== $currency ) {
1068
+ return $currency;
1069
+ }
1070
+ }
1071
+ }
1072
  $default_currency_number = wcj_get_option( 'wcj_multicurrency_default_currency', 1 );
1073
  $currency = wcj_get_option( 'wcj_multicurrency_currency_' . $default_currency_number, apply_filters( 'woocommerce_currency', get_option( 'woocommerce_currency' ) ) );
1074
  return $currency;
includes/class-wcj-old-slugs.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Module - Old Slugs
4
  *
5
- * @version 5.6.8
6
  * @author Pluggabl LLC.
7
  * @package Booster_For_WooCommerce/includes
8
  */
@@ -43,13 +43,13 @@ if ( ! class_exists( 'WCJ_Old_Slugs' ) ) :
43
  /**
44
  * Create_old_slugs_tool.
45
  *
46
- * @version 5.6.8
47
  */
48
  public function create_old_slugs_tool() {
49
 
50
  global $wpdb;
51
  $wp_postmeta_table = $wpdb->prefix . 'postmeta';
52
- $all_old_slugs = $wpdb->get_results( "SELECT * FROM {$wpdb->prefix}postmeta WHERE meta_key = '_wp_old_slug' ORDER BY post_id" ); // WPCS: db call ok and cache ok.
53
  $num_old_slugs = count( $all_old_slugs );
54
  $remove_result_html = '';
55
  $headings = array(
2
  /**
3
  * Booster for WooCommerce - Module - Old Slugs
4
  *
5
+ * @version 6.0.0
6
  * @author Pluggabl LLC.
7
  * @package Booster_For_WooCommerce/includes
8
  */
43
  /**
44
  * Create_old_slugs_tool.
45
  *
46
+ * @version 6.0.0
47
  */
48
  public function create_old_slugs_tool() {
49
 
50
  global $wpdb;
51
  $wp_postmeta_table = $wpdb->prefix . 'postmeta';
52
+ $all_old_slugs = $wpdb->get_results( "SELECT * FROM {$wpdb->prefix}postmeta WHERE meta_key = '_wp_old_slug' ORDER BY post_id" ); // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching
53
  $num_old_slugs = count( $all_old_slugs );
54
  $remove_result_html = '';
55
  $headings = array(
includes/class-wcj-order-custom-statuses.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Module - Order Custom Statuses
4
  *
5
- * @version 5.6.3
6
  * @since 2.2.0
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/includes
@@ -358,7 +358,7 @@ if ( ! class_exists( 'WCJ_Order_Custom_Statuses' ) ) :
358
  /**
359
  * Register_custom_post_statuses.
360
  *
361
- * @version 5.6.2
362
  */
363
  public function register_custom_post_statuses() {
364
  $custom_statuses = $this->get_custom_order_statuses( $this->cut_prefix() );
@@ -372,7 +372,7 @@ if ( ! class_exists( 'WCJ_Order_Custom_Statuses' ) ) :
372
  'show_in_admin_all_list' => true,
373
  'show_in_admin_status_list' => true,
374
  /* translators: %s: translation added */
375
- 'label_count' => _n_noop( $label . ' <span class="count">(%s)</span>', $label . ' <span class="count">(%s)</span>' ), //phpcs:ignore
376
  )
377
  );
378
  }
2
  /**
3
  * Booster for WooCommerce - Module - Order Custom Statuses
4
  *
5
+ * @version 6.0.0
6
  * @since 2.2.0
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/includes
358
  /**
359
  * Register_custom_post_statuses.
360
  *
361
+ * @version 6.0.0
362
  */
363
  public function register_custom_post_statuses() {
364
  $custom_statuses = $this->get_custom_order_statuses( $this->cut_prefix() );
372
  'show_in_admin_all_list' => true,
373
  'show_in_admin_status_list' => true,
374
  /* translators: %s: translation added */
375
+ 'label_count' => _n_noop( $label . ' <span class="count">(%s)</span>', $label . ' <span class="count">(%s)</span>' ), // phpcs:ignore WordPress.WP.I18n
376
  )
377
  );
378
  }
includes/class-wcj-pdf-invoicing.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Module - PDF Invoicing
4
  *
5
- * @version 5.6.8
6
  * @author Pluggabl LLC.
7
  * @package Booster_For_WooCommerce/includes
8
  */
@@ -329,7 +329,7 @@ if ( ! class_exists( 'WCJ_PDF_Invoicing' ) ) :
329
  /**
330
  * Get_invoices_zip.
331
  *
332
- * @version 3.5.0
333
  * @since 2.5.7
334
  * @todo (maybe) add timestamp to filename
335
  * @todo add `ZipArchive` fallback
@@ -362,7 +362,7 @@ if ( ! class_exists( 'WCJ_PDF_Invoicing' ) ) :
362
  }
363
  $zip->close();
364
  // Sending Zip.
365
- wcj_send_file( $zip_file_name, $zip_file_path, 'zip', true );
366
  return '';
367
  }
368
 
@@ -505,7 +505,7 @@ if ( ! class_exists( 'WCJ_PDF_Invoicing' ) ) :
505
  /**
506
  * Generate_pdf_on_init.
507
  *
508
- * @version 4.3.1
509
  */
510
  public function generate_pdf_on_init() {
511
  // Check if all is OK.
@@ -514,7 +514,7 @@ if ( ! class_exists( 'WCJ_PDF_Invoicing' ) ) :
514
  }
515
  // Get PDF.
516
  $the_invoice = wcj_get_pdf_invoice( $this->order_id, $this->invoice_type_id );
517
- $dest = ( true === $this->save_as_pdf ? 'D' : 'I' );
518
  if ( 'yes' === wcj_get_option( 'wcj_general_advanced_disable_output_buffer', 'no' ) ) {
519
  ob_clean();
520
  ob_flush();
2
  /**
3
  * Booster for WooCommerce - Module - PDF Invoicing
4
  *
5
+ * @version 6.0.0
6
  * @author Pluggabl LLC.
7
  * @package Booster_For_WooCommerce/includes
8
  */
329
  /**
330
  * Get_invoices_zip.
331
  *
332
+ * @version 6.0.0
333
  * @since 2.5.7
334
  * @todo (maybe) add timestamp to filename
335
  * @todo add `ZipArchive` fallback
362
  }
363
  $zip->close();
364
  // Sending Zip.
365
+ WC_Download_Handler::download_file_force( $zip_file_path, $zip_file_name );
366
  return '';
367
  }
368
 
505
  /**
506
  * Generate_pdf_on_init.
507
  *
508
+ * @version 6.0.0
509
  */
510
  public function generate_pdf_on_init() {
511
  // Check if all is OK.
514
  }
515
  // Get PDF.
516
  $the_invoice = wcj_get_pdf_invoice( $this->order_id, $this->invoice_type_id );
517
+ $dest = ( '1' === $this->save_as_pdf ? 'D' : 'I' );
518
  if ( 'yes' === wcj_get_option( 'wcj_general_advanced_disable_output_buffer', 'no' ) ) {
519
  ob_clean();
520
  ob_flush();
includes/class-wcj-product-price-by-formula.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Module - Product Price by Formula
4
  *
5
- * @version 5.6.8
6
  * @since 2.5.1
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/includes
@@ -21,7 +21,7 @@ if ( ! class_exists( 'WCJ_Product_Price_By_Formula' ) ) :
21
  /**
22
  * Constructor.
23
  *
24
- * @version 5.6.8
25
  * @since 2.5.1
26
  * @todo use WC math library instead of `PHPMathParser`
27
  */
@@ -41,10 +41,9 @@ if ( ! class_exists( 'WCJ_Product_Price_By_Formula' ) ) :
41
  add_action( 'save_post_product', array( $this, 'save_meta_box' ), PHP_INT_MAX, 2 );
42
  $wpnonce = isset( $_REQUEST['wcj-cat-nonce'] ) ? wp_verify_nonce( sanitize_key( $_REQUEST['wcj-cat-nonce'] ), 'wcj-cat-nonce' ) : false;
43
  if (
44
- $wpnonce &&
45
  ( wcj_is_frontend() && 'yes' === wcj_get_option( 'wcj_product_price_by_formula_admin_scope', 'yes' ) ) ||
46
  ( 'no' === wcj_get_option( 'wcj_product_price_by_formula_admin_scope', 'yes' ) && ( wcj_is_frontend() || is_admin() ) ) ||
47
- isset( $_GET['wcj_create_products_xml'] )
48
  ) {
49
  wcj_add_change_price_hooks( $this, wcj_get_module_price_hooks_priority( 'product_price_by_formula' ), false );
50
  }
@@ -186,7 +185,7 @@ if ( ! class_exists( 'WCJ_Product_Price_By_Formula' ) ) :
186
  /**
187
  * Reset_settings.
188
  *
189
- * @version 5.6.8
190
  * @since 5.3.0
191
  */
192
  public function reset_settings() {
@@ -201,7 +200,7 @@ if ( ! class_exists( 'WCJ_Product_Price_By_Formula' ) ) :
201
  ) {
202
  global $wpdb;
203
  $prefix = '_wcj_product_price_by_formula';
204
- $wpdb->query( $wpdb->prepare( 'delete from ' . $wpdb->postmeta . ' where meta_key REGEXP %s', $prefix ) ); // WPCS: db call ok and cache ok.
205
  }
206
  parent::reset_settings(); // TODO: Change the autogenerated stub.
207
  }
2
  /**
3
  * Booster for WooCommerce - Module - Product Price by Formula
4
  *
5
+ * @version 6.0.0
6
  * @since 2.5.1
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/includes
21
  /**
22
  * Constructor.
23
  *
24
+ * @version 6.0.0
25
  * @since 2.5.1
26
  * @todo use WC math library instead of `PHPMathParser`
27
  */
41
  add_action( 'save_post_product', array( $this, 'save_meta_box' ), PHP_INT_MAX, 2 );
42
  $wpnonce = isset( $_REQUEST['wcj-cat-nonce'] ) ? wp_verify_nonce( sanitize_key( $_REQUEST['wcj-cat-nonce'] ), 'wcj-cat-nonce' ) : false;
43
  if (
 
44
  ( wcj_is_frontend() && 'yes' === wcj_get_option( 'wcj_product_price_by_formula_admin_scope', 'yes' ) ) ||
45
  ( 'no' === wcj_get_option( 'wcj_product_price_by_formula_admin_scope', 'yes' ) && ( wcj_is_frontend() || is_admin() ) ) ||
46
+ ( $wpnonce && isset( $_GET['wcj_create_products_xml'] ) )
47
  ) {
48
  wcj_add_change_price_hooks( $this, wcj_get_module_price_hooks_priority( 'product_price_by_formula' ), false );
49
  }
185
  /**
186
  * Reset_settings.
187
  *
188
+ * @version 6.0.0
189
  * @since 5.3.0
190
  */
191
  public function reset_settings() {
200
  ) {
201
  global $wpdb;
202
  $prefix = '_wcj_product_price_by_formula';
203
+ $wpdb->query( $wpdb->prepare( 'delete from ' . $wpdb->postmeta . ' where meta_key REGEXP %s', $prefix ) );// phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching
204
  }
205
  parent::reset_settings(); // TODO: Change the autogenerated stub.
206
  }
includes/class-wcj-products-xml.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Module - Products XML
4
  *
5
- * @version 5.6.8
6
  * @since 2.5.7
7
  * @author Pluggabl LLC.
8
  * @todo create all files at once (manually and synchronize update)
@@ -179,11 +179,14 @@ if ( ! class_exists( 'WCJ_Products_XML' ) ) :
179
  /**
180
  * Create_products_xml.
181
  *
182
- * @version 5.6.2
183
  * @since 2.5.7
184
  * @param int $file_num defines the file_num.
185
  */
186
  public function create_products_xml( $file_num ) {
 
 
 
187
  $xml_items = '';
188
  $xml_header_template = wcj_get_option( 'wcj_products_xml_header_' . $file_num, '' );
189
  $xml_footer_template = wcj_get_option( 'wcj_products_xml_footer_' . $file_num, '' );
@@ -295,9 +298,10 @@ if ( ! class_exists( 'WCJ_Products_XML' ) ) :
295
  }
296
  }
297
  wp_reset_postdata();
298
- return file_put_contents(
299
  ABSPATH . wcj_get_option( 'wcj_products_xml_file_path_' . $file_num, ( ( '1' === $file_num ) ? 'products.xml' : 'products_' . $file_num . '.xml' ) ),
300
- $this->process_shortcode( $xml_header_template ) . $xml_items . $this->process_shortcode( $xml_footer_template )
 
301
  );
302
  }
303
 
2
  /**
3
  * Booster for WooCommerce - Module - Products XML
4
  *
5
+ * @version 6.0.0
6
  * @since 2.5.7
7
  * @author Pluggabl LLC.
8
  * @todo create all files at once (manually and synchronize update)
179
  /**
180
  * Create_products_xml.
181
  *
182
+ * @version 6.0.0
183
  * @since 2.5.7
184
  * @param int $file_num defines the file_num.
185
  */
186
  public function create_products_xml( $file_num ) {
187
+ global $wp_filesystem;
188
+ require_once ABSPATH . '/wp-admin/includes/file.php';
189
+ WP_Filesystem();
190
  $xml_items = '';
191
  $xml_header_template = wcj_get_option( 'wcj_products_xml_header_' . $file_num, '' );
192
  $xml_footer_template = wcj_get_option( 'wcj_products_xml_footer_' . $file_num, '' );
298
  }
299
  }
300
  wp_reset_postdata();
301
+ return $wp_filesystem->put_contents(
302
  ABSPATH . wcj_get_option( 'wcj_products_xml_file_path_' . $file_num, ( ( '1' === $file_num ) ? 'products.xml' : 'products_' . $file_num . '.xml' ) ),
303
+ $this->process_shortcode( $xml_header_template ) . $xml_items . $this->process_shortcode( $xml_footer_template ),
304
+ FS_CHMOD_FILE
305
  );
306
  }
307
 
includes/class-wcj-track-users.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Module - User Tracking
4
  *
5
- * @version 5.6.8
6
  * @since 3.1.3
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/includes
@@ -216,7 +216,7 @@ if ( ! class_exists( 'WCJ_Track_Users' ) ) :
216
  /**
217
  * Add_http_referer_to_order.
218
  *
219
- * @version 5.6.8
220
  * @since 2.9.1
221
  * @todo add "all orders by referer type" stats
222
  * @param int $order_id defines the order_id.
@@ -225,13 +225,15 @@ if ( ! class_exists( 'WCJ_Track_Users' ) ) :
225
  global $wpdb;
226
  $table_name = $wpdb->prefix . 'wcj_track_users';
227
  $http_referer = 'N/A';
228
- if ( $wpdb->get_var( $wpdb->prepare( 'SHOW TABLES LIKE %s', $table_name ) ) === $table_name ) {// phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching
 
229
  $user_ip = ( class_exists( 'WC_Geolocation' ) ? WC_Geolocation::get_ip_address() : wcj_get_the_ip() );
230
- $result = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM {$wpdb->prefix}wcj_track_users WHERE ip = %s ORDER BY time DESC", $user_ip ) ); // WPCS: db call ok and cache ok.
231
  if ( $result ) {
232
  $http_referer = $result->referer;
233
  }
234
  }
 
235
  update_post_meta( $order_id, '_wcj_track_users_http_referer', $http_referer );
236
  }
237
 
@@ -412,7 +414,7 @@ if ( ! class_exists( 'WCJ_Track_Users' ) ) :
412
  /**
413
  * Track_users.
414
  *
415
- * @version 5.6.8
416
  * @since 2.9.1
417
  * @todo (maybe) customizable `$time_expired`
418
  * @todo (maybe) optionally do not track selected user roles (e.g. admin)
@@ -455,7 +457,7 @@ if ( ! class_exists( 'WCJ_Track_Users' ) ) :
455
  // HTTP referrer.
456
  $http_referer = ( isset( $_POST['wcj_http_referer'] ) ? sanitize_text_field( wp_unslash( $_POST['wcj_http_referer'] ) ) : 'N/A' );
457
  // Add row to DB table.
458
- $wpdb->insert(
459
  $table_name,
460
  array(
461
  'time' => current_time( 'mysql' ),
@@ -464,7 +466,7 @@ if ( ! class_exists( 'WCJ_Track_Users' ) ) :
464
  'ip' => $user_ip,
465
  'referer' => $http_referer,
466
  )
467
- );// WPCS: db call ok.
468
  die();
469
  }
470
 
2
  /**
3
  * Booster for WooCommerce - Module - User Tracking
4
  *
5
+ * @version 6.0.0
6
  * @since 3.1.3
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/includes
216
  /**
217
  * Add_http_referer_to_order.
218
  *
219
+ * @version 6.0.0
220
  * @since 2.9.1
221
  * @todo add "all orders by referer type" stats
222
  * @param int $order_id defines the order_id.
225
  global $wpdb;
226
  $table_name = $wpdb->prefix . 'wcj_track_users';
227
  $http_referer = 'N/A';
228
+ // phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching
229
+ if ( $wpdb->get_var( $wpdb->prepare( 'SHOW TABLES LIKE %s', $table_name ) ) === $table_name ) {
230
  $user_ip = ( class_exists( 'WC_Geolocation' ) ? WC_Geolocation::get_ip_address() : wcj_get_the_ip() );
231
+ $result = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM {$wpdb->prefix}wcj_track_users WHERE ip = %s ORDER BY time DESC", $user_ip ) );
232
  if ( $result ) {
233
  $http_referer = $result->referer;
234
  }
235
  }
236
+ // phpcs:enable
237
  update_post_meta( $order_id, '_wcj_track_users_http_referer', $http_referer );
238
  }
239
 
414
  /**
415
  * Track_users.
416
  *
417
+ * @version 6.0.0
418
  * @since 2.9.1
419
  * @todo (maybe) customizable `$time_expired`
420
  * @todo (maybe) optionally do not track selected user roles (e.g. admin)
457
  // HTTP referrer.
458
  $http_referer = ( isset( $_POST['wcj_http_referer'] ) ? sanitize_text_field( wp_unslash( $_POST['wcj_http_referer'] ) ) : 'N/A' );
459
  // Add row to DB table.
460
+ $wpdb->insert( // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery
461
  $table_name,
462
  array(
463
  'time' => current_time( 'mysql' ),
466
  'ip' => $user_ip,
467
  'referer' => $http_referer,
468
  )
469
+ );
470
  die();
471
  }
472
 
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 5.6.2
6
  * @since 3.6.0
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/classes
@@ -83,7 +83,7 @@ if ( ! class_exists( 'WCJ_Module_Product_By_Condition' ) ) :
83
  /**
84
  * Get_invisible_products_ids.
85
  *
86
- * @version 5.6.2
87
  * @since 4.7.1
88
  *
89
  * @param null $params Get params.
@@ -100,7 +100,7 @@ if ( ! class_exists( 'WCJ_Module_Product_By_Condition' ) ) :
100
  );
101
  $option_to_check = $params['option_to_check'];
102
  $args = $params['invisible_products_query_args'];
103
- $transient_name = 'wcj_' . $this->id . '_' . md5( serialize( $args ) . '_' . serialize( $option_to_check ) ); //phpcs:ignore
104
  $invisible_products = get_transient( $transient_name );
105
  if ( false === $invisible_products ) {
106
  $invisible_products = array();
@@ -118,7 +118,7 @@ if ( ! class_exists( 'WCJ_Module_Product_By_Condition' ) ) :
118
  /**
119
  * Get_invisible_products_query_args.
120
  *
121
- * @version 5.6.2
122
  * @since 4.7.1
123
  *
124
  * @return array
@@ -146,7 +146,7 @@ if ( ! class_exists( 'WCJ_Module_Product_By_Condition' ) ) :
146
  'post_type' => 'product',
147
  'posts_per_page' => - 1,
148
  'fields' => 'ids',
149
- 'meta_query' => $meta_query, //phpcs:ignore
150
  );
151
  return $args;
152
  }
@@ -154,7 +154,7 @@ if ( ! class_exists( 'WCJ_Module_Product_By_Condition' ) ) :
154
  /**
155
  * Delete_invisible_products_transient.
156
  *
157
- * @version 5.6.2
158
  * @since 4.7.1
159
  *
160
  * @param null $params Get params.
@@ -171,11 +171,11 @@ if ( ! class_exists( 'WCJ_Module_Product_By_Condition' ) ) :
171
  if ( 'current_user_roles' === $params['remove_method'] ) {
172
  $option_to_check = $params['option_to_check'];
173
  $args = $params['invisible_products_query_args'];
174
- $transient_name = 'wcj_' . $this->id . '_' . md5( serialize( $args ) . '_' . serialize( $option_to_check ) ); //phpcs:ignore
175
  delete_transient( $transient_name );
176
  } elseif ( 'all_roles' === $params['remove_method'] ) {
177
  global $wpdb;
178
- $wpdb->query( $wpdb->prepare( "delete from {$wpdb->options} where option_name REGEXP %s", '^_transient_wcj_' . $this->id ) ); // WPCS: db call ok and cache ok.
179
  }
180
  }
181
 
@@ -305,7 +305,7 @@ if ( ! class_exists( 'WCJ_Module_Product_By_Condition' ) ) :
305
  /**
306
  * Save_bulk_and_quick_edit_fields.
307
  *
308
- * @version 5.6.2
309
  * @since 3.6.0
310
  * @param int $post_id get post id.
311
  * @param obj|Array $post get post.
@@ -320,11 +320,11 @@ if ( ! class_exists( 'WCJ_Module_Product_By_Condition' ) ) :
320
  return $post_id;
321
  }
322
  // Check nonce.
323
- if ( ! isset( $_REQUEST['woocommerce_quick_edit_nonce'] ) || ! wp_verify_nonce( $_REQUEST['woocommerce_quick_edit_nonce'], 'woocommerce_quick_edit_nonce' ) ) { //phpcs:ignore
324
  return $post_id;
325
  }
326
  // Check bulk or quick edit.
327
- if ( ! empty( $_REQUEST['woocommerce_quick_edit'] ) ) { // WPCS: input var ok.
328
  if ( 'no' === wcj_get_option( 'wcj_' . $this->id . '_admin_quick_edit', 'no' ) ) {
329
  return $post_id;
330
  }
2
  /**
3
  * Booster for WooCommerce - Module - Product by Condition
4
  *
5
+ * @version 6.0.0
6
  * @since 3.6.0
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/classes
83
  /**
84
  * Get_invisible_products_ids.
85
  *
86
+ * @version 6.0.0
87
  * @since 4.7.1
88
  *
89
  * @param null $params Get params.
100
  );
101
  $option_to_check = $params['option_to_check'];
102
  $args = $params['invisible_products_query_args'];
103
+ $transient_name = 'wcj_' . $this->id . '_' . md5( wp_json_encode( $args ) . '_' . wp_json_encode( $option_to_check ) );
104
  $invisible_products = get_transient( $transient_name );
105
  if ( false === $invisible_products ) {
106
  $invisible_products = array();
118
  /**
119
  * Get_invisible_products_query_args.
120
  *
121
+ * @version 6.0.0
122
  * @since 4.7.1
123
  *
124
  * @return array
146
  'post_type' => 'product',
147
  'posts_per_page' => - 1,
148
  'fields' => 'ids',
149
+ 'meta_query' => $meta_query, // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_query
150
  );
151
  return $args;
152
  }
154
  /**
155
  * Delete_invisible_products_transient.
156
  *
157
+ * @version 6.0.0
158
  * @since 4.7.1
159
  *
160
  * @param null $params Get params.
171
  if ( 'current_user_roles' === $params['remove_method'] ) {
172
  $option_to_check = $params['option_to_check'];
173
  $args = $params['invisible_products_query_args'];
174
+ $transient_name = 'wcj_' . $this->id . '_' . md5( wp_json_encode( $args ) . '_' . wp_json_encode( $option_to_check ) );
175
  delete_transient( $transient_name );
176
  } elseif ( 'all_roles' === $params['remove_method'] ) {
177
  global $wpdb;
178
+ $wpdb->query( $wpdb->prepare( "delete from {$wpdb->options} where option_name REGEXP %s", '^_transient_wcj_' . $this->id ) ); // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching
179
  }
180
  }
181
 
305
  /**
306
  * Save_bulk_and_quick_edit_fields.
307
  *
308
+ * @version 6.0.0
309
  * @since 3.6.0
310
  * @param int $post_id get post id.
311
  * @param obj|Array $post get post.
320
  return $post_id;
321
  }
322
  // Check nonce.
323
+ if ( ! isset( $_REQUEST['woocommerce_quick_edit_nonce'] ) || ! wp_verify_nonce( sanitize_key( wp_unslash( $_REQUEST['woocommerce_quick_edit_nonce'] ) ), 'woocommerce_quick_edit_nonce' ) ) {
324
  return $post_id;
325
  }
326
  // Check bulk or quick edit.
327
+ if ( ! empty( $_REQUEST['woocommerce_quick_edit'] ) ) {
328
  if ( 'no' === wcj_get_option( 'wcj_' . $this->id . '_admin_quick_edit', 'no' ) ) {
329
  return $post_id;
330
  }
includes/classes/class-wcj-module.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce Module
4
  *
5
- * @version 5.6.8
6
  * @since 2.2.0
7
  * @author Pluggabl LLC.
8
  * @todo [dev] maybe should be `abstract` ?
@@ -323,7 +323,7 @@ if ( ! class_exists( 'WCJ_Module' ) ) :
323
  /**
324
  * Save_meta_box_validate_value.
325
  *
326
- * @version 5.6.2
327
  * @since 2.9.1
328
  * @param string $option_value Get option value.
329
  * @param string $option_name Get option name.
@@ -341,8 +341,8 @@ if ( ! class_exists( 'WCJ_Module' ) ) :
341
  'post_type' => 'product',
342
  'post_status' => 'any',
343
  'posts_per_page' => 1,
344
- 'meta_key' => '_' . $this->meta_box_validate_value, //phpcs:ignore
345
- 'meta_value' => 'yes', //phpcs:ignore
346
  'post__not_in' => array( get_the_ID() ),
347
  );
348
  $loop = new WP_Query( $args );
@@ -358,23 +358,32 @@ if ( ! class_exists( 'WCJ_Module' ) ) :
358
  /**
359
  * Validate_value_add_notice_query_var.
360
  *
361
- * @version 5.6.3
362
  * @since 2.9.1
363
  * @param String $location Get location.
364
  */
365
  public function validate_value_add_notice_query_var( $location ) {
366
  remove_filter( 'redirect_post_location', array( $this, 'validate_value_add_notice_query_var' ), 99 );
367
- return esc_url_raw( add_query_arg( array( 'wcj_' . $this->id . '_meta_box_admin_notice' => true ), $location ) );
 
 
 
 
 
 
 
 
368
  }
369
 
370
  /**
371
  * Validate_value_admin_notices.
372
  *
373
- * @version 5.6.2
374
  * @since 2.9.1
375
  */
376
  public function validate_value_admin_notices() {
377
- if ( ! isset( $_GET[ 'wcj_' . $this->id . '_meta_box_admin_notice' ] ) ) { // phpcs:ignore WordPress.Security.NonceVerification
 
378
  return;
379
  }
380
  echo '<div class="error"><p><div class="message">' .
@@ -458,7 +467,7 @@ if ( ! class_exists( 'WCJ_Module' ) ) :
458
  /**
459
  * Save_meta_box_value.
460
  *
461
- * @version 5.6.2
462
  * @since 2.5.3
463
  * @param string $option_value Get option value.
464
  * @param string $option_name Get option name.
@@ -476,8 +485,8 @@ if ( ! class_exists( 'WCJ_Module' ) ) :
476
  'post_type' => 'product',
477
  'post_status' => 'any',
478
  'posts_per_page' => 3,
479
- 'meta_key' => '_' . $this->co, //phpcs:ignore
480
- 'meta_value' => 'yes', //phpcs:ignore
481
  'post__not_in' => array( get_the_ID() ),
482
  );
483
  $loop = new WP_Query( $args );
@@ -505,13 +514,13 @@ if ( ! class_exists( 'WCJ_Module' ) ) :
505
  /**
506
  * Admin_notices.
507
  *
508
- * @version 5.6.8
509
  * @since 2.5.3
510
  */
511
  public function admin_notices() {
512
  $_get = array();
513
  parse_str( isset( $_SERVER['QUERY_STRING'] ) ? sanitize_text_field( wp_unslash( $_SERVER['QUERY_STRING'] ) ) : '', $_get );
514
- if ( ! $wpnonce || ! isset( $_get[ 'wcj_' . $this->id . '_admin_notice' ] ) ) {
515
  return;
516
  }
517
  echo '<div class="error"><p><div class="message">' . wp_kses_post( $this->get_the_notice() ) . '</div></p></div>';
@@ -616,7 +625,7 @@ if ( ! class_exists( 'WCJ_Module' ) ) :
616
  /**
617
  * Save_meta_box.
618
  *
619
- * @version 5.6.2
620
  * @since 2.5.0
621
  * @todo (maybe) also order_id in `$the_post_id = ...`
622
  * @param int $post_id Get post id.
@@ -624,7 +633,7 @@ if ( ! class_exists( 'WCJ_Module' ) ) :
624
  */
625
  public function save_meta_box( $post_id, $__post ) {
626
  // Check that we are saving with current metabox displayed.
627
- if ( ! isset( $_POST[ 'woojetpack_' . $this->id . '_save_post' ] ) ) { // phpcs:ignore WordPress.Security.NonceVerification
628
  return;
629
  }
630
  // Setup post (just in case...).
2
  /**
3
  * Booster for WooCommerce Module
4
  *
5
+ * @version 6.0.0
6
  * @since 2.2.0
7
  * @author Pluggabl LLC.
8
  * @todo [dev] maybe should be `abstract` ?
323
  /**
324
  * Save_meta_box_validate_value.
325
  *
326
+ * @version 6.0.0
327
  * @since 2.9.1
328
  * @param string $option_value Get option value.
329
  * @param string $option_name Get option name.
341
  'post_type' => 'product',
342
  'post_status' => 'any',
343
  'posts_per_page' => 1,
344
+ 'meta_key' => '_' . $this->meta_box_validate_value, // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_key
345
+ 'meta_value' => 'yes', // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_value
346
  'post__not_in' => array( get_the_ID() ),
347
  );
348
  $loop = new WP_Query( $args );
358
  /**
359
  * Validate_value_add_notice_query_var.
360
  *
361
+ * @version 6.0.0
362
  * @since 2.9.1
363
  * @param String $location Get location.
364
  */
365
  public function validate_value_add_notice_query_var( $location ) {
366
  remove_filter( 'redirect_post_location', array( $this, 'validate_value_add_notice_query_var' ), 99 );
367
+ return esc_url_raw(
368
+ add_query_arg(
369
+ array(
370
+ 'wcj_' . $this->id . '_meta_box_admin_notice' => true,
371
+ 'wcj_' . $this->id . '_meta_box_admin_notice_nonce' => wp_create_nonce( 'wcj_' . $this->id . '_meta_box_admin_notice' ),
372
+ ),
373
+ $location
374
+ )
375
+ );
376
  }
377
 
378
  /**
379
  * Validate_value_admin_notices.
380
  *
381
+ * @version 6.0.0
382
  * @since 2.9.1
383
  */
384
  public function validate_value_admin_notices() {
385
+ $wpnonce = isset( $_REQUEST[ 'wcj_' . $this->id . '_meta_box_admin_notice_nonce' ] ) ? wp_verify_nonce( sanitize_key( $_REQUEST[ 'wcj_' . $this->id . '_meta_box_admin_notice_nonce' ] ), 'wcj_' . $this->id . '_meta_box_admin_notice' ) : false;
386
+ if ( ! $wpnonce || ! isset( $_GET[ 'wcj_' . $this->id . '_meta_box_admin_notice' ] ) ) {
387
  return;
388
  }
389
  echo '<div class="error"><p><div class="message">' .
467
  /**
468
  * Save_meta_box_value.
469
  *
470
+ * @version 6.0.0
471
  * @since 2.5.3
472
  * @param string $option_value Get option value.
473
  * @param string $option_name Get option name.
485
  'post_type' => 'product',
486
  'post_status' => 'any',
487
  'posts_per_page' => 3,
488
+ 'meta_key' => '_' . $this->co, // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_key
489
+ 'meta_value' => 'yes', // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_value
490
  'post__not_in' => array( get_the_ID() ),
491
  );
492
  $loop = new WP_Query( $args );
514
  /**
515
  * Admin_notices.
516
  *
517
+ * @version 6.0.0
518
  * @since 2.5.3
519
  */
520
  public function admin_notices() {
521
  $_get = array();
522
  parse_str( isset( $_SERVER['QUERY_STRING'] ) ? sanitize_text_field( wp_unslash( $_SERVER['QUERY_STRING'] ) ) : '', $_get );
523
+ if ( ! isset( $_get[ 'wcj_' . $this->id . '_admin_notice' ] ) ) {
524
  return;
525
  }
526
  echo '<div class="error"><p><div class="message">' . wp_kses_post( $this->get_the_notice() ) . '</div></p></div>';
625
  /**
626
  * Save_meta_box.
627
  *
628
+ * @version 6.0.0
629
  * @since 2.5.0
630
  * @todo (maybe) also order_id in `$the_post_id = ...`
631
  * @param int $post_id Get post id.
633
  */
634
  public function save_meta_box( $post_id, $__post ) {
635
  // Check that we are saving with current metabox displayed.
636
+ if ( ! isset( $_POST[ 'woojetpack_' . $this->id . '_save_post' ] ) ) {
637
  return;
638
  }
639
  // Setup post (just in case...).
includes/classes/class-wcj-pdf-invoice.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce PDF Invoice
4
  *
5
- * @version 5.6.2
6
  * @author Pluggabl LLC.
7
  * @package Booster_For_WooCommerce/classes
8
  */
@@ -29,7 +29,8 @@ if ( ! class_exists( 'WCJ_PDF_Invoice' ) ) :
29
  * @param int $order_id Get order id.
30
  * @param string $invoice_type Get invoice type.
31
  */
32
- public function __construct( $order_id, $invoice_type ) { //phpcs:ignore
 
33
  parent::__construct( $order_id, $invoice_type );
34
  }
35
 
@@ -183,7 +184,7 @@ if ( ! class_exists( 'WCJ_PDF_Invoice' ) ) :
183
  /**
184
  * Maybe_replace_tcpdf_method_params.
185
  *
186
- * @version 5.6.2
187
  * @since 3.6.0
188
  * @param mixed $html Get pdf html.
189
  * @param mixed $pdf Get pdfs.
@@ -197,7 +198,7 @@ if ( ! class_exists( 'WCJ_PDF_Invoice' ) ) :
197
  while ( false !== $start ) {
198
  $params_start = $start + $start_str_length;
199
  $params_length = strpos( $html, $end_str ) - $params_start;
200
- $params = $pdf->serializeTCPDFtagParameters( unserialize( substr( $html, $params_start, $params_length ) ) ); //phpcs:ignore
201
  $html = substr_replace( $html, 'params="' . $params . '"', $start, $start_str_length + $params_length + $end_str_length );
202
  }
203
  return $html;
@@ -248,11 +249,14 @@ if ( ! class_exists( 'WCJ_PDF_Invoice' ) ) :
248
  /**
249
  * Get_pdf.
250
  *
251
- * @version 5.6.2
252
  * @todo [dev] (maybe) `die()` on success
253
  * @param string $dest define dest.
254
  */
255
  public function get_pdf( $dest ) {
 
 
 
256
  $pdf = $this->prepare_pdf();
257
  $html = $this->get_html( $this->order_id, $pdf );
258
  $styling = '<style>' . wcj_get_option(
@@ -264,7 +268,7 @@ if ( ! class_exists( 'WCJ_PDF_Invoice' ) ) :
264
  $file_name = $this->get_file_name();
265
  if ( 'F' === $dest ) {
266
  $file_path = wcj_get_invoicing_temp_dir() . '/' . $file_name;
267
- if ( ! file_put_contents( $file_path, $result_pdf ) ) { //phpcs:ignore
268
  return null;
269
  }
270
  return $file_path;
@@ -284,23 +288,13 @@ if ( ! class_exists( 'WCJ_PDF_Invoice' ) ) :
284
  echo $result_pdf; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
285
  } else {
286
  $file_path = wcj_get_invoicing_temp_dir() . '/' . $file_name;
287
- if ( ! file_put_contents( $file_path, $result_pdf ) ) { //phpcs:ignore
288
  return null;
289
  }
290
  if ( apply_filters( 'wcj_invoicing_header_content_length', true ) ) {
291
  header( 'Content-Length: ' . filesize( $file_path ) );
292
  }
293
- flush(); // this doesn't really matter.
294
- $fp = fopen( $file_path, 'r' ); //phpcs:ignore
295
- if ( false !== ( $fp ) ) {
296
- while ( ! feof( $fp ) ) {
297
- echo fread( $fp, 65536 ); //phpcs:ignore
298
- flush(); // this is essential for large downloads.
299
- }
300
- fclose( $fp ); //phpcs:ignore
301
- } else {
302
- die( esc_html__( 'Unexpected error', 'woocommerce-jetpack' ) );
303
- }
304
  }
305
  }
306
  return null;
2
  /**
3
  * Booster for WooCommerce PDF Invoice
4
  *
5
+ * @version 6.0.0
6
  * @author Pluggabl LLC.
7
  * @package Booster_For_WooCommerce/classes
8
  */
29
  * @param int $order_id Get order id.
30
  * @param string $invoice_type Get invoice type.
31
  */
32
+ public function __construct( $order_id, $invoice_type ) {
33
+ $this->wcj_invoice_type = $invoice_type;
34
  parent::__construct( $order_id, $invoice_type );
35
  }
36
 
184
  /**
185
  * Maybe_replace_tcpdf_method_params.
186
  *
187
+ * @version 6.0.0
188
  * @since 3.6.0
189
  * @param mixed $html Get pdf html.
190
  * @param mixed $pdf Get pdfs.
198
  while ( false !== $start ) {
199
  $params_start = $start + $start_str_length;
200
  $params_length = strpos( $html, $end_str ) - $params_start;
201
+ $params = $pdf->serializeTCPDFtagParameters( json_decode( substr( $html, $params_start, $params_length ) ) );
202
  $html = substr_replace( $html, 'params="' . $params . '"', $start, $start_str_length + $params_length + $end_str_length );
203
  }
204
  return $html;
249
  /**
250
  * Get_pdf.
251
  *
252
+ * @version 6.0.0
253
  * @todo [dev] (maybe) `die()` on success
254
  * @param string $dest define dest.
255
  */
256
  public function get_pdf( $dest ) {
257
+ global $wp_filesystem;
258
+ require_once ABSPATH . '/wp-admin/includes/file.php';
259
+ WP_Filesystem();
260
  $pdf = $this->prepare_pdf();
261
  $html = $this->get_html( $this->order_id, $pdf );
262
  $styling = '<style>' . wcj_get_option(
268
  $file_name = $this->get_file_name();
269
  if ( 'F' === $dest ) {
270
  $file_path = wcj_get_invoicing_temp_dir() . '/' . $file_name;
271
+ if ( ! $wp_filesystem->put_contents( $file_path, $result_pdf, FS_CHMOD_FILE ) ) {
272
  return null;
273
  }
274
  return $file_path;
288
  echo $result_pdf; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
289
  } else {
290
  $file_path = wcj_get_invoicing_temp_dir() . '/' . $file_name;
291
+ if ( ! $wp_filesystem->put_contents( $file_path, $result_pdf, FS_CHMOD_FILE ) ) {
292
  return null;
293
  }
294
  if ( apply_filters( 'wcj_invoicing_header_content_length', true ) ) {
295
  header( 'Content-Length: ' . filesize( $file_path ) );
296
  }
297
+ echo $wp_filesystem->get_contents( $file_path ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
 
 
 
 
 
 
 
 
 
 
298
  }
299
  }
300
  return null;
includes/classes/class-wcj-shortcodes.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Shortcodes
4
  *
5
- * @version 5.6.2
6
  * @author Pluggabl LLC.
7
  * @package Booster_For_WooCommerce/classes
8
  */
@@ -91,7 +91,7 @@ if ( ! class_exists( 'WCJ_Shortcodes' ) ) :
91
  /**
92
  * Wcj_shortcode.
93
  *
94
- * @version 5.6.2
95
  * @todo `time` - weekly, e.g. 8:00-19:59;8:00-19:59;8:00-19:59;8:00-19:59;8:00-9:59,12:00-17:59;-;-;
96
  * @todo (maybe) - `return $atts['on_empty'];` everywhere instead of `return '';`
97
  * @todo (maybe) - add `$atts['function']` and `$atts['function_args']` - if set, will be run on shortcode's result
@@ -259,11 +259,12 @@ if ( ! class_exists( 'WCJ_Shortcodes' ) ) :
259
  }
260
 
261
  // Check if billing country by arg is ok.
 
262
  if ( '' !== $atts['billing_country'] ) {
263
- if ( ! isset( $_GET['order_id'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification
264
  return '';
265
  }
266
- $order_id = sanitize_text_field( wp_unslash( $_GET['order_id'] ) ); // phpcs:ignore WordPress.Security.NonceVerification
267
  $orders = new WC_Order( $order_id );
268
  $billing_contry = $orders->get_billing_country();
269
  if ( ! isset( $billing_contry ) ) {
@@ -277,10 +278,10 @@ if ( ! class_exists( 'WCJ_Shortcodes' ) ) :
277
  }
278
  // Check if billing country by arg is ok (not in...).
279
  if ( '' !== $atts['not_billing_country'] ) {
280
- if ( ! isset( $_GET['order_id'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification
281
  return '';
282
  }
283
- $order_id = sanitize_text_field( wp_unslash( $_GET['order_id'] ) ); // phpcs:ignore WordPress.Security.NonceVerification
284
  $orders = new WC_Order( $order_id );
285
  $billing_contry = $orders->get_billing_country();
286
  if ( isset( $billing_contry ) ) {
@@ -293,21 +294,22 @@ if ( ! class_exists( 'WCJ_Shortcodes' ) ) :
293
 
294
  // Check if payment method by arg is ok.
295
  if ( '' !== $atts['payment_method'] ) {
296
- if ( ! isset( $_GET['payment_method'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification
297
  return '';
298
  }
299
- if ( ! in_array( $_GET['payment_method'], $this->custom_explode( $atts['payment_method'] ), true ) ) { // phpcs:ignore WordPress.Security.NonceVerification
300
  return '';
301
  }
302
  }
303
  // Check if payment method by arg is ok (not in...).
304
  if ( '' !== $atts['not_payment_method'] ) {
305
- if ( isset( $_GET['payment_method'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification
306
- if ( in_array( $_GET['payment_method'], $this->custom_explode( $atts['not_payment_method'] ), true ) ) { // phpcs:ignore WordPress.Security.NonceVerification
307
  return '';
308
  }
309
  }
310
  }
 
311
 
312
  // Additional (child class specific) checks.
313
  if ( ! $this->extra_check( $atts ) ) {
2
  /**
3
  * Booster for WooCommerce - Shortcodes
4
  *
5
+ * @version 6.0.0
6
  * @author Pluggabl LLC.
7
  * @package Booster_For_WooCommerce/classes
8
  */
91
  /**
92
  * Wcj_shortcode.
93
  *
94
+ * @version 6.0.0
95
  * @todo `time` - weekly, e.g. 8:00-19:59;8:00-19:59;8:00-19:59;8:00-19:59;8:00-9:59,12:00-17:59;-;-;
96
  * @todo (maybe) - `return $atts['on_empty'];` everywhere instead of `return '';`
97
  * @todo (maybe) - add `$atts['function']` and `$atts['function_args']` - if set, will be run on shortcode's result
259
  }
260
 
261
  // Check if billing country by arg is ok.
262
+ // phpcs:disable WordPress.Security.NonceVerification
263
  if ( '' !== $atts['billing_country'] ) {
264
+ if ( ! isset( $_GET['order_id'] ) ) {
265
  return '';
266
  }
267
+ $order_id = sanitize_text_field( wp_unslash( $_GET['order_id'] ) );
268
  $orders = new WC_Order( $order_id );
269
  $billing_contry = $orders->get_billing_country();
270
  if ( ! isset( $billing_contry ) ) {
278
  }
279
  // Check if billing country by arg is ok (not in...).
280
  if ( '' !== $atts['not_billing_country'] ) {
281
+ if ( ! isset( $_GET['order_id'] ) ) {
282
  return '';
283
  }
284
+ $order_id = sanitize_text_field( wp_unslash( $_GET['order_id'] ) );
285
  $orders = new WC_Order( $order_id );
286
  $billing_contry = $orders->get_billing_country();
287
  if ( isset( $billing_contry ) ) {
294
 
295
  // Check if payment method by arg is ok.
296
  if ( '' !== $atts['payment_method'] ) {
297
+ if ( ! isset( $_GET['payment_method'] ) ) {
298
  return '';
299
  }
300
+ if ( ! in_array( $_GET['payment_method'], $this->custom_explode( $atts['payment_method'] ), true ) ) {
301
  return '';
302
  }
303
  }
304
  // Check if payment method by arg is ok (not in...).
305
  if ( '' !== $atts['not_payment_method'] ) {
306
+ if ( isset( $_GET['payment_method'] ) ) {
307
+ if ( in_array( $_GET['payment_method'], $this->custom_explode( $atts['not_payment_method'] ), true ) ) {
308
  return '';
309
  }
310
  }
311
  }
312
+ // phpcs:enable WordPress.Security.NonceVerification
313
 
314
  // Additional (child class specific) checks.
315
  if ( ! $this->extra_check( $atts ) ) {
includes/core/wcj-loader.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Core - Loader
4
  *
5
- * @version 5.6.2
6
  * @since 3.2.4
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/core
@@ -14,7 +14,7 @@ if ( ! defined( 'ABSPATH' ) ) {
14
 
15
  // Debug Mode.
16
  if ( 'yes' === wcj_get_option( 'wcj_debug_tools_enabled', 'no' ) && 'yes' === wcj_get_option( 'wcj_debuging_enabled', 'no' ) ) {
17
- error_reporting( E_ALL ); //phpcs:ignore
18
  }
19
 
20
  if ( ! defined( 'WCJ_FREE_PLUGIN_PATH' ) ) {
2
  /**
3
  * Booster for WooCommerce - Core - Loader
4
  *
5
+ * @version 6.0.0
6
  * @since 3.2.4
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/core
14
 
15
  // Debug Mode.
16
  if ( 'yes' === wcj_get_option( 'wcj_debug_tools_enabled', 'no' ) && 'yes' === wcj_get_option( 'wcj_debuging_enabled', 'no' ) ) {
17
+ error_reporting( E_ALL ); // phpcs:ignore WordPress.PHP
18
  }
19
 
20
  if ( ! defined( 'WCJ_FREE_PLUGIN_PATH' ) ) {
includes/css/images/ui-bg_flat_0_aaaaaa_40x100.png ADDED
Binary file
includes/css/images/ui-bg_flat_75_ffffff_40x100.png ADDED
Binary file
includes/css/images/ui-bg_glass_55_fbf9ee_1x400.png ADDED
Binary file
includes/css/images/ui-bg_glass_65_ffffff_1x400.png ADDED
Binary file
includes/css/images/ui-bg_glass_75_dadada_1x400.png ADDED
Binary file
includes/css/images/ui-bg_glass_75_e6e6e6_1x400.png ADDED
Binary file
includes/css/images/ui-bg_glass_95_fef1ec_1x400.png ADDED
Binary file
includes/css/images/ui-bg_highlight-soft_75_cccccc_1x100.png ADDED
Binary file
includes/css/images/ui-icons_222222_256x240.png ADDED
Binary file
includes/css/images/ui-icons_2e83ff_256x240.png ADDED
Binary file
includes/css/images/ui-icons_454545_256x240.png ADDED
Binary file
includes/css/images/ui-icons_888888_256x240.png ADDED
Binary file
includes/css/images/ui-icons_cd0a0a_256x240.png ADDED
Binary file
includes/css/wcj-admin.css CHANGED
@@ -321,4 +321,33 @@ img.wcj-rocket-icon:hover {
321
 
322
  .wcj-row td {
323
  line-break: anywhere;
324
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
321
 
322
  .wcj-row td {
323
  line-break: anywhere;
324
+ }
325
+
326
+ /* Booster : Reports - Start */
327
+ .wcj-reports-wide .postbox .stats_range ul li.custom h4 {
328
+ margin: 0;
329
+ }
330
+ .wcj-reports-wide .postbox .stats_range ul li.custom form input.search_product {
331
+ margin: 0 10px 0 0;
332
+ background: 0 0 !important;
333
+ border: 0 !important;
334
+ color: #777;
335
+ box-shadow: none;
336
+ }
337
+ .wcj-reports-wide .postbox .chart-with-sidebar .chart-sidebar{
338
+ padding-bottom: 12px;
339
+ }
340
+ .wcj-reports-wide .widefat .wcj-row th, .woocommerce-reports-wrap .widefat .wcj-row th{
341
+ border-bottom: 1px solid #c3c4c7;
342
+ background: #fff;
343
+ font-weight: bold;
344
+ }
345
+ .wcj-reports-wide .widefat .wcj-row th span.woocommerce-Price-amount.amount{
346
+ line-height: 1.2em;
347
+ color: #464646;
348
+ font-weight: 400;
349
+ font-family: HelveticaNeue-Light,"Helvetica Neue Light","Helvetica Neue",sans-serif;
350
+ font-size: 1.618em;
351
+ }
352
+
353
+ /* Booster : Reports - End */
includes/emails/class-wc-email-wcj-custom.php CHANGED
@@ -4,7 +4,7 @@
4
  *
5
  * An email sent to recipient list when selected triggers are called.
6
  *
7
- * @version 5.6.2
8
  * @since 2.3.9
9
  * @author Pluggabl LLC.
10
  * @extends WC_Email
@@ -97,7 +97,7 @@ if ( ! class_exists( 'WC_Email_WCJ_Custom' ) ) :
97
  /**
98
  * Proxy to parent's get_option and attempt to localize the result using gettext.
99
  *
100
- * @version 5.6.2
101
  * @since 2.4.1
102
  * @param string $key posted key.
103
  * @param mixed $empty_value get empty value.
@@ -106,7 +106,7 @@ if ( ! class_exists( 'WC_Email_WCJ_Custom' ) ) :
106
  public function get_option( $key, $empty_value = null ) {
107
  $grandparent = get_parent_class( 'WC_Email' );
108
  $value = $grandparent::get_option( $key, $empty_value );
109
- return ( is_array( $value ) ) ? $value : apply_filters( 'woocommerce_email_get_option', __( $value ), $this, $value, $key, $empty_value ); // phpcs:ignore
110
  }
111
 
112
  /**
4
  *
5
  * An email sent to recipient list when selected triggers are called.
6
  *
7
+ * @version 6.0.0
8
  * @since 2.3.9
9
  * @author Pluggabl LLC.
10
  * @extends WC_Email
97
  /**
98
  * Proxy to parent's get_option and attempt to localize the result using gettext.
99
  *
100
+ * @version 6.0.0
101
  * @since 2.4.1
102
  * @param string $key posted key.
103
  * @param mixed $empty_value get empty value.
106
  public function get_option( $key, $empty_value = null ) {
107
  $grandparent = get_parent_class( 'WC_Email' );
108
  $value = $grandparent::get_option( $key, $empty_value );
109
+ return ( is_array( $value ) ) ? $value : apply_filters( 'woocommerce_email_get_option', $value, $this, $value, $key, $empty_value );
110
  }
111
 
112
  /**
includes/emails/email-html.php CHANGED
@@ -1,4 +1,13 @@
1
- <?php //phpcs:ignore ?>
 
 
 
 
 
 
 
 
 
2
  <h1>Email</h1>
3
  <p>
4
  <table>
1
+ <?php
2
+ /**
3
+ * Booster for WooCommerce - Custom Email HTML Template
4
+ *
5
+ * @version 6.0.0
6
+ * @author Pluggabl LLC.
7
+ * @package Booster_For_WooCommerce/includes/email
8
+ */
9
+
10
+ ?>
11
  <h1>Email</h1>
12
  <p>
13
  <table>
includes/emails/email-plain.php CHANGED
@@ -1,4 +1,13 @@
1
- <?php //phpcs:ignore ?>
 
 
 
 
 
 
 
 
 
2
  Order Date: [wcj_order_date]
3
  Order Nr.: [wcj_order_number]
4
  Buyer: [wcj_order_billing_address]
1
+ <?php
2
+ /**
3
+ * Booster for WooCommerce - Custom Email Plain Template
4
+ *
5
+ * @version 6.0.0
6
+ * @author Pluggabl LLC.
7
+ * @package Booster_For_WooCommerce/includes/email
8
+ */
9
+
10
+ ?>
11
  Order Date: [wcj_order_date]
12
  Order Nr.: [wcj_order_number]
13
  Buyer: [wcj_order_billing_address]
includes/exchange-rates/class-wcj-exchange-rates.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce Exchange Rates
4
  *
5
- * @version 5.6.8
6
  * @author Pluggabl LLC.
7
  * @package Booster_For_WooCommerce/includes
8
  */
@@ -37,29 +37,35 @@ if ( ! class_exists( 'WCJ_Exchange_Rates' ) ) :
37
  /**
38
  * Wcj_ajax_get_exchange_rates_average.
39
  *
40
- * @version 5.6.2
41
  * @since 3.2.2
42
  */
43
  public function wcj_ajax_get_exchange_rates_average() {
44
- $currency_from = isset( $_POST['wcj_currency_from'] ) ? sanitize_text_field( wp_unslash( $_POST['wcj_currency_from'] ) ) : ''; // phpcs:ignore WordPress.Security.NonceVerification
45
- $currency_to = isset( $_POST['wcj_currency_to'] ) ? sanitize_text_field( wp_unslash( $_POST['wcj_currency_to'] ) ) : ''; // phpcs:ignore WordPress.Security.NonceVerification
46
- $start_date = isset( $_POST['wcj_start_date'] ) ? sanitize_text_field( wp_unslash( $_POST['wcj_start_date'] ) ) : ''; // phpcs:ignore WordPress.Security.NonceVerification
47
- $end_date = isset( $_POST['wcj_end_date'] ) ? sanitize_text_field( wp_unslash( $_POST['wcj_end_date'] ) ) : ''; // phpcs:ignore WordPress.Security.NonceVerification
48
- echo wcj_currencyconverterapi_io_get_exchange_rate_average( $currency_from, $currency_to, $start_date, $end_date ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
 
 
 
 
49
  die();
50
  }
51
 
52
  /**
53
  * Register_script.
54
  *
55
- * @version 5.6.8
56
  */
57
  public function register_script() {
 
58
  if (
59
- isset( $_GET['section'] ) // phpcs:ignore WordPress.Security.NonceVerification
 
60
  &&
61
  in_array(
62
- $_GET['section'], // phpcs:ignore WordPress.Security.NonceVerification
63
  array(
64
  'multicurrency',
65
  'multicurrency_base_price',
@@ -86,13 +92,15 @@ if ( ! class_exists( 'WCJ_Exchange_Rates' ) ) :
86
  /**
87
  * Enqueue_exchange_rates_script.
88
  *
89
- * @version 5.6.2
90
  */
91
  public function enqueue_exchange_rates_script() {
 
92
  if (
93
- isset( $_GET['section'] ) && // phpcs:ignore WordPress.Security.NonceVerification
 
94
  in_array(
95
- $_GET['section'], // phpcs:ignore WordPress.Security.NonceVerification
96
  array(
97
  'multicurrency',
98
  'multicurrency_base_price',
@@ -107,9 +115,9 @@ if ( ! class_exists( 'WCJ_Exchange_Rates' ) ) :
107
  wp_enqueue_script( 'wcj-exchange-rates-ajax' );
108
  }
109
  if (
110
- isset( $_GET['report'] ) && // phpcs:ignore WordPress.Security.NonceVerification
111
  in_array(
112
- $_GET['report'], // phpcs:ignore WordPress.Security.NonceVerification
113
  array(
114
  'booster_monthly_sales',
115
  ),
@@ -122,6 +130,7 @@ if ( ! class_exists( 'WCJ_Exchange_Rates' ) ) :
122
  'ajax_object',
123
  array(
124
  'ajax_url' => admin_url( 'admin-ajax.php' ),
 
125
  )
126
  );
127
  }
2
  /**
3
  * Booster for WooCommerce Exchange Rates
4
  *
5
+ * @version 6.0.0
6
  * @author Pluggabl LLC.
7
  * @package Booster_For_WooCommerce/includes
8
  */
37
  /**
38
  * Wcj_ajax_get_exchange_rates_average.
39
  *
40
+ * @version 6.0.0
41
  * @since 3.2.2
42
  */
43
  public function wcj_ajax_get_exchange_rates_average() {
44
+ $wpnonce = isset( $_POST['wpnonce'] ) ? wp_verify_nonce( sanitize_key( $_POST['wpnonce'] ), 'ajax-nonce' ) : false;
45
+ if ( ! $wpnonce ) {
46
+ die();
47
+ }
48
+ $currency_from = isset( $_POST['wcj_currency_from'] ) ? sanitize_text_field( wp_unslash( $_POST['wcj_currency_from'] ) ) : '';
49
+ $currency_to = isset( $_POST['wcj_currency_to'] ) ? sanitize_text_field( wp_unslash( $_POST['wcj_currency_to'] ) ) : '';
50
+ $start_date = isset( $_POST['wcj_start_date'] ) ? sanitize_text_field( wp_unslash( $_POST['wcj_start_date'] ) ) : '';
51
+ $end_date = isset( $_POST['wcj_end_date'] ) ? sanitize_text_field( wp_unslash( $_POST['wcj_end_date'] ) ) : '';
52
+ echo esc_html( wcj_currencyconverterapi_io_get_exchange_rate_average( $currency_from, $currency_to, $start_date, $end_date ) );
53
  die();
54
  }
55
 
56
  /**
57
  * Register_script.
58
  *
59
+ * @version 6.0.0
60
  */
61
  public function register_script() {
62
+ $wpnonce = isset( $_REQUEST['wcj-cat-nonce'] ) ? wp_verify_nonce( sanitize_key( $_REQUEST['wcj-cat-nonce'] ), 'wcj-cat-nonce' ) : false;
63
  if (
64
+ $wpnonce &&
65
+ isset( $_GET['section'] )
66
  &&
67
  in_array(
68
+ $_GET['section'],
69
  array(
70
  'multicurrency',
71
  'multicurrency_base_price',
92
  /**
93
  * Enqueue_exchange_rates_script.
94
  *
95
+ * @version 6.0.0
96
  */
97
  public function enqueue_exchange_rates_script() {
98
+ $wpnonce = isset( $_REQUEST['wcj-cat-nonce'] ) ? wp_verify_nonce( sanitize_key( $_REQUEST['wcj-cat-nonce'] ), 'wcj-cat-nonce' ) : false;
99
  if (
100
+ $wpnonce &&
101
+ isset( $_GET['section'] ) &&
102
  in_array(
103
+ $_GET['section'],
104
  array(
105
  'multicurrency',
106
  'multicurrency_base_price',
115
  wp_enqueue_script( 'wcj-exchange-rates-ajax' );
116
  }
117
  if (
118
+ isset( $_GET['report'] ) &&
119
  in_array(
120
+ $_GET['report'],
121
  array(
122
  'booster_monthly_sales',
123
  ),
130
  'ajax_object',
131
  array(
132
  'ajax_url' => admin_url( 'admin-ajax.php' ),
133
+ 'wpnonce' => wp_create_nonce( 'ajax-nonce' ),
134
  )
135
  );
136
  }
includes/export/class-wcj-exporter-customers.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce Exporter Customers
4
  *
5
- * @version 5.6.2
6
  * @since 2.5.9
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/includes
@@ -34,7 +34,7 @@ if ( ! class_exists( 'WCJ_Exporter_Customers' ) ) :
34
  /**
35
  * Export_customers.
36
  *
37
- * @version 5.6.2
38
  * @since 2.4.8
39
  * @param array $fields_helper defines the fields.
40
  */
@@ -86,7 +86,7 @@ if ( ! class_exists( 'WCJ_Exporter_Customers' ) ) :
86
  $row[] = $customer->last_name;
87
  break;
88
  case 'customer-debug':
89
- $row[] = '<pre>' . print_r( $customer, true ) . '</pre>'; // phpcs:ignore
90
  break;
91
  }
92
  }
2
  /**
3
  * Booster for WooCommerce Exporter Customers
4
  *
5
+ * @version 6.0.0
6
  * @since 2.5.9
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/includes
34
  /**
35
  * Export_customers.
36
  *
37
+ * @version 6.0.0
38
  * @since 2.4.8
39
  * @param array $fields_helper defines the fields.
40
  */
86
  $row[] = $customer->last_name;
87
  break;
88
  case 'customer-debug':
89
+ $row[] = wp_json_encode( $customer );
90
  break;
91
  }
92
  }
includes/export/class-wcj-exporter-orders.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce Exporter Orders
4
  *
5
- * @version 5.6.8
6
  * @since 2.5.9
7
  * @author Pluggabl LLC.
8
  * @todo filter export by date
@@ -35,7 +35,7 @@ if ( ! class_exists( 'WCJ_Exporter_Orders' ) ) :
35
  /**
36
  * Get_export_orders_row.
37
  *
38
- * @version 5.6.2
39
  * @since 2.5.9
40
  * @param array $fields_ids defines the order field ids.
41
  * @param int $order_id defines the order id.
@@ -70,7 +70,11 @@ if ( ! class_exists( 'WCJ_Exporter_Orders' ) ) :
70
  $row[] = wcj_get_product_input_fields( $item );
71
  break;
72
  case 'item-debug':
73
- $row[] = '<pre>' . print_r( $item, true ) . '</pre>'; //phpcs:ignore
 
 
 
 
74
  break;
75
  case 'item-name':
76
  $row[] = $item['name'];
2
  /**
3
  * Booster for WooCommerce Exporter Orders
4
  *
5
+ * @version 6.0.0
6
  * @since 2.5.9
7
  * @author Pluggabl LLC.
8
  * @todo filter export by date
35
  /**
36
  * Get_export_orders_row.
37
  *
38
+ * @version 6.0.0
39
  * @since 2.5.9
40
  * @param array $fields_ids defines the order field ids.
41
  * @param int $order_id defines the order id.
70
  $row[] = wcj_get_product_input_fields( $item );
71
  break;
72
  case 'item-debug':
73
+ try {
74
+ $row[] = $item;
75
+ } catch ( Exception $e ) {
76
+ $row[] = '';
77
+ }
78
  break;
79
  case 'item-name':
80
  $row[] = $item['name'];
includes/functions/wcj-functions-booster-core.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Functions - Booster Core
4
  *
5
- * @version 5.6.2
6
  * @since 2.9.0
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/functions
@@ -54,7 +54,7 @@ if ( ! function_exists( 'wcj_is_rest' ) ) {
54
  /**
55
  * Checks if the current request is a WP REST API request.
56
  *
57
- * @version 5.6.2
58
  * @since 4.3.0
59
  *
60
  * @author matzeeable
@@ -65,7 +65,7 @@ if ( ! function_exists( 'wcj_is_rest' ) ) {
65
  $prefix = rest_get_url_prefix();
66
  if (
67
  defined( 'REST_REQUEST' ) && REST_REQUEST || // After WP_REST_Request initialisation.
68
- isset( $_GET['rest_route'] ) && 0 === strpos( trim( $_GET['rest_route'], '\\/' ), $prefix, 0 ) // phpcs:ignore
69
  // Support "plain" permalink settings.
70
  ) {
71
  return true;
2
  /**
3
  * Booster for WooCommerce - Functions - Booster Core
4
  *
5
+ * @version 6.0.0
6
  * @since 2.9.0
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/functions
54
  /**
55
  * Checks if the current request is a WP REST API request.
56
  *
57
+ * @version 6.0.0
58
  * @since 4.3.0
59
  *
60
  * @author matzeeable
65
  $prefix = rest_get_url_prefix();
66
  if (
67
  defined( 'REST_REQUEST' ) && REST_REQUEST || // After WP_REST_Request initialisation.
68
+ isset( $_GET['rest_route'] ) && 0 === strpos( trim( wp_unslash( $_GET['rest_route'] ), '\\/' ), $prefix, 0 ) // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized, WordPress.Security.NonceVerification.Recommended
69
  // Support "plain" permalink settings.
70
  ) {
71
  return true;
includes/functions/wcj-functions-debug.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Functions - Debug
4
  *
5
- * @version 5.6.2
6
  * @author Pluggabl LLC.
7
  * @package Booster_For_WooCommerce/functions
8
  */
@@ -15,20 +15,21 @@ if ( ! function_exists( 'wcj_log' ) ) {
15
  /**
16
  * Wcj_log.
17
  *
18
- * @version 5.6.2
19
  * @param null | string $message defines the message.
20
  * @param bool $do_var_dump defines the do_var_dump.
21
  */
22
  function wcj_log( $message = '', $do_var_dump = false ) {
 
23
  if ( ! wcj_is_module_enabled( 'debug_tools' ) || ( 'no' === wcj_get_option( 'wcj_logging_enabled', 'no' ) && 'no' === wcj_get_option( 'wcj_wc_logging_enabled', 'no' ) ) ) {
24
  return;
25
  }
26
  if ( $do_var_dump ) {
27
  ob_start();
28
- var_dump( $message ); // phpcs:ignore
29
  $message = ob_get_clean();
30
  } elseif ( is_array( $message ) || is_object( $message ) ) {
31
- $message = print_r( $message, true ); // phpcs:ignore
32
  }
33
  if ( 'yes' === wcj_get_option( 'wcj_logging_enabled', 'no' ) ) {
34
  update_option( 'wcj_log', '<span style="color:red;">' . gmdate( 'Y-m-d H:i:s' ) . ' ' . ! empty( esc_url( sanitize_text_field( wp_unslash( $_SERVER['REQUEST_URI'] ) ) ) ) . '</span> <span style="color:orange;">[</span>' . $message . '<span style="color:orange;">]</span> <br>' . wcj_get_option( 'wcj_log', '' ) );
@@ -40,5 +41,6 @@ if ( ! function_exists( 'wcj_log' ) ) {
40
  $log->log( 'info', $message, array( 'source' => 'booster_for_woocommerce' ) );
41
  }
42
  }
 
43
  }
44
  }
2
  /**
3
  * Booster for WooCommerce - Functions - Debug
4
  *
5
+ * @version 6.0.0
6
  * @author Pluggabl LLC.
7
  * @package Booster_For_WooCommerce/functions
8
  */
15
  /**
16
  * Wcj_log.
17
  *
18
+ * @version 6.0.0
19
  * @param null | string $message defines the message.
20
  * @param bool $do_var_dump defines the do_var_dump.
21
  */
22
  function wcj_log( $message = '', $do_var_dump = false ) {
23
+ // phpcs:disable WordPress.PHP.DevelopmentFunctions
24
  if ( ! wcj_is_module_enabled( 'debug_tools' ) || ( 'no' === wcj_get_option( 'wcj_logging_enabled', 'no' ) && 'no' === wcj_get_option( 'wcj_wc_logging_enabled', 'no' ) ) ) {
25
  return;
26
  }
27
  if ( $do_var_dump ) {
28
  ob_start();
29
+ var_dump( $message );
30
  $message = ob_get_clean();
31
  } elseif ( is_array( $message ) || is_object( $message ) ) {
32
+ $message = print_r( $message, true );
33
  }
34
  if ( 'yes' === wcj_get_option( 'wcj_logging_enabled', 'no' ) ) {
35
  update_option( 'wcj_log', '<span style="color:red;">' . gmdate( 'Y-m-d H:i:s' ) . ' ' . ! empty( esc_url( sanitize_text_field( wp_unslash( $_SERVER['REQUEST_URI'] ) ) ) ) . '</span> <span style="color:orange;">[</span>' . $message . '<span style="color:orange;">]</span> <br>' . wcj_get_option( 'wcj_log', '' ) );
41
  $log->log( 'info', $message, array( 'source' => 'booster_for_woocommerce' ) );
42
  }
43
  }
44
+ // phpcs:enable
45
  }
46
  }
includes/functions/wcj-functions-exchange-rates.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Functions - Exchange Rates
4
  *
5
- * @version 5.6.2
6
  * @since 2.7.0
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/functions
@@ -187,7 +187,7 @@ if ( ! function_exists( 'wcj_get_currency_exchange_rates_url_response' ) ) {
187
  /**
188
  * Wcj_get_currency_exchange_rates_url_response.
189
  *
190
- * @version 35.6.2
191
  * @since 3.2.4
192
  * @todo use where needed
193
  * @param string $url defines the url.
@@ -195,12 +195,8 @@ if ( ! function_exists( 'wcj_get_currency_exchange_rates_url_response' ) ) {
195
  */
196
  function wcj_get_currency_exchange_rates_url_response( $url, $do_json_decode = true ) {
197
  $response = '';
198
- if ( 'no' === wcj_get_option( 'wcj_currency_exchange_rates_always_curl', 'no' ) && ini_get( 'allow_url_fopen' ) ) {
199
- $response = file_get_contents( $url ); //phpcs:ignore
200
- } elseif ( function_exists( 'curl_version' ) ) {
201
- $response = wp_remote_get( $url );
202
- $response = $response['body'];
203
- }
204
  return ( '' !== $response ? ( $do_json_decode ? json_decode( $response ) : $response ) : false );
205
  }
206
  }
@@ -418,32 +414,33 @@ if ( ! function_exists( 'wcj_ecb_get_exchange_rate' ) ) {
418
  /**
419
  * Wcj_ecb_get_exchange_rate.
420
  *
421
- * @version 4.3.0
422
  * @since 2.6.0
423
  * @param string | int $currency_from defines the currency_from.
424
  * @param string | int $currency_to defines the currency_to.
425
  */
426
  function wcj_ecb_get_exchange_rate( $currency_from, $currency_to ) {
427
  $final_rate = false;
 
428
  if ( function_exists( 'simplexml_load_file' ) ) {
429
  if ( WP_DEBUG === true ) {
430
  $xml = simplexml_load_file( 'http://www.ecb.int/stats/eurofxref/eurofxref-daily.xml' );
431
  } else {
432
  $xml = simplexml_load_file( 'http://www.ecb.int/stats/eurofxref/eurofxref-daily.xml' );
433
  }
434
- if ( isset( $xml->cube->cube->cube ) ) {
435
  if ( 'EUR' === $currency_from ) {
436
  $eur_currency_from_rate = 1;
437
  }
438
  if ( 'EUR' === $currency_to ) {
439
  $eur_currency_to_rate = 1;
440
  }
441
- foreach ( $xml->cube->cube->cube as $currency_rate ) {
442
  $currency_rate = $currency_rate->attributes();
443
- if ( ! isset( $eur_currency_from_rate ) && $currency_from === $currency_rate->currency ) {
444
  $eur_currency_from_rate = (float) $currency_rate->rate;
445
  }
446
- if ( ! isset( $eur_currency_to_rate ) && $currency_to === $currency_rate->currency ) {
447
  $eur_currency_to_rate = (float) $currency_rate->rate;
448
  }
449
  }
2
  /**
3
  * Booster for WooCommerce - Functions - Exchange Rates
4
  *
5
+ * @version 6.0.0
6
  * @since 2.7.0
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/functions
187
  /**
188
  * Wcj_get_currency_exchange_rates_url_response.
189
  *
190
+ * @version 6.0.0
191
  * @since 3.2.4
192
  * @todo use where needed
193
  * @param string $url defines the url.
195
  */
196
  function wcj_get_currency_exchange_rates_url_response( $url, $do_json_decode = true ) {
197
  $response = '';
198
+ $response = wp_remote_get( $url );
199
+ $response = $response['body'];
 
 
 
 
200
  return ( '' !== $response ? ( $do_json_decode ? json_decode( $response ) : $response ) : false );
201
  }
202
  }
414
  /**
415
  * Wcj_ecb_get_exchange_rate.
416
  *
417
+ * @version 6.0.0
418
  * @since 2.6.0
419
  * @param string | int $currency_from defines the currency_from.
420
  * @param string | int $currency_to defines the currency_to.
421
  */
422
  function wcj_ecb_get_exchange_rate( $currency_from, $currency_to ) {
423
  $final_rate = false;
424
+ $cube = 'Cube';
425
  if ( function_exists( 'simplexml_load_file' ) ) {
426
  if ( WP_DEBUG === true ) {
427
  $xml = simplexml_load_file( 'http://www.ecb.int/stats/eurofxref/eurofxref-daily.xml' );
428
  } else {
429
  $xml = simplexml_load_file( 'http://www.ecb.int/stats/eurofxref/eurofxref-daily.xml' );
430
  }
431
+ if ( isset( $xml->$cube->$cube->$cube ) ) {
432
  if ( 'EUR' === $currency_from ) {
433
  $eur_currency_from_rate = 1;
434
  }
435
  if ( 'EUR' === $currency_to ) {
436
  $eur_currency_to_rate = 1;
437
  }
438
+ foreach ( $xml->$cube->$cube->$cube as $currency_rate ) {
439
  $currency_rate = $currency_rate->attributes();
440
+ if ( ! isset( $eur_currency_from_rate ) && $currency_from === (string) $currency_rate->currency ) {
441
  $eur_currency_from_rate = (float) $currency_rate->rate;
442
  }
443
+ if ( ! isset( $eur_currency_to_rate ) && $currency_to === (string) $currency_rate->currency ) {
444
  $eur_currency_to_rate = (float) $currency_rate->rate;
445
  }
446
  }
includes/functions/wcj-functions-general.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Functions - General
4
  *
5
- * @version 5.6.8
6
  * @author Pluggabl LLC.
7
  * @todo add `wcj_add_actions()` and `wcj_add_filters()`
8
  * @package Booster_For_WooCommerce/functions
@@ -120,48 +120,6 @@ if ( ! function_exists( 'wcj_is_product_in_cart' ) ) {
120
  }
121
  }
122
 
123
- if ( ! function_exists( 'wcj_send_file' ) ) {
124
- /**
125
- * Wcj_send_file.
126
- *
127
- * @version 5.6.2
128
- * @since 3.5.0
129
- * @todo use where needed
130
- * @todo add more cases for `$file_type`
131
- * @param string $file_name defines the file_name.
132
- * @param string $file_path defines the file_path.
133
- * @param string $file_type defines the file_type.
134
- * @param bool $do_clean_up defines the do_clean_up.
135
- */
136
- function wcj_send_file( $file_name, $file_path, $file_type, $do_clean_up = true ) {
137
- switch ( $file_type ) {
138
- default: // 'zip'
139
- header( 'Content-Type: application/octet-stream' );
140
- header( 'Content-Disposition: attachment; filename=' . rawurlencode( $file_name ) );
141
- header( 'Content-Type: application/octet-stream' );
142
- header( 'Content-Type: application/download' );
143
- header( 'Content-Description: File Transfer' );
144
- header( 'Content-Length: ' . filesize( $file_path ) );
145
- break;
146
- }
147
- flush(); // this doesn't really matter.
148
- $fp = fopen( $file_path, 'r' ); //phpcs:ignore
149
- if ( false !== ( $fp ) ) {
150
- while ( ! feof( $fp ) ) {
151
- echo fread( $fp, 65536 ); //phpcs:ignore
152
- flush(); // this is essential for large downloads.
153
- }
154
- fclose( $fp ); //phpcs:ignore
155
- if ( $do_clean_up ) {
156
- @unlink( $file_path ); //phpcs:ignore
157
- }
158
- exit();
159
- } else {
160
- die( wp_kses_post( 'Unexpected error', 'woocommerce-jetpack' ) );
161
- }
162
- }
163
- }
164
-
165
  if ( ! function_exists( 'wcj_parse_number' ) ) {
166
  /**
167
  * Wcj_parse_number.
@@ -215,13 +173,13 @@ if ( ! function_exists( 'wcj_tcpdf_method' ) ) {
215
  /**
216
  * Wcj_tcpdf_method.
217
  *
218
- * @version 3.6.0
219
  * @since 3.4.0
220
  * @param string $method defines the method.
221
  * @param string $params defines the params.
222
  */
223
  function wcj_tcpdf_method( $method, $params ) {
224
- return '<tcpdf method="' . $method . '" wcj_tcpdf_method_params_start' . serialize( $params ) . 'wcj_tcpdf_method_params_end />'; //phpcs:ignore
225
  }
226
  }
227
 
@@ -561,7 +519,7 @@ if ( ! function_exists( 'wcj_variation_radio_button' ) ) {
561
  /**
562
  * Wcj_variation_radio_button.
563
  *
564
- * @version 5.6.2
565
  * @since 2.4.8
566
  * @todo (maybe) check - maybe we can use `$variation['variation_description']` instead of `get_post_meta( $variation_id, '_variation_description', true )`
567
  * @param array $_product defines the _product.
@@ -580,8 +538,10 @@ if ( ! function_exists( 'wcj_variation_radio_button' ) ) {
580
  $attribute_name = substr( $attribute_full_name, strlen( $prefix ) );
581
  }
582
  // Checked.
583
- $checked = ( isset( $_REQUEST[ 'attribute_' . sanitize_title( $attribute_name ) ] ) ) ? // phpcs:ignore WordPress.Security.NonceVerification
584
- wc_clean( sanitize_text_field( wp_unslash( $_REQUEST[ 'attribute_' . sanitize_title( $attribute_name ) ] ) ) ) : $_product->get_variation_default_attribute( $attribute_name ); // phpcs:ignore WordPress.Security.NonceVerification
 
 
585
  if ( $checked !== $attribute_value ) {
586
  $is_checked = false;
587
  }
@@ -672,7 +632,7 @@ if ( ! function_exists( 'wcj_maybe_unserialize_and_implode' ) ) {
672
  /**
673
  * Wcj_maybe_unserialize_and_implode.
674
  *
675
- * @version 2.8.0
676
  * @since 2.8.0
677
  * @return string
678
  * @todo `if ( ! is_array() )`
@@ -681,7 +641,7 @@ if ( ! function_exists( 'wcj_maybe_unserialize_and_implode' ) ) {
681
  */
682
  function wcj_maybe_unserialize_and_implode( $value, $glue = ' ' ) {
683
  if ( is_serialized( $value ) ) {
684
- $value = unserialize( $value ); //phpcs:ignore
685
  if ( is_array( $value ) ) {
686
  $value = implode( $glue, $value );
687
  }
@@ -732,16 +692,18 @@ if ( ! function_exists( 'wcj_get_rates_for_tax_class' ) ) {
732
  * Used by admin settings page.
733
  *
734
  * @return array|null|object
735
- * @version 5.6.2
736
  * @since 2.3.10
737
  * @param string $tax_class defines the tax_class.
738
  */
739
  function wcj_get_rates_for_tax_class( $tax_class ) {
740
  global $wpdb;
741
 
 
742
  // Get all the rates and locations. Snagging all at once should significantly cut down on the number of queries.
743
- $rates = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM `{$wpdb->prefix}woocommerce_tax_rates` WHERE `tax_rate_class` = %s ORDER BY `tax_rate_order`;", sanitize_title( $tax_class ) ) ); // WPCS: db call ok and cache ok.
744
- $locations = $wpdb->get_results( "SELECT * FROM `{$wpdb->prefix}woocommerce_tax_rate_locations`" ); // WPCS: db call ok and cache ok.
 
745
 
746
  // Set the rates keys equal to their ids.
747
  $rates = array_combine( wp_list_pluck( $rates, 'tax_rate_id' ), $rates );
@@ -791,15 +753,16 @@ if ( ! function_exists( 'wcj_is_frontend' ) ) {
791
  /**
792
  * Wcj_is_frontend()
793
  *
794
- * @since 5.6.2
795
  * @return boolean
796
  */
797
  function wcj_is_frontend() {
 
798
  if ( ! is_admin() ) {
799
  return true;
800
  } elseif ( defined( 'DOING_AJAX' ) && DOING_AJAX ) {
801
- return ( ! isset( $_REQUEST['action'] ) || ! is_string( $_REQUEST['action'] ) || ! in_array( // phpcs:ignore WordPress.Security.NonceVerification
802
- $_REQUEST['action'], // phpcs:ignore WordPress.Security.NonceVerification
803
  array(
804
  'woocommerce_load_variations',
805
  ),
@@ -808,6 +771,7 @@ if ( ! function_exists( 'wcj_is_frontend' ) ) {
808
  } else {
809
  return false;
810
  }
 
811
  }
812
  }
813
 
@@ -1032,7 +996,7 @@ if ( ! function_exists( 'wcj_add_allowed_html' ) ) {
1032
  /**
1033
  * Wcj_add_allowed_html.
1034
  *
1035
- * @version 5.6.8
1036
  * @since 5.6.0
1037
  * @param array $allowed_html to get default allowed html.
1038
  * @param string $context to get default context.
@@ -1072,6 +1036,9 @@ if ( ! function_exists( 'wcj_add_allowed_html' ) ) {
1072
  'onclick' => true,
1073
  'accept' => true,
1074
  'data-*' => true,
 
 
 
1075
  ),
1076
  'textarea' => array(
1077
  'name' => true,
2
  /**
3
  * Booster for WooCommerce - Functions - General
4
  *
5
+ * @version 6.0.0
6
  * @author Pluggabl LLC.
7
  * @todo add `wcj_add_actions()` and `wcj_add_filters()`
8
  * @package Booster_For_WooCommerce/functions
120
  }
121
  }
122
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
123
  if ( ! function_exists( 'wcj_parse_number' ) ) {
124
  /**
125
  * Wcj_parse_number.
173
  /**
174
  * Wcj_tcpdf_method.
175
  *
176
+ * @version 6.0.0
177
  * @since 3.4.0
178
  * @param string $method defines the method.
179
  * @param string $params defines the params.
180
  */
181
  function wcj_tcpdf_method( $method, $params ) {
182
+ return '<tcpdf method="' . $method . '" wcj_tcpdf_method_params_start' . wp_json_encode( $params ) . 'wcj_tcpdf_method_params_end />';
183
  }
184
  }
185
 
519
  /**
520
  * Wcj_variation_radio_button.
521
  *
522
+ * @version 6.0.0
523
  * @since 2.4.8
524
  * @todo (maybe) check - maybe we can use `$variation['variation_description']` instead of `get_post_meta( $variation_id, '_variation_description', true )`
525
  * @param array $_product defines the _product.
538
  $attribute_name = substr( $attribute_full_name, strlen( $prefix ) );
539
  }
540
  // Checked.
541
+ // phpcs:disable WordPress.Security.NonceVerification
542
+ $checked = ( isset( $_REQUEST[ 'attribute_' . sanitize_title( $attribute_name ) ] ) ) ?
543
+ wc_clean( sanitize_text_field( wp_unslash( $_REQUEST[ 'attribute_' . sanitize_title( $attribute_name ) ] ) ) ) : $_product->get_variation_default_attribute( $attribute_name );
544
+ // phpcs:enable
545
  if ( $checked !== $attribute_value ) {
546
  $is_checked = false;
547
  }
632
  /**
633
  * Wcj_maybe_unserialize_and_implode.
634
  *
635
+ * @version 6.0.0
636
  * @since 2.8.0
637
  * @return string
638
  * @todo `if ( ! is_array() )`
641
  */
642
  function wcj_maybe_unserialize_and_implode( $value, $glue = ' ' ) {
643
  if ( is_serialized( $value ) ) {
644
+ $value = unserialize( $value ); // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions
645
  if ( is_array( $value ) ) {
646
  $value = implode( $glue, $value );
647
  }
692
  * Used by admin settings page.
693
  *
694
  * @return array|null|object
695
+ * @version 6.0.0
696
  * @since 2.3.10
697
  * @param string $tax_class defines the tax_class.
698
  */
699
  function wcj_get_rates_for_tax_class( $tax_class ) {
700
  global $wpdb;
701
 
702
+ // phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching
703
  // Get all the rates and locations. Snagging all at once should significantly cut down on the number of queries.
704
+ $rates = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM `{$wpdb->prefix}woocommerce_tax_rates` WHERE `tax_rate_class` = %s ORDER BY `tax_rate_order`;", sanitize_title( $tax_class ) ) );
705
+ $locations = $wpdb->get_results( "SELECT * FROM `{$wpdb->prefix}woocommerce_tax_rate_locations`" );
706
+ // phpcs:enable
707
 
708
  // Set the rates keys equal to their ids.
709
  $rates = array_combine( wp_list_pluck( $rates, 'tax_rate_id' ), $rates );
753
  /**
754
  * Wcj_is_frontend()
755
  *
756
+ * @since 5.6.9-dev
757
  * @return boolean
758
  */
759
  function wcj_is_frontend() {
760
+ // phpcs:disable WordPress.Security.NonceVerification
761
  if ( ! is_admin() ) {
762
  return true;
763
  } elseif ( defined( 'DOING_AJAX' ) && DOING_AJAX ) {
764
+ return ( ! isset( $_REQUEST['action'] ) || ! is_string( $_REQUEST['action'] ) || ! in_array(
765
+ $_REQUEST['action'],
766
  array(
767
  'woocommerce_load_variations',
768
  ),
771
  } else {
772
  return false;
773
  }
774
+ // phpcs:enable
775
  }
776
  }
777
 
996
  /**
997
  * Wcj_add_allowed_html.
998
  *
999
+ * @version 6.0.0
1000
  * @since 5.6.0
1001
  * @param array $allowed_html to get default allowed html.
1002
  * @param string $context to get default context.
1036
  'onclick' => true,
1037
  'accept' => true,
1038
  'data-*' => true,
1039
+ 'attribute_*' => true,
1040
+ 'variation_id' => true,
1041
+ 'size' => true,
1042
  ),
1043
  'textarea' => array(
1044
  'name' => true,
includes/functions/wcj-functions-number-to-words-lt.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Functions - Numbers to Words
4
  *
5
- * @version 5.6.2
6
  * @since 2.5.9
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/functions
@@ -12,7 +12,7 @@ if ( ! function_exists( 'convert_number_to_words_lt' ) ) {
12
  /**
13
  * Convert_number_to_words_lt.
14
  *
15
- * @version 5.6.2
16
  * @since 2.5.9
17
  * @return string
18
  * @param int $number Get Number.
@@ -80,7 +80,7 @@ if ( ! function_exists( 'convert_number_to_words_lt' ) ) {
80
 
81
  if ( ( $number >= 0 && (int) $number < 0 ) || (int) $number < 0 - PHP_INT_MAX ) {
82
  // overflow.
83
- trigger_error( //phpcs:ignore
84
  'convert_number_to_words_lt only accepts numbers between -' . PHP_INT_MAX . ' and ' . PHP_INT_MAX, // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
85
  E_USER_WARNING
86
  );
2
  /**
3
  * Booster for WooCommerce - Functions - Numbers to Words
4
  *
5
+ * @version 6.0.0
6
  * @since 2.5.9
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/functions
12
  /**
13
  * Convert_number_to_words_lt.
14
  *
15
+ * @version 6.0.0
16
  * @since 2.5.9
17
  * @return string
18
  * @param int $number Get Number.
80
 
81
  if ( ( $number >= 0 && (int) $number < 0 ) || (int) $number < 0 - PHP_INT_MAX ) {
82
  // overflow.
83
+ trigger_error( // phpcs:ignore WordPress.PHP.DevelopmentFunctions
84
  'convert_number_to_words_lt only accepts numbers between -' . PHP_INT_MAX . ' and ' . PHP_INT_MAX, // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
85
  E_USER_WARNING
86
  );
includes/functions/wcj-functions-number-to-words.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Functions - Numbers to Words
4
  *
5
- * @version 5.6.2
6
  * @author Pluggabl LLC.
7
  * @package Booster_For_WooCommerce/functions
8
  */
@@ -16,7 +16,7 @@ if ( ! function_exists( 'convert_number_to_words' ) ) {
16
  /**
17
  * Convert_number_to_words.
18
  *
19
- * @version 5.6.2
20
  * @since 2.5.0
21
  * @param int $number Get Number.
22
  */
@@ -70,7 +70,7 @@ if ( ! function_exists( 'convert_number_to_words' ) ) {
70
 
71
  if ( ( $number >= 0 && (int) $number < 0 ) || (int) $number < 0 - PHP_INT_MAX ) {
72
  // overflow.
73
- trigger_error( //phpcs:ignore
74
  'convert_number_to_words only accepts numbers between -' . PHP_INT_MAX . ' and ' . PHP_INT_MAX, // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
75
  E_USER_WARNING
76
  );
2
  /**
3
  * Booster for WooCommerce - Functions - Numbers to Words
4
  *
5
+ * @version 6.0.0
6
  * @author Pluggabl LLC.
7
  * @package Booster_For_WooCommerce/functions
8
  */
16
  /**
17
  * Convert_number_to_words.
18
  *
19
+ * @version 6.0.0
20
  * @since 2.5.0
21
  * @param int $number Get Number.
22
  */
70
 
71
  if ( ( $number >= 0 && (int) $number < 0 ) || (int) $number < 0 - PHP_INT_MAX ) {
72
  // overflow.
73
+ trigger_error( // phpcs:ignore WordPress.PHP.DevelopmentFunctions
74
  'convert_number_to_words only accepts numbers between -' . PHP_INT_MAX . ' and ' . PHP_INT_MAX, // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
75
  E_USER_WARNING
76
  );
includes/functions/wcj-functions-reports.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Functions - Reports
4
  *
5
- * @version 5.6.8
6
  * @since 2.9.0
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/functions
@@ -16,12 +16,12 @@ if ( ! function_exists( 'wcj_get_product_sales_daily_report_columns' ) ) {
16
  /**
17
  * Wcj_get_product_sales_daily_report_columns.
18
  *
19
- * @version 5.6.2
20
  * @since 2.9.0
21
  */
22
  function wcj_get_product_sales_daily_report_columns() {
23
  return array(
24
- 'date' => __( 'date', 'woocommerce-jetpack' ),
25
  'daily_total_sum' => __( 'Daily Total Sum', 'woocommerce-jetpack' ),
26
  'daily_total_quantity' => __( 'Daily Total Quantity', 'woocommerce-jetpack' ),
27
  'product_id' => __( 'Product ID', 'woocommerce-jetpack' ),
2
  /**
3
  * Booster for WooCommerce - Functions - Reports
4
  *
5
+ * @version 6.0.0
6
  * @since 2.9.0
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/functions
16
  /**
17
  * Wcj_get_product_sales_daily_report_columns.
18
  *
19
+ * @version 6.0.0
20
  * @since 2.9.0
21
  */
22
  function wcj_get_product_sales_daily_report_columns() {
23
  return array(
24
+ 'date' => __( 'Date', 'woocommerce-jetpack' ),
25
  'daily_total_sum' => __( 'Daily Total Sum', 'woocommerce-jetpack' ),
26
  'daily_total_quantity' => __( 'Daily Total Quantity', 'woocommerce-jetpack' ),
27
  'product_id' => __( 'Product ID', 'woocommerce-jetpack' ),
includes/js/wcj-ajax-exchange-rates-average.js CHANGED
@@ -1,7 +1,7 @@
1
  /**
2
  * Wcj-ajax-exchange-rates-average.js
3
  *
4
- * @version 5.6.2
5
  * @since 3.2.2
6
  *
7
  * @package Booster_For_WooCommerce/includes/JS
@@ -18,6 +18,7 @@ jQuery( document ).ready(
18
  'wcj_currency_to': this.getAttribute( 'currency_to' ),
19
  'wcj_start_date': this.getAttribute( 'start_date' ),
20
  'wcj_end_date': this.getAttribute( 'end_date' ),
 
21
  };
22
  jQuery( input_id ).prop( 'readonly', true );
23
  jQuery.ajax(
1
  /**
2
  * Wcj-ajax-exchange-rates-average.js
3
  *
4
+ * @version 6.0.0
5
  * @since 3.2.2
6
  *
7
  * @package Booster_For_WooCommerce/includes/JS
18
  'wcj_currency_to': this.getAttribute( 'currency_to' ),
19
  'wcj_start_date': this.getAttribute( 'start_date' ),
20
  'wcj_end_date': this.getAttribute( 'end_date' ),
21
+ 'wpnonce': ajax_object.wpnonce,
22
  };
23
  jQuery( input_id ).prop( 'readonly', true );
24
  jQuery.ajax(
includes/pdf-invoices/class-wcj-pdf-invoicing-renumerate-tool.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - PDF Invoicing - Renumerate Tool
4
  *
5
- * @version 5.6.8
6
  * @author Pluggabl LLC.
7
  * @package Booster_For_WooCommerce/includes
8
  */
@@ -51,7 +51,7 @@ if ( ! class_exists( 'WCJ_PDF_Invoicing_Renumerate_Tool' ) ) :
51
  /**
52
  * Add Renumerate Invoices tool to WooCommerce menu (the content).
53
  *
54
- * @version 5.6.8
55
  */
56
  public function create_renumerate_invoices_tool() {
57
 
@@ -141,11 +141,13 @@ if ( ! class_exists( 'WCJ_PDF_Invoicing_Renumerate_Tool' ) ) :
141
  );
142
 
143
  // Print all.
144
- echo wcj_get_table_html( // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
145
- $data,
146
- array(
147
- 'table_class' => 'widefat striped',
148
- 'table_heading_type' => 'vertical',
 
 
149
  )
150
  );
151
 
@@ -153,7 +155,7 @@ if ( ! class_exists( 'WCJ_PDF_Invoicing_Renumerate_Tool' ) ) :
153
  </form></p>
154
  <?php
155
  if ( '' !== $renumerate_result ) {
156
- echo '<h3>' . wp_kses_post( 'Results', 'woocommerce-jetpack' ) . '</h3>';
157
  echo '<p>' . wp_kses_post( $renumerate_result ) . '</p>';
158
  }
159
  ?>
2
  /**
3
  * Booster for WooCommerce - PDF Invoicing - Renumerate Tool
4
  *
5
+ * @version 6.0.0
6
  * @author Pluggabl LLC.
7
  * @package Booster_For_WooCommerce/includes
8
  */
51
  /**
52
  * Add Renumerate Invoices tool to WooCommerce menu (the content).
53
  *
54
+ * @version 6.0.0
55
  */
56
  public function create_renumerate_invoices_tool() {
57
 
141
  );
142
 
143
  // Print all.
144
+ echo wp_kses_post(
145
+ wcj_get_table_html(
146
+ $data,
147
+ array(
148
+ 'table_class' => 'widefat striped',
149
+ 'table_heading_type' => 'vertical',
150
+ )
151
  )
152
  );
153
 
155
  </form></p>
156
  <?php
157
  if ( '' !== $renumerate_result ) {
158
+ echo '<h3>' . esc_html__( 'Results', 'woocommerce-jetpack' ) . '</h3>';
159
  echo '<p>' . wp_kses_post( $renumerate_result ) . '</p>';
160
  }
161
  ?>
includes/pdf-invoices/class-wcj-pdf-invoicing-report-tool.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - PDF Invoicing - Report Tool
4
  *
5
- * @version 5.6.8
6
  * @since 2.2.1
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/includes
@@ -111,12 +111,11 @@ if ( ! class_exists( 'WCJ_PDF_Invoicing_Report_Tool' ) ) :
111
  /**
112
  * Add Invoices Report tool to WooCommerce menu (the content).
113
  *
114
- * @version 5.6.8
115
  */
116
  public function create_invoices_report_tool() {
117
  $wpnonce = isset( $_REQUEST['wcj_tools_nonce'] ) ? wp_verify_nonce( sanitize_key( $_REQUEST['wcj_tools_nonce'] ), 'wcj_tools' ) : false;
118
  $result_message = '';
119
- $result_message .= $this->notice;
120
  $the_year = ( $wpnonce && ! empty( $_POST['report_year'] ) ) ? sanitize_text_field( wp_unslash( $_POST['report_year'] ) ) : gmdate( 'Y' );
121
  $the_month = ( $wpnonce && ! empty( $_POST['report_month'] ) ) ? sanitize_text_field( wp_unslash( $_POST['report_month'] ) ) : gmdate( 'n' );
122
  $the_invoice_type = ( $wpnonce && ! empty( $_POST['invoice_type'] ) ) ? sanitize_text_field( wp_unslash( $_POST['invoice_type'] ) ) : 'invoice';
@@ -131,6 +130,7 @@ if ( ! class_exists( 'WCJ_PDF_Invoicing_Report_Tool' ) ) :
131
  $html .= '<div class="wcj-setting-jetpack-body">';
132
  $html .= '<div class="wrap">';
133
  $html .= w_c_j()->modules['pdf_invoicing']->get_tool_header_html( 'invoices_report' );
 
134
  $html .= '<p><form method="post" action="">';
135
  // Type.
136
  $invoice_type_select_html = '<select name="invoice_type" class="widefat">';
@@ -192,13 +192,16 @@ if ( ! class_exists( 'WCJ_PDF_Invoicing_Report_Tool' ) ) :
192
  /**
193
  * Get_invoices_report_zip.
194
  *
195
- * @version 5.6.2
196
  * @since 2.3.10
197
  * @param int | string $year Get year.
198
  * @param int | string $month Get month.
199
  * @param int $invoice_type_id Get invoice type id.
200
  */
201
  public function get_invoices_report_zip( $year, $month, $invoice_type_id ) {
 
 
 
202
  if ( ! class_exists( 'ZipArchive' ) ) {
203
  return sprintf(
204
  /* translators: %s: search term */
@@ -229,9 +232,9 @@ if ( ! class_exists( 'WCJ_PDF_Invoicing_Report_Tool' ) ) :
229
  'post_status' => 'any',
230
  'posts_per_page' => $block_size,
231
  'orderby' => 'meta_value_num',
232
- 'meta_key' => '_wcj_invoicing_' . $invoice_type_id . '_date', //phpcs:ignore
233
  'order' => 'ASC',
234
- 'meta_query' => array( //phpcs:ignore
235
  array(
236
  'key' => '_wcj_invoicing_' . $invoice_type_id . '_date',
237
  'value' => array( $first_minute, $last_minute ),
@@ -262,22 +265,10 @@ if ( ! class_exists( 'WCJ_PDF_Invoicing_Report_Tool' ) ) :
262
  if ( $archive_is_empty ) {
263
  return $this->get_no_documents_found_message( $year, $month, $invoice_type_id );
264
  }
265
-
266
- header( 'Content-Disposition: attachment; filename=' . rawurlencode( $zip_file_name ) );
267
- header( 'Content-Type: application/download' );
268
- header( 'Content-Description: File Transfer' );
269
- header( 'Content-Length: ' . filesize( $zip_file_path ) );
270
- flush(); // this doesn't really matter.
271
- $fp = fopen( $zip_file_path, 'r' ); //phpcs:ignore
272
- if ( false !== ( $fp ) ) {
273
- while ( ! feof( $fp ) ) {
274
- echo fread( $fp, 65536 ); //phpcs:ignore
275
- flush(); // this is essential for large downloads.
276
- }
277
- fclose( $fp ); //phpcs:ignore
278
- exit();
279
  } else {
280
- die( esc_html__( 'Unexpected error', 'woocommerce-jetpack' ) );
281
  }
282
  return true;
283
  }
@@ -353,7 +344,7 @@ if ( ! class_exists( 'WCJ_PDF_Invoicing_Report_Tool' ) ) :
353
  /**
354
  * Invoices Report Data function.
355
  *
356
- * @version 5.6.3
357
  * @since 2.5.7
358
  * @param int | string $year Get year.
359
  * @param int | string $month Get month.
@@ -384,9 +375,9 @@ if ( ! class_exists( 'WCJ_PDF_Invoicing_Report_Tool' ) ) :
384
  'post_status' => 'any',
385
  'posts_per_page' => $block_size,
386
  'orderby' => 'meta_value_num',
387
- 'meta_key' => '_wcj_invoicing_' . $invoice_type_id . '_date', //phpcs:ignore
388
  'order' => 'ASC',
389
- 'meta_query' => array( //phpcs:ignore
390
  array(
391
  'key' => '_wcj_invoicing_' . $invoice_type_id . '_date',
392
  'value' => array( $first_minute, $last_minute ),
2
  /**
3
  * Booster for WooCommerce - PDF Invoicing - Report Tool
4
  *
5
+ * @version 6.0.0
6
  * @since 2.2.1
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/includes
111
  /**
112
  * Add Invoices Report tool to WooCommerce menu (the content).
113
  *
114
+ * @version 6.0.0
115
  */
116
  public function create_invoices_report_tool() {
117
  $wpnonce = isset( $_REQUEST['wcj_tools_nonce'] ) ? wp_verify_nonce( sanitize_key( $_REQUEST['wcj_tools_nonce'] ), 'wcj_tools' ) : false;
118
  $result_message = '';
 
119
  $the_year = ( $wpnonce && ! empty( $_POST['report_year'] ) ) ? sanitize_text_field( wp_unslash( $_POST['report_year'] ) ) : gmdate( 'Y' );
120
  $the_month = ( $wpnonce && ! empty( $_POST['report_month'] ) ) ? sanitize_text_field( wp_unslash( $_POST['report_month'] ) ) : gmdate( 'n' );
121
  $the_invoice_type = ( $wpnonce && ! empty( $_POST['invoice_type'] ) ) ? sanitize_text_field( wp_unslash( $_POST['invoice_type'] ) ) : 'invoice';
130
  $html .= '<div class="wcj-setting-jetpack-body">';
131
  $html .= '<div class="wrap">';
132
  $html .= w_c_j()->modules['pdf_invoicing']->get_tool_header_html( 'invoices_report' );
133
+ $html .= $this->notice;
134
  $html .= '<p><form method="post" action="">';
135
  // Type.
136
  $invoice_type_select_html = '<select name="invoice_type" class="widefat">';
192
  /**
193
  * Get_invoices_report_zip.
194
  *
195
+ * @version 6.0.0
196
  * @since 2.3.10
197
  * @param int | string $year Get year.
198
  * @param int | string $month Get month.
199
  * @param int $invoice_type_id Get invoice type id.
200
  */
201
  public function get_invoices_report_zip( $year, $month, $invoice_type_id ) {
202
+ require_once ABSPATH . '/wp-admin/includes/file.php';
203
+ global $wp_filesystem;
204
+ WP_Filesystem();
205
  if ( ! class_exists( 'ZipArchive' ) ) {
206
  return sprintf(
207
  /* translators: %s: search term */
232
  'post_status' => 'any',
233
  'posts_per_page' => $block_size,
234
  'orderby' => 'meta_value_num',
235
+ 'meta_key' => '_wcj_invoicing_' . $invoice_type_id . '_date', // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_key
236
  'order' => 'ASC',
237
+ 'meta_query' => array( // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_query
238
  array(
239
  'key' => '_wcj_invoicing_' . $invoice_type_id . '_date',
240
  'value' => array( $first_minute, $last_minute ),
265
  if ( $archive_is_empty ) {
266
  return $this->get_no_documents_found_message( $year, $month, $invoice_type_id );
267
  }
268
+ if ( $wp_filesystem->exists( $zip_file_path ) ) {
269
+ WC_Download_Handler::download_file_force( $zip_file_path, $zip_file_name );
 
 
 
 
 
 
 
 
 
 
 
 
270
  } else {
271
+ return false;
272
  }
273
  return true;
274
  }
344
  /**
345
  * Invoices Report Data function.
346
  *
347
+ * @version 6.0.0
348
  * @since 2.5.7
349
  * @param int | string $year Get year.
350
  * @param int | string $month Get month.
375
  'post_status' => 'any',
376
  'posts_per_page' => $block_size,
377
  'orderby' => 'meta_value_num',
378
+ 'meta_key' => '_wcj_invoicing_' . $invoice_type_id . '_date', // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_key
379
  'order' => 'ASC',
380
+ 'meta_query' => array( // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_query
381
  array(
382
  'key' => '_wcj_invoicing_' . $invoice_type_id . '_date',
383
  'value' => array( $first_minute, $last_minute ),
includes/reports/class-wcj-reports-customers.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Reports - Customers
4
  *
5
- * @version 5.6.7
6
  * @author Pluggabl LLC.
7
  * @package Booster_For_WooCommerce/includes
8
  */
@@ -135,7 +135,7 @@ if ( ! class_exists( 'WCJ_Reports_Customers' ) ) :
135
  /**
136
  * Get_data function.
137
  *
138
- * @version 5.6.7
139
  * @param Array $data Get data.
140
  * @param int $total_customers Get total number of customers.
141
  * @param string $report_type Get all_countries.
@@ -144,8 +144,9 @@ if ( ! class_exists( 'WCJ_Reports_Customers' ) ) :
144
  $html = '';
145
  if ( 'all_countries' === $report_type ) {
146
  $html .= '<h5>' . __( 'Total customers', 'woocommerce-jetpack' ) . ': ' . $total_customers . '</h5>';
147
- $html .= '<table class="widefat" style="width:100% !important;"><tbody>';
148
- $html .= '<tr>';
 
149
  $html .= '<th></th>';
150
  $html .= '<th>' . __( 'Country Code', 'woocommerce-jetpack' ) . '</th>';
151
  $html .= '<th>' . __( 'Customers Count', 'woocommerce-jetpack' ) . '</th>';
@@ -182,7 +183,7 @@ if ( ! class_exists( 'WCJ_Reports_Customers' ) ) :
182
  $html .= ( 2 === strlen( $country_code ) ) ? '<td>' . $country_flag_img_link . '</td>' : '<td></td>';
183
  $html .= '</tr>';
184
  }
185
- $html .= '</tbody></table>';
186
  } else { // single country.
187
  $country_code = $report_type;
188
  $html .= '<h5>' . __( 'Report for:', 'woocommerce-jetpack' ) . ' ' . wcj_get_country_name_by_code( $country_code ) . ' [' . $country_code . '] </h5>';
2
  /**
3
  * Booster for WooCommerce - Reports - Customers
4
  *
5
+ * @version 6.0.0
6
  * @author Pluggabl LLC.
7
  * @package Booster_For_WooCommerce/includes
8
  */
135
  /**
136
  * Get_data function.
137
  *
138
+ * @version 6.0.0
139
  * @param Array $data Get data.
140
  * @param int $total_customers Get total number of customers.
141
  * @param string $report_type Get all_countries.
144
  $html = '';
145
  if ( 'all_countries' === $report_type ) {
146
  $html .= '<h5>' . __( 'Total customers', 'woocommerce-jetpack' ) . ': ' . $total_customers . '</h5>';
147
+ $html .= '<div id="poststuff" class="wcj-reports-wide oocommerce-reports-wide"><div class="inside">';
148
+ $html .= '<table class="widefat striped" style="width:100% !important;"><tbody>';
149
+ $html .= '<tr class="wcj-row wcj-row0 wcj-row-even">';
150
  $html .= '<th></th>';
151
  $html .= '<th>' . __( 'Country Code', 'woocommerce-jetpack' ) . '</th>';
152
  $html .= '<th>' . __( 'Customers Count', 'woocommerce-jetpack' ) . '</th>';
183
  $html .= ( 2 === strlen( $country_code ) ) ? '<td>' . $country_flag_img_link . '</td>' : '<td></td>';
184
  $html .= '</tr>';
185
  }
186
+ $html .= '</tbody></table></div></div>';
187
  } else { // single country.
188
  $country_code = $report_type;
189
  $html .= '<h5>' . __( 'Report for:', 'woocommerce-jetpack' ) . ' ' . wcj_get_country_name_by_code( $country_code ) . ' [' . $country_code . '] </h5>';
includes/reports/class-wcj-reports-monthly-sales.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Reports - Monthly Sales (with Currency Conversion)
4
  *
5
- * @version 5.6.8
6
  * @since 2.4.7
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/includes
@@ -86,7 +86,7 @@ if ( ! class_exists( 'WCJ_Reports_Monthly_Sales' ) ) :
86
  /**
87
  * Get_monthly_sales_report.
88
  *
89
- * @version 5.6.8
90
  * @since 2.4.7
91
  * @todo (maybe) visible rows selection by admin (as option)
92
  * @todo (maybe) take not monthly average, but "Close" of closest day (probably create new "Daily Sales (with Currency Conversion)" report)
@@ -343,26 +343,22 @@ if ( ! class_exists( 'WCJ_Reports_Monthly_Sales' ) ) :
343
  $execution_time_end = microtime( true );
344
 
345
  // HTML.
346
- $html = '';
347
- $menu = '';
348
- $menu .= '<p>';
349
- $menu .= '<ul class="subsubsub">';
350
- $menu .= '<li><a href="' . esc_url( add_query_arg( 'year', gmdate( 'Y' ) ) ) . '" class="' .
351
- ( ( gmdate( 'Y' ) === $this->year ) ? 'current' : '' ) . '">' . gmdate( 'Y' ) . '</a> | </li>';
352
- $menu .= '<li><a href="' . esc_url( add_query_arg( 'year', ( gmdate( 'Y' ) - 1 ) ) ) . '" class="' .
353
- ( ( ( gmdate( 'Y' ) - 1 ) === $this->year ) ? 'current' : '' ) . '">' . ( gmdate( 'Y' ) - 1 ) . '</a> | </li>';
354
- $menu .= '<li><a href="' . esc_url( add_query_arg( 'year', ( gmdate( 'Y' ) - 2 ) ) ) . '" class="' .
355
- ( ( ( gmdate( 'Y' ) - 2 ) === $this->year ) ? 'current' : '' ) . '">' . ( gmdate( 'Y' ) - 2 ) . '</a> | </li>';
356
- $menu .= '</ul>';
357
- $menu .= '</p>';
358
- $menu .= '<br class="clear">';
359
  $html .= $menu;
 
360
  $html .= '<h4>' . __( 'Report currency', 'woocommerce-jetpack' ) . ': ' . $report_currency . '</h4>';
 
361
  $months_styles = array();
362
  for ( $i = 1; $i <= 12; $i++ ) {
363
  $months_styles[] = ( gmdate( 'm' ) === $i && gmdate( 'Y' ) === $this->year ? 'width:8%;' : 'width:6%;' );
364
  }
365
- $html .= '<form method="post" action="">';
366
  $html .= wcj_get_table_html(
367
  $table_data,
368
  array(
@@ -388,7 +384,7 @@ if ( ! class_exists( 'WCJ_Reports_Monthly_Sales' ) ) :
388
  '<input name="wcj_reset_currency_rates" type="submit" class="button button-primary" value="' .
389
  __( 'Reset Currency Rates', 'woocommerce-jetpack' ) . '" onclick="return confirm(\'' . __( 'Are you sure?', 'woocommerce-jetpack' ) . '\')">' .
390
  wp_nonce_field( 'wcj_reset_currency_rates', 'wcj-reset-currency-rates-nonce' ) .
391
- '</form>';
392
  return $html;
393
  }
394
  }
2
  /**
3
  * Booster for WooCommerce - Reports - Monthly Sales (with Currency Conversion)
4
  *
5
+ * @version 6.0.0
6
  * @since 2.4.7
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/includes
86
  /**
87
  * Get_monthly_sales_report.
88
  *
89
+ * @version 6.0.0
90
  * @since 2.4.7
91
  * @todo (maybe) visible rows selection by admin (as option)
92
  * @todo (maybe) take not monthly average, but "Close" of closest day (probably create new "Daily Sales (with Currency Conversion)" report)
343
  $execution_time_end = microtime( true );
344
 
345
  // HTML.
346
+ $html = '';
347
+ $menu = '';
348
+ $menu .= '<div id="poststuff" class="wcj-reports-wide woocommerce-reports-wide"><div class="postbox"><div class="stats_range"><ul class="">';
349
+ $menu .= '<li class="' . ( ( gmdate( 'Y' ) === $this->year ) ? 'active' : '' ) . '"><a href="' . esc_url( add_query_arg( 'year', gmdate( 'Y' ) ) ) . '" >' . gmdate( 'Y' ) . '</a></li>';
350
+ $menu .= '<li class="' . ( ( (string) ( gmdate( 'Y' ) - 1 ) ) === ( $this->year ) ? 'active' : '' ) . '"><a href="' . esc_url( add_query_arg( 'year', ( gmdate( 'Y' ) - 1 ) ) ) . '">' . ( gmdate( 'Y' ) - 1 ) . '</a></li>';
351
+ $menu .= '<li class="' . ( ( (string) ( gmdate( 'Y' ) - 2 ) ) === ( $this->year ) ? 'active' : '' ) . '"><a href="' . esc_url( add_query_arg( 'year', ( gmdate( 'Y' ) - 2 ) ) ) . '">' . ( gmdate( 'Y' ) - 2 ) . '</a></li>';
352
+
 
 
 
 
 
 
353
  $html .= $menu;
354
+ $html .= '<li class="custom">';
355
  $html .= '<h4>' . __( 'Report currency', 'woocommerce-jetpack' ) . ': ' . $report_currency . '</h4>';
356
+ $html .= '</li></ul><br class="clear">';
357
  $months_styles = array();
358
  for ( $i = 1; $i <= 12; $i++ ) {
359
  $months_styles[] = ( gmdate( 'm' ) === $i && gmdate( 'Y' ) === $this->year ? 'width:8%;' : 'width:6%;' );
360
  }
361
+ $html .= '<div class="inside"><form method="post" action="">';
362
  $html .= wcj_get_table_html(
363
  $table_data,
364
  array(
384
  '<input name="wcj_reset_currency_rates" type="submit" class="button button-primary" value="' .
385
  __( 'Reset Currency Rates', 'woocommerce-jetpack' ) . '" onclick="return confirm(\'' . __( 'Are you sure?', 'woocommerce-jetpack' ) . '\')">' .
386
  wp_nonce_field( 'wcj_reset_currency_rates', 'wcj-reset-currency-rates-nonce' ) .
387
+ '</form></div></div></div></div>';
388
  return $html;
389
  }
390
  }
includes/reports/class-wcj-reports-product-sales-daily.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Reports - Product Sales (Daily)
4
  *
5
- * @version 5.6.8
6
  * @since 2.9.0
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/includes
@@ -47,14 +47,18 @@ if ( ! class_exists( 'WCJ_Reports_Product_Sales_Daily' ) ) :
47
  /**
48
  * Get_report_args.
49
  *
50
- * @version 5.6.8
51
  * @since 2.9.0
52
  */
53
  public function get_report_args() {
54
- $current_time = wcj_get_timestamp_date_from_gmt();
55
- $wpnonce = isset( $_REQUEST['booster_products_sales_daily_filter-nonce'] ) ? wp_verify_nonce( sanitize_key( $_REQUEST['booster_products_sales_daily_filter-nonce'] ), 'booster_products_sales_daily_filter' ) : false;
 
 
 
 
56
  $this->start_date = $wpnonce && isset( $_GET['start_date'] ) ? sanitize_text_field( wp_unslash( $_GET['start_date'] ) ) : gmdate( 'Y-m-d', strtotime( '-7 days', $current_time ) );
57
- $this->end_date = isset( $_GET['end_date'] ) ? sanitize_text_field( wp_unslash( $_GET['end_date'] ) ) : gmdate( 'Y-m-d', $current_time );
58
  $this->product_title = isset( $_GET['product_title'] ) ? sanitize_text_field( wp_unslash( $_GET['product_title'] ) ) : '';
59
  }
60
 
@@ -171,7 +175,7 @@ if ( ! class_exists( 'WCJ_Reports_Product_Sales_Daily' ) ) :
171
  /**
172
  * Output_report_header.
173
  *
174
- * @version 5.6.8
175
  * @since 2.9.0
176
  */
177
  public function output_report_header() {
@@ -179,9 +183,11 @@ if ( ! class_exists( 'WCJ_Reports_Product_Sales_Daily' ) ) :
179
  $settings_link = '<a href="' . admin_url( wcj_admin_tab_url() . '&wcj-cat=emails_and_misc&section=reports' ) . '">' .
180
  '<< ' . __( 'Reports Settings', 'woocommerce-jetpack' ) . '</a>';
181
  $menu = '';
182
- $menu .= '<ul class="subsubsub">';
183
  foreach ( array_merge( wcj_get_reports_standard_ranges(), wcj_get_reports_custom_ranges() ) as $custom_range ) {
184
- $menu .= '<li><a ' .
 
 
185
  'href="' . esc_url(
186
  add_query_arg(
187
  array(
@@ -191,34 +197,30 @@ if ( ! class_exists( 'WCJ_Reports_Product_Sales_Daily' ) ) :
191
  )
192
  ) . '" ' .
193
  'class="' . ( ( $this->start_date === $custom_range['start_date'] && $this->end_date === $custom_range['end_date'] ) ? 'current' : '' ) . '"' .
194
- '>' . $custom_range['title'] . '</a> | </li>';
195
  }
196
- $menu .= '</ul>';
197
- $menu .= '<br class="clear">';
198
  // Product and date filter form.
199
  // phpcs:disable WordPress.Security.NonceVerification
200
  $pages = isset( $_GET['page'] ) ? sanitize_text_field( wp_unslash( $_GET['page'] ) ) : '';
201
  $tabs = isset( $_GET['tab'] ) ? sanitize_text_field( wp_unslash( $_GET['tab'] ) ) : '';
202
  $reports = isset( $_GET['report'] ) ? sanitize_text_field( wp_unslash( $_GET['report'] ) ) : '';
203
  // phpcs:enable WordPress.Security.NonceVerification
204
- $filter_form = '';
205
  $filter_form .= '<form method="get" action="">';
206
  $filter_form .= '<input type="hidden" name="page" value="' . esc_attr( $pages ) . '" />';
207
  $filter_form .= '<input type="hidden" name="tab" value="' . esc_attr( $tabs ) . '" />';
208
  $filter_form .= '<input type="hidden" name="report" value="' . esc_attr( $reports ) . '" />';
209
- $filter_form .= '<label style="font-style:italic;" for="start_date">' . __( 'From:', 'woocommerce-jetpack' ) . '</label> ' .
210
- '<input type="text" display="date" dateformat="' . wcj_date_format_php_to_js( 'Y-m-d' ) . '" name="start_date" title="" value="' . $this->start_date . '" />';
211
- $filter_form .= ' ';
212
- $filter_form .= '<label style="font-style:italic;" for="end_date">' . __( 'To:', 'woocommerce-jetpack' ) . '</label> ' .
213
- '<input type="text" display="date" dateformat="' . wcj_date_format_php_to_js( 'Y-m-d' ) . '" name="end_date" title="" value="' . $this->end_date . '" />';
214
- $filter_form .= ' ';
215
- $filter_form .= '<label style="font-style:italic;" for="product_title">' . __( 'Product:', 'woocommerce-jetpack' ) . '</label> ' .
216
- '<input type="text" name="product_title" id="product_title" title="" value="' . $this->product_title . '" />';
217
  $filter_form .= wp_nonce_field( 'booster_products_sales_daily_filter', 'booster_products_sales_daily_filter-nonce' );
218
- $filter_form .= '<input type="submit" value="' . __( 'Filter', 'woocommerce-jetpack' ) . '" />';
219
  $filter_form .= '</form>';
 
220
  // Final result.
221
- return '<p>' . $settings_link . '</p> <p>' . $menu . '</p> <p>' . $filter_form . '</p>';
222
  }
223
 
224
  /**
@@ -328,13 +330,13 @@ if ( ! class_exists( 'WCJ_Reports_Product_Sales_Daily' ) ) :
328
  $table_data,
329
  array(
330
  'table_class' => 'widefat striped',
331
- 'table_heading_type' => 'none',
332
  )
333
  ) .
334
  /* translators: %d: translation added */
335
  '<p><em>' . sprintf( __( 'Total orders: %d', 'woocommerce-jetpack' ), $this->total_orders ) . '</em></p>' :
336
  '<p><em>' . __( 'No sales data for current period.', 'woocommerce-jetpack' ) . '</em></p>';
337
- return $result;
338
  }
339
  }
340
 
2
  /**
3
  * Booster for WooCommerce - Reports - Product Sales (Daily)
4
  *
5
+ * @version 6.0.0
6
  * @since 2.9.0
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/includes
47
  /**
48
  * Get_report_args.
49
  *
50
+ * @version 6.0.0
51
  * @since 2.9.0
52
  */
53
  public function get_report_args() {
54
+ $current_time = wcj_get_timestamp_date_from_gmt();
55
+ if ( isset( $_REQUEST['filter_submit'] ) ) {
56
+ $wpnonce = isset( $_REQUEST['booster_products_sales_daily_filter-nonce'] ) ? wp_verify_nonce( sanitize_key( $_REQUEST['booster_products_sales_daily_filter-nonce'] ), 'booster_products_sales_daily_filter' ) : false;
57
+ } else {
58
+ $wpnonce = true;
59
+ }
60
  $this->start_date = $wpnonce && isset( $_GET['start_date'] ) ? sanitize_text_field( wp_unslash( $_GET['start_date'] ) ) : gmdate( 'Y-m-d', strtotime( '-7 days', $current_time ) );
61
+ $this->end_date = $wpnonce && isset( $_GET['end_date'] ) ? sanitize_text_field( wp_unslash( $_GET['end_date'] ) ) : gmdate( 'Y-m-d', $current_time );
62
  $this->product_title = isset( $_GET['product_title'] ) ? sanitize_text_field( wp_unslash( $_GET['product_title'] ) ) : '';
63
  }
64
 
175
  /**
176
  * Output_report_header.
177
  *
178
+ * @version 6.0.0
179
  * @since 2.9.0
180
  */
181
  public function output_report_header() {
183
  $settings_link = '<a href="' . admin_url( wcj_admin_tab_url() . '&wcj-cat=emails_and_misc&section=reports' ) . '">' .
184
  '<< ' . __( 'Reports Settings', 'woocommerce-jetpack' ) . '</a>';
185
  $menu = '';
186
+ $menu .= '<div id="poststuff" class="wcj-reports-wide woocommerce-reports-wide"><div class="postbox"><div class="stats_range"><ul class="">';
187
  foreach ( array_merge( wcj_get_reports_standard_ranges(), wcj_get_reports_custom_ranges() ) as $custom_range ) {
188
+ $is_active = $this->start_date === $custom_range['start_date'] && $this->end_date === $custom_range['end_date'] ? 'active' : '';
189
+
190
+ $menu .= '<li class="' . $is_active . '"><a ' .
191
  'href="' . esc_url(
192
  add_query_arg(
193
  array(
197
  )
198
  ) . '" ' .
199
  'class="' . ( ( $this->start_date === $custom_range['start_date'] && $this->end_date === $custom_range['end_date'] ) ? 'current' : '' ) . '"' .
200
+ '>' . $custom_range['title'] . '</a></li>';
201
  }
202
+
 
203
  // Product and date filter form.
204
  // phpcs:disable WordPress.Security.NonceVerification
205
  $pages = isset( $_GET['page'] ) ? sanitize_text_field( wp_unslash( $_GET['page'] ) ) : '';
206
  $tabs = isset( $_GET['tab'] ) ? sanitize_text_field( wp_unslash( $_GET['tab'] ) ) : '';
207
  $reports = isset( $_GET['report'] ) ? sanitize_text_field( wp_unslash( $_GET['report'] ) ) : '';
208
  // phpcs:enable WordPress.Security.NonceVerification
209
+ $filter_form = '<li class="custom">Custom:';
210
  $filter_form .= '<form method="get" action="">';
211
  $filter_form .= '<input type="hidden" name="page" value="' . esc_attr( $pages ) . '" />';
212
  $filter_form .= '<input type="hidden" name="tab" value="' . esc_attr( $tabs ) . '" />';
213
  $filter_form .= '<input type="hidden" name="report" value="' . esc_attr( $reports ) . '" />';
214
+ $filter_form .= '<input type="hidden" name="filter_submit" value="filter_submit" />';
215
+ $filter_form .= '<input class="range_datepicker" size="9" type="text" display="date" dateformat="' . wcj_date_format_php_to_js( 'Y-m-d' ) . '" name="start_date" title="" value="' . $this->start_date . '" />';
216
+ $filter_form .= '<input class="range_datepicker" size="9" type="text" display="date" dateformat="' . wcj_date_format_php_to_js( 'Y-m-d' ) . '" name="end_date" title="" value="' . $this->end_date . '" />';
217
+ $filter_form .= '<input class="search_product" placeholder="Search product..." size="9" type="text" name="product_title" id="product_title" title="" value="' . $this->product_title . '" />';
 
 
 
 
218
  $filter_form .= wp_nonce_field( 'booster_products_sales_daily_filter', 'booster_products_sales_daily_filter-nonce' );
219
+ $filter_form .= '<input type="submit" class="button" value="' . __( 'Filter', 'woocommerce-jetpack' ) . '" />';
220
  $filter_form .= '</form>';
221
+ $filter_form .= '</li></ul><br class="clear">';
222
  // Final result.
223
+ return '<p>' . $settings_link . '</p> ' . $menu . $filter_form;
224
  }
225
 
226
  /**
330
  $table_data,
331
  array(
332
  'table_class' => 'widefat striped',
333
+ 'table_heading_type' => 'horizontal',
334
  )
335
  ) .
336
  /* translators: %d: translation added */
337
  '<p><em>' . sprintf( __( 'Total orders: %d', 'woocommerce-jetpack' ), $this->total_orders ) . '</em></p>' :
338
  '<p><em>' . __( 'No sales data for current period.', 'woocommerce-jetpack' ) . '</em></p>';
339
+ return '<div class="inside">' . $result . '</div></div></div></div>';
340
  }
341
  }
342
 
includes/reports/class-wcj-reports-sales-gateways.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Reports - Product Sales - Gateways
4
  *
5
- * @version 5.6.8
6
  * @since 3.6.0
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/includes
@@ -47,11 +47,15 @@ if ( ! class_exists( 'WCJ_Reports_Sales_Gateways' ) ) :
47
  /**
48
  * Get_report_args.
49
  *
50
- * @version 5.6.2
51
  * @since 3.6.0
52
  */
53
  public function get_report_args() {
54
- $wpnonce = isset( $_REQUEST['wcj-reports-sales-gateways-nonce'] ) ? wp_verify_nonce( sanitize_key( $_REQUEST['wcj-reports-sales-gateways-nonce'] ), 'wcj-reports-sales-gateways' ) : false;
 
 
 
 
55
  $current_time = wcj_get_timestamp_date_from_gmt();
56
  $this->start_date = $wpnonce && isset( $_GET['start_date'] ) ? sanitize_text_field( wp_unslash( $_GET['start_date'] ) ) : gmdate( 'Y-m-d', strtotime( '-7 days', $current_time ) );
57
  $this->end_date = $wpnonce && isset( $_GET['end_date'] ) ? sanitize_text_field( wp_unslash( $_GET['end_date'] ) ) : gmdate( 'Y-m-d', $current_time );
@@ -116,7 +120,7 @@ if ( ! class_exists( 'WCJ_Reports_Sales_Gateways' ) ) :
116
  /**
117
  * Output_report_header.
118
  *
119
- * @version 5.6.2
120
  * @since 3.6.0
121
  */
122
  public function output_report_header() {
@@ -124,9 +128,11 @@ if ( ! class_exists( 'WCJ_Reports_Sales_Gateways' ) ) :
124
  $settings_link = '<a href="' . admin_url( wcj_admin_tab_url() . '&wcj-cat=emails_and_misc&section=reports' ) . '">' .
125
  '<< ' . __( 'Reports Settings', 'woocommerce-jetpack' ) . '</a>';
126
  $menu = '';
127
- $menu .= '<ul class="subsubsub">';
128
  foreach ( array_merge( wcj_get_reports_standard_ranges(), wcj_get_reports_custom_ranges() ) as $custom_range ) {
129
- $menu .= '<li><a ' .
 
 
130
  'href="' . esc_url(
131
  add_query_arg(
132
  array(
@@ -136,10 +142,8 @@ if ( ! class_exists( 'WCJ_Reports_Sales_Gateways' ) ) :
136
  )
137
  ) . '" ' .
138
  'class="' . ( ( $this->start_date === $custom_range['start_date'] && $this->end_date === $custom_range['end_date'] ) ? 'current' : '' ) . '"' .
139
- '>' . $custom_range['title'] . '</a> | </li>';
140
  }
141
- $menu .= '</ul>';
142
- $menu .= '<br class="clear">';
143
  // phpcs:disable WordPress.Security.NonceVerification
144
  $page = isset( $_GET['page'] ) ? sanitize_text_field( wp_unslash( $_GET['page'] ) ) : '';
145
  $tab = isset( $_GET['tab'] ) ? sanitize_text_field( wp_unslash( $_GET['tab'] ) ) : '';
@@ -147,28 +151,25 @@ if ( ! class_exists( 'WCJ_Reports_Sales_Gateways' ) ) :
147
  // phpcs:enable WordPress.Security.NonceVerification
148
 
149
  // Date filter form.
150
- $filter_form = '';
151
  $filter_form .= '<form method="get" action="">';
152
  $filter_form .= '<input type="hidden" name="page" value="' . esc_attr( $page ) . '" />';
153
  $filter_form .= '<input type="hidden" name="tab" value="' . esc_attr( $tab ) . '" />';
154
  $filter_form .= '<input type="hidden" name="report" value="' . esc_attr( $report ) . '" />';
155
- $filter_form .= '<label style="font-style:italic;" for="start_date">' . __( 'From:', 'woocommerce-jetpack' ) . '</label> ' .
156
- '<input type="text" display="date" dateformat="' . wcj_date_format_php_to_js( 'Y-m-d' ) . '" name="start_date" title="" value="' . $this->start_date . '" />';
157
- $filter_form .= ' ';
158
- $filter_form .= '<label style="font-style:italic;" for="end_date">' . __( 'To:', 'woocommerce-jetpack' ) . '</label>' .
159
- '<input type="text" display="date" dateformat="' . wcj_date_format_php_to_js( 'Y-m-d' ) . '" name="end_date" title="" value="' . $this->end_date . '" />';
160
- $filter_form .= ' ';
161
  $filter_form .= '<input type="hidden" name="wcj-reports-sales-gateways-nonce" value="' . wp_create_nonce( 'wcj-reports-sales-gateways' ) . '" />';
162
- $filter_form .= '<input type="submit" value="' . __( 'Filter', 'woocommerce-jetpack' ) . '" />';
163
  $filter_form .= '</form>';
 
164
  // Final result.
165
- return '<p>' . $settings_link . '</p> <p>' . $menu . '</p> <p>' . $filter_form . '</p>';
166
  }
167
 
168
  /**
169
  * Output_report_results.
170
  *
171
- * @version 3.6.0
172
  * @since 3.6.0
173
  */
174
  public function output_report_results() {
@@ -185,7 +186,7 @@ if ( ! class_exists( 'WCJ_Reports_Sales_Gateways' ) ) :
185
  $table_data,
186
  array(
187
  'table_class' => 'widefat striped',
188
- 'table_heading_type' => 'none',
189
  )
190
  ) .
191
  /* translators: %d: translation added */
@@ -193,7 +194,7 @@ if ( ! class_exists( 'WCJ_Reports_Sales_Gateways' ) ) :
193
  } else {
194
  $result = '<p><em>' . __( 'No sales data for current period.', 'woocommerce-jetpack' ) . '</em></p>';
195
  }
196
- return $result;
197
  }
198
  }
199
 
2
  /**
3
  * Booster for WooCommerce - Reports - Product Sales - Gateways
4
  *
5
+ * @version 6.0.0
6
  * @since 3.6.0
7
  * @author Pluggabl LLC.
8
  * @package Booster_For_WooCommerce/includes
47
  /**
48
  * Get_report_args.
49
  *
50
+ * @version 6.0.0
51
  * @since 3.6.0
52
  */
53
  public function get_report_args() {
54
+ if ( isset( $_REQUEST['filter_submit'] ) ) {
55
+ $wpnonce = isset( $_REQUEST['wcj-reports-sales-gateways-nonce'] ) ? wp_verify_nonce( sanitize_key( $_REQUEST['wcj-reports-sales-gateways-nonce'] ), 'wcj-reports-sales-gateways' ) : false;
56
+ } else {
57
+ $wpnonce = true;
58
+ }
59
  $current_time = wcj_get_timestamp_date_from_gmt();
60
  $this->start_date = $wpnonce && isset( $_GET['start_date'] ) ? sanitize_text_field( wp_unslash( $_GET['start_date'] ) ) : gmdate( 'Y-m-d', strtotime( '-7 days', $current_time ) );
61
  $this->end_date = $wpnonce && isset( $_GET['end_date'] ) ? sanitize_text_field( wp_unslash( $_GET['end_date'] ) ) : gmdate( 'Y-m-d', $current_time );
120
  /**
121
  * Output_report_header.
122
  *
123
+ * @version 6.0.0
124
  * @since 3.6.0
125
  */
126
  public function output_report_header() {
128
  $settings_link = '<a href="' . admin_url( wcj_admin_tab_url() . '&wcj-cat=emails_and_misc&section=reports' ) . '">' .
129
  '<< ' . __( 'Reports Settings', 'woocommerce-jetpack' ) . '</a>';
130
  $menu = '';
131
+ $menu .= '<div id="poststuff" class="wcj-reports-wide woocommerce-reports-wide"><div class="postbox"><div class="stats_range"><ul class="">';
132
  foreach ( array_merge( wcj_get_reports_standard_ranges(), wcj_get_reports_custom_ranges() ) as $custom_range ) {
133
+ $is_active = $this->start_date === $custom_range['start_date'] && $this->end_date === $custom_range['end_date'] ? 'active' : '';
134
+
135
+ $menu .= '<li class="' . $is_active . '"><a ' .
136
  'href="' . esc_url(
137
  add_query_arg(
138
  array(
142
  )
143
  ) . '" ' .
144
  'class="' . ( ( $this->start_date === $custom_range['start_date'] && $this->end_date === $custom_range['end_date'] ) ? 'current' : '' ) . '"' .
145
+ '>' . $custom_range['title'] . '</a></li>';
146
  }
 
 
147
  // phpcs:disable WordPress.Security.NonceVerification
148
  $page = isset( $_GET['page'] ) ? sanitize_text_field( wp_unslash( $_GET['page'] ) ) : '';
149
  $tab = isset( $_GET['tab'] ) ? sanitize_text_field( wp_unslash( $_GET['tab'] ) ) : '';
151
  // phpcs:enable WordPress.Security.NonceVerification
152
 
153
  // Date filter form.
154
+ $filter_form = '<li class="custom">Custom:';
155
  $filter_form .= '<form method="get" action="">';
156
  $filter_form .= '<input type="hidden" name="page" value="' . esc_attr( $page ) . '" />';
157
  $filter_form .= '<input type="hidden" name="tab" value="' . esc_attr( $tab ) . '" />';
158
  $filter_form .= '<input type="hidden" name="report" value="' . esc_attr( $report ) . '" />';
159
+ $filter_form .= '<input class="range_datepicker" size="9" type="text" display="date" dateformat="' . wcj_date_format_php_to_js( 'Y-m-d' ) . '" name="start_date" title="" value="' . $this->start_date . '" />';
160
+ $filter_form .= '<input class="range_datepicker" size="9" type="text" display="date" dateformat="' . wcj_date_format_php_to_js( 'Y-m-d' ) . '" name="end_date" title="" value="' . $this->end_date . '" />';
 
 
 
 
161
  $filter_form .= '<input type="hidden" name="wcj-reports-sales-gateways-nonce" value="' . wp_create_nonce( 'wcj-reports-sales-gateways' ) . '" />';
162
+ $filter_form .= '<input type="submit" class="button" value="' . __( 'Filter', 'woocommerce-jetpack' ) . '" />';
163
  $filter_form .= '</form>';
164
+ $filter_form .= '</li></ul><br class="clear">';
165
  // Final result.
166
+ return '<p>' . $settings_link . '</p> ' . $menu . $filter_form;
167
  }
168
 
169
  /**
170
  * Output_report_results.
171
  *
172
+ * @version 6.0.0
173
  * @since 3.6.0
174
  */
175
  public function output_report_results() {
186
  $table_data,
187
  array(
188
  'table_class' => 'widefat striped',
189
+ 'table_heading_type' => 'horizontal',
190
  )
191
  ) .
192
  /* translators: %d: translation added */
194
  } else {
195
  $result = '<p><em>' . __( 'No sales data for current period.', 'woocommerce-jetpack' ) . '</em></p>';
196
  }
197
+ return '<div class="inside">' . $result . '</div></div></div></div>';
198
  }
199
  }
200
 
includes/reports/class-wcj-reports-sales.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Reports - Sales
4
  *
5
- * @version 5.6.8
6
  * @author Pluggabl LLC.
7
  * @package Booster_For_WooCommerce/includes
8
  */
@@ -80,7 +80,7 @@ if ( ! class_exists( 'WCJ_Reports_Sales' ) ) :
80
  /**
81
  * Get_products_sales.
82
  *
83
- * @version 5.6.8
84
  * @since 2.3.0
85
  * @todo fix when variable and variations are all (wrongfully) counted in total sums
86
  * @todo display more info for "Parent product deleted" and "Product deleted"
@@ -365,15 +365,11 @@ if ( ! class_exists( 'WCJ_Reports_Sales' ) ) :
365
  '<< ' . __( 'Reports Settings', 'woocommerce-jetpack' ) . '</a>';
366
 
367
  $menu = '';
368
- $menu .= '<ul class="subsubsub">';
369
- $menu .= '<li><a href="' . esc_url( add_query_arg( 'year', gmdate( 'Y' ) ) ) . '" class="' .
370
- ( ( gmdate( 'Y' ) === $this->year ) ? 'current' : '' ) . '">' . gmdate( 'Y' ) . '</a> | </li>';
371
- $menu .= '<li><a href="' . esc_url( add_query_arg( 'year', ( gmdate( 'Y' ) - 1 ) ) ) . '" class="' .
372
- ( ( (string) ( gmdate( 'Y' ) - 1 ) === $this->year ) ? 'current' : '' ) . '">' . ( gmdate( 'Y' ) - 1 ) . '</a> | </li>';
373
- $menu .= '<li><a href="' . esc_url( add_query_arg( 'year', ( gmdate( 'Y' ) - 2 ) ) ) . '" class="' .
374
- ( ( (string) ( gmdate( 'Y' ) - 2 ) === $this->year ) ? 'current' : '' ) . '">' . ( gmdate( 'Y' ) - 2 ) . '</a></li>';
375
- $menu .= '</ul>';
376
- $menu .= '<br class="clear">';
377
 
378
  // phpcs:disable WordPress.Security.NonceVerification
379
  $page = isset( $_GET['page'] ) ? sanitize_text_field( wp_unslash( $_GET['page'] ) ) : '';
@@ -381,21 +377,22 @@ if ( ! class_exists( 'WCJ_Reports_Sales' ) ) :
381
  $report = isset( $_GET['report'] ) ? sanitize_text_field( wp_unslash( $_GET['report'] ) ) : '';
382
  // phpcs:enable WordPress.Security.NonceVerification
383
 
384
- $filter_form = '';
385
  $filter_form .= '<form method="get" action="">';
386
  $filter_form .= '<input type="hidden" name="page" value="' . esc_attr( $page ) . '" />';
387
  $filter_form .= '<input type="hidden" name="tab" value="' . esc_attr( $tab ) . '" />';
388
  $filter_form .= '<input type="hidden" name="report" value="' . esc_attr( $report ) . '" />';
389
  $filter_form .= '<input type="hidden" name="year" value="' . $this->year . '" />';
390
- $filter_form .= '<input type="text" name="product_title" title="" value="' . $this->product_title . '" />' .
391
- '<input type="submit" value="' . __( 'Filter products', 'woocommerce-jetpack' ) . '" />';
392
  $filter_form .= '</form>';
 
393
 
394
  $the_results = ( ! empty( $products_data ) ) ?
395
  wcj_get_table_html( $table_data, array( 'table_class' => 'widefat striped' ) ) :
396
  '<p><em>' . __( 'No sales data for current period.' ) . '</em></p>';
397
 
398
- return '<p>' . $settings_link . '</p> <p>' . $menu . '</p> <p>' . $filter_form . '</p>' . $the_results;
399
  }
400
  }
401
 
2
  /**
3
  * Booster for WooCommerce - Reports - Sales
4
  *
5
+ * @version 6.0.0
6
  * @author Pluggabl LLC.
7
  * @package Booster_For_WooCommerce/includes
8
  */
80
  /**
81
  * Get_products_sales.
82
  *
83
+ * @version 6.0.0
84
  * @since 2.3.0
85
  * @todo fix when variable and variations are all (wrongfully) counted in total sums
86
  * @todo display more info for "Parent product deleted" and "Product deleted"
365
  '<< ' . __( 'Reports Settings', 'woocommerce-jetpack' ) . '</a>';
366
 
367
  $menu = '';
368
+ $menu .= '<div id="poststuff" class="wcj-reports-wide woocommerce-reports-wide"><div class="postbox"><div class="stats_range"><ul class="">';
369
+
370
+ $menu .= '<li class="' . ( ( gmdate( 'Y' ) === $this->year ) ? 'active' : '' ) . '"><a href="' . esc_url( add_query_arg( 'year', gmdate( 'Y' ) ) ) . '" >' . gmdate( 'Y' ) . '</a></li>';
371
+ $menu .= '<li class="' . ( ( (string) ( gmdate( 'Y' ) - 1 ) ) === ( $this->year ) ? 'active' : '' ) . '"><a href="' . esc_url( add_query_arg( 'year', ( gmdate( 'Y' ) - 1 ) ) ) . '">' . ( gmdate( 'Y' ) - 1 ) . '</a></li>';
372
+ $menu .= '<li class="' . ( ( (string) ( gmdate( 'Y' ) - 2 ) ) === ( $this->year ) ? 'active' : '' ) . '"><a href="' . esc_url( add_query_arg( 'year', ( gmdate( 'Y' ) - 2 ) ) ) . '">' . ( gmdate( 'Y' ) - 2 ) . '</a></li>';
 
 
 
 
373
 
374
  // phpcs:disable WordPress.Security.NonceVerification
375
  $page = isset( $_GET['page'] ) ? sanitize_text_field( wp_unslash( $_GET['page'] ) ) : '';
377
  $report = isset( $_GET['report'] ) ? sanitize_text_field( wp_unslash( $_GET['report'] ) ) : '';
378
  // phpcs:enable WordPress.Security.NonceVerification
379
 
380
+ $filter_form = '<li class="custom">';
381
  $filter_form .= '<form method="get" action="">';
382
  $filter_form .= '<input type="hidden" name="page" value="' . esc_attr( $page ) . '" />';
383
  $filter_form .= '<input type="hidden" name="tab" value="' . esc_attr( $tab ) . '" />';
384
  $filter_form .= '<input type="hidden" name="report" value="' . esc_attr( $report ) . '" />';
385
  $filter_form .= '<input type="hidden" name="year" value="' . $this->year . '" />';
386
+ $filter_form .= '<input class="search_product" placeholder="Search product..." size="14" type="text" name="product_title" title="" value="' . $this->product_title . '" />' .
387
+ '<input class="button" type="submit" value="' . __( 'Filter products', 'woocommerce-jetpack' ) . '" />';
388
  $filter_form .= '</form>';
389
+ $filter_form .= '</li></ul><br class="clear">';
390
 
391
  $the_results = ( ! empty( $products_data ) ) ?
392
  wcj_get_table_html( $table_data, array( 'table_class' => 'widefat striped' ) ) :
393
  '<p><em>' . __( 'No sales data for current period.' ) . '</em></p>';
394
 
395
+ return '<p>' . $settings_link . '</p> ' . $menu . $filter_form . '<div class="inside">' . $the_results . '</div></div></div></div>';
396
  }
397
  }
398
 
includes/reports/class-wcj-reports-stock.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Reports - Stock
4
  *
5
- * @version 5.6.8
6
  * @author Pluggabl LLC.
7
  * @package Booster_For_WooCommerce/includes
8
  */
@@ -77,20 +77,20 @@ if ( ! class_exists( 'WCJ_Reports_Stock' ) ) :
77
 
78
  /**
79
  * Get_submenu_html.
 
 
80
  */
81
  public function get_submenu_html() {
82
  $html = '';
83
- $html .= '<ul class="subsubsub">';
84
  foreach ( $this->ranges_in_days as $the_period ) {
85
- $html .= '<li>';
86
- $html .= ( $the_period === $this->range_days ) ? '<strong>' : '';
 
87
  $html .= '<a href="' . get_admin_url() . 'admin.php?page=wc-reports&tab=stock&report=' . $this->report_id . '&period=' . $the_period . '" class="">' . $the_period . ' days</a>';
88
- $html .= ( $the_period === $this->range_days ) ? '</strong>' : '';
89
- $html .= ' | ';
90
  $html .= '</li>';
91
  }
92
  $html .= '</ul>';
93
- $html .= '<br class="clear">';
94
  return $html;
95
  }
96
 
@@ -270,7 +270,7 @@ if ( ! class_exists( 'WCJ_Reports_Stock' ) ) :
270
  /**
271
  * Get_report_html.
272
  *
273
- * @version 5.6.8
274
  */
275
  public function get_report_html() {
276
  $products_info = $this->data_products;
@@ -280,11 +280,11 @@ if ( ! class_exists( 'WCJ_Reports_Stock' ) ) :
280
  // Style.
281
  $html .= '<style>';
282
  $html .= '.wcj_report_table_sales_columns { background-color: #F6F6F6; }';
283
- $html .= '.widefat { width: 90%; }';
284
  $html .= '</style>';
285
  // Products table - header.
286
- $html .= '<table class="widefat"><tbody>';
287
- $html .= '<tr>';
288
  $html .= '<th>#</th>';
289
  $html .= '<th>' . __( 'Product', 'woocommerce-jetpack' ) . '</th>';
290
  $html .= '<th>' . __( 'Category', 'woocommerce-jetpack' ) . '</th>';
@@ -356,19 +356,23 @@ if ( ! class_exists( 'WCJ_Reports_Stock' ) ) :
356
  $html .= '</tr>';
357
  }
358
  }
359
- $html .= '</tbody></table>';
360
- $html_header = '<h4>' . $report_info['title'] . ': ' . $report_info['desc'] . '</h4>';
361
- $html_header .= '<table class="widefat" style="width:30% !important;"><tbody>';
362
- $html_header .= '<tr> <th>' . __( 'Total current stock value', 'woocommerce-jetpack' ) . '</th> <td>' . wc_price( $total_current_stock_price ) . '</td> </tr>';
363
- $html_header .= '<tr> <th>' . __( 'Total stock value', 'woocommerce-jetpack' ) . '</th> <td>' . wc_price( $info['total_stock_price'] ) . '</td> </tr>';
364
- $html_header .= '<tr> <th>' . __( 'Product stock value average', 'woocommerce-jetpack' ) . '</th> <td>' . wc_price( $info['stock_price_average'] ) . '</td> </tr>';
365
- $html_header .= '<tr> <th>' . __( 'Product stock average', 'woocommerce-jetpack' ) . '</th> <td>' . number_format( $info['stock_average'], 2, '.', '' ) . '</td> </tr>';
 
 
 
366
  if ( 0 !== $total_current_stock_purchase_price ) {
367
- $html_header .= '<tr> <th>' . __( 'Total current stock purchase price', 'woocommerce-jetpack' ) . '</th> <td>' . wc_price( $total_current_stock_purchase_price ) . '</td> </tr>';
368
  }
369
  $html_header .= '</tbody></table>';
370
- $html_header .= '<br class="clear">';
371
  $time_elapsed_html = '<p><em>' . __( 'Report was generated in: ', 'woocommerce-jetpack' ) . intval( microtime( true ) - $this->start_time ) . ' s </em></p>';
 
372
  return $this->get_submenu_html() . $html_header . $html . $time_elapsed_html;
373
  }
374
  }
2
  /**
3
  * Booster for WooCommerce - Reports - Stock
4
  *
5
+ * @version 6.0.0
6
  * @author Pluggabl LLC.
7
  * @package Booster_For_WooCommerce/includes
8
  */
77
 
78
  /**
79
  * Get_submenu_html.
80
+ *
81
+ * @version 6.0.0
82
  */
83
  public function get_submenu_html() {
84
  $html = '';
85
+ $html .= '<div id="poststuff" class="wcj-reports-wide woocommerce-reports-wide"><div class="postbox"><div class="stats_range"><ul class="">';
86
  foreach ( $this->ranges_in_days as $the_period ) {
87
+ $is_active = (string) $the_period === $this->range_days ? 'active' : '';
88
+
89
+ $html .= '<li class="' . $is_active . '">';
90
  $html .= '<a href="' . get_admin_url() . 'admin.php?page=wc-reports&tab=stock&report=' . $this->report_id . '&period=' . $the_period . '" class="">' . $the_period . ' days</a>';
 
 
91
  $html .= '</li>';
92
  }
93
  $html .= '</ul>';
 
94
  return $html;
95
  }
96
 
270
  /**
271
  * Get_report_html.
272
  *
273
+ * @version 6.0.0
274
  */
275
  public function get_report_html() {
276
  $products_info = $this->data_products;
280
  // Style.
281
  $html .= '<style>';
282
  $html .= '.wcj_report_table_sales_columns { background-color: #F6F6F6; }';
283
+ $html .= '.widefat { width: 100%; }';
284
  $html .= '</style>';
285
  // Products table - header.
286
+ $html .= '<div class="main"><table class="widefat striped" style="clear:inherit"><tbody>';
287
+ $html .= '<tr class="wcj-row">';
288
  $html .= '<th>#</th>';
289
  $html .= '<th>' . __( 'Product', 'woocommerce-jetpack' ) . '</th>';
290
  $html .= '<th>' . __( 'Category', 'woocommerce-jetpack' ) . '</th>';
356
  $html .= '</tr>';
357
  }
358
  }
359
+ if ( $product_counter <= 0 ) {
360
+ $html .= '<tr class="wcj-row"> <td colspan="10"> ' . __( 'Product not available', 'woocommerce-jetpack' ) . '</td> </tr>';
361
+ }
362
+ $html .= '</tbody></table></div>';
363
+ $html_header = '<div class="inside"><h4>' . $report_info['title'] . ': ' . $report_info['desc'] . '</h4></div>';
364
+ $html_header .= '<div class="inside chart-with-sidebar"><div class="chart-sidebar"><table class="widefat striped" style="clear:inherit"><tbody>';
365
+ $html_header .= '<tr class="wcj-row"> <th>' . wc_price( $total_current_stock_price ) . '<br class="clear"><span style="font-weight: 400;">' . __( 'Total current stock value', 'woocommerce-jetpack' ) . '</span></th> </tr>';
366
+ $html_header .= '<tr class="wcj-row"> <th>' . wc_price( $info['total_stock_price'] ) . '<br class="clear"><span style="font-weight: 400;">' . __( 'Total stock value', 'woocommerce-jetpack' ) . '</span></th> </tr>';
367
+ $html_header .= '<tr class="wcj-row"> <th>' . wc_price( $info['stock_price_average'] ) . '<br class="clear"><span style="font-weight: 400;">' . __( 'Product stock value average', 'woocommerce-jetpack' ) . '</span></th> </tr>';
368
+ $html_header .= '<tr class="wcj-row"> <th><span class="woocommerce-Price-amount amount" >' . number_format( $info['stock_average'], 2, '.', '' ) . '</span><br class="clear"><span style="font-weight: 400;">' . __( 'Product stock average', 'woocommerce-jetpack' ) . '</span></th> </tr>';
369
  if ( 0 !== $total_current_stock_purchase_price ) {
370
+ $html_header .= '<tr class="wcj-row"> <th>' . wc_price( $total_current_stock_purchase_price ) . '<br class="clear"><span style="font-weight: 400;">' . __( 'Total current stock purchase price', 'woocommerce-jetpack' ) . '</span></th> </tr>';
371
  }
372
  $html_header .= '</tbody></table>';
373
+ $html_header .= '</div>';
374
  $time_elapsed_html = '<p><em>' . __( 'Report was generated in: ', 'woocommerce-jetpack' ) . intval( microtime( true ) - $this->start_time ) . ' s </em></p>';
375
+ $time_elapsed_html = '</div>';
376
  return $this->get_submenu_html() . $html_header . $html . $time_elapsed_html;
377
  }
378
  }
includes/settings/wcj-settings-currency-exchange-rates.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Settings - Currency Exchange Rates
4
  *
5
- * @version 5.6.0
6
  * @since 2.8.0
7
  * @author Pluggabl LLC.
8
  * @todo add "rounding" and "fixed offset" options for each pair separately (and option to enable/disable these per pair extra settings)
@@ -95,14 +95,6 @@ $settings = array(
95
  'default' => 'no',
96
  'type' => 'checkbox',
97
  ),
98
- array(
99
- 'title' => __( 'Always Use cURL', 'woocommerce-jetpack' ),
100
- 'desc' => __( 'Enable', 'woocommerce-jetpack' ),
101
- 'desc_tip' => __( 'If for some reason currency exchange rates are not updating, try enabling this option.', 'woocommerce-jetpack' ),
102
- 'id' => 'wcj_currency_exchange_rates_always_curl',
103
- 'default' => 'no',
104
- 'type' => 'checkbox',
105
- ),
106
  array(
107
  'title' => __( 'Force Point as Decimal Separator', 'woocommerce-jetpack' ),
108
  'desc' => __( 'Enable', 'woocommerce-jetpack' ),
2
  /**
3
  * Booster for WooCommerce - Settings - Currency Exchange Rates
4
  *
5
+ * @version 6.0.0
6
  * @since 2.8.0
7
  * @author Pluggabl LLC.
8
  * @todo add "rounding" and "fixed offset" options for each pair separately (and option to enable/disable these per pair extra settings)
95
  'default' => 'no',
96
  'type' => 'checkbox',
97
  ),
 
 
 
 
 
 
 
 
98
  array(
99
  'title' => __( 'Force Point as Decimal Separator', 'woocommerce-jetpack' ),
100
  'desc' => __( 'Enable', 'woocommerce-jetpack' ),
includes/shortcodes/class-wcj-general-shortcodes.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Shortcodes - General
4
  *
5
- * @version 5.6.8
6
  * @author Pluggabl LLC.
7
  * @package Booster_For_WooCommerce/shortcodes
8
  */
@@ -121,7 +121,7 @@ if ( ! class_exists( 'WCJ_General_Shortcodes' ) ) :
121
  /**
122
  * Wcj_post_meta_sum.
123
  *
124
- * @version 5.6.2
125
  * @since 4.1.0
126
  * @param array $atts defined shortcode attributes.
127
  */
@@ -130,7 +130,7 @@ if ( ! class_exists( 'WCJ_General_Shortcodes' ) ) :
130
  return '';
131
  }
132
  global $wpdb;
133
- $sum = $wpdb->get_var( $wpdb->prepare( "SELECT sum(meta_value) FROM $wpdb->postmeta WHERE meta_key = %s", $atts['key'] ) ); // WPCS: db call ok and cache ok.
134
  return ( ! empty( $atts['offset'] ) ? $sum + $atts['offset'] : $sum );
135
  }
136
 
@@ -476,7 +476,7 @@ if ( ! class_exists( 'WCJ_General_Shortcodes' ) ) :
476
  /**
477
  * Wcj_selector.
478
  *
479
- * @version 5.6.8
480
  * @since 3.1.0
481
  * @todo add `default` attribute
482
  * @todo (maybe) add more selector types (e.g.: currency)
@@ -487,8 +487,9 @@ if ( ! class_exists( 'WCJ_General_Shortcodes' ) ) :
487
  $html = '';
488
  $options = '';
489
  $countries = apply_filters( 'booster_option', 'all', wcj_get_option( 'wcj_product_by_country_country_list_shortcode', 'all' ) );
490
- $selected_value = ( ( isset( $_REQUEST[ 'wcj_' . $atts['selector_type'] . '_selector' ] ) ) ? // phpcs:ignore WordPress.Security.NonceVerification
491
- sanitize_text_field( wp_unslash( $_REQUEST[ 'wcj_' . $atts['selector_type'] . '_selector' ] ) ) : // phpcs:ignore WordPress.Security.NonceVerification
 
492
  wcj_session_get( 'wcj_selected_' . $atts['selector_type'] )
493
  );
494
 
2
  /**
3
  * Booster for WooCommerce - Shortcodes - General
4
  *
5
+ * @version 6.0.0
6
  * @author Pluggabl LLC.
7
  * @package Booster_For_WooCommerce/shortcodes
8
  */
121
  /**
122
  * Wcj_post_meta_sum.
123
  *
124
+ * @version 6.0.0
125
  * @since 4.1.0
126
  * @param array $atts defined shortcode attributes.
127
  */
130
  return '';
131
  }
132
  global $wpdb;
133
+ $sum = $wpdb->get_var( $wpdb->prepare( "SELECT sum(meta_value) FROM $wpdb->postmeta WHERE meta_key = %s", $atts['key'] ) ); // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching
134
  return ( ! empty( $atts['offset'] ) ? $sum + $atts['offset'] : $sum );
135
  }
136
 
476
  /**
477
  * Wcj_selector.
478
  *
479
+ * @version 6.0.0
480
  * @since 3.1.0
481
  * @todo add `default` attribute
482
  * @todo (maybe) add more selector types (e.g.: currency)
487
  $html = '';
488
  $options = '';
489
  $countries = apply_filters( 'booster_option', 'all', wcj_get_option( 'wcj_product_by_country_country_list_shortcode', 'all' ) );
490
+ $wpnonce = isset( $_REQUEST[ 'wcj_' . $atts['selector_type'] . '_selector-nonce' ] ) ? wp_verify_nonce( sanitize_key( $_REQUEST[ 'wcj_' . $atts['selector_type'] . '_selector-nonce' ] ), 'wcj_' . $atts['selector_type'] . '_selector' ) : false;
491
+ $selected_value = ( ( $wpnonce && isset( $_REQUEST[ 'wcj_' . $atts['selector_type'] . '_selector' ] ) ) ?
492
+ sanitize_text_field( wp_unslash( $_REQUEST[ 'wcj_' . $atts['selector_type'] . '_selector' ] ) ) :
493
  wcj_session_get( 'wcj_selected_' . $atts['selector_type'] )
494
  );
495
 
includes/shortcodes/class-wcj-order-items-shortcodes.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Shortcodes - Order Items
4
  *
5
- * @version 5.6.7
6
  * @author Pluggabl LLC.
7
  * @package Booster_For_WooCommerce/shortcodes
8
  */
@@ -39,7 +39,7 @@ if ( ! class_exists( 'WCJ_Order_Items_Shortcodes' ) ) :
39
 
40
  $modified_atts = array_merge(
41
  array(
42
- 'order_id' => ( isset( $_GET['order_id'] ) ) ? sanitize_text_field( wp_unslash( $_GET['order_id'] ) ) : get_the_ID(), // phpcs:ignore WordPress.Security.NonceVerification
43
  'hide_currency' => 'no',
44
  'table_class' => '',
45
  'shipping_as_item' => '', // e.g.: 'Shipping'.
@@ -145,7 +145,14 @@ if ( ! class_exists( 'WCJ_Order_Items_Shortcodes' ) ) :
145
  if ( empty( $new_item_args ) ) {
146
  return $items;
147
  }
148
- extract( $new_item_args ); // phpcs:ignore
 
 
 
 
 
 
 
149
  // Create item.
150
  if ( WCJ_IS_WC_VERSION_BELOW_3 ) {
151
  $item = array(
@@ -264,14 +271,16 @@ if ( ! class_exists( 'WCJ_Order_Items_Shortcodes' ) ) :
264
  }
265
 
266
  // Get attribute data.
 
267
  if ( taxonomy_exists( wc_sanitize_taxonomy_name( $meta['meta_key'] ) ) ) {
268
  $term = get_term_by( 'slug', $meta['meta_value'], wc_sanitize_taxonomy_name( $meta['meta_key'] ) );
269
- $meta['meta_key'] = wc_attribute_label( wc_sanitize_taxonomy_name( $meta['meta_key'] ) ); // phpcs:ignore
270
- $meta['meta_value'] = isset( $term->name ) ? $term->name : $meta['meta_value']; // phpcs:ignore
271
  } else {
272
- $meta['meta_key'] = ( is_object( $the_product ) ) ? wc_attribute_label( $meta['meta_key'], $the_product ) : $meta['meta_key']; // phpcs:ignore
273
  }
274
  $meta_info[] = wp_kses_post( rawurldecode( $meta['meta_key'] ) ) . ': ' . wp_kses_post( rawurldecode( $meta['meta_value'] ) );
 
275
  }
276
  $meta_info = implode( ', ', $meta_info );
277
  }
@@ -281,7 +290,7 @@ if ( ! class_exists( 'WCJ_Order_Items_Shortcodes' ) ) :
281
  /**
282
  * Wcj_order_items_table.
283
  *
284
- * @version 5.3.1
285
  * @todo `sort_by_column` - fix `item_number`
286
  * @todo `$item['is_custom']` may be defined only if WCJ_IS_WC_VERSION_BELOW_3
287
  * @todo `if ( '' !== $column_cell_data )` - this may be optional?
@@ -357,8 +366,8 @@ if ( ! class_exists( 'WCJ_Order_Items_Shortcodes' ) ) :
357
  $data = array();
358
  $item_counter = 0;
359
  foreach ( $the_items as $item_id => $item ) {
360
- $item['is_custom'] = $item['is_custom'];
361
- $the_product = ( true === $item['is_custom'] ) ? null : ( method_exists( $item, 'get_product' ) ? $item->get_product( $item ) : null );
362
  // Check if it's not excluded by category.
363
  if ( '' !== $atts['exclude_by_categories'] && $the_product ) {
364
  if ( wcj_product_has_terms( $the_product, $atts['exclude_by_categories'], 'product_cat' ) ) {
@@ -536,7 +545,7 @@ if ( ! class_exists( 'WCJ_Order_Items_Shortcodes' ) ) :
536
 
537
  case 'item_debug':
538
  case 'debug':
539
- return print_r( $item, true ); // phpcs:ignore
540
 
541
  case 'item_regular_price':
542
  case 'product_regular_price':
@@ -556,7 +565,7 @@ if ( ! class_exists( 'WCJ_Order_Items_Shortcodes' ) ) :
556
 
557
  case 'product_categories':
558
  return ( is_object( $the_product ) ) ?
559
- strip_tags( ( WCJ_IS_WC_VERSION_BELOW_3 ? $the_product->get_categories() : wc_get_product_category_list( $item['product_id'] ) ) ) : // phpcs:ignore
560
  '';
561
 
562
  case 'item_tax_class':
2
  /**
3
  * Booster for WooCommerce - Shortcodes - Order Items
4
  *
5
+ * @version 6.0.0
6
  * @author Pluggabl LLC.
7
  * @package Booster_For_WooCommerce/shortcodes
8
  */
39
 
40
  $modified_atts = array_merge(
41
  array(
42
+ 'order_id' => ( isset( $_GET['order_id'] ) ) ? sanitize_text_field( wp_unslash( $_GET['order_id'] ) ) : get_the_ID(), //phpcs:ignore WordPress.Security.NonceVerification
43
  'hide_currency' => 'no',
44
  'table_class' => '',
45
  'shipping_as_item' => '', // e.g.: 'Shipping'.
145
  if ( empty( $new_item_args ) ) {
146
  return $items;
147
  }
148
+ $name = $new_item_args['name'];
149
+ $qty = $new_item_args['qty'];
150
+ $line_subtotal = $new_item_args['line_subtotal'];
151
+ $line_total = $new_item_args['line_total'];
152
+ $line_tax = $new_item_args['line_tax'];
153
+ $line_subtotal_tax = $new_item_args['line_subtotal_tax'];
154
+ $type = $new_item_args['type'];
155
+
156
  // Create item.
157
  if ( WCJ_IS_WC_VERSION_BELOW_3 ) {
158
  $item = array(
271
  }
272
 
273
  // Get attribute data.
274
+ // phpcs:disable WordPress.DB.SlowDBQuery.slow_db_query_meta_key, WordPress.DB.SlowDBQuery.slow_db_query_meta_value
275
  if ( taxonomy_exists( wc_sanitize_taxonomy_name( $meta['meta_key'] ) ) ) {
276
  $term = get_term_by( 'slug', $meta['meta_value'], wc_sanitize_taxonomy_name( $meta['meta_key'] ) );
277
+ $meta['meta_key'] = wc_attribute_label( wc_sanitize_taxonomy_name( $meta['meta_key'] ) );
278
+ $meta['meta_value'] = isset( $term->name ) ? $term->name : $meta['meta_value'];
279
  } else {
280
+ $meta['meta_key'] = ( is_object( $the_product ) ) ? wc_attribute_label( $meta['meta_key'], $the_product ) : $meta['meta_key'];
281
  }
282
  $meta_info[] = wp_kses_post( rawurldecode( $meta['meta_key'] ) ) . ': ' . wp_kses_post( rawurldecode( $meta['meta_value'] ) );
283
+ // phpcs:enable
284
  }
285
  $meta_info = implode( ', ', $meta_info );
286
  }
290
  /**
291
  * Wcj_order_items_table.
292
  *
293
+ * @version 6.0.0
294
  * @todo `sort_by_column` - fix `item_number`
295
  * @todo `$item['is_custom']` may be defined only if WCJ_IS_WC_VERSION_BELOW_3
296
  * @todo `if ( '' !== $column_cell_data )` - this may be optional?
366
  $data = array();
367
  $item_counter = 0;
368
  foreach ( $the_items as $item_id => $item ) {
369
+ $is_custom = ( isset( $item['is_custom'] ) );
370
+ $the_product = ( true === $is_custom ) ? null : ( method_exists( $item, 'get_product' ) ? $item->get_product( $item ) : null );
371
  // Check if it's not excluded by category.
372
  if ( '' !== $atts['exclude_by_categories'] && $the_product ) {
373
  if ( wcj_product_has_terms( $the_product, $atts['exclude_by_categories'], 'product_cat' ) ) {
545
 
546
  case 'item_debug':
547
  case 'debug':
548
+ return $item;
549
 
550
  case 'item_regular_price':
551
  case 'product_regular_price':
565
 
566
  case 'product_categories':
567
  return ( is_object( $the_product ) ) ?
568
+ wp_strip_all_tags( ( WCJ_IS_WC_VERSION_BELOW_3 ? $the_product->get_categories() : wc_get_product_category_list( $item['product_id'] ) ) ) :
569
  '';
570
 
571
  case 'item_tax_class':
includes/shortcodes/class-wcj-orders-shortcodes.php CHANGED
@@ -495,7 +495,7 @@ if ( ! class_exists( 'WCJ_Orders_Shortcodes' ) ) :
495
  /**
496
  * Wcj_order_item_total_refunded.
497
  *
498
- * @version 5.6.3
499
  * @since 2.5.3
500
  * @param array $atts The user defined shortcode attributes.
501
  */
@@ -504,8 +504,8 @@ if ( ! class_exists( 'WCJ_Orders_Shortcodes' ) ) :
504
  foreach ( $refund_item as $_refund ) {
505
 
506
  foreach ( $_refund->get_items() as $_item ) {
507
- $refund_total = $_item->get_total();
508
- $refund_total_tax = $_item->get_total_tax();
509
  }
510
  }
511
  $refund_result = ( $atts['excl_tax'] ) ? abs( $refund_total ) : abs( $refund_total ) + abs( $refund_total_tax );
495
  /**
496
  * Wcj_order_item_total_refunded.
497
  *
498
+ * @version 6.0.0
499
  * @since 2.5.3
500
  * @param array $atts The user defined shortcode attributes.
501
  */
504
  foreach ( $refund_item as $_refund ) {
505
 
506
  foreach ( $_refund->get_items() as $_item ) {
507
+ $refund_total += $_item->get_total();
508
+ $refund_total_tax += $_item->get_total_tax();
509
  }
510
  }
511
  $refund_result = ( $atts['excl_tax'] ) ? abs( $refund_total ) : abs( $refund_total ) + abs( $refund_total_tax );
includes/templates/wcj-radio-for-variations.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Variable product add to cart - radio inputs
4
  *
5
- * @version 4.6.0
6
  * @since 2.4.8
7
  * @author Pluggabl LLC.
8
  * @package WooCommerce/Templates
@@ -21,8 +21,8 @@ $attribute_keys = array_keys( $attributes );
21
  <tr>
22
  <th colspan="2">
23
  <?php $attribute_labels = array_map( 'wc_attribute_label', array_keys( $attributes ) ); ?>
24
- <?php echo implode( ' X ', wp_kses_post( $attribute_labels ) ); ?>
25
- <?php echo wp_kses_post( apply_filters( 'woocommerce_reset_variations_link', '<a style="float:right" class="reset_variations" href="#">' . esc_html__( 'Clear', 'woocommerce' ) . '</a>' ) ); ?>
26
  </th>
27
  </tr>
28
  <?php foreach ( $available_variations as $variation ) : ?>
@@ -34,7 +34,7 @@ $attribute_keys = array_keys( $attributes );
34
  </table>
35
  <?php
36
  foreach ( $product->get_attributes() as $attribute_name => $options ) {
37
- echo '<input type="hidden" name="attribute_' . wp_kses_post( $attribute_name ) . '" value="">';
38
  }
39
  ?>
40
  <?php endif; ?>
2
  /**
3
  * Variable product add to cart - radio inputs
4
  *
5
+ * @version 6.0.0
6
  * @since 2.4.8
7
  * @author Pluggabl LLC.
8
  * @package WooCommerce/Templates
21
  <tr>
22
  <th colspan="2">
23
  <?php $attribute_labels = array_map( 'wc_attribute_label', array_keys( $attributes ) ); ?>
24
+ <?php echo esc_html( implode( ' X ', $attribute_labels ) ); ?>
25
+ <?php echo '<a style="float:right" class="reset_variations" href="#">' . esc_html__( 'Clear', 'woocommerce' ) . '</a>'; ?>
26
  </th>
27
  </tr>
28
  <?php foreach ( $available_variations as $variation ) : ?>
34
  </table>
35
  <?php
36
  foreach ( $product->get_attributes() as $attribute_name => $options ) {
37
+ echo wp_kses_post( '<input type="hidden" name="attribute_' . $attribute_name . '" value="" />' );
38
  }
39
  ?>
40
  <?php endif; ?>
langs/woocommerce-jetpack.pot CHANGED
@@ -41,9 +41,9 @@ msgstr ""
41
  #: includes/class-wcj-max-products-per-user.php:219
42
  #: includes/class-wcj-orders.php:133 includes/class-wcj-orders.php:170
43
  #: includes/class-wcj-payment-gateways.php:103
44
- #: includes/class-wcj-track-users.php:175 includes/class-wcj-track-users.php:266
45
- #: includes/classes/class-wcj-module.php:676
46
- #: includes/classes/class-wcj-module.php:885
47
  #: includes/settings/wcj-settings-price-by-country.php:275
48
  msgid "Booster"
49
  msgstr ""
@@ -206,7 +206,7 @@ msgstr ""
206
  #: includes/admin/class-wc-settings-jetpack.php:642
207
  #: includes/admin/class-wc-settings-jetpack.php:1089
208
  #: includes/class-wcj-admin-bar.php:188
209
- #: includes/classes/class-wcj-module.php:1038
210
  msgid "Documentation"
211
  msgstr ""
212
 
@@ -269,7 +269,7 @@ msgstr ""
269
  #: includes/admin/class-wc-settings-jetpack.php:766
270
  #: includes/admin/class-wc-settings-jetpack.php:782
271
  #: includes/class-wcj-product-custom-info.php:29
272
- #: includes/functions/wcj-functions-general.php:485
273
  msgid "Product Info"
274
  msgstr ""
275
 
@@ -585,7 +585,7 @@ msgstr ""
585
  msgid "Doesn't apply rounding, offset etc."
586
  msgstr ""
587
 
588
- #: includes/admin/class-wcj-settings-custom-fields.php:348
589
  msgid "Save changes"
590
  msgstr ""
591
 
@@ -993,7 +993,7 @@ msgstr ""
993
 
994
  #: includes/class-wcj-admin-bar.php:267 includes/class-wcj-admin-bar.php:311
995
  #: includes/class-wcj-admin-bar.php:659
996
- #: includes/classes/class-wcj-module.php:856
997
  #: includes/settings/wcj-settings-wpml.php:97
998
  msgid "Tools"
999
  msgstr ""
@@ -1058,7 +1058,7 @@ msgstr ""
1058
  #: includes/class-wcj-admin-bar.php:418 includes/class-wcj-admin-bar.php:422
1059
  #: includes/class-wcj-admin-bar.php:440 includes/class-wcj-my-account.php:40
1060
  #: includes/class-wcj-my-account.php:48 includes/class-wcj-orders.php:31
1061
- #: includes/reports/class-wcj-reports-sales-gateways.php:179
1062
  #: includes/settings/wcj-settings-reports.php:24
1063
  #: includes/settings/wcj-settings-reports.php:62
1064
  #: includes/settings/wcj-settings-reports.php:103
@@ -1932,34 +1932,34 @@ msgid ""
1932
  "currency rate with real conversion then enable it"
1933
  msgstr ""
1934
 
1935
- #: includes/class-wcj-currency-exchange-rates.php:225
1936
  #: includes/settings/wcj-settings-currency-exchange-rates.php:52
1937
  msgid "Exchange Rates Server"
1938
  msgstr ""
1939
 
1940
- #: includes/class-wcj-currency-exchange-rates.php:231
1941
  #, php-format
1942
  msgid "Use default: %s"
1943
  msgstr ""
1944
 
1945
- #: includes/class-wcj-currency-exchange-rates.php:258
1946
  msgid "Exchange Rates Offset (Percent)"
1947
  msgstr ""
1948
 
1949
- #: includes/class-wcj-currency-exchange-rates.php:264
1950
  #, php-format
1951
  msgid "Use default: %s%%"
1952
  msgstr ""
1953
 
1954
- #: includes/class-wcj-currency-exchange-rates.php:265
1955
  msgid "Custom offset"
1956
  msgstr ""
1957
 
1958
- #: includes/class-wcj-currency-exchange-rates.php:269
1959
  msgid "Custom offset (Percent)"
1960
  msgstr ""
1961
 
1962
- #: includes/class-wcj-currency-exchange-rates.php:270
1963
  msgid "Used when \"Custom offset\" option is selected above."
1964
  msgstr ""
1965
 
@@ -2168,31 +2168,31 @@ msgid ""
2168
  "\">here</a>."
2169
  msgstr ""
2170
 
2171
- #: includes/class-wcj-emails-verification.php:219
2172
- #: includes/class-wcj-emails-verification.php:222
2173
  #: includes/settings/wcj-settings-emails-verification.php:139
2174
  msgid ""
2175
  "Please click the following link to verify your email:<br><br><a href="
2176
  "\"%verification_url%\">%verification_url%</a>"
2177
  msgstr ""
2178
 
2179
- #: includes/class-wcj-emails-verification.php:230
2180
- #: includes/class-wcj-emails-verification.php:233
2181
  #: includes/settings/wcj-settings-emails-verification.php:128
2182
  msgid "Please activate your account"
2183
  msgstr ""
2184
 
2185
- #: includes/class-wcj-emails-verification.php:242
2186
  #: includes/settings/wcj-settings-emails-verification.php:161
2187
  msgid "Activate your account"
2188
  msgstr ""
2189
 
2190
- #: includes/class-wcj-emails-verification.php:263
2191
  #: includes/settings/wcj-settings-emails-verification.php:73
2192
  msgid "<strong>Success:</strong> Your account has been activated!"
2193
  msgstr ""
2194
 
2195
- #: includes/class-wcj-emails-verification.php:285
2196
  #: includes/settings/wcj-settings-emails-verification.php:91
2197
  msgid ""
2198
  "<strong>Error:</strong> Activation failed, please contact our administrator. "
@@ -2200,20 +2200,20 @@ msgid ""
2200
  "\"%resend_verification_url%\">here</a>."
2201
  msgstr ""
2202
 
2203
- #: includes/class-wcj-emails-verification.php:293
2204
  #: includes/settings/wcj-settings-emails-verification.php:98
2205
  msgid ""
2206
  "<strong>Error:</strong> Activation failed, please contact our administrator."
2207
  msgstr ""
2208
 
2209
- #: includes/class-wcj-emails-verification.php:302
2210
  #: includes/settings/wcj-settings-emails-verification.php:105
2211
  msgid ""
2212
  "Thank you for your registration. Your account has to be activated before you "
2213
  "can login. Please check your email."
2214
  msgstr ""
2215
 
2216
- #: includes/class-wcj-emails-verification.php:312
2217
  #: includes/settings/wcj-settings-emails-verification.php:112
2218
  msgid ""
2219
  "<strong>Success:</strong> Your activation email has been resent. Please check "
@@ -2253,7 +2253,7 @@ msgid "Booster: Send Email: %s"
2253
  msgstr ""
2254
 
2255
  #: includes/class-wcj-empty-cart-button.php:30
2256
- #: includes/shortcodes/class-wcj-general-shortcodes.php:599
2257
  msgid "Empty Cart Button"
2258
  msgstr ""
2259
 
@@ -2398,32 +2398,32 @@ msgstr ""
2398
  msgid "Export Products."
2399
  msgstr ""
2400
 
2401
- #: includes/class-wcj-export-import.php:243
2402
- #: includes/class-wcj-export-import.php:249
2403
  msgid "Filter by Billing Country"
2404
  msgstr ""
2405
 
2406
- #: includes/class-wcj-export-import.php:244
2407
  msgid "Filter by Product Title"
2408
  msgstr ""
2409
 
2410
- #: includes/class-wcj-export-import.php:263
2411
- #: includes/reports/class-wcj-reports-product-sales-daily.php:218
2412
  #: includes/reports/class-wcj-reports-sales-gateways.php:162
2413
  #: includes/settings/wcj-settings-orders.php:48
2414
  msgid "Filter"
2415
  msgstr ""
2416
 
2417
- #: includes/class-wcj-export-import.php:292
2418
  #: includes/class-wcj-track-users.php:45
2419
  msgid "All time"
2420
  msgstr ""
2421
 
2422
- #: includes/class-wcj-export-import.php:311
2423
  msgid "Custom:"
2424
  msgstr ""
2425
 
2426
- #: includes/class-wcj-export-import.php:317
2427
  msgid "Go"
2428
  msgstr ""
2429
 
@@ -2759,6 +2759,7 @@ msgid "Booster: Offer Price History"
2759
  msgstr ""
2760
 
2761
  #: includes/class-wcj-offer-price.php:164
 
2762
  #: includes/settings/wcj-settings-cross-sells.php:47
2763
  #: includes/settings/wcj-settings-order-numbers.php:173
2764
  #: includes/settings/wcj-settings-products-xml.php:244
@@ -3476,7 +3477,7 @@ msgstr ""
3476
  #: includes/class-wcj-product-by-country.php:203
3477
  #: includes/class-wcj-product-by-user-role.php:62
3478
  #: includes/class-wcj-product-info.php:255
3479
- #: includes/class-wcj-product-price-by-formula.php:171
3480
  #: includes/class-wcj-shipping-by-products.php:214
3481
  #: includes/class-wcj-shipping-options.php:191
3482
  #: includes/classes/class-wcj-module.php:221
@@ -3526,7 +3527,6 @@ msgstr ""
3526
  #: includes/settings/wcj-settings-currency-exchange-rates.php:61
3527
  #: includes/settings/wcj-settings-currency-exchange-rates.php:92
3528
  #: includes/settings/wcj-settings-currency-exchange-rates.php:100
3529
- #: includes/settings/wcj-settings-currency-exchange-rates.php:108
3530
  #: includes/settings/wcj-settings-currency-per-product.php:63
3531
  #: includes/settings/wcj-settings-currency-per-product.php:80
3532
  #: includes/settings/wcj-settings-currency-per-product.php:87
@@ -3870,11 +3870,7 @@ msgstr ""
3870
  msgid "Some of the required addons are not selected!"
3871
  msgstr ""
3872
 
3873
- #: includes/class-wcj-product-addons.php:306
3874
- msgid "Invalid security nonce"
3875
- msgstr ""
3876
-
3877
- #: includes/class-wcj-product-addons.php:319
3878
  msgid ""
3879
  "Booster: Free plugin's version is limited to only three products with per "
3880
  "product addons enabled at a time. You will need to get <a href=\"https://"
@@ -4017,10 +4013,10 @@ msgstr ""
4017
  #: includes/class-wcj-product-bulk-meta-editor.php:320
4018
  #: includes/class-wcj-product-by-user.php:301
4019
  #: includes/class-wcj-purchase-data.php:122
4020
- #: includes/classes/class-wcj-module.php:998
4021
- #: includes/functions/wcj-functions-general.php:208
4022
  #: includes/functions/wcj-functions-html.php:138
4023
- #: includes/reports/class-wcj-reports-monthly-sales.php:389
4024
  #: includes/settings/wcj-settings-empty-cart.php:88
4025
  #: includes/shortcodes/class-wcj-products-add-form-shortcodes.php:391
4026
  #: includes/tools/class-wcj-order-statuses-tool.php:213
@@ -4752,26 +4748,26 @@ msgstr ""
4752
  msgid "Set formula for automatic product price calculation."
4753
  msgstr ""
4754
 
4755
- #: includes/class-wcj-product-price-by-formula.php:128
4756
  msgid "Booking cost"
4757
  msgstr ""
4758
 
4759
- #: includes/class-wcj-product-price-by-formula.php:143
4760
  #, php-format
4761
  msgid "From: %s"
4762
  msgstr ""
4763
 
4764
- #: includes/class-wcj-product-price-by-formula.php:170
4765
  msgid "Reset products"
4766
  msgstr ""
4767
 
4768
- #: includes/class-wcj-product-price-by-formula.php:176
4769
  msgid ""
4770
  "If enabled will also reset formula related settings on products when "
4771
  "<code>Reset Settings</code> button is pressed."
4772
  msgstr ""
4773
 
4774
- #: includes/class-wcj-product-price-by-formula.php:176
4775
  msgid ""
4776
  "It's necessary to <code>Save changes</code> first with the option enabled so "
4777
  "the <code>Reset settings</code> can be pressed."
@@ -4929,7 +4925,7 @@ msgstr ""
4929
  #: includes/settings/meta-box/wcj-settings-meta-box-product-by-date.php:25
4930
  #: includes/settings/meta-box/wcj-settings-meta-box-product-by-time.php:22
4931
  #: includes/settings/wcj-settings-checkout-core-fields.php:89
4932
- #: includes/settings/wcj-settings-currency-exchange-rates.php:171
4933
  #: includes/settings/wcj-settings-order-numbers.php:49
4934
  #: includes/settings/wcj-settings-orders.php:184
4935
  #: includes/settings/wcj-settings-product-add-to-cart.php:68
@@ -5746,12 +5742,12 @@ msgstr ""
5746
  msgid "Type:"
5747
  msgstr ""
5748
 
5749
- #: includes/class-wcj-track-users.php:268
5750
  #, php-format
5751
  msgid "Top %d countries by visits"
5752
  msgstr ""
5753
 
5754
- #: includes/class-wcj-track-users.php:341
5755
  #: includes/input-fields/wcj-product-input-fields-options.php:46
5756
  #: includes/settings/wcj-settings-checkout-custom-fields.php:154
5757
  #: includes/tools/class-wcj-eu-countries-vat-rates-tool.php:113
@@ -5759,16 +5755,16 @@ msgstr ""
5759
  msgid "Country"
5760
  msgstr ""
5761
 
5762
- #: includes/class-wcj-track-users.php:341
5763
  msgid "Visits"
5764
  msgstr ""
5765
 
5766
- #: includes/class-wcj-track-users.php:380
5767
  #, php-format
5768
  msgid "Stats generated at %1$s. Next update is scheduled at %2$s."
5769
  msgstr ""
5770
 
5771
- #: includes/class-wcj-track-users.php:388
5772
  msgid "Update now"
5773
  msgstr ""
5774
 
@@ -5857,7 +5853,7 @@ msgstr ""
5857
  msgid "Get products in all languages"
5858
  msgstr ""
5859
 
5860
- #: includes/classes/class-wcj-module.php:383
5861
  #, php-format
5862
  msgid ""
5863
  "Booster: Free plugin's version is limited to only one \"%1$s\" product with "
@@ -5866,30 +5862,30 @@ msgid ""
5866
  "\" products."
5867
  msgstr ""
5868
 
5869
- #: includes/classes/class-wcj-module.php:770
5870
  #, php-format
5871
  msgid "Selected: %s."
5872
  msgstr ""
5873
 
5874
- #: includes/classes/class-wcj-module.php:841
5875
  msgid "Back to Module Settings"
5876
  msgstr ""
5877
 
5878
- #: includes/classes/class-wcj-module.php:862
5879
  #: includes/settings/wcj-settings-wpml.php:102
5880
  msgid "Module Tools"
5881
  msgstr ""
5882
 
5883
- #: includes/classes/class-wcj-module.php:940
5884
  #: includes/settings/wcj-settings-checkout-core-fields.php:82
5885
  msgid "enabled"
5886
  msgstr ""
5887
 
5888
- #: includes/classes/class-wcj-module.php:941
5889
  msgid "disabled"
5890
  msgstr ""
5891
 
5892
- #: includes/classes/class-wcj-module.php:949
5893
  #: includes/settings/wcj-settings-product-tabs.php:181
5894
  #: includes/settings/wcj-settings-product-tabs.php:196
5895
  #: includes/settings/wcj-settings-product-tabs.php:211
@@ -5897,42 +5893,37 @@ msgstr ""
5897
  msgid "Deprecated"
5898
  msgstr ""
5899
 
5900
- #: includes/classes/class-wcj-module.php:988
5901
  msgid "Reset Settings"
5902
  msgstr ""
5903
 
5904
- #: includes/classes/class-wcj-module.php:994
5905
  msgid "Reset Module to Default Settings"
5906
  msgstr ""
5907
 
5908
- #: includes/classes/class-wcj-module.php:995
5909
  msgid "Reset Submodule to Default Settings"
5910
  msgstr ""
5911
 
5912
- #: includes/classes/class-wcj-module.php:1004
5913
  msgid "Reset settings"
5914
  msgstr ""
5915
 
5916
- #: includes/classes/class-wcj-module.php:1042
5917
  msgid "Module Options"
5918
  msgstr ""
5919
 
5920
- #: includes/classes/class-wcj-module.php:1049
5921
  msgid "Enable Module"
5922
  msgstr ""
5923
 
5924
- #: includes/classes/class-wcj-pdf-invoice.php:103
5925
  #: includes/settings/wcj-settings-pdf-invoicing-header.php:71
5926
  msgid "Company Name"
5927
  msgstr ""
5928
 
5929
- #: includes/classes/class-wcj-pdf-invoice.php:302
5930
- #: includes/pdf-invoices/class-wcj-pdf-invoicing-report-tool.php:280
5931
- msgid "Unexpected error"
5932
- msgstr ""
5933
-
5934
  #: includes/classes/class-wcj-shortcodes.php:156
5935
- #: includes/shortcodes/class-wcj-general-shortcodes.php:599
5936
  #, php-format
5937
  msgid "\"%s\" module is not enabled!"
5938
  msgstr ""
@@ -7759,92 +7750,92 @@ msgstr ""
7759
  msgid "CoinMarketCap"
7760
  msgstr ""
7761
 
7762
- #: includes/functions/wcj-functions-general.php:703
7763
  #: includes/settings/wcj-settings-cross-sells.php:78
7764
  #: includes/settings/wcj-settings-empty-cart.php:50
7765
  msgid "Before cart"
7766
  msgstr ""
7767
 
7768
- #: includes/functions/wcj-functions-general.php:704
7769
  msgid "Before cart table"
7770
  msgstr ""
7771
 
7772
- #: includes/functions/wcj-functions-general.php:705
7773
  msgid "Before cart contents"
7774
  msgstr ""
7775
 
7776
- #: includes/functions/wcj-functions-general.php:706
7777
  msgid "Cart contents"
7778
  msgstr ""
7779
 
7780
- #: includes/functions/wcj-functions-general.php:707
7781
  msgid "Cart coupon"
7782
  msgstr ""
7783
 
7784
- #: includes/functions/wcj-functions-general.php:708
7785
  msgid "Cart actions"
7786
  msgstr ""
7787
 
7788
- #: includes/functions/wcj-functions-general.php:709
7789
  msgid "After cart contents"
7790
  msgstr ""
7791
 
7792
- #: includes/functions/wcj-functions-general.php:710
7793
  msgid "After cart table"
7794
  msgstr ""
7795
 
7796
- #: includes/functions/wcj-functions-general.php:711
7797
  #: includes/settings/wcj-settings-cross-sells.php:79
7798
  msgid "Cart collaterals"
7799
  msgstr ""
7800
 
7801
- #: includes/functions/wcj-functions-general.php:712
7802
  #: includes/settings/wcj-settings-cross-sells.php:80
7803
  #: includes/settings/wcj-settings-empty-cart.php:59
7804
  msgid "After cart"
7805
  msgstr ""
7806
 
7807
- #: includes/functions/wcj-functions-general.php:714
7808
  msgid "Before cart totals"
7809
  msgstr ""
7810
 
7811
- #: includes/functions/wcj-functions-general.php:715
7812
  #: includes/settings/wcj-settings-empty-cart.php:52
7813
  msgid "Cart totals: Before shipping"
7814
  msgstr ""
7815
 
7816
- #: includes/functions/wcj-functions-general.php:716
7817
  #: includes/settings/wcj-settings-empty-cart.php:53
7818
  msgid "Cart totals: After shipping"
7819
  msgstr ""
7820
 
7821
- #: includes/functions/wcj-functions-general.php:717
7822
  #: includes/settings/wcj-settings-empty-cart.php:54
7823
  msgid "Cart totals: Before order total"
7824
  msgstr ""
7825
 
7826
- #: includes/functions/wcj-functions-general.php:718
7827
  #: includes/settings/wcj-settings-empty-cart.php:55
7828
  msgid "Cart totals: After order total"
7829
  msgstr ""
7830
 
7831
- #: includes/functions/wcj-functions-general.php:719
7832
  msgid "Proceed to checkout"
7833
  msgstr ""
7834
 
7835
- #: includes/functions/wcj-functions-general.php:720
7836
  msgid "After cart totals"
7837
  msgstr ""
7838
 
7839
- #: includes/functions/wcj-functions-general.php:722
7840
  msgid "Before shipping calculator"
7841
  msgstr ""
7842
 
7843
- #: includes/functions/wcj-functions-general.php:723
7844
  msgid "After shipping calculator"
7845
  msgstr ""
7846
 
7847
- #: includes/functions/wcj-functions-general.php:725
7848
  msgid "If cart is empty"
7849
  msgstr ""
7850
 
@@ -7873,10 +7864,6 @@ msgstr ""
7873
  msgid "Custom Document"
7874
  msgstr ""
7875
 
7876
- #: includes/functions/wcj-functions-reports.php:24
7877
- msgid "date"
7878
- msgstr ""
7879
-
7880
  #: includes/functions/wcj-functions-reports.php:25
7881
  msgid "Daily Total Sum"
7882
  msgstr ""
@@ -8526,12 +8513,16 @@ msgstr ""
8526
  msgid "Renumerate invoices"
8527
  msgstr ""
8528
 
8529
- #: includes/pdf-invoices/class-wcj-pdf-invoicing-renumerate-tool.php:245
 
 
 
 
8530
  #, php-format
8531
  msgid "Total documents created: %d"
8532
  msgstr ""
8533
 
8534
- #: includes/pdf-invoices/class-wcj-pdf-invoicing-renumerate-tool.php:247
8535
  #, php-format
8536
  msgid "Total documents deleted: %d"
8537
  msgstr ""
@@ -8545,7 +8536,7 @@ msgid ""
8545
  msgstr ""
8546
 
8547
  #: includes/pdf-invoices/class-wcj-pdf-invoicing-report-tool.php:105
8548
- #: includes/pdf-invoices/class-wcj-pdf-invoicing-report-tool.php:127
8549
  msgid "Please fill year and month values."
8550
  msgstr ""
8551
 
@@ -8565,14 +8556,14 @@ msgstr ""
8565
  msgid "Download monthly documents CSV"
8566
  msgstr ""
8567
 
8568
- #: includes/pdf-invoices/class-wcj-pdf-invoicing-report-tool.php:205
8569
  #, php-format
8570
  msgid ""
8571
  "Booster: %s class is not accessible on your server. Please contact your "
8572
  "hosting provider."
8573
  msgstr ""
8574
 
8575
- #: includes/pdf-invoices/class-wcj-pdf-invoicing-report-tool.php:296
8576
  #, php-format
8577
  msgid "No documents (%1$s) found for %2$d-%3$02d."
8578
  msgstr ""
@@ -8772,19 +8763,19 @@ msgstr ""
8772
  msgid "Total customers"
8773
  msgstr ""
8774
 
8775
- #: includes/reports/class-wcj-reports-customers.php:150
8776
  msgid "Country Code"
8777
  msgstr ""
8778
 
8779
- #: includes/reports/class-wcj-reports-customers.php:151
8780
  msgid "Customers Count"
8781
  msgstr ""
8782
 
8783
- #: includes/reports/class-wcj-reports-customers.php:152
8784
  msgid "Percent of total"
8785
  msgstr ""
8786
 
8787
- #: includes/reports/class-wcj-reports-customers.php:188
8788
  msgid "Report for:"
8789
  msgstr ""
8790
 
@@ -8849,73 +8840,59 @@ msgstr ""
8849
  msgid "Totals"
8850
  msgstr ""
8851
 
8852
- #: includes/reports/class-wcj-reports-monthly-sales.php:360
8853
  msgid "Report currency"
8854
  msgstr ""
8855
 
8856
- #: includes/reports/class-wcj-reports-monthly-sales.php:380
8857
  #, php-format
8858
  msgid "Report generated in: %s s"
8859
  msgstr ""
8860
 
8861
- #: includes/reports/class-wcj-reports-monthly-sales.php:384
8862
  msgid "Save Currency Rates"
8863
  msgstr ""
8864
 
8865
- #: includes/reports/class-wcj-reports-monthly-sales.php:389
8866
  msgid "Reset Currency Rates"
8867
  msgstr ""
8868
 
8869
- #: includes/reports/class-wcj-reports-product-sales-daily.php:180
8870
- #: includes/reports/class-wcj-reports-sales-gateways.php:125
8871
  #: includes/reports/class-wcj-reports-sales.php:365
8872
  msgid "Reports Settings"
8873
  msgstr ""
8874
 
8875
- #: includes/reports/class-wcj-reports-product-sales-daily.php:209
8876
- #: includes/reports/class-wcj-reports-sales-gateways.php:155
8877
- msgid "From:"
8878
- msgstr ""
8879
-
8880
- #: includes/reports/class-wcj-reports-product-sales-daily.php:212
8881
- #: includes/reports/class-wcj-reports-sales-gateways.php:158
8882
- msgid "To:"
8883
- msgstr ""
8884
-
8885
- #: includes/reports/class-wcj-reports-product-sales-daily.php:215
8886
- msgid "Product:"
8887
- msgstr ""
8888
-
8889
- #: includes/reports/class-wcj-reports-product-sales-daily.php:306
8890
  #, php-format
8891
  msgid "Total: %d"
8892
  msgstr ""
8893
 
8894
- #: includes/reports/class-wcj-reports-product-sales-daily.php:311
8895
- #: includes/reports/class-wcj-reports-product-sales-daily.php:316
8896
  #, php-format
8897
  msgid "Total: %s"
8898
  msgstr ""
8899
 
8900
- #: includes/reports/class-wcj-reports-product-sales-daily.php:335
8901
- #: includes/reports/class-wcj-reports-sales-gateways.php:192
8902
  #, php-format
8903
  msgid "Total orders: %d"
8904
  msgstr ""
8905
 
8906
- #: includes/reports/class-wcj-reports-product-sales-daily.php:336
8907
- #: includes/reports/class-wcj-reports-sales-gateways.php:194
8908
- #: includes/reports/class-wcj-reports-sales.php:396
8909
  msgid "No sales data for current period."
8910
  msgstr ""
8911
 
8912
- #: includes/reports/class-wcj-reports-sales-gateways.php:95
8913
  #: includes/reports/class-wcj-reports-stock.php:121
8914
  #: includes/reports/class-wcj-reports-stock.php:197
8915
  msgid "N/A"
8916
  msgstr ""
8917
 
8918
- #: includes/reports/class-wcj-reports-sales-gateways.php:178
8919
  msgid "Gateway"
8920
  msgstr ""
8921
 
@@ -8939,7 +8916,7 @@ msgstr ""
8939
  msgid "Total Profit"
8940
  msgstr ""
8941
 
8942
- #: includes/reports/class-wcj-reports-sales.php:391
8943
  msgid "Filter products"
8944
  msgstr ""
8945
 
@@ -9019,27 +8996,31 @@ msgstr ""
9019
  msgid "profit:"
9020
  msgstr ""
9021
 
9022
- #: includes/reports/class-wcj-reports-stock.php:362
 
 
 
 
9023
  msgid "Total current stock value"
9024
  msgstr ""
9025
 
9026
- #: includes/reports/class-wcj-reports-stock.php:363
9027
  msgid "Total stock value"
9028
  msgstr ""
9029
 
9030
- #: includes/reports/class-wcj-reports-stock.php:364
9031
  msgid "Product stock value average"
9032
  msgstr ""
9033
 
9034
- #: includes/reports/class-wcj-reports-stock.php:365
9035
  msgid "Product stock average"
9036
  msgstr ""
9037
 
9038
- #: includes/reports/class-wcj-reports-stock.php:367
9039
  msgid "Total current stock purchase price"
9040
  msgstr ""
9041
 
9042
- #: includes/reports/class-wcj-reports-stock.php:371
9043
  msgid "Report was generated in: "
9044
  msgstr ""
9045
 
@@ -11927,67 +11908,57 @@ msgid ""
11927
  msgstr ""
11928
 
11929
  #: includes/settings/wcj-settings-currency-exchange-rates.php:99
11930
- msgid "Always Use cURL"
11931
- msgstr ""
11932
-
11933
- #: includes/settings/wcj-settings-currency-exchange-rates.php:101
11934
- msgid ""
11935
- "If for some reason currency exchange rates are not updating, try enabling "
11936
- "this option."
11937
- msgstr ""
11938
-
11939
- #: includes/settings/wcj-settings-currency-exchange-rates.php:107
11940
  msgid "Force Point as Decimal Separator"
11941
  msgstr ""
11942
 
11943
- #: includes/settings/wcj-settings-currency-exchange-rates.php:109
11944
  msgid "Force \".\" as decimal separator for exchange rates."
11945
  msgstr ""
11946
 
11947
- #: includes/settings/wcj-settings-currency-exchange-rates.php:119
11948
  msgid "API Keys"
11949
  msgstr ""
11950
 
11951
- #: includes/settings/wcj-settings-currency-exchange-rates.php:120
11952
  msgid "API keys provided by the Exchange Rates Servers"
11953
  msgstr ""
11954
 
11955
- #: includes/settings/wcj-settings-currency-exchange-rates.php:125
11956
  msgid "Free Currency Converter"
11957
  msgstr ""
11958
 
11959
- #: includes/settings/wcj-settings-currency-exchange-rates.php:127
11960
  #, php-format
11961
  msgid "More information at %s"
11962
  msgstr ""
11963
 
11964
- #: includes/settings/wcj-settings-currency-exchange-rates.php:136
11965
  msgid "Custom Currencies Options"
11966
  msgstr ""
11967
 
11968
- #: includes/settings/wcj-settings-currency-exchange-rates.php:139
11969
  #, php-format
11970
  msgid ""
11971
  "You can add more currencies in this section. E.g. this can be used to display "
11972
  "exchange rates with %s shortcodes."
11973
  msgstr ""
11974
 
11975
- #: includes/settings/wcj-settings-currency-exchange-rates.php:152
11976
  #: includes/settings/wcj-settings-currency.php:72
11977
  msgid "Total Custom Currencies"
11978
  msgstr ""
11979
 
11980
- #: includes/settings/wcj-settings-currency-exchange-rates.php:167
11981
  #: includes/settings/wcj-settings-currency.php:87
11982
  msgid "Custom Currency"
11983
  msgstr ""
11984
 
11985
- #: includes/settings/wcj-settings-currency-exchange-rates.php:192
11986
  #: includes/settings/wcj-settings-price-by-country.php:420
11987
  msgid "Exchange Rates"
11988
  msgstr ""
11989
 
11990
- #: includes/settings/wcj-settings-currency-exchange-rates.php:194
11991
  msgid ""
11992
  "All currencies from all <strong>enabled</strong> modules (with \"Exchange "
11993
  "Rates Updates\" set to \"Automatically via Currency Exchange Rates module\") "
@@ -17179,7 +17150,7 @@ msgstr ""
17179
 
17180
  #: includes/settings/wcj-settings-product-by-condition.php:91
17181
  #: includes/settings/wcj-settings-related-products.php:182
17182
- #: includes/shortcodes/class-wcj-order-items-shortcodes.php:212
17183
  msgid "Standard"
17184
  msgstr ""
17185
 
41
  #: includes/class-wcj-max-products-per-user.php:219
42
  #: includes/class-wcj-orders.php:133 includes/class-wcj-orders.php:170
43
  #: includes/class-wcj-payment-gateways.php:103
44
+ #: includes/class-wcj-track-users.php:175 includes/class-wcj-track-users.php:268
45
+ #: includes/classes/class-wcj-module.php:685
46
+ #: includes/classes/class-wcj-module.php:894
47
  #: includes/settings/wcj-settings-price-by-country.php:275
48
  msgid "Booster"
49
  msgstr ""
206
  #: includes/admin/class-wc-settings-jetpack.php:642
207
  #: includes/admin/class-wc-settings-jetpack.php:1089
208
  #: includes/class-wcj-admin-bar.php:188
209
+ #: includes/classes/class-wcj-module.php:1047
210
  msgid "Documentation"
211
  msgstr ""
212
 
269
  #: includes/admin/class-wc-settings-jetpack.php:766
270
  #: includes/admin/class-wc-settings-jetpack.php:782
271
  #: includes/class-wcj-product-custom-info.php:29
272
+ #: includes/functions/wcj-functions-general.php:443
273
  msgid "Product Info"
274
  msgstr ""
275
 
585
  msgid "Doesn't apply rounding, offset etc."
586
  msgstr ""
587
 
588
+ #: includes/admin/class-wcj-settings-custom-fields.php:350
589
  msgid "Save changes"
590
  msgstr ""
591
 
993
 
994
  #: includes/class-wcj-admin-bar.php:267 includes/class-wcj-admin-bar.php:311
995
  #: includes/class-wcj-admin-bar.php:659
996
+ #: includes/classes/class-wcj-module.php:865
997
  #: includes/settings/wcj-settings-wpml.php:97
998
  msgid "Tools"
999
  msgstr ""
1058
  #: includes/class-wcj-admin-bar.php:418 includes/class-wcj-admin-bar.php:422
1059
  #: includes/class-wcj-admin-bar.php:440 includes/class-wcj-my-account.php:40
1060
  #: includes/class-wcj-my-account.php:48 includes/class-wcj-orders.php:31
1061
+ #: includes/reports/class-wcj-reports-sales-gateways.php:180
1062
  #: includes/settings/wcj-settings-reports.php:24
1063
  #: includes/settings/wcj-settings-reports.php:62
1064
  #: includes/settings/wcj-settings-reports.php:103
1932
  "currency rate with real conversion then enable it"
1933
  msgstr ""
1934
 
1935
+ #: includes/class-wcj-currency-exchange-rates.php:229
1936
  #: includes/settings/wcj-settings-currency-exchange-rates.php:52
1937
  msgid "Exchange Rates Server"
1938
  msgstr ""
1939
 
1940
+ #: includes/class-wcj-currency-exchange-rates.php:235
1941
  #, php-format
1942
  msgid "Use default: %s"
1943
  msgstr ""
1944
 
1945
+ #: includes/class-wcj-currency-exchange-rates.php:262
1946
  msgid "Exchange Rates Offset (Percent)"
1947
  msgstr ""
1948
 
1949
+ #: includes/class-wcj-currency-exchange-rates.php:268
1950
  #, php-format
1951
  msgid "Use default: %s%%"
1952
  msgstr ""
1953
 
1954
+ #: includes/class-wcj-currency-exchange-rates.php:269
1955
  msgid "Custom offset"
1956
  msgstr ""
1957
 
1958
+ #: includes/class-wcj-currency-exchange-rates.php:273
1959
  msgid "Custom offset (Percent)"
1960
  msgstr ""
1961
 
1962
+ #: includes/class-wcj-currency-exchange-rates.php:274
1963
  msgid "Used when \"Custom offset\" option is selected above."
1964
  msgstr ""
1965
 
2168
  "\">here</a>."
2169
  msgstr ""
2170
 
2171
+ #: includes/class-wcj-emails-verification.php:220
2172
+ #: includes/class-wcj-emails-verification.php:223
2173
  #: includes/settings/wcj-settings-emails-verification.php:139
2174
  msgid ""
2175
  "Please click the following link to verify your email:<br><br><a href="
2176
  "\"%verification_url%\">%verification_url%</a>"
2177
  msgstr ""
2178
 
2179
+ #: includes/class-wcj-emails-verification.php:231
2180
+ #: includes/class-wcj-emails-verification.php:234
2181
  #: includes/settings/wcj-settings-emails-verification.php:128
2182
  msgid "Please activate your account"
2183
  msgstr ""
2184
 
2185
+ #: includes/class-wcj-emails-verification.php:243
2186
  #: includes/settings/wcj-settings-emails-verification.php:161
2187
  msgid "Activate your account"
2188
  msgstr ""
2189
 
2190
+ #: includes/class-wcj-emails-verification.php:265
2191
  #: includes/settings/wcj-settings-emails-verification.php:73
2192
  msgid "<strong>Success:</strong> Your account has been activated!"
2193
  msgstr ""
2194
 
2195
+ #: includes/class-wcj-emails-verification.php:287
2196
  #: includes/settings/wcj-settings-emails-verification.php:91
2197
  msgid ""
2198
  "<strong>Error:</strong> Activation failed, please contact our administrator. "
2200
  "\"%resend_verification_url%\">here</a>."
2201
  msgstr ""
2202
 
2203
+ #: includes/class-wcj-emails-verification.php:295
2204
  #: includes/settings/wcj-settings-emails-verification.php:98
2205
  msgid ""
2206
  "<strong>Error:</strong> Activation failed, please contact our administrator."
2207
  msgstr ""
2208
 
2209
+ #: includes/class-wcj-emails-verification.php:304
2210
  #: includes/settings/wcj-settings-emails-verification.php:105
2211
  msgid ""
2212
  "Thank you for your registration. Your account has to be activated before you "
2213
  "can login. Please check your email."
2214
  msgstr ""
2215
 
2216
+ #: includes/class-wcj-emails-verification.php:314
2217
  #: includes/settings/wcj-settings-emails-verification.php:112
2218
  msgid ""
2219
  "<strong>Success:</strong> Your activation email has been resent. Please check "
2253
  msgstr ""
2254
 
2255
  #: includes/class-wcj-empty-cart-button.php:30
2256
+ #: includes/shortcodes/class-wcj-general-shortcodes.php:600
2257
  msgid "Empty Cart Button"
2258
  msgstr ""
2259
 
2398
  msgid "Export Products."
2399
  msgstr ""
2400
 
2401
+ #: includes/class-wcj-export-import.php:246
2402
+ #: includes/class-wcj-export-import.php:252
2403
  msgid "Filter by Billing Country"
2404
  msgstr ""
2405
 
2406
+ #: includes/class-wcj-export-import.php:247
2407
  msgid "Filter by Product Title"
2408
  msgstr ""
2409
 
2410
+ #: includes/class-wcj-export-import.php:266
2411
+ #: includes/reports/class-wcj-reports-product-sales-daily.php:219
2412
  #: includes/reports/class-wcj-reports-sales-gateways.php:162
2413
  #: includes/settings/wcj-settings-orders.php:48
2414
  msgid "Filter"
2415
  msgstr ""
2416
 
2417
+ #: includes/class-wcj-export-import.php:295
2418
  #: includes/class-wcj-track-users.php:45
2419
  msgid "All time"
2420
  msgstr ""
2421
 
2422
+ #: includes/class-wcj-export-import.php:314
2423
  msgid "Custom:"
2424
  msgstr ""
2425
 
2426
+ #: includes/class-wcj-export-import.php:320
2427
  msgid "Go"
2428
  msgstr ""
2429
 
2759
  msgstr ""
2760
 
2761
  #: includes/class-wcj-offer-price.php:164
2762
+ #: includes/functions/wcj-functions-reports.php:24
2763
  #: includes/settings/wcj-settings-cross-sells.php:47
2764
  #: includes/settings/wcj-settings-order-numbers.php:173
2765
  #: includes/settings/wcj-settings-products-xml.php:244
3477
  #: includes/class-wcj-product-by-country.php:203
3478
  #: includes/class-wcj-product-by-user-role.php:62
3479
  #: includes/class-wcj-product-info.php:255
3480
+ #: includes/class-wcj-product-price-by-formula.php:170
3481
  #: includes/class-wcj-shipping-by-products.php:214
3482
  #: includes/class-wcj-shipping-options.php:191
3483
  #: includes/classes/class-wcj-module.php:221
3527
  #: includes/settings/wcj-settings-currency-exchange-rates.php:61
3528
  #: includes/settings/wcj-settings-currency-exchange-rates.php:92
3529
  #: includes/settings/wcj-settings-currency-exchange-rates.php:100
 
3530
  #: includes/settings/wcj-settings-currency-per-product.php:63
3531
  #: includes/settings/wcj-settings-currency-per-product.php:80
3532
  #: includes/settings/wcj-settings-currency-per-product.php:87
3870
  msgid "Some of the required addons are not selected!"
3871
  msgstr ""
3872
 
3873
+ #: includes/class-wcj-product-addons.php:316
 
 
 
 
3874
  msgid ""
3875
  "Booster: Free plugin's version is limited to only three products with per "
3876
  "product addons enabled at a time. You will need to get <a href=\"https://"
4013
  #: includes/class-wcj-product-bulk-meta-editor.php:320
4014
  #: includes/class-wcj-product-by-user.php:301
4015
  #: includes/class-wcj-purchase-data.php:122
4016
+ #: includes/classes/class-wcj-module.php:1007
4017
+ #: includes/functions/wcj-functions-general.php:166
4018
  #: includes/functions/wcj-functions-html.php:138
4019
+ #: includes/reports/class-wcj-reports-monthly-sales.php:385
4020
  #: includes/settings/wcj-settings-empty-cart.php:88
4021
  #: includes/shortcodes/class-wcj-products-add-form-shortcodes.php:391
4022
  #: includes/tools/class-wcj-order-statuses-tool.php:213
4748
  msgid "Set formula for automatic product price calculation."
4749
  msgstr ""
4750
 
4751
+ #: includes/class-wcj-product-price-by-formula.php:127
4752
  msgid "Booking cost"
4753
  msgstr ""
4754
 
4755
+ #: includes/class-wcj-product-price-by-formula.php:142
4756
  #, php-format
4757
  msgid "From: %s"
4758
  msgstr ""
4759
 
4760
+ #: includes/class-wcj-product-price-by-formula.php:169
4761
  msgid "Reset products"
4762
  msgstr ""
4763
 
4764
+ #: includes/class-wcj-product-price-by-formula.php:175
4765
  msgid ""
4766
  "If enabled will also reset formula related settings on products when "
4767
  "<code>Reset Settings</code> button is pressed."
4768
  msgstr ""
4769
 
4770
+ #: includes/class-wcj-product-price-by-formula.php:175
4771
  msgid ""
4772
  "It's necessary to <code>Save changes</code> first with the option enabled so "
4773
  "the <code>Reset settings</code> can be pressed."
4925
  #: includes/settings/meta-box/wcj-settings-meta-box-product-by-date.php:25
4926
  #: includes/settings/meta-box/wcj-settings-meta-box-product-by-time.php:22
4927
  #: includes/settings/wcj-settings-checkout-core-fields.php:89
4928
+ #: includes/settings/wcj-settings-currency-exchange-rates.php:163
4929
  #: includes/settings/wcj-settings-order-numbers.php:49
4930
  #: includes/settings/wcj-settings-orders.php:184
4931
  #: includes/settings/wcj-settings-product-add-to-cart.php:68
5742
  msgid "Type:"
5743
  msgstr ""
5744
 
5745
+ #: includes/class-wcj-track-users.php:270
5746
  #, php-format
5747
  msgid "Top %d countries by visits"
5748
  msgstr ""
5749
 
5750
+ #: includes/class-wcj-track-users.php:343
5751
  #: includes/input-fields/wcj-product-input-fields-options.php:46
5752
  #: includes/settings/wcj-settings-checkout-custom-fields.php:154
5753
  #: includes/tools/class-wcj-eu-countries-vat-rates-tool.php:113
5755
  msgid "Country"
5756
  msgstr ""
5757
 
5758
+ #: includes/class-wcj-track-users.php:343
5759
  msgid "Visits"
5760
  msgstr ""
5761
 
5762
+ #: includes/class-wcj-track-users.php:382
5763
  #, php-format
5764
  msgid "Stats generated at %1$s. Next update is scheduled at %2$s."
5765
  msgstr ""
5766
 
5767
+ #: includes/class-wcj-track-users.php:390
5768
  msgid "Update now"
5769
  msgstr ""
5770
 
5853
  msgid "Get products in all languages"
5854
  msgstr ""
5855
 
5856
+ #: includes/classes/class-wcj-module.php:392
5857
  #, php-format
5858
  msgid ""
5859
  "Booster: Free plugin's version is limited to only one \"%1$s\" product with "
5862
  "\" products."
5863
  msgstr ""
5864
 
5865
+ #: includes/classes/class-wcj-module.php:779
5866
  #, php-format
5867
  msgid "Selected: %s."
5868
  msgstr ""
5869
 
5870
+ #: includes/classes/class-wcj-module.php:850
5871
  msgid "Back to Module Settings"
5872
  msgstr ""
5873
 
5874
+ #: includes/classes/class-wcj-module.php:871
5875
  #: includes/settings/wcj-settings-wpml.php:102
5876
  msgid "Module Tools"
5877
  msgstr ""
5878
 
5879
+ #: includes/classes/class-wcj-module.php:949
5880
  #: includes/settings/wcj-settings-checkout-core-fields.php:82
5881
  msgid "enabled"
5882
  msgstr ""
5883
 
5884
+ #: includes/classes/class-wcj-module.php:950
5885
  msgid "disabled"
5886
  msgstr ""
5887
 
5888
+ #: includes/classes/class-wcj-module.php:958
5889
  #: includes/settings/wcj-settings-product-tabs.php:181
5890
  #: includes/settings/wcj-settings-product-tabs.php:196
5891
  #: includes/settings/wcj-settings-product-tabs.php:211
5893
  msgid "Deprecated"
5894
  msgstr ""
5895
 
5896
+ #: includes/classes/class-wcj-module.php:997
5897
  msgid "Reset Settings"
5898
  msgstr ""
5899
 
5900
+ #: includes/classes/class-wcj-module.php:1003
5901
  msgid "Reset Module to Default Settings"
5902
  msgstr ""
5903
 
5904
+ #: includes/classes/class-wcj-module.php:1004
5905
  msgid "Reset Submodule to Default Settings"
5906
  msgstr ""
5907
 
5908
+ #: includes/classes/class-wcj-module.php:1013
5909
  msgid "Reset settings"
5910
  msgstr ""
5911
 
5912
+ #: includes/classes/class-wcj-module.php:1051
5913
  msgid "Module Options"
5914
  msgstr ""
5915
 
5916
+ #: includes/classes/class-wcj-module.php:1058
5917
  msgid "Enable Module"
5918
  msgstr ""
5919
 
5920
+ #: includes/classes/class-wcj-pdf-invoice.php:104
5921
  #: includes/settings/wcj-settings-pdf-invoicing-header.php:71
5922
  msgid "Company Name"
5923
  msgstr ""
5924
 
 
 
 
 
 
5925
  #: includes/classes/class-wcj-shortcodes.php:156
5926
+ #: includes/shortcodes/class-wcj-general-shortcodes.php:600
5927
  #, php-format
5928
  msgid "\"%s\" module is not enabled!"
5929
  msgstr ""
7750
  msgid "CoinMarketCap"
7751
  msgstr ""
7752
 
7753
+ #: includes/functions/wcj-functions-general.php:663
7754
  #: includes/settings/wcj-settings-cross-sells.php:78
7755
  #: includes/settings/wcj-settings-empty-cart.php:50
7756
  msgid "Before cart"
7757
  msgstr ""
7758
 
7759
+ #: includes/functions/wcj-functions-general.php:664
7760
  msgid "Before cart table"
7761
  msgstr ""
7762
 
7763
+ #: includes/functions/wcj-functions-general.php:665
7764
  msgid "Before cart contents"
7765
  msgstr ""
7766
 
7767
+ #: includes/functions/wcj-functions-general.php:666
7768
  msgid "Cart contents"
7769
  msgstr ""
7770
 
7771
+ #: includes/functions/wcj-functions-general.php:667
7772
  msgid "Cart coupon"
7773
  msgstr ""
7774
 
7775
+ #: includes/functions/wcj-functions-general.php:668
7776
  msgid "Cart actions"
7777
  msgstr ""
7778
 
7779
+ #: includes/functions/wcj-functions-general.php:669
7780
  msgid "After cart contents"
7781
  msgstr ""
7782
 
7783
+ #: includes/functions/wcj-functions-general.php:670
7784
  msgid "After cart table"
7785
  msgstr ""
7786
 
7787
+ #: includes/functions/wcj-functions-general.php:671
7788
  #: includes/settings/wcj-settings-cross-sells.php:79
7789
  msgid "Cart collaterals"
7790
  msgstr ""
7791
 
7792
+ #: includes/functions/wcj-functions-general.php:672
7793
  #: includes/settings/wcj-settings-cross-sells.php:80
7794
  #: includes/settings/wcj-settings-empty-cart.php:59
7795
  msgid "After cart"
7796
  msgstr ""
7797
 
7798
+ #: includes/functions/wcj-functions-general.php:674
7799
  msgid "Before cart totals"
7800
  msgstr ""
7801
 
7802
+ #: includes/functions/wcj-functions-general.php:675
7803
  #: includes/settings/wcj-settings-empty-cart.php:52
7804
  msgid "Cart totals: Before shipping"
7805
  msgstr ""
7806
 
7807
+ #: includes/functions/wcj-functions-general.php:676
7808
  #: includes/settings/wcj-settings-empty-cart.php:53
7809
  msgid "Cart totals: After shipping"
7810
  msgstr ""
7811
 
7812
+ #: includes/functions/wcj-functions-general.php:677
7813
  #: includes/settings/wcj-settings-empty-cart.php:54
7814
  msgid "Cart totals: Before order total"
7815
  msgstr ""
7816
 
7817
+ #: includes/functions/wcj-functions-general.php:678
7818
  #: includes/settings/wcj-settings-empty-cart.php:55
7819
  msgid "Cart totals: After order total"
7820
  msgstr ""
7821
 
7822
+ #: includes/functions/wcj-functions-general.php:679
7823
  msgid "Proceed to checkout"
7824
  msgstr ""
7825
 
7826
+ #: includes/functions/wcj-functions-general.php:680
7827
  msgid "After cart totals"
7828
  msgstr ""
7829
 
7830
+ #: includes/functions/wcj-functions-general.php:682
7831
  msgid "Before shipping calculator"
7832
  msgstr ""
7833
 
7834
+ #: includes/functions/wcj-functions-general.php:683
7835
  msgid "After shipping calculator"
7836
  msgstr ""
7837
 
7838
+ #: includes/functions/wcj-functions-general.php:685
7839
  msgid "If cart is empty"
7840
  msgstr ""
7841
 
7864
  msgid "Custom Document"
7865
  msgstr ""
7866
 
 
 
 
 
7867
  #: includes/functions/wcj-functions-reports.php:25
7868
  msgid "Daily Total Sum"
7869
  msgstr ""
8513
  msgid "Renumerate invoices"
8514
  msgstr ""
8515
 
8516
+ #: includes/pdf-invoices/class-wcj-pdf-invoicing-renumerate-tool.php:158
8517
+ msgid "Results"
8518
+ msgstr ""
8519
+
8520
+ #: includes/pdf-invoices/class-wcj-pdf-invoicing-renumerate-tool.php:247
8521
  #, php-format
8522
  msgid "Total documents created: %d"
8523
  msgstr ""
8524
 
8525
+ #: includes/pdf-invoices/class-wcj-pdf-invoicing-renumerate-tool.php:249
8526
  #, php-format
8527
  msgid "Total documents deleted: %d"
8528
  msgstr ""
8536
  msgstr ""
8537
 
8538
  #: includes/pdf-invoices/class-wcj-pdf-invoicing-report-tool.php:105
8539
+ #: includes/pdf-invoices/class-wcj-pdf-invoicing-report-tool.php:126
8540
  msgid "Please fill year and month values."
8541
  msgstr ""
8542
 
8556
  msgid "Download monthly documents CSV"
8557
  msgstr ""
8558
 
8559
+ #: includes/pdf-invoices/class-wcj-pdf-invoicing-report-tool.php:208
8560
  #, php-format
8561
  msgid ""
8562
  "Booster: %s class is not accessible on your server. Please contact your "
8563
  "hosting provider."
8564
  msgstr ""
8565
 
8566
+ #: includes/pdf-invoices/class-wcj-pdf-invoicing-report-tool.php:287
8567
  #, php-format
8568
  msgid "No documents (%1$s) found for %2$d-%3$02d."
8569
  msgstr ""
8763
  msgid "Total customers"
8764
  msgstr ""
8765
 
8766
+ #: includes/reports/class-wcj-reports-customers.php:151
8767
  msgid "Country Code"
8768
  msgstr ""
8769
 
8770
+ #: includes/reports/class-wcj-reports-customers.php:152
8771
  msgid "Customers Count"
8772
  msgstr ""
8773
 
8774
+ #: includes/reports/class-wcj-reports-customers.php:153
8775
  msgid "Percent of total"
8776
  msgstr ""
8777
 
8778
+ #: includes/reports/class-wcj-reports-customers.php:189
8779
  msgid "Report for:"
8780
  msgstr ""
8781
 
8840
  msgid "Totals"
8841
  msgstr ""
8842
 
8843
+ #: includes/reports/class-wcj-reports-monthly-sales.php:355
8844
  msgid "Report currency"
8845
  msgstr ""
8846
 
8847
+ #: includes/reports/class-wcj-reports-monthly-sales.php:376
8848
  #, php-format
8849
  msgid "Report generated in: %s s"
8850
  msgstr ""
8851
 
8852
+ #: includes/reports/class-wcj-reports-monthly-sales.php:380
8853
  msgid "Save Currency Rates"
8854
  msgstr ""
8855
 
8856
+ #: includes/reports/class-wcj-reports-monthly-sales.php:385
8857
  msgid "Reset Currency Rates"
8858
  msgstr ""
8859
 
8860
+ #: includes/reports/class-wcj-reports-product-sales-daily.php:184
8861
+ #: includes/reports/class-wcj-reports-sales-gateways.php:129
8862
  #: includes/reports/class-wcj-reports-sales.php:365
8863
  msgid "Reports Settings"
8864
  msgstr ""
8865
 
8866
+ #: includes/reports/class-wcj-reports-product-sales-daily.php:308
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8867
  #, php-format
8868
  msgid "Total: %d"
8869
  msgstr ""
8870
 
8871
+ #: includes/reports/class-wcj-reports-product-sales-daily.php:313
8872
+ #: includes/reports/class-wcj-reports-product-sales-daily.php:318
8873
  #, php-format
8874
  msgid "Total: %s"
8875
  msgstr ""
8876
 
8877
+ #: includes/reports/class-wcj-reports-product-sales-daily.php:337
8878
+ #: includes/reports/class-wcj-reports-sales-gateways.php:193
8879
  #, php-format
8880
  msgid "Total orders: %d"
8881
  msgstr ""
8882
 
8883
+ #: includes/reports/class-wcj-reports-product-sales-daily.php:338
8884
+ #: includes/reports/class-wcj-reports-sales-gateways.php:195
8885
+ #: includes/reports/class-wcj-reports-sales.php:393
8886
  msgid "No sales data for current period."
8887
  msgstr ""
8888
 
8889
+ #: includes/reports/class-wcj-reports-sales-gateways.php:99
8890
  #: includes/reports/class-wcj-reports-stock.php:121
8891
  #: includes/reports/class-wcj-reports-stock.php:197
8892
  msgid "N/A"
8893
  msgstr ""
8894
 
8895
+ #: includes/reports/class-wcj-reports-sales-gateways.php:179
8896
  msgid "Gateway"
8897
  msgstr ""
8898
 
8916
  msgid "Total Profit"
8917
  msgstr ""
8918
 
8919
+ #: includes/reports/class-wcj-reports-sales.php:387
8920
  msgid "Filter products"
8921
  msgstr ""
8922
 
8996
  msgid "profit:"
8997
  msgstr ""
8998
 
8999
+ #: includes/reports/class-wcj-reports-stock.php:360
9000
+ msgid "Product not available"
9001
+ msgstr ""
9002
+
9003
+ #: includes/reports/class-wcj-reports-stock.php:365
9004
  msgid "Total current stock value"
9005
  msgstr ""
9006
 
9007
+ #: includes/reports/class-wcj-reports-stock.php:366
9008
  msgid "Total stock value"
9009
  msgstr ""
9010
 
9011
+ #: includes/reports/class-wcj-reports-stock.php:367
9012
  msgid "Product stock value average"
9013
  msgstr ""
9014
 
9015
+ #: includes/reports/class-wcj-reports-stock.php:368
9016
  msgid "Product stock average"
9017
  msgstr ""
9018
 
9019
+ #: includes/reports/class-wcj-reports-stock.php:370
9020
  msgid "Total current stock purchase price"
9021
  msgstr ""
9022
 
9023
+ #: includes/reports/class-wcj-reports-stock.php:374
9024
  msgid "Report was generated in: "
9025
  msgstr ""
9026
 
11908
  msgstr ""
11909
 
11910
  #: includes/settings/wcj-settings-currency-exchange-rates.php:99
 
 
 
 
 
 
 
 
 
 
11911
  msgid "Force Point as Decimal Separator"
11912
  msgstr ""
11913
 
11914
+ #: includes/settings/wcj-settings-currency-exchange-rates.php:101
11915
  msgid "Force \".\" as decimal separator for exchange rates."
11916
  msgstr ""
11917
 
11918
+ #: includes/settings/wcj-settings-currency-exchange-rates.php:111
11919
  msgid "API Keys"
11920
  msgstr ""
11921
 
11922
+ #: includes/settings/wcj-settings-currency-exchange-rates.php:112
11923
  msgid "API keys provided by the Exchange Rates Servers"
11924
  msgstr ""
11925
 
11926
+ #: includes/settings/wcj-settings-currency-exchange-rates.php:117
11927
  msgid "Free Currency Converter"
11928
  msgstr ""
11929
 
11930
+ #: includes/settings/wcj-settings-currency-exchange-rates.php:119
11931
  #, php-format
11932
  msgid "More information at %s"
11933
  msgstr ""
11934
 
11935
+ #: includes/settings/wcj-settings-currency-exchange-rates.php:128
11936
  msgid "Custom Currencies Options"
11937
  msgstr ""
11938
 
11939
+ #: includes/settings/wcj-settings-currency-exchange-rates.php:131
11940
  #, php-format
11941
  msgid ""
11942
  "You can add more currencies in this section. E.g. this can be used to display "
11943
  "exchange rates with %s shortcodes."
11944
  msgstr ""
11945
 
11946
+ #: includes/settings/wcj-settings-currency-exchange-rates.php:144
11947
  #: includes/settings/wcj-settings-currency.php:72
11948
  msgid "Total Custom Currencies"
11949
  msgstr ""
11950
 
11951
+ #: includes/settings/wcj-settings-currency-exchange-rates.php:159
11952
  #: includes/settings/wcj-settings-currency.php:87
11953
  msgid "Custom Currency"
11954
  msgstr ""
11955
 
11956
+ #: includes/settings/wcj-settings-currency-exchange-rates.php:184
11957
  #: includes/settings/wcj-settings-price-by-country.php:420
11958
  msgid "Exchange Rates"
11959
  msgstr ""
11960
 
11961
+ #: includes/settings/wcj-settings-currency-exchange-rates.php:186
11962
  msgid ""
11963
  "All currencies from all <strong>enabled</strong> modules (with \"Exchange "
11964
  "Rates Updates\" set to \"Automatically via Currency Exchange Rates module\") "
17150
 
17151
  #: includes/settings/wcj-settings-product-by-condition.php:91
17152
  #: includes/settings/wcj-settings-related-products.php:182
17153
+ #: includes/shortcodes/class-wcj-order-items-shortcodes.php:219
17154
  msgid "Standard"
17155
  msgstr ""
17156
 
readme.txt CHANGED
@@ -4,7 +4,7 @@ Tags: woocommerce customization, woocommerce bundle, woocommerce product addon,
4
  Requires at least: 5.8
5
  Tested up to: 6.1
6
  Requires PHP: 7.2
7
- Stable tag: 5.6.8
8
  License: GNU General Public License v3.0
9
  License URI: http://www.gnu.org/licenses/gpl-3.0.html
10
 
@@ -275,6 +275,20 @@ To unlock all Booster for WooCommerce features, please install additional paid B
275
 
276
  == Changelog ==
277
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
278
  = 5.6.8 16/11/2022 =
279
 
280
  * FIXED - CART & CHECKOUT - EU VAT Number - Replace endpoint to validate EU VAT number for without soap method.
4
  Requires at least: 5.8
5
  Tested up to: 6.1
6
  Requires PHP: 7.2
7
+ Stable tag: 6.0.0
8
  License: GNU General Public License v3.0
9
  License URI: http://www.gnu.org/licenses/gpl-3.0.html
10
 
275
 
276
  == Changelog ==
277
 
278
+ = 6.0.0 30/11/2022 =
279
+
280
+ * FIXED - PDF INVOICING & PACKING SLIPS - PDF Invoicing - Fixed error PHP Deprecated: Function WC_Order_Item_Product::offsetSet is deprecated since version...
281
+ * FIXED - PDF INVOICING & PACKING SLIPS - PDF Invoicing - Fixed calculation issue in wcj_order_item_total_refunded shortcode.
282
+ * FIXED - PRICES & CURRENCIES - Currency Exchange Rates - Fixed exchange rate issue for European Central Bank (ECB) exchange rate server response.
283
+ * FIXED - PRICES & CURRENCIES - Currency Exchange Rates - "Always Use cURL" option removed.
284
+ * FIXED - PRICES & CURRENCIES - Multicurrency (Currency Switcher) - Fixed Default Currency and Role Defaults conflict.
285
+ * FIXED - PRICES & CURRENCIES - Product Price by Formula - Fixed verify nonce issue.
286
+ * FIXED - EMAILS & MISC. - General - Added missing images for jquery-ui.css
287
+ * FIXED - Added Security vulnerability fixes - Multiple CSRF.
288
+ * FIXED - Added Security vulnerability fixes.
289
+ * WooCommerce 7.1.0 tested
290
+ * WordPress 6.1 tested
291
+
292
  = 5.6.8 16/11/2022 =
293
 
294
  * FIXED - CART & CHECKOUT - EU VAT Number - Replace endpoint to validate EU VAT number for without soap method.
version-details.json CHANGED
@@ -1,7 +1,7 @@
1
  {
2
- "0" : "= 5.6.8 16/11/2022 =",
3
- "1" : "* FIXED - CART & CHECKOUT - EU VAT Number - Replace endpoint to validate EU VAT number for without soap method",
4
- "2" : "* FIXED - EMAILS & MISC. - Admin Tools - Fixed admin order page issue when order item value is array.",
5
  "3" : "* FIXED - Added Security vulnerability fixes",
6
  "4" : "* WooCommerce 7.1.0 tested",
7
  "5" : "* WordPress 6.1 Tested"
1
  {
2
+ "0" : "= 6.0.0 30/11/2022 =",
3
+ "1" : "* FIXED - PDF INVOICING & PACKING SLIPS - PDF Invoicing - Fixed error PHP Deprecated: Function WC_Order_Item_Product::offsetSet is deprecated since version...",
4
+ "2" : "* FIXED - PRICES & CURRENCIES - Currency Exchange Rates - Fixed exchange rate issue for European Central Bank (ECB) exchange rate server response.",
5
  "3" : "* FIXED - Added Security vulnerability fixes",
6
  "4" : "* WooCommerce 7.1.0 tested",
7
  "5" : "* WordPress 6.1 Tested"
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: 5.6.8
7
  * Author: Pluggabl LLC
8
  * Author URI: https://booster.io
9
  * Text Domain: woocommerce-jetpack
@@ -65,7 +65,7 @@ if ( ! class_exists( 'WC_Jetpack' ) ) :
65
  * @var string
66
  * @since 2.4.7
67
  */
68
- public $version = '5.6.8';
69
 
70
  /**
71
  * 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: 6.0.0
7
  * Author: Pluggabl LLC
8
  * Author URI: https://booster.io
9
  * Text Domain: woocommerce-jetpack
65
  * @var string
66
  * @since 2.4.7
67
  */
68
+ public $version = '6.0.0';
69
 
70
  /**
71
  * The single instance of the class