Booster for WooCommerce - Version 3.5.3

Version Description

  • 12/04/2018 =
  • Dev - PRODUCTS - Cross Sells - Initial module release.
  • Dev - PRODUCTS - Product Input Fields - Shortcodes are now processed in product input fields titles and placeholders.
  • Dev - PRODUCTS - Upsells - Initial module release.
  • Fix - CART & CHECKOUT - Empty Cart Button - Button position on the Checkout page - Some possible positions removed (fixes the issue with "Place order" button not working etc.).
  • Dev - CART & CHECKOUT - Empty Cart Button - Button position on the Cart page - More possible positions added.
  • Fix - PDF INVOICING & PACKING SLIPS - Email Options - Checking for invoice to be created before attaching it to email (fixes the issue with empty invoices attached with zero total orders, and "Do not create if order total equals zero" option enabled).
  • Dev - EMAILS & MISC. - Admin Tools - "Show Booster Menus Only to Admin" option added.
Download this release

Release Info

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

Code changes from version 3.5.2 to 3.5.3

includes/admin/class-wcj-tools.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce Tools
4
  *
5
- * @version 2.5.7
6
  * @author Algoritmika Ltd.
7
  */
8
 
@@ -24,14 +24,14 @@ class WCJ_Tools {
24
  /**
25
  * add_wcj_tools.
26
  *
27
- * @version 2.5.7
28
  */
29
  function add_wcj_tools() {
30
  add_submenu_page(
31
  'woocommerce',
32
  __( 'Booster for WooCommerce Tools', 'woocommerce-jetpack' ),
33
  __( 'Booster Tools', 'woocommerce-jetpack' ),
34
- 'manage_woocommerce',
35
  'wcj-tools',
36
  array( $this, 'create_tools_page' )
37
  );
2
  /**
3
  * Booster for WooCommerce Tools
4
  *
5
+ * @version 3.5.3
6
  * @author Algoritmika Ltd.
7
  */
8
 
24
  /**
25
  * add_wcj_tools.
26
  *
27
+ * @version 3.5.3
28
  */
29
  function add_wcj_tools() {
30
  add_submenu_page(
31
  'woocommerce',
32
  __( 'Booster for WooCommerce Tools', 'woocommerce-jetpack' ),
33
  __( 'Booster Tools', 'woocommerce-jetpack' ),
34
+ ( 'yes' === get_option( 'wcj_' . 'admin_tools' . '_enabled', 'no' ) && 'yes' === get_option( 'wcj_admin_tools_show_menus_to_admin_only', 'no' ) ? 'manage_options' : 'manage_woocommerce' ),
35
  'wcj-tools',
36
  array( $this, 'create_tools_page' )
37
  );
includes/admin/wcj-modules-cats.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Modules Array
4
  *
5
- * @version 3.5.0
6
  * @since 2.2.0
7
  * @author Algoritmika Ltd.
8
  * @todo (maybe) split "Shipping & Orders", "Cart & Checkout", "Products", "Prices & Currencies" etc.
@@ -66,6 +66,8 @@ return apply_filters( 'wcj_modules', array(
66
  'product_tabs',
67
  'product_custom_info',
68
  'related_products',
 
 
69
  'sorting',
70
  'sku',
71
  'stock',
2
  /**
3
  * Booster for WooCommerce - Modules Array
4
  *
5
+ * @version 3.5.3
6
  * @since 2.2.0
7
  * @author Algoritmika Ltd.
8
  * @todo (maybe) split "Shipping & Orders", "Cart & Checkout", "Products", "Prices & Currencies" etc.
66
  'product_tabs',
67
  'product_custom_info',
68
  'related_products',
69
+ 'cross_sells',
70
+ 'upsells',
71
  'sorting',
72
  'sku',
73
  'stock',
includes/class-wcj-cross-sells.php ADDED
@@ -0,0 +1,90 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Booster for WooCommerce - Module - Cross-sells
4
+ *
5
+ * @version 3.5.3
6
+ * @since 3.5.3
7
+ * @author Algoritmika Ltd.
8
+ */
9
+
10
+ if ( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly
11
+
12
+ if ( ! class_exists( 'WCJ_Cross_Sells' ) ) :
13
+
14
+ class WCJ_Cross_Sells extends WCJ_Module {
15
+
16
+ /**
17
+ * Constructor.
18
+ *
19
+ * @version 3.5.3
20
+ * @since 3.5.3
21
+ * @todo use `woocommerce_product_get_cross_sell_ids` (since WC v3.0.0)
22
+ */
23
+ function __construct() {
24
+
25
+ $this->id = 'cross_sells';
26
+ $this->short_desc = __( 'Cross-sells', 'woocommerce-jetpack' );
27
+ $this->extra_desc = __( 'Cross-sells are products which you promote in the cart, based on the current product.', 'woocommerce' );
28
+ $this->desc = __( 'Customize WooCommerce cross-sells products display.', 'woocommerce-jetpack' );
29
+ $this->link_slug = 'woocommerce-cross-sells';
30
+ parent::__construct();
31
+
32
+ if ( $this->is_enabled() ) {
33
+ add_filter( 'woocommerce_cross_sells_total', array( $this, 'cross_sells_total' ), PHP_INT_MAX );
34
+ add_filter( 'woocommerce_cross_sells_columns', array( $this, 'cross_sells_columns' ), PHP_INT_MAX );
35
+ add_filter( 'woocommerce_cross_sells_orderby', array( $this, 'cross_sells_orderby' ), PHP_INT_MAX );
36
+ if ( ! WCJ_IS_WC_VERSION_BELOW_3_3_0 ) {
37
+ add_filter( 'woocommerce_cross_sells_order', array( $this, 'cross_sells_order' ), PHP_INT_MAX );
38
+ }
39
+ }
40
+
41
+ }
42
+
43
+ /**
44
+ * cross_sells_order.
45
+ *
46
+ * @version 3.5.3
47
+ * @since 3.5.3
48
+ */
49
+ function cross_sells_order( $order ) {
50
+ return ( 'no_changes' != ( $_order = get_option( 'wcj_cross_sells_order', 'no_changes' ) ) ? $_order : $order );
51
+ }
52
+
53
+ /**
54
+ * cross_sells_orderby.
55
+ *
56
+ * @version 3.5.3
57
+ * @since 3.5.3
58
+ */
59
+ function cross_sells_orderby( $orderby ) {
60
+ return ( 'no_changes' != ( $_orderby = get_option( 'wcj_cross_sells_orderby', 'no_changes' ) ) ? $_orderby : $orderby );
61
+ }
62
+
63
+ /**
64
+ * cross_sells_columns.
65
+ *
66
+ * @version 3.5.3
67
+ * @since 3.5.3
68
+ */
69
+ function cross_sells_columns( $columns ) {
70
+ return ( 0 != ( $_columns = get_option( 'wcj_cross_sells_columns', 0 ) ) ? $_columns : $columns );
71
+ }
72
+
73
+ /**
74
+ * cross_sells_total.
75
+ *
76
+ * @version 3.5.3
77
+ * @since 3.5.3
78
+ */
79
+ function cross_sells_total( $limit ) {
80
+ if ( 'yes' === get_option( 'wcj_cross_sells_hide', 'no' ) ) {
81
+ return 0;
82
+ }
83
+ return ( 0 != ( $_limit = get_option( 'wcj_cross_sells_total', 0 ) ) ? $_limit : $limit );
84
+ }
85
+
86
+ }
87
+
88
+ endif;
89
+
90
+ return new WCJ_Cross_Sells();
includes/class-wcj-empty-cart-button.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Module - Empty Cart Button
4
  *
5
- * @version 2.8.0
6
  * @since 2.2.1
7
  * @author Algoritmika Ltd.
8
  */
@@ -16,8 +16,9 @@ class WCJ_Empty_Cart_Button extends WCJ_Module {
16
  /**
17
  * Constructor.
18
  *
19
- * @version 2.8.0
20
- * @todo copy additional options form "Empty Cart Button" plugin
 
21
  */
22
  function __construct() {
23
 
@@ -35,6 +36,19 @@ class WCJ_Empty_Cart_Button extends WCJ_Module {
35
  add_action( $empty_cart_cart_position, array( $this, 'add_empty_cart_link' ) );
36
  }
37
  if ( 'disable' != ( $empty_cart_checkout_position = get_option( 'wcj_empty_cart_checkout_position', 'disable' ) ) ) {
 
 
 
 
 
 
 
 
 
 
 
 
 
38
  add_action( $empty_cart_checkout_position, array( $this, 'add_empty_cart_link' ) );
39
  }
40
  }
2
  /**
3
  * Booster for WooCommerce - Module - Empty Cart Button
4
  *
5
+ * @version 3.5.3
6
  * @since 2.2.1
7
  * @author Algoritmika Ltd.
8
  */
16
  /**
17
  * Constructor.
18
  *
19
+ * @version 3.5.3
20
+ * @since 2.2.1
21
+ * @todo recheck and maybe copy additional options form "Empty Cart Button" plugin
22
  */
23
  function __construct() {
24
 
36
  add_action( $empty_cart_cart_position, array( $this, 'add_empty_cart_link' ) );
37
  }
38
  if ( 'disable' != ( $empty_cart_checkout_position = get_option( 'wcj_empty_cart_checkout_position', 'disable' ) ) ) {
39
+ $deprecated_hooks = array(
40
+ 'woocommerce_checkout_before_customer_details' => 'woocommerce_before_checkout_form',
41
+ 'woocommerce_checkout_billing' => 'woocommerce_before_checkout_form',
42
+ 'woocommerce_checkout_shipping' => 'woocommerce_before_checkout_form',
43
+ 'woocommerce_checkout_after_customer_details' => 'woocommerce_after_checkout_form',
44
+ 'woocommerce_checkout_before_order_review' => 'woocommerce_after_checkout_form',
45
+ 'woocommerce_checkout_order_review' => 'woocommerce_after_checkout_form',
46
+ 'woocommerce_checkout_after_order_review' => 'woocommerce_after_checkout_form',
47
+ );
48
+ if ( isset( $deprecated_hooks[ $empty_cart_checkout_position ] ) ) {
49
+ $empty_cart_checkout_position = $deprecated_hooks[ $empty_cart_checkout_position ];
50
+ update_option( 'wcj_empty_cart_checkout_position', $empty_cart_checkout_position );
51
+ }
52
  add_action( $empty_cart_checkout_position, array( $this, 'add_empty_cart_link' ) );
53
  }
54
  }
includes/class-wcj-upsells.php ADDED
@@ -0,0 +1,82 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Booster for WooCommerce - Module - Upsells
4
+ *
5
+ * @version 3.5.3
6
+ * @since 3.5.3
7
+ * @author Algoritmika Ltd.
8
+ */
9
+
10
+ if ( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly
11
+
12
+ if ( ! class_exists( 'WCJ_Upsells' ) ) :
13
+
14
+ class WCJ_Upsells extends WCJ_Module {
15
+
16
+ /**
17
+ * Constructor.
18
+ *
19
+ * @version 3.5.3
20
+ * @since 3.5.3
21
+ * @todo (maybe) Hide Upsells - maybe better by `remove_action( 'woocommerce_after_single_product_summary', 'woocommerce_upsell_display', 15 );`
22
+ * @todo (maybe) use `apply_filters( 'woocommerce_upsell_display_args', array( 'posts_per_page' => $limit, 'orderby' => $orderby, 'columns' => $columns ) );`
23
+ * @todo (maybe) use `apply_filters( 'woocommerce_product_upsell_ids', $this->get_upsell_ids(), $this );` and `woocommerce_product_get_upsell_ids` (since WC v3.0.0)
24
+ */
25
+ function __construct() {
26
+
27
+ $this->id = 'upsells';
28
+ $this->short_desc = __( 'Upsells', 'woocommerce-jetpack' );
29
+ $this->extra_desc = __( 'Upsells are products which you recommend instead of the currently viewed product, for example, products that are more profitable or better quality or more expensive.', 'woocommerce' );
30
+ $this->desc = __( 'Customize WooCommerce upsells products display.', 'woocommerce-jetpack' );
31
+ $this->link_slug = 'woocommerce-upsells';
32
+ parent::__construct();
33
+
34
+ if ( $this->is_enabled() ) {
35
+ add_filter( 'woocommerce_upsells_total', array( $this, 'upsells_total' ), PHP_INT_MAX );
36
+ add_filter( 'woocommerce_upsells_columns', array( $this, 'upsells_columns' ), PHP_INT_MAX );
37
+ add_filter( 'woocommerce_upsells_orderby', array( $this, 'upsells_orderby' ), PHP_INT_MAX );
38
+ }
39
+
40
+ }
41
+
42
+ /**
43
+ * upsells_orderby.
44
+ *
45
+ * @version 3.5.3
46
+ * @since 3.5.3
47
+ * @todo (maybe) check for `isset( $args['orderby'] )`
48
+ */
49
+ function upsells_orderby( $orderby ) {
50
+ return ( 'no_changes' != ( $_orderby = get_option( 'wcj_upsells_orderby', 'no_changes' ) ) ? $_orderby : $orderby );
51
+ }
52
+
53
+ /**
54
+ * upsells_columns.
55
+ *
56
+ * @version 3.5.3
57
+ * @since 3.5.3
58
+ * @todo (maybe) check for `isset( $args['columns'] )`
59
+ */
60
+ function upsells_columns( $columns ) {
61
+ return ( 0 != ( $_columns = get_option( 'wcj_upsells_columns', 0 ) ) ? $_columns : $columns );
62
+ }
63
+
64
+ /**
65
+ * upsells_total.
66
+ *
67
+ * @version 3.5.3
68
+ * @since 3.5.3
69
+ * @todo (maybe) check for `isset( $args['posts_per_page'] )`
70
+ */
71
+ function upsells_total( $limit ) {
72
+ if ( 'yes' === get_option( 'wcj_upsells_hide', 'no' ) ) {
73
+ return 0;
74
+ }
75
+ return ( 0 != ( $_limit = get_option( 'wcj_upsells_total', 0 ) ) ? $_limit : $limit );
76
+ }
77
+
78
+ }
79
+
80
+ endif;
81
+
82
+ return new WCJ_Upsells();
includes/core/class-wcj-admin.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Core - Admin
4
  *
5
- * @version 3.4.0
6
  * @since 3.2.4
7
  * @author Algoritmika Ltd.
8
  */
@@ -89,14 +89,14 @@ class WCJ_Admin {
89
  /**
90
  * Add menu item
91
  *
92
- * @version 2.9.0
93
  */
94
  function booster_menu() {
95
  add_submenu_page(
96
  'woocommerce',
97
  __( 'Booster for WooCommerce', 'woocommerce-jetpack' ),
98
  __( 'Booster Settings', 'woocommerce-jetpack' ) ,
99
- 'manage_woocommerce',
100
  'admin.php?page=wc-settings&tab=jetpack'
101
  );
102
  }
2
  /**
3
  * Booster for WooCommerce - Core - Admin
4
  *
5
+ * @version 3.5.3
6
  * @since 3.2.4
7
  * @author Algoritmika Ltd.
8
  */
89
  /**
90
  * Add menu item
91
  *
92
+ * @version 3.5.3
93
  */
94
  function booster_menu() {
95
  add_submenu_page(
96
  'woocommerce',
97
  __( 'Booster for WooCommerce', 'woocommerce-jetpack' ),
98
  __( 'Booster Settings', 'woocommerce-jetpack' ) ,
99
+ ( 'yes' === get_option( 'wcj_' . 'admin_tools' . '_enabled', 'no' ) && 'yes' === get_option( 'wcj_admin_tools_show_menus_to_admin_only', 'no' ) ? 'manage_options' : 'manage_woocommerce' ),
100
  'admin.php?page=wc-settings&tab=jetpack'
101
  );
102
  }
includes/core/wcj-modules.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Modules
4
  *
5
- * @version 3.5.0
6
  * @since 3.2.4
7
  * @author Algoritmika Ltd.
8
  */
@@ -24,6 +24,8 @@ $wcj_module_files = array(
24
  'class-wcj-product-add-to-cart.php',
25
  'class-wcj-add-to-cart-button-visibility.php',
26
  'class-wcj-related-products.php',
 
 
27
  'class-wcj-sku.php',
28
  'class-wcj-stock.php',
29
  'class-wcj-product-tabs.php',
2
  /**
3
  * Booster for WooCommerce - Modules
4
  *
5
+ * @version 3.5.3
6
  * @since 3.2.4
7
  * @author Algoritmika Ltd.
8
  */
24
  'class-wcj-product-add-to-cart.php',
25
  'class-wcj-add-to-cart-button-visibility.php',
26
  'class-wcj-related-products.php',
27
+ 'class-wcj-cross-sells.php',
28
+ 'class-wcj-upsells.php',
29
  'class-wcj-sku.php',
30
  'class-wcj-stock.php',
31
  'class-wcj-product-tabs.php',
includes/input-fields/class-wcj-product-input-fields-core.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Product Input Fields - Core
4
  *
5
- * @version 3.5.0
6
  * @author Algoritmika Ltd.
7
  */
8
 
@@ -20,6 +20,7 @@ class WCJ_Product_Input_Fields_Core {
20
  *
21
  * @version 3.4.0
22
  * @todo save all info (e.g. label etc.) in order meta
 
23
  */
24
  function __construct( $scope ) {
25
  $this->scope = $scope;
@@ -456,7 +457,7 @@ class WCJ_Product_Input_Fields_Core {
456
  /**
457
  * add_product_input_fields_to_frontend.
458
  *
459
- * @version 3.5.0
460
  * @todo `$set_value` - add "default" option for all other types except checkbox
461
  * @todo `$set_value` - 'file' type
462
  * @todo add `required` attributes
@@ -493,10 +494,10 @@ class WCJ_Product_Input_Fields_Core {
493
  $datepicker_year = '';
494
  }
495
 
496
- $timepicker_format = $this->get_value( 'wcj_product_input_fields_type_timepicker_format_' . $this->scope . '_' . $i, $_product_id, 'hh:mm p' );
497
  $timepicker_interval = $this->get_value( 'wcj_product_input_fields_type_timepicker_interval_' . $this->scope . '_' . $i, $_product_id, 15 );
498
- $timepicker_mintime = $this->get_value( 'wcj_product_input_fields_type_timepicker_mintime_' . $this->scope . '_' . $i, $_product_id, '' );
499
- $timepicker_maxtime = $this->get_value( 'wcj_product_input_fields_type_timepicker_maxtime_' . $this->scope . '_' . $i, $_product_id, '' );
500
  if ( '' != $timepicker_mintime ) {
501
  $timepicker_mintime = ' mintime="' . $timepicker_mintime . '"';
502
  }
@@ -639,10 +640,10 @@ class WCJ_Product_Input_Fields_Core {
639
  $field_order = $i;
640
  }
641
  $fields[ $field_order ] = apply_filters( 'wcj_product_input_field_frontend_html', $html, array(
642
- 'title' => $title,
643
  'type' => $type,
644
  'field_name' => $field_name,
645
- 'placeholder' => $placeholder,
646
  'custom_attributes' => $custom_attributes,
647
  '_product_id' => $_product_id,
648
  '_field_nr' => $i,
2
  /**
3
  * Booster for WooCommerce - Product Input Fields - Core
4
  *
5
+ * @version 3.5.3
6
  * @author Algoritmika Ltd.
7
  */
8
 
20
  *
21
  * @version 3.4.0
22
  * @todo save all info (e.g. label etc.) in order meta
23
+ * @todo add `do_shortcode()` to all applicable options (e.g. "Message on required")
24
  */
25
  function __construct( $scope ) {
26
  $this->scope = $scope;
457
  /**
458
  * add_product_input_fields_to_frontend.
459
  *
460
+ * @version 3.5.3
461
  * @todo `$set_value` - add "default" option for all other types except checkbox
462
  * @todo `$set_value` - 'file' type
463
  * @todo add `required` attributes
494
  $datepicker_year = '';
495
  }
496
 
497
+ $timepicker_format = $this->get_value( 'wcj_product_input_fields_type_timepicker_format_' . $this->scope . '_' . $i, $_product_id, 'hh:mm p' );
498
  $timepicker_interval = $this->get_value( 'wcj_product_input_fields_type_timepicker_interval_' . $this->scope . '_' . $i, $_product_id, 15 );
499
+ $timepicker_mintime = $this->get_value( 'wcj_product_input_fields_type_timepicker_mintime_' . $this->scope . '_' . $i, $_product_id, '' );
500
+ $timepicker_maxtime = $this->get_value( 'wcj_product_input_fields_type_timepicker_maxtime_' . $this->scope . '_' . $i, $_product_id, '' );
501
  if ( '' != $timepicker_mintime ) {
502
  $timepicker_mintime = ' mintime="' . $timepicker_mintime . '"';
503
  }
640
  $field_order = $i;
641
  }
642
  $fields[ $field_order ] = apply_filters( 'wcj_product_input_field_frontend_html', $html, array(
643
+ 'title' => do_shortcode( $title ),
644
  'type' => $type,
645
  'field_name' => $field_name,
646
+ 'placeholder' => do_shortcode( $placeholder ),
647
  'custom_attributes' => $custom_attributes,
648
  '_product_id' => $_product_id,
649
  '_field_nr' => $i,
includes/pdf-invoices/submodules/class-wcj-pdf-invoicing-emails.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - PDF Invoicing - Email Options
4
  *
5
- * @version 3.1.1
6
  * @author Algoritmika Ltd.
7
  */
8
 
@@ -48,23 +48,27 @@ class WCJ_PDF_Invoicing_Emails extends WCJ_Module {
48
  /**
49
  * add_pdf_invoice_email_attachment.
50
  *
51
- * @version 3.1.1
52
  */
53
  function add_pdf_invoice_email_attachment( $attachments, $status, $order ) {
54
  if ( ! $order || ! is_object( $order ) ) {
55
  return $attachments;
56
  }
57
  $invoice_types_ids = wcj_get_enabled_invoice_types_ids();
 
58
  foreach ( $invoice_types_ids as $invoice_type_id ) {
59
  if ( false === $this->do_attach_for_payment_method( $invoice_type_id, wcj_order_get_payment_method( $order ) ) ) {
60
  continue;
61
  }
 
 
 
62
  $send_on_statuses = get_option( 'wcj_invoicing_' . $invoice_type_id . '_attach_to_emails', array() );
63
  if ( '' == $send_on_statuses ) {
64
  $send_on_statuses = array();
65
  }
66
  if ( in_array( $status, $send_on_statuses ) ) {
67
- $the_invoice = wcj_get_pdf_invoice( wcj_get_order_id( $order ), $invoice_type_id );
68
  $file_name = $the_invoice->get_pdf( 'F' );
69
  if ( '' != $file_name ) {
70
  $attachments[] = $file_name;
2
  /**
3
  * Booster for WooCommerce - PDF Invoicing - Email Options
4
  *
5
+ * @version 3.5.3
6
  * @author Algoritmika Ltd.
7
  */
8
 
48
  /**
49
  * add_pdf_invoice_email_attachment.
50
  *
51
+ * @version 3.5.3
52
  */
53
  function add_pdf_invoice_email_attachment( $attachments, $status, $order ) {
54
  if ( ! $order || ! is_object( $order ) ) {
55
  return $attachments;
56
  }
57
  $invoice_types_ids = wcj_get_enabled_invoice_types_ids();
58
+ $order_id = wcj_get_order_id( $order );
59
  foreach ( $invoice_types_ids as $invoice_type_id ) {
60
  if ( false === $this->do_attach_for_payment_method( $invoice_type_id, wcj_order_get_payment_method( $order ) ) ) {
61
  continue;
62
  }
63
+ if ( ! wcj_is_invoice_created( $order_id, $invoice_type_id ) ) {
64
+ continue;
65
+ }
66
  $send_on_statuses = get_option( 'wcj_invoicing_' . $invoice_type_id . '_attach_to_emails', array() );
67
  if ( '' == $send_on_statuses ) {
68
  $send_on_statuses = array();
69
  }
70
  if ( in_array( $status, $send_on_statuses ) ) {
71
+ $the_invoice = wcj_get_pdf_invoice( $order_id, $invoice_type_id );
72
  $file_name = $the_invoice->get_pdf( 'F' );
73
  if ( '' != $file_name ) {
74
  $attachments[] = $file_name;
includes/price-by-country/class-wcj-price-by-country-core.php CHANGED
@@ -224,6 +224,7 @@ class WCJ_Price_by_Country_Core {
224
  * get_customer_country_group_id.
225
  *
226
  * @version 3.4.0
 
227
  * @todo (maybe) add `cart_and_checkout` override option
228
  */
229
  function get_customer_country_group_id() {
224
  * get_customer_country_group_id.
225
  *
226
  * @version 3.4.0
227
+ * @todo ! "We already know the group - nothing to calculate - return group"
228
  * @todo (maybe) add `cart_and_checkout` override option
229
  */
230
  function get_customer_country_group_id() {
includes/settings/wcj-settings-admin-tools.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce - Settings - Admin Tools
4
  *
5
- * @version 3.3.0
6
  * @since 2.8.0
7
  * @author Algoritmika Ltd.
8
  */
@@ -15,6 +15,13 @@ return array(
15
  'type' => 'title',
16
  'id' => 'wcj_admin_tools_module_options',
17
  ),
 
 
 
 
 
 
 
18
  array(
19
  'title' => __( 'Log', 'woocommerce-jetpack' ),
20
  'desc' => __( 'Enable', 'woocommerce-jetpack' ),
2
  /**
3
  * Booster for WooCommerce - Settings - Admin Tools
4
  *
5
+ * @version 3.5.3
6
  * @since 2.8.0
7
  * @author Algoritmika Ltd.
8
  */
15
  'type' => 'title',
16
  'id' => 'wcj_admin_tools_module_options',
17
  ),
18
+ array(
19
+ 'title' => __( 'Show Booster Menus Only to Admin', 'woocommerce-jetpack' ),
20
+ 'desc' => __( 'Enable', 'woocommerce-jetpack' ),
21
+ 'id' => 'wcj_admin_tools_show_menus_to_admin_only',
22
+ 'default' => 'no',
23
+ 'type' => 'checkbox',
24
+ ),
25
  array(
26
  'title' => __( 'Log', 'woocommerce-jetpack' ),
27
  'desc' => __( 'Enable', 'woocommerce-jetpack' ),
includes/settings/wcj-settings-cross-sells.php ADDED
@@ -0,0 +1,77 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Booster for WooCommerce - Settings - Cross-sells
4
+ *
5
+ * @version 3.5.3
6
+ * @since 3.5.3
7
+ * @author Algoritmika Ltd.
8
+ */
9
+
10
+ if ( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly
11
+
12
+ $settings = array(
13
+ array(
14
+ 'title' => __( 'Options', 'woocommerce-jetpack' ),
15
+ 'type' => 'title',
16
+ 'id' => 'wcj_cross_sells_options',
17
+ ),
18
+ array(
19
+ 'title' => __( 'Cross-sells Total', 'woocommerce-jetpack' ),
20
+ 'desc_tip' => __( 'Set to zero for WooCommerce default.', 'woocommerce-jetpack' ) . ' ' . __( 'Set to -1 for unlimited.', 'woocommerce-jetpack' ),
21
+ 'type' => 'number',
22
+ 'id' => 'wcj_cross_sells_total',
23
+ 'default' => 0,
24
+ 'custom_attributes' => array( 'min' => -1 ),
25
+ ),
26
+ array(
27
+ 'title' => __( 'Cross-sells Columns', 'woocommerce-jetpack' ),
28
+ 'desc_tip' => __( 'Set to zero for WooCommerce default.', 'woocommerce-jetpack' ),
29
+ 'type' => 'number',
30
+ 'id' => 'wcj_cross_sells_columns',
31
+ 'default' => 0,
32
+ 'custom_attributes' => array( 'min' => 0 ),
33
+ ),
34
+ array(
35
+ 'title' => __( 'Cross-sells Order By', 'woocommerce-jetpack' ),
36
+ 'type' => 'select',
37
+ 'id' => 'wcj_cross_sells_orderby',
38
+ 'default' => 'no_changes',
39
+ 'options' => array(
40
+ 'no_changes' => __( 'No changes (default behaviour)', 'woocommerce-jetpack' ),
41
+ 'rand' => __( 'Random', 'woocommerce-jetpack' ),
42
+ 'title' => __( 'Title', 'woocommerce-jetpack' ),
43
+ 'id' => __( 'ID', 'woocommerce-jetpack' ),
44
+ 'date' => __( 'Date', 'woocommerce-jetpack' ),
45
+ 'modified' => __( 'Modified', 'woocommerce-jetpack' ),
46
+ 'menu_order' => __( 'Menu order', 'woocommerce-jetpack' ),
47
+ 'price' => __( 'Price', 'woocommerce-jetpack' ),
48
+ ),
49
+ ),
50
+ );
51
+ if ( ! WCJ_IS_WC_VERSION_BELOW_3_3_0 ) {
52
+ $settings[] = array(
53
+ 'title' => __( 'Cross-sells Order', 'woocommerce-jetpack' ),
54
+ 'type' => 'select',
55
+ 'id' => 'wcj_cross_sells_order',
56
+ 'default' => 'no_changes',
57
+ 'options' => array(
58
+ 'no_changes' => __( 'No changes (default behaviour)', 'woocommerce-jetpack' ),
59
+ 'desc' => __( 'Descending', 'woocommerce-jetpack' ),
60
+ 'asc' => __( 'Ascending', 'woocommerce-jetpack' ),
61
+ ),
62
+ );
63
+ };
64
+ $settings = array_merge( $settings, array(
65
+ array(
66
+ 'title' => __( 'Hide Cross-sells', 'woocommerce-jetpack' ),
67
+ 'desc' => __( 'Hide', 'woocommerce-jetpack' ),
68
+ 'type' => 'checkbox',
69
+ 'id' => 'wcj_cross_sells_hide',
70
+ 'default' => 'no',
71
+ ),
72
+ array(
73
+ 'type' => 'sectionend',
74
+ 'id' => 'wcj_cross_sells_options',
75
+ ),
76
+ ) );
77
+ return $settings;
includes/settings/wcj-settings-empty-cart.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Booster for WooCommerce Settings - Empty Cart Button
4
  *
5
- * @version 2.8.0
6
  * @since 2.8.0
7
  * @author Algoritmika Ltd.
8
  */
@@ -37,11 +37,17 @@ return array(
37
  'default' => 'woocommerce_after_cart',
38
  'type' => 'select',
39
  'options' => array(
40
- 'disable' => __( 'Do not add', 'woocommerce-jetpack' ),
41
- 'woocommerce_after_cart' => __( 'After Cart', 'woocommerce-jetpack' ),
42
- 'woocommerce_before_cart' => __( 'Before Cart', 'woocommerce-jetpack' ),
43
- 'woocommerce_proceed_to_checkout' => __( 'After Proceed to Checkout button', 'woocommerce-jetpack' ),
44
- 'woocommerce_after_cart_totals' => __( 'After Cart Totals', 'woocommerce-jetpack' ),
 
 
 
 
 
 
45
  ),
46
  'desc' => apply_filters( 'booster_message', '', 'desc' ),
47
  'custom_attributes' => apply_filters( 'booster_message', '', 'disabled' ),
@@ -52,16 +58,9 @@ return array(
52
  'default' => 'disable',
53
  'type' => 'select',
54
  'options' => array(
55
- 'disable' => __( 'Do not add', 'woocommerce-jetpack' ),
56
- 'woocommerce_before_checkout_form' => __( 'Before checkout form', 'woocommerce-jetpack' ),
57
- 'woocommerce_checkout_before_customer_details' => __( 'Before customer details', 'woocommerce-jetpack' ),
58
- 'woocommerce_checkout_billing' => __( 'Billing', 'woocommerce-jetpack' ),
59
- 'woocommerce_checkout_shipping' => __( 'Shipping', 'woocommerce-jetpack' ),
60
- 'woocommerce_checkout_after_customer_details' => __( 'After customer details', 'woocommerce-jetpack' ),
61
- 'woocommerce_checkout_before_order_review' => __( 'Before order review', 'woocommerce-jetpack' ),
62
- 'woocommerce_checkout_order_review' => __( 'Order review', 'woocommerce-jetpack' ),
63
- 'woocommerce_checkout_after_order_review' => __( 'After order review', 'woocommerce-jetpack' ),
64
- 'woocommerce_after_checkout_form' => __( 'After checkout form', 'woocommerce-jetpack' ),
65
  ),
66
  ),
67
  array(
2
  /**
3
  * Booster for WooCommerce Settings - Empty Cart Button
4
  *
5
+ * @version 3.5.3
6
  * @since 2.8.0
7
  * @author Algoritmika Ltd.
8
  */
37
  'default' => 'woocommerce_after_cart',
38
  'type' => 'select',
39
  'options' => array(
40
+ 'disable' => __( 'Do not add', 'woocommerce-jetpack' ),
41
+ 'woocommerce_before_cart' => __( 'Before cart', 'woocommerce-jetpack' ),
42
+ 'woocommerce_before_cart_totals' => __( 'Cart totals: Before cart totals', 'woocommerce-jetpack' ),
43
+ 'woocommerce_cart_totals_before_shipping' => __( 'Cart totals: Before shipping', 'woocommerce-jetpack' ),
44
+ 'woocommerce_cart_totals_after_shipping' => __( 'Cart totals: After shipping', 'woocommerce-jetpack' ),
45
+ 'woocommerce_cart_totals_before_order_total' => __( 'Cart totals: Before order total', 'woocommerce-jetpack' ),
46
+ 'woocommerce_cart_totals_after_order_total' => __( 'Cart totals: After order total', 'woocommerce-jetpack' ),
47
+ 'woocommerce_proceed_to_checkout' => __( 'Cart totals: After proceed to checkout button', 'woocommerce-jetpack' ),
48
+ 'woocommerce_after_cart_totals' => __( 'Cart totals: After cart totals', 'woocommerce-jetpack' ),
49
+ 'woocommerce_cart_collaterals' => __( 'After cart collaterals', 'woocommerce-jetpack' ),
50
+ 'woocommerce_after_cart' => __( 'After cart', 'woocommerce-jetpack' ),
51
  ),
52
  'desc' => apply_filters( 'booster_message', '', 'desc' ),
53
  'custom_attributes' => apply_filters( 'booster_message', '', 'disabled' ),
58
  'default' => 'disable',
59
  'type' => 'select',
60
  'options' => array(
61
+ 'disable' => __( 'Do not add', 'woocommerce-jetpack' ),
62
+ 'woocommerce_before_checkout_form' => __( 'Before checkout form', 'woocommerce-jetpack' ),
63
+ 'woocommerce_after_checkout_form' => __( 'After checkout form', 'woocommerce-jetpack' ),
 
 
 
 
 
 
 
64
  ),
65
  ),
66
  array(
includes/settings/wcj-settings-upsells.php ADDED
@@ -0,0 +1,62 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Booster for WooCommerce - Settings - Upsells
4
+ *
5
+ * @version 3.5.3
6
+ * @since 3.5.3
7
+ * @author Algoritmika Ltd.
8
+ */
9
+
10
+ if ( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly
11
+
12
+ $settings = array(
13
+ array(
14
+ 'title' => __( 'Options', 'woocommerce-jetpack' ),
15
+ 'type' => 'title',
16
+ 'id' => 'wcj_upsells_options',
17
+ ),
18
+ array(
19
+ 'title' => __( 'Upsells Total', 'woocommerce-jetpack' ),
20
+ 'desc_tip' => __( 'Set to zero for WooCommerce default.', 'woocommerce-jetpack' ) . ' ' . __( 'Set to -1 for unlimited.', 'woocommerce-jetpack' ),
21
+ 'type' => 'number',
22
+ 'id' => 'wcj_upsells_total',
23
+ 'default' => 0,
24
+ 'custom_attributes' => array( 'min' => -1 ),
25
+ ),
26
+ array(
27
+ 'title' => __( 'Upsells Columns', 'woocommerce-jetpack' ),
28
+ 'desc_tip' => __( 'Set to zero for WooCommerce default.', 'woocommerce-jetpack' ),
29
+ 'type' => 'number',
30
+ 'id' => 'wcj_upsells_columns',
31
+ 'default' => 0,
32
+ 'custom_attributes' => array( 'min' => 0 ),
33
+ ),
34
+ array(
35
+ 'title' => __( 'Upsells Order By', 'woocommerce-jetpack' ),
36
+ 'type' => 'select',
37
+ 'id' => 'wcj_upsells_orderby',
38
+ 'default' => 'no_changes',
39
+ 'options' => array(
40
+ 'no_changes' => __( 'No changes (default behaviour)', 'woocommerce-jetpack' ),
41
+ 'rand' => __( 'Random', 'woocommerce-jetpack' ),
42
+ 'title' => __( 'Title', 'woocommerce-jetpack' ),
43
+ 'id' => __( 'ID', 'woocommerce-jetpack' ),
44
+ 'date' => __( 'Date', 'woocommerce-jetpack' ),
45
+ 'modified' => __( 'Modified', 'woocommerce-jetpack' ),
46
+ 'menu_order' => __( 'Menu order', 'woocommerce-jetpack' ),
47
+ 'price' => __( 'Price', 'woocommerce-jetpack' ),
48
+ ),
49
+ ),
50
+ array(
51
+ 'title' => __( 'Hide Upsells', 'woocommerce-jetpack' ),
52
+ 'desc' => __( 'Hide', 'woocommerce-jetpack' ),
53
+ 'type' => 'checkbox',
54
+ 'id' => 'wcj_upsells_hide',
55
+ 'default' => 'no',
56
+ ),
57
+ array(
58
+ 'type' => 'sectionend',
59
+ 'id' => 'wcj_upsells_options',
60
+ ),
61
+ );
62
+ return $settings;
readme.txt CHANGED
@@ -3,7 +3,7 @@ Contributors: algoritmika, anbinder
3
  Tags: woocommerce, booster for woocommerce, woocommerce jetpack
4
  Requires at least: 4.4
5
  Tested up to: 4.9
6
- Stable tag: 3.5.2
7
  License: GNU General Public License v3.0
8
  License URI: http://www.gnu.org/licenses/gpl-3.0.html
9
 
@@ -48,6 +48,7 @@ Booster for WooCommerce is a WordPress plugin that supercharges your site with a
48
  * *Admin Products List* - Customize WooCommerce admin products list.
49
  * *Bookings* - Add bookings products to WooCommerce.
50
  * *Cost of Goods* - Save WooCommerce product purchase costs data for admin reports.
 
51
  * *Crowdfunding* - Add crowdfunding products to WooCommerce.
52
  * *Product Addons* - Add (paid/free/discount) addons to WooCommerce products.
53
  * *Product Availability by Date* - WooCommerce product availability by date.
@@ -69,6 +70,7 @@ Booster for WooCommerce is a WordPress plugin that supercharges your site with a
69
  * *Sorting* - Add more WooCommerce sorting options; rename or remove default sorting options; rearrange sorting options on frontend.
70
  * *Stock* - WooCommerce products stock management.
71
  * *Tax Display* - Customize WooCommerce tax display.
 
72
  * *User Products* - Let users add new WooCommerce products from frontend.
73
 
74
  **Cart & Checkout**
@@ -182,6 +184,15 @@ You can see the differences between versions in this [table](https://booster.io/
182
 
183
  == Changelog ==
184
 
 
 
 
 
 
 
 
 
 
185
  = 3.5.2 - 09/04/2018 =
186
  * Dev - PDF INVOICING & PACKING SLIPS - Bulk Actions - Merge (Print) - Error messages output added.
187
  * Dev - PDF INVOICING & PACKING SLIPS - Bulk Actions - Merge (Print) - Namespaces parse error in PHP < 5.3.0 fixed.
3
  Tags: woocommerce, booster for woocommerce, woocommerce jetpack
4
  Requires at least: 4.4
5
  Tested up to: 4.9
6
+ Stable tag: 3.5.3
7
  License: GNU General Public License v3.0
8
  License URI: http://www.gnu.org/licenses/gpl-3.0.html
9
 
48
  * *Admin Products List* - Customize WooCommerce admin products list.
49
  * *Bookings* - Add bookings products to WooCommerce.
50
  * *Cost of Goods* - Save WooCommerce product purchase costs data for admin reports.
51
+ * *Cross-sells* - Customize WooCommerce cross-sells products display.
52
  * *Crowdfunding* - Add crowdfunding products to WooCommerce.
53
  * *Product Addons* - Add (paid/free/discount) addons to WooCommerce products.
54
  * *Product Availability by Date* - WooCommerce product availability by date.
70
  * *Sorting* - Add more WooCommerce sorting options; rename or remove default sorting options; rearrange sorting options on frontend.
71
  * *Stock* - WooCommerce products stock management.
72
  * *Tax Display* - Customize WooCommerce tax display.
73
+ * *Upsells* - Customize WooCommerce upsells products display.
74
  * *User Products* - Let users add new WooCommerce products from frontend.
75
 
76
  **Cart & Checkout**
184
 
185
  == Changelog ==
186
 
187
+ = 3.5.3 - 12/04/2018 =
188
+ * Dev - PRODUCTS - Cross Sells - Initial module release.
189
+ * Dev - PRODUCTS - Product Input Fields - Shortcodes are now processed in product input fields titles and placeholders.
190
+ * Dev - PRODUCTS - Upsells - Initial module release.
191
+ * Fix - CART & CHECKOUT - Empty Cart Button - Button position on the Checkout page - Some possible positions removed (fixes the issue with "Place order" button not working etc.).
192
+ * Dev - CART & CHECKOUT - Empty Cart Button - Button position on the Cart page - More possible positions added.
193
+ * Fix - PDF INVOICING & PACKING SLIPS - Email Options - Checking for invoice to be created before attaching it to email (fixes the issue with empty invoices attached with zero total orders, and "Do not create if order total equals zero" option enabled).
194
+ * Dev - EMAILS & MISC. - Admin Tools - "Show Booster Menus Only to Admin" option added.
195
+
196
  = 3.5.2 - 09/04/2018 =
197
  * Dev - PDF INVOICING & PACKING SLIPS - Bulk Actions - Merge (Print) - Error messages output added.
198
  * Dev - PDF INVOICING & PACKING SLIPS - Bulk Actions - Merge (Print) - Namespaces parse error in PHP < 5.3.0 fixed.
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.
6
- Version: 3.5.2
7
  Author: Algoritmika Ltd
8
  Author URI: https://booster.io
9
  Text Domain: woocommerce-jetpack
@@ -57,7 +57,7 @@ final class WC_Jetpack {
57
  * @var string
58
  * @since 2.4.7
59
  */
60
- public $version = '3.5.2';
61
 
62
  /**
63
  * @var WC_Jetpack The single instance of the class
3
  Plugin Name: Booster for WooCommerce
4
  Plugin URI: https://booster.io
5
  Description: Supercharge your WooCommerce site with these awesome powerful features.
6
+ Version: 3.5.3
7
  Author: Algoritmika Ltd
8
  Author URI: https://booster.io
9
  Text Domain: woocommerce-jetpack
57
  * @var string
58
  * @since 2.4.7
59
  */
60
+ public $version = '3.5.3';
61
 
62
  /**
63
  * @var WC_Jetpack The single instance of the class