WooCommerce Square - Version 2.1.1

Version Description

  • 2020.03.23 =
  • Fix - Inventory/Stock updates as a result of checkout via PayPal Standard does not reflect on the Square item.
  • Fix - Error when trying to save an external product with the modified 'sync with square' value.
  • Fix - Move product check on a possibly invalid product out of the try block avoiding potential further errors.
Download this release

Release Info

Developer automattic
Plugin Icon 128x128 WooCommerce Square
Version 2.1.1
Comparing to
See all releases

Code changes from version 2.1.0 to 2.1.1

i18n/languages/woocommerce-square.pot CHANGED
@@ -2,10 +2,10 @@
2
  # This file is distributed under the GNU General Public License v3.0.
3
  msgid ""
4
  msgstr ""
5
- "Project-Id-Version: WooCommerce Square 2.1.0\n"
6
  "Report-Msgid-Bugs-To: "
7
  "https://github.com/woocommerce/woocommerce-square/issues\n"
8
- "POT-Creation-Date: 2020-02-10 19:58:42+00:00\n"
9
  "MIME-Version: 1.0\n"
10
  "Content-Type: text/plain; charset=utf-8\n"
11
  "Content-Transfer-Encoding: 8bit\n"
@@ -2965,37 +2965,37 @@ msgstr ""
2965
  msgid "Unknown Error"
2966
  msgstr ""
2967
 
2968
- #: vendor/skyverge/wc-plugin-framework/woocommerce/utilities/class-sv-wp-background-job-handler.php:643
2969
  msgid "Job data key \"%s\" not set"
2970
  msgstr ""
2971
 
2972
- #: vendor/skyverge/wc-plugin-framework/woocommerce/utilities/class-sv-wp-background-job-handler.php:647
2973
  msgid "Job data key \"%s\" is not an array"
2974
  msgstr ""
2975
 
2976
- #: vendor/skyverge/wc-plugin-framework/woocommerce/utilities/class-sv-wp-background-job-handler.php:883
2977
  msgid "Every %d Minutes"
2978
  msgstr ""
2979
 
2980
- #: vendor/skyverge/wc-plugin-framework/woocommerce/utilities/class-sv-wp-background-job-handler.php:1047
2981
  msgid "Background Processing Test"
2982
  msgstr ""
2983
 
2984
- #: vendor/skyverge/wc-plugin-framework/woocommerce/utilities/class-sv-wp-background-job-handler.php:1048
2985
  msgid "Run Test"
2986
  msgstr ""
2987
 
2988
- #: vendor/skyverge/wc-plugin-framework/woocommerce/utilities/class-sv-wp-background-job-handler.php:1049
2989
  msgid ""
2990
  "This tool will test whether your server is capable of processing background "
2991
  "jobs."
2992
  msgstr ""
2993
 
2994
- #: vendor/skyverge/wc-plugin-framework/woocommerce/utilities/class-sv-wp-background-job-handler.php:1067
2995
  msgid "Success! You should be able to process background jobs."
2996
  msgstr ""
2997
 
2998
- #: vendor/skyverge/wc-plugin-framework/woocommerce/utilities/class-sv-wp-background-job-handler.php:1070
2999
  msgid ""
3000
  "Could not connect. Please ask your hosting company to ensure your server "
3001
  "has loopback connections enabled."
2
  # This file is distributed under the GNU General Public License v3.0.
3
  msgid ""
4
  msgstr ""
5
+ "Project-Id-Version: WooCommerce Square 2.1.1\n"
6
  "Report-Msgid-Bugs-To: "
7
  "https://github.com/woocommerce/woocommerce-square/issues\n"
8
+ "POT-Creation-Date: 2020-03-20 15:35:44+00:00\n"
9
  "MIME-Version: 1.0\n"
10
  "Content-Type: text/plain; charset=utf-8\n"
11
  "Content-Transfer-Encoding: 8bit\n"
2965
  msgid "Unknown Error"
2966
  msgstr ""
2967
 
2968
+ #: vendor/skyverge/wc-plugin-framework/woocommerce/utilities/class-sv-wp-background-job-handler.php:644
2969
  msgid "Job data key \"%s\" not set"
2970
  msgstr ""
2971
 
2972
+ #: vendor/skyverge/wc-plugin-framework/woocommerce/utilities/class-sv-wp-background-job-handler.php:648
2973
  msgid "Job data key \"%s\" is not an array"
2974
  msgstr ""
2975
 
2976
+ #: vendor/skyverge/wc-plugin-framework/woocommerce/utilities/class-sv-wp-background-job-handler.php:884
2977
  msgid "Every %d Minutes"
2978
  msgstr ""
2979
 
2980
+ #: vendor/skyverge/wc-plugin-framework/woocommerce/utilities/class-sv-wp-background-job-handler.php:1048
2981
  msgid "Background Processing Test"
2982
  msgstr ""
2983
 
2984
+ #: vendor/skyverge/wc-plugin-framework/woocommerce/utilities/class-sv-wp-background-job-handler.php:1049
2985
  msgid "Run Test"
2986
  msgstr ""
2987
 
2988
+ #: vendor/skyverge/wc-plugin-framework/woocommerce/utilities/class-sv-wp-background-job-handler.php:1050
2989
  msgid ""
2990
  "This tool will test whether your server is capable of processing background "
2991
  "jobs."
2992
  msgstr ""
2993
 
2994
+ #: vendor/skyverge/wc-plugin-framework/woocommerce/utilities/class-sv-wp-background-job-handler.php:1068
2995
  msgid "Success! You should be able to process background jobs."
2996
  msgstr ""
2997
 
2998
+ #: vendor/skyverge/wc-plugin-framework/woocommerce/utilities/class-sv-wp-background-job-handler.php:1071
2999
  msgid ""
3000
  "Could not connect. Please ask your hosting company to ensure your server "
3001
  "has loopback connections enabled."
includes/Handlers/Order.php CHANGED
@@ -64,6 +64,9 @@ class Order {
64
  // ADD hooks for stock syncs based on changes from orders not from this gateway
65
  add_action( 'woocommerce_checkout_order_processed', [ $this, 'maybe_sync_stock_for_order_via_other_gateway' ], 10, 3 );
66
 
 
 
 
67
  // ADD hooks to listen to refunds on orders from other gateways.
68
  add_action( 'woocommerce_order_refunded', [ $this, 'maybe_sync_stock_for_refund_from_other_gateway' ], 10, 2 );
69
  }
@@ -84,6 +87,33 @@ class Order {
84
  return $hidden;
85
  }
86
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
87
 
88
  /**
89
  * Checks if we should sync stock for this order.
@@ -99,12 +129,24 @@ class Order {
99
  */
100
  public function maybe_sync_stock_for_order_via_other_gateway( $order_id, $posted_data, $order ) {
101
 
102
- if ( ! wc_square()->get_settings_handler()->is_inventory_sync_enabled() ) {
 
103
  return;
104
  }
105
 
106
- // Confirm we are not processing the order through the Square gateway.
107
- if ( ! $order instanceof \WC_Order || Plugin::GATEWAY_ID === $order->get_payment_method() ) {
 
 
 
 
 
 
 
 
 
 
 
108
  return;
109
  }
110
 
64
  // ADD hooks for stock syncs based on changes from orders not from this gateway
65
  add_action( 'woocommerce_checkout_order_processed', [ $this, 'maybe_sync_stock_for_order_via_other_gateway' ], 10, 3 );
66
 
67
+ // Add specific hook for paypal IPN callback
68
+ add_action( 'valid-paypal-standard-ipn-request', [ $this, 'maybe_sync_stock_for_order_via_paypal' ], 10, 1 );
69
+
70
  // ADD hooks to listen to refunds on orders from other gateways.
71
  add_action( 'woocommerce_order_refunded', [ $this, 'maybe_sync_stock_for_refund_from_other_gateway' ], 10, 2 );
72
  }
87
  return $hidden;
88
  }
89
 
90
+ /**
91
+ * Add hooks to ensure PayPal IPN callbacks are added caches and considered for inventory changes
92
+ * when the sync happens. This also adds the shutdown hook to ensure sync happens if needed at
93
+ * a later stage.
94
+ *
95
+ * @since 2.1.1
96
+ *
97
+ * @param array $posted values returned from PayPal Standard IPN callback.
98
+ */
99
+ public function maybe_sync_stock_for_order_via_paypal( $posted ) {
100
+ if ( empty( $posted[ 'custom' ] ) ) {
101
+ return;
102
+ }
103
+
104
+ $raw_order = json_decode( $posted[ 'custom' ] );
105
+ if ( empty( $raw_order->order_id ) ) {
106
+ return;
107
+ }
108
+
109
+ $order = wc_get_order( $raw_order->order_id );
110
+
111
+ if ( ! $order || ! $order instanceof \WC_Order ) {
112
+ return;
113
+ }
114
+
115
+ $this->sync_stock_for_order( $order );
116
+ }
117
 
118
  /**
119
  * Checks if we should sync stock for this order.
129
  */
130
  public function maybe_sync_stock_for_order_via_other_gateway( $order_id, $posted_data, $order ) {
131
 
132
+ // Confirm we are not processing the order through the Square gateway.
133
+ if ( ! $order instanceof \WC_Order || Plugin::GATEWAY_ID === $order->get_payment_method() ) {
134
  return;
135
  }
136
 
137
+ $this->sync_stock_for_order( $order );
138
+ }
139
+
140
+ /**
141
+ * For a given order sync stock if inventory sync is enabled.
142
+ *
143
+ * @since 2.1.1
144
+ *
145
+ * @param \WC_Order $order the order for which the stock must be synced.
146
+ */
147
+ protected function sync_stock_for_order( $order ) {
148
+
149
+ if ( ! wc_square()->get_settings_handler()->is_inventory_sync_enabled() ) {
150
  return;
151
  }
152
 
includes/Handlers/Product.php CHANGED
@@ -217,22 +217,25 @@ class Product {
217
  * Updates a product image from a URL provided by Square (helper method).
218
  *
219
  * Note: does not save the product for persistence. If opening to public, consider changing this behavior.
 
220
  *
221
  * @since 2.0.0
222
  *
223
- * @param \WC_Product|int $product product object or product ID
224
  * @param string $image_id
225
- * @return \WC_Product updated product
 
226
  */
227
- public static function update_image_from_square( $product, $image_id ) {
228
 
229
- $product = is_numeric( $product ) ? wc_get_product( $product ) : $product;
230
 
231
- try {
 
 
 
232
 
233
- if ( ! $product instanceof \WC_Product ) {
234
- throw new Framework\SV_WC_Plugin_Exception( 'Invalid product' );
235
- }
236
 
237
  $image_response = wc_square()->get_api()->retrieve_catalog_object( $image_id );
238
 
@@ -242,6 +245,10 @@ class Product {
242
 
243
  $image_url = $image_response->get_data()->getObject()->getImageData()->getUrl();
244
 
 
 
 
 
245
  // grab remote image to upload into WordPress before attaching to product
246
  $url_parts = parse_url( $image_url );
247
  $url_parts = explode( '/', $url_parts['path'] );
@@ -398,6 +405,10 @@ class Product {
398
  /**
399
  * Sets a product's synced with Square status.
400
  *
 
 
 
 
401
  * @since 2.0.0
402
  *
403
  * @param \WC_Product|int $product a valid product object or product ID
@@ -406,29 +417,29 @@ class Product {
406
  */
407
  public static function set_synced_with_square( $product, $synced = 'yes' ) {
408
 
409
- $success = false;
410
  $product = is_numeric( $product ) ? wc_get_product( $product ) : $product;
411
 
412
- if ( $product instanceof \WC_Product && in_array( $synced, [ 'yes', 'no' ], true ) ) {
413
-
414
- // ensure only one term is associated with the product at any time
415
- wp_delete_object_term_relationships( $product->get_id(), [ self::SYNCED_WITH_SQUARE_TAXONOMY ] );
416
-
417
- if ( 'yes' === $synced ) {
418
-
419
- $set_term = wp_set_post_terms( $product->get_id(), [ $synced ], self::SYNCED_WITH_SQUARE_TAXONOMY );
420
- $success = is_array( $set_term );
421
 
422
- if ( wc_square()->get_settings_handler()->is_inventory_sync_enabled() ) {
423
- $product->set_manage_stock( ! $product->is_type( 'variable' ) );
424
- }
425
 
426
- $product->save();
 
 
 
 
427
 
428
- } else {
 
429
 
430
- $success = true;
431
- }
 
 
 
432
  }
433
 
434
  return $success;
217
  * Updates a product image from a URL provided by Square (helper method).
218
  *
219
  * Note: does not save the product for persistence. If opening to public, consider changing this behavior.
220
+ * This function handles its own exceptions and logs them.
221
  *
222
  * @since 2.0.0
223
  *
224
+ * @param \WC_Product|int $given_product product object or product ID
225
  * @param string $image_id
226
+ * @todo Look at ussages of this function. Does it even need to return anything?
227
+ * @return \WC_Product|int The product id of object that was passed in.
228
  */
229
+ public static function update_image_from_square( $given_product, $image_id ) {
230
 
231
+ $product = is_numeric( $given_product ) ? wc_get_product( $given_product ) : $given_product;
232
 
233
+ if ( ! $product instanceof \WC_Product ) {
234
+ wc_square()->log( sprintf( 'Could not import image from Square at %1$s for attaching to product: Invalid product.', $image_url ) );
235
+ return $given_product;
236
+ }
237
 
238
+ try {
 
 
239
 
240
  $image_response = wc_square()->get_api()->retrieve_catalog_object( $image_id );
241
 
245
 
246
  $image_url = $image_response->get_data()->getObject()->getImageData()->getUrl();
247
 
248
+ if ( empty( $image_url ) ) {
249
+ throw new Framework\SV_WC_Plugin_Exception( 'Square image url empty' );
250
+ }
251
+
252
  // grab remote image to upload into WordPress before attaching to product
253
  $url_parts = parse_url( $image_url );
254
  $url_parts = explode( '/', $url_parts['path'] );
405
  /**
406
  * Sets a product's synced with Square status.
407
  *
408
+ * This function has a side effect where we also set the Product's
409
+ * manage stock value. We ignore external type product when setting this manage
410
+ * stock value.
411
+ *
412
  * @since 2.0.0
413
  *
414
  * @param \WC_Product|int $product a valid product object or product ID
417
  */
418
  public static function set_synced_with_square( $product, $synced = 'yes' ) {
419
 
 
420
  $product = is_numeric( $product ) ? wc_get_product( $product ) : $product;
421
 
422
+ if ( ! $product instanceof \WC_Product || ! in_array( $synced, [ 'yes', 'no' ], true ) ) {
423
+ return false;
424
+ }
 
 
 
 
 
 
425
 
426
+ // ensure only one term is associated with the product at any time
427
+ wp_delete_object_term_relationships( $product->get_id(), [ self::SYNCED_WITH_SQUARE_TAXONOMY ] );
 
428
 
429
+ // we have already set the value to "no" above by deleting the term relationship
430
+ // so it is safe to return with true.
431
+ if ( 'no' === $synced ) {
432
+ return true;
433
+ }
434
 
435
+ $set_term = wp_set_post_terms( $product->get_id(), [ $synced ], self::SYNCED_WITH_SQUARE_TAXONOMY );
436
+ $success = is_array( $set_term );
437
 
438
+ // Function side effect see phpDoc for details:
439
+ if ( wc_square()->get_settings_handler()->is_inventory_sync_enabled()
440
+ && 'external' !== $product->get_type() ) {
441
+ $product->set_manage_stock( ! $product->is_type( 'variable' ) );
442
+ $product->save();
443
  }
444
 
445
  return $success;
includes/Plugin.php CHANGED
@@ -42,7 +42,7 @@ class Plugin extends Framework\SV_WC_Payment_Gateway_Plugin {
42
 
43
 
44
  /** plugin version number */
45
- const VERSION = '2.1.0';
46
 
47
  /** plugin ID */
48
  const PLUGIN_ID = 'square';
42
 
43
 
44
  /** plugin version number */
45
+ const VERSION = '2.1.1';
46
 
47
  /** plugin ID */
48
  const PLUGIN_ID = 'square';
readme.txt CHANGED
@@ -2,9 +2,9 @@
2
  Contributors: automattic, royho, woothemes, bor0
3
  Tags: credit card, square, woocommerce, inventory sync
4
  Requires at least: 4.6
5
- Tested up to: 5.3
6
  Requires PHP: 5.6
7
- Stable tag: 2.1.0
8
  License: GPLv3
9
  License URI: https://www.gnu.org/licenses/gpl-3.0.html
10
 
@@ -72,6 +72,11 @@ If you get stuck, you can ask for help in the [Plugin Forum](https://wordpress.o
72
 
73
  == Changelog ==
74
 
 
 
 
 
 
75
  = 2.1.0 - 2020.02.11 =
76
  * Feature - Add support for SCA (3D Secure 2)
77
  * Fix - Minor fixes to the Sync completed emails
2
  Contributors: automattic, royho, woothemes, bor0
3
  Tags: credit card, square, woocommerce, inventory sync
4
  Requires at least: 4.6
5
+ Tested up to: 5.4
6
  Requires PHP: 5.6
7
+ Stable tag: 2.1.1
8
  License: GPLv3
9
  License URI: https://www.gnu.org/licenses/gpl-3.0.html
10
 
72
 
73
  == Changelog ==
74
 
75
+ = 2.1.1 - 2020.03.23 =
76
+ * Fix - Inventory/Stock updates as a result of checkout via PayPal Standard does not reflect on the Square item.
77
+ * Fix - Error when trying to save an external product with the modified 'sync with square' value.
78
+ * Fix - Move product check on a possibly invalid product out of the try block avoiding potential further errors.
79
+
80
  = 2.1.0 - 2020.02.11 =
81
  * Feature - Add support for SCA (3D Secure 2)
82
  * Fix - Minor fixes to the Sync completed emails
woocommerce-square.php CHANGED
@@ -1,7 +1,7 @@
1
  <?php
2
  /**
3
  * Plugin Name: WooCommerce Square
4
- * Version: 2.1.0
5
  * Plugin URI: https://woocommerce.com/products/square/
6
  * Description: Adds ability to sync inventory between WooCommerce and Square POS. In addition, you can also make purchases through the Square payment gateway.
7
  * Author: WooCommerce
@@ -19,7 +19,7 @@
19
  * @license http://www.gnu.org/licenses/gpl-3.0.html GNU General Public License v3.0
20
  *
21
  * WC requires at least: 3.0
22
- * WC tested up to: 3.9
23
  */
24
 
25
  defined( 'ABSPATH' ) or exit;
1
  <?php
2
  /**
3
  * Plugin Name: WooCommerce Square
4
+ * Version: 2.1.1
5
  * Plugin URI: https://woocommerce.com/products/square/
6
  * Description: Adds ability to sync inventory between WooCommerce and Square POS. In addition, you can also make purchases through the Square payment gateway.
7
  * Author: WooCommerce
19
  * @license http://www.gnu.org/licenses/gpl-3.0.html GNU General Public License v3.0
20
  *
21
  * WC requires at least: 3.0
22
+ * WC tested up to: 4.0
23
  */
24
 
25
  defined( 'ABSPATH' ) or exit;