Version Description
- 2018-04-04 =
- Fix - Double inventory sync for newly created products.
- Fix - Infinite loop with pagination, where Square keeps sending the same link.
- Fix - Remove usage of deprecated jQuery method.
- Fix - Sync job should not be sending anything if there are no stock changes.
- Fix - Trigger to decrease stock upon purchase not working
- Tweak - Add logging and skip sync in case store's currency/country is not allowed.
- Tweak - Improve debug logging when fetching inventory
- Tweak - Inventory reduction in Square will be treated as stock sale.
Download this release
Release Info
Developer | bor0 |
Plugin | WooCommerce Square |
Version | 1.0.28 |
Comparing to | |
See all releases |
Code changes from version 1.0.27 to 1.0.28
- assets/js/wc-square-admin-scripts.js +10 -1
- assets/js/wc-square-admin-scripts.min.js +1 -1
- assets/js/wc-square-payments.js +2 -2
- assets/js/wc-square-payments.min.js +1 -1
- changelog.txt +10 -0
- includes/class-wc-square-client.php +10 -1
- includes/class-wc-square-sync-from-square.php +27 -0
- includes/class-wc-square-sync-to-square-wp-hooks.php +21 -14
- includes/class-wc-square-sync-to-square.php +31 -1
- languages/woocommerce-square.pot +6 -6
- readme.txt +12 -2
- woocommerce-square.php +6 -5
assets/js/wc-square-admin-scripts.js
CHANGED
@@ -45,7 +45,11 @@ jQuery( document ).ready( function( $ ) {
|
|
45 |
});
|
46 |
},
|
47 |
|
48 |
-
|
|
|
|
|
|
|
|
|
49 |
|
50 |
$( '.woocommerce_page_wc-settings' ).on( 'click', '#wc-to-square, #square-to-wc', function( e ) {
|
51 |
e.preventDefault();
|
@@ -76,6 +80,11 @@ jQuery( document ).ready( function( $ ) {
|
|
76 |
$.wc_square_admin.sync( 0, $( this ).attr( 'id' ) );
|
77 |
});
|
78 |
|
|
|
|
|
|
|
|
|
|
|
79 |
$( document.body ).on( 'change', '#woocommerce_square_testmode', function() {
|
80 |
if ( $( this ).is( ':checked' ) ) {
|
81 |
$( '#woocommerce_square_application_id' ).parents( 'tr' ).eq(0).hide();
|
45 |
});
|
46 |
},
|
47 |
|
48 |
+
init_sync_buttons: function() {
|
49 |
+
if ( ! wc_square_local.country_currency ) {
|
50 |
+
$( '#wc-to-square, #square-to-wc' ).attr( 'disabled', 'disabled' );
|
51 |
+
return;
|
52 |
+
}
|
53 |
|
54 |
$( '.woocommerce_page_wc-settings' ).on( 'click', '#wc-to-square, #square-to-wc', function( e ) {
|
55 |
e.preventDefault();
|
80 |
$.wc_square_admin.sync( 0, $( this ).attr( 'id' ) );
|
81 |
});
|
82 |
|
83 |
+
},
|
84 |
+
|
85 |
+
init: function() {
|
86 |
+
this.init_sync_buttons();
|
87 |
+
|
88 |
$( document.body ).on( 'change', '#woocommerce_square_testmode', function() {
|
89 |
if ( $( this ).is( ':checked' ) ) {
|
90 |
$( '#woocommerce_square_application_id' ).parents( 'tr' ).eq(0).hide();
|
assets/js/wc-square-admin-scripts.min.js
CHANGED
@@ -1 +1 @@
|
|
1 |
-
jQuery(document).ready(function(e){"use strict";e.wc_square_admin={sync:function(o,c){var r={security:wc_square_local.ajaxSyncNonce,process:parseInt(o,10),action:"wc-to-square"===c?"wc_to_square":"square_to_wc"};e.ajax({type:"POST",data:r,url:wc_square_local.admin_ajax_url}).done(function(o){"done"===o.process?(e("body").trigger("woocommerce_square_wc_to_square_sync_complete",[o]),e("table.form-table").unblock(),e(".wc-square-progress-bar span").css({width:o.percentage+"%"}).parent(".wc-square-progress-bar").fadeOut("slow",function(){alert(o.message)})):(e(".wc-square-progress-bar span").css({width:o.percentage+"%"}),e.wc_square_admin.sync(parseInt(o.process,10),o.type))}).fail(function(o,c,r){e("table.form-table").unblock(),console.log(r),alert(r)})},
|
1 |
+
jQuery(document).ready(function(e){"use strict";e.wc_square_admin={sync:function(o,c){var r={security:wc_square_local.ajaxSyncNonce,process:parseInt(o,10),action:"wc-to-square"===c?"wc_to_square":"square_to_wc"};e.ajax({type:"POST",data:r,url:wc_square_local.admin_ajax_url}).done(function(o){"done"===o.process?(e("body").trigger("woocommerce_square_wc_to_square_sync_complete",[o]),e("table.form-table").unblock(),e(".wc-square-progress-bar span").css({width:o.percentage+"%"}).parent(".wc-square-progress-bar").fadeOut("slow",function(){alert(o.message)})):(e(".wc-square-progress-bar span").css({width:o.percentage+"%"}),e.wc_square_admin.sync(parseInt(o.process,10),o.type))}).fail(function(o,c,r){e("table.form-table").unblock(),console.log(r),alert(r)})},init_sync_buttons:function(){wc_square_local.country_currency?e(".woocommerce_page_wc-settings").on("click","#wc-to-square, #square-to-wc",function(o){if(o.preventDefault(),confirm(wc_square_local.i18n.confirm_sync)){var c=e(this).parents("table.form-table"),r=e('<div class="wc-square-progress-bar wc-square-stripes"><span class="step"></span></div>');e(".wc-square-progress-bar").remove(),c.block({message:null,overlayCSS:{background:"#fff",opacity:.6}}),c.after(r),e.wc_square_admin.sync(0,e(this).attr("id"))}}):e("#wc-to-square, #square-to-wc").attr("disabled","disabled")},init:function(){this.init_sync_buttons(),e(document.body).on("change","#woocommerce_square_testmode",function(){e(this).is(":checked")?(e("#woocommerce_square_application_id").parents("tr").eq(0).hide(),e("#woocommerce_square_token").parents("tr").eq(0).hide(),e("#woocommerce_square_sandbox_application_id").parents("tr").eq(0).show(),e("#woocommerce_square_sandbox_token").parents("tr").eq(0).show()):(e("#woocommerce_square_application_id").parents("tr").eq(0).show(),e("#woocommerce_square_token").parents("tr").eq(0).show(),e("#woocommerce_square_sandbox_application_id").parents("tr").eq(0).hide(),e("#woocommerce_square_sandbox_token").parents("tr").eq(0).hide())}),e("#woocommerce_square_testmode").trigger("change"),e(document.body).on("change","#woocommerce_squareconnect_sync_products",function(){e(this).is(":checked")?(e("#woocommerce_squareconnect_sync_categories").parents("tr").eq(0).show(),e("#woocommerce_squareconnect_sync_inventory").parents("tr").eq(0).show(),e("#woocommerce_squareconnect_sync_images").parents("tr").eq(0).show()):(e("#woocommerce_squareconnect_sync_categories").parents("tr").eq(0).hide(),e("#woocommerce_squareconnect_sync_inventory").parents("tr").eq(0).hide(),e("#woocommerce_squareconnect_sync_images").parents("tr").eq(0).hide())}),e("#woocommerce_squareconnect_sync_products").trigger("change")}},e.wc_square_admin.init()});
|
assets/js/wc-square-payments.js
CHANGED
@@ -114,7 +114,7 @@
|
|
114 |
// remove any error messages first
|
115 |
$( '.payment_method_square .woocommerce-error' ).remove();
|
116 |
|
117 |
-
if ( $( '#payment_method_square' ).is( ':checked' ) && $( 'input.square-nonce' ).
|
118 |
wcSquarePaymentForm.requestCardNonce();
|
119 |
|
120 |
return false;
|
@@ -128,7 +128,7 @@
|
|
128 |
// remove any error messages first
|
129 |
$( '.payment_method_square .woocommerce-error' ).remove();
|
130 |
|
131 |
-
if ( $( '#payment_method_square' ).is( ':checked' ) && $( 'input.square-nonce' ).
|
132 |
wcSquarePaymentForm.requestCardNonce();
|
133 |
|
134 |
return false;
|
114 |
// remove any error messages first
|
115 |
$( '.payment_method_square .woocommerce-error' ).remove();
|
116 |
|
117 |
+
if ( $( '#payment_method_square' ).is( ':checked' ) && $( 'input.square-nonce' ).length === 0 ) {
|
118 |
wcSquarePaymentForm.requestCardNonce();
|
119 |
|
120 |
return false;
|
128 |
// remove any error messages first
|
129 |
$( '.payment_method_square .woocommerce-error' ).remove();
|
130 |
|
131 |
+
if ( $( '#payment_method_square' ).is( ':checked' ) && $( 'input.square-nonce' ).length === 0 ) {
|
132 |
wcSquarePaymentForm.requestCardNonce();
|
133 |
|
134 |
return false;
|
assets/js/wc-square-payments.min.js
CHANGED
@@ -1 +1 @@
|
|
1 |
-
!function(e){"use strict";var o;e.wc_square_payments={init:function(){e(document.body).on("updated_checkout",function(){e.wc_square_payments.loadForm()}),e("form#order_review").length&&e.wc_square_payments.loadForm();var o=square_params.custom_form_trigger_element;o.length&&e(document.body).on("click",o,function(){e.wc_square_payments.loadForm()}),e(document.body).on("click","#payment_method_square",function(){e(".payment_box.payment_method_square").css({display:"block",visibility:"visible",height:"auto"})})},loadForm:function(){e("#payment_method_square").length&&(e("#payment_method_square").is(":checked")||e(".payment_box.payment_method_square").css({display:"block",visibility:"hidden",height:"0"}),"object"===e.type(o)&&o.destroy(),(o=new SqPaymentForm({env:square_params.environment,applicationId:square_params.application_id,inputClass:"sq-input",cardNumber:{elementId:"sq-card-number",placeholder:square_params.placeholder_card_number},cvv:{elementId:"sq-cvv",placeholder:square_params.placeholder_card_cvv},expirationDate:{elementId:"sq-expiration-date",placeholder:square_params.placeholder_card_expiration},postalCode:{elementId:"sq-postal-code",placeholder:square_params.placeholder_card_postal_code},callbacks:{cardNonceResponseReceived:function(o,r,a){if(o){var t="";t+='<ul class="woocommerce_error woocommerce-error">',e(o).each(function(e,o){t+="<li>"+o.message+"</li>"}),t+="</ul>",e(".payment_method_square fieldset").eq(0).prepend(t)}else{var n=e("form.woocommerce-checkout, form#order_review");n.append('<input type="hidden" class="square-nonce" name="square_nonce" value="'+r+'" />'),n.submit()}},paymentFormLoaded:function(){o.setPostalCode(e("#billing_postcode").val())},unsupportedBrowserDetected:function(){var o="";o+='<ul class="woocommerce_error woocommerce-error">',o+="<li>"+square_params.unsupported_browser+"</li>",o+="</ul>",e(".payment_method_square fieldset").eq(0).prepend(o)}},inputStyles:e.parseJSON(square_params.payment_form_input_styles)})).build(),e("form.woocommerce-checkout").on("checkout_place_order_square",function(r){return e(".payment_method_square .woocommerce-error").remove(),!e("#payment_method_square").is(":checked")||0!==e("input.square-nonce").
|
1 |
+
!function(e){"use strict";var o;e.wc_square_payments={init:function(){e(document.body).on("updated_checkout",function(){e.wc_square_payments.loadForm()}),e("form#order_review").length&&e.wc_square_payments.loadForm();var o=square_params.custom_form_trigger_element;o.length&&e(document.body).on("click",o,function(){e.wc_square_payments.loadForm()}),e(document.body).on("click","#payment_method_square",function(){e(".payment_box.payment_method_square").css({display:"block",visibility:"visible",height:"auto"})})},loadForm:function(){e("#payment_method_square").length&&(e("#payment_method_square").is(":checked")||e(".payment_box.payment_method_square").css({display:"block",visibility:"hidden",height:"0"}),"object"===e.type(o)&&o.destroy(),(o=new SqPaymentForm({env:square_params.environment,applicationId:square_params.application_id,inputClass:"sq-input",cardNumber:{elementId:"sq-card-number",placeholder:square_params.placeholder_card_number},cvv:{elementId:"sq-cvv",placeholder:square_params.placeholder_card_cvv},expirationDate:{elementId:"sq-expiration-date",placeholder:square_params.placeholder_card_expiration},postalCode:{elementId:"sq-postal-code",placeholder:square_params.placeholder_card_postal_code},callbacks:{cardNonceResponseReceived:function(o,r,a){if(o){var t="";t+='<ul class="woocommerce_error woocommerce-error">',e(o).each(function(e,o){t+="<li>"+o.message+"</li>"}),t+="</ul>",e(".payment_method_square fieldset").eq(0).prepend(t)}else{var n=e("form.woocommerce-checkout, form#order_review");n.append('<input type="hidden" class="square-nonce" name="square_nonce" value="'+r+'" />'),n.submit()}},paymentFormLoaded:function(){o.setPostalCode(e("#billing_postcode").val())},unsupportedBrowserDetected:function(){var o="";o+='<ul class="woocommerce_error woocommerce-error">',o+="<li>"+square_params.unsupported_browser+"</li>",o+="</ul>",e(".payment_method_square fieldset").eq(0).prepend(o)}},inputStyles:e.parseJSON(square_params.payment_form_input_styles)})).build(),e("form.woocommerce-checkout").on("checkout_place_order_square",function(r){return e(".payment_method_square .woocommerce-error").remove(),!e("#payment_method_square").is(":checked")||0!==e("input.square-nonce").length||(o.requestCardNonce(),!1)}),e("form#order_review").on("submit",function(r){return e(".payment_method_square .woocommerce-error").remove(),!e("#payment_method_square").is(":checked")||0!==e("input.square-nonce").length||(o.requestCardNonce(),!1)}),e(document.body).on("checkout_error",function(){e("input.square-nonce").remove()}),setTimeout(function(){e("#payment_method_square").is(":checked")||e(".payment_box.payment_method_square").css({display:"none",visibility:"visible",height:"auto"})},1e3))}},e.wc_square_payments.init()}(jQuery);
|
changelog.txt
CHANGED
@@ -1,5 +1,15 @@
|
|
1 |
*** WooCommerce Square Changelog ***
|
2 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
3 |
2018-02-19 - version 1.0.27
|
4 |
* Fix - In some cases request timeouts are not set long enough causing timeout errors.
|
5 |
* Fix - Square to WC sync sets products with 0 quantity to In Stock.
|
1 |
*** WooCommerce Square Changelog ***
|
2 |
|
3 |
+
2018-04-04 - version 1.0.28
|
4 |
+
* Fix - Double inventory sync for newly created products.
|
5 |
+
* Fix - Infinite loop with pagination, where Square keeps sending the same link.
|
6 |
+
* Fix - Remove usage of deprecated jQuery method.
|
7 |
+
* Fix - Sync job should not be sending anything if there are no stock changes.
|
8 |
+
* Fix - Trigger to decrease stock upon purchase not working
|
9 |
+
* Tweak - Add logging and skip sync in case store's currency/country is not allowed.
|
10 |
+
* Tweak - Improve debug logging when fetching inventory
|
11 |
+
* Tweak - Inventory reduction in Square will be treated as stock sale.
|
12 |
+
|
13 |
2018-02-19 - version 1.0.27
|
14 |
* Fix - In some cases request timeouts are not set long enough causing timeout errors.
|
15 |
* Fix - Square to WC sync sets products with 0 quantity to In Stock.
|
includes/class-wc-square-client.php
CHANGED
@@ -200,10 +200,12 @@ class WC_Square_Client {
|
|
200 |
|
201 |
$request_url = $this->get_request_url( $path );
|
202 |
$return_data = array();
|
|
|
|
|
203 |
|
204 |
while ( true ) {
|
205 |
|
206 |
-
$response = $this->http_request( $debug_label, $request_url, $method, $body );
|
207 |
|
208 |
if ( ! $response ) {
|
209 |
|
@@ -236,8 +238,15 @@ class WC_Square_Client {
|
|
236 |
// Set up the next page URL for the following loop
|
237 |
if ( ( 'GET' === $method ) && preg_match( '/Link:( |)<(.+)>;rel=("|\')next("|\')/i', $link_header, $rel_link_matches ) ) {
|
238 |
|
|
|
|
|
|
|
|
|
|
|
239 |
$request_url = $rel_link_matches[2];
|
240 |
$body = null;
|
|
|
|
|
241 |
|
242 |
} else {
|
243 |
|
200 |
|
201 |
$request_url = $this->get_request_url( $path );
|
202 |
$return_data = array();
|
203 |
+
$page_label = '';
|
204 |
+
$page_count = 1;
|
205 |
|
206 |
while ( true ) {
|
207 |
|
208 |
+
$response = $this->http_request( $debug_label . $page_label, $request_url, $method, $body );
|
209 |
|
210 |
if ( ! $response ) {
|
211 |
|
238 |
// Set up the next page URL for the following loop
|
239 |
if ( ( 'GET' === $method ) && preg_match( '/Link:( |)<(.+)>;rel=("|\')next("|\')/i', $link_header, $rel_link_matches ) ) {
|
240 |
|
241 |
+
// Check if we're at the end of pagination.
|
242 |
+
if ( $request_url === $rel_link_matches[2] ) {
|
243 |
+
return $return_data;
|
244 |
+
}
|
245 |
+
|
246 |
$request_url = $rel_link_matches[2];
|
247 |
$body = null;
|
248 |
+
$page_count++;
|
249 |
+
$page_label = sprintf( ' - Fetching page %d', $page_count );
|
250 |
|
251 |
} else {
|
252 |
|
includes/class-wc-square-sync-from-square.php
CHANGED
@@ -302,6 +302,11 @@ class WC_Square_Sync_From_Square {
|
|
302 |
* @param stdClass $square_item
|
303 |
*/
|
304 |
public function sync_inventory( WC_Product $wc_product, $square_item ) {
|
|
|
|
|
|
|
|
|
|
|
305 |
|
306 |
$wc_variation_ids = WC_Square_Utils::get_stock_managed_wc_variation_ids( $wc_product );
|
307 |
$square_inventory = $this->connect->get_square_inventory();
|
@@ -323,6 +328,14 @@ class WC_Square_Sync_From_Square {
|
|
323 |
|
324 |
$square_stock = (int) $square_inventory[ $square_variation_id ];
|
325 |
$wc_variation = wc_get_product( $wc_variation_id );
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
326 |
$result = version_compare( WC_VERSION, '3.0.0', '<' ) ? $wc_variation->set_stock( $square_stock ) : wc_update_product_stock( $wc_variation, $square_stock );
|
327 |
|
328 |
}
|
@@ -335,6 +348,12 @@ class WC_Square_Sync_From_Square {
|
|
335 |
* @todo if searching for square id fails, check for SKU
|
336 |
*/
|
337 |
public function sync_all_inventory() {
|
|
|
|
|
|
|
|
|
|
|
|
|
338 |
try {
|
339 |
set_time_limit( apply_filters( 'woocommerce_square_inventory_sync_timeout_limit', 200 ) );
|
340 |
|
@@ -368,6 +387,14 @@ class WC_Square_Sync_From_Square {
|
|
368 |
$product_id = version_compare( WC_VERSION, '3.0.0', '<' ) ? $wc_variation_product->parent->id : $wc_variation_product->get_parent_id();
|
369 |
}
|
370 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
371 |
if ( is_object( $wc_variation_product ) && ! WC_Square_Utils::skip_product_sync( $product_id ) ) {
|
372 |
version_compare( WC_VERSION, '3.0.0', '<' ) ? $wc_variation_product->set_stock( (int) $stock ) : wc_update_product_stock( $wc_variation_product, (int) $stock );
|
373 |
}
|
302 |
* @param stdClass $square_item
|
303 |
*/
|
304 |
public function sync_inventory( WC_Product $wc_product, $square_item ) {
|
305 |
+
if ( ! Woocommerce_Square::instance()->is_allowed_countries()
|
306 |
+
|| ! Woocommerce_Square::instance()->is_allowed_currencies() ) {
|
307 |
+
WC_Square_Sync_Logger::log( '[Square -> WC] Error syncing inventory for WC Product - Country or Currency mismatch' );
|
308 |
+
return;
|
309 |
+
}
|
310 |
|
311 |
$wc_variation_ids = WC_Square_Utils::get_stock_managed_wc_variation_ids( $wc_product );
|
312 |
$square_inventory = $this->connect->get_square_inventory();
|
328 |
|
329 |
$square_stock = (int) $square_inventory[ $square_variation_id ];
|
330 |
$wc_variation = wc_get_product( $wc_variation_id );
|
331 |
+
|
332 |
+
$current_stock = $wc_variation->get_stock_quantity();
|
333 |
+
|
334 |
+
// Do not trigger sync if setting same stock quantity
|
335 |
+
if ( $square_stock === $current_stock ) {
|
336 |
+
continue;
|
337 |
+
}
|
338 |
+
|
339 |
$result = version_compare( WC_VERSION, '3.0.0', '<' ) ? $wc_variation->set_stock( $square_stock ) : wc_update_product_stock( $wc_variation, $square_stock );
|
340 |
|
341 |
}
|
348 |
* @todo if searching for square id fails, check for SKU
|
349 |
*/
|
350 |
public function sync_all_inventory() {
|
351 |
+
if ( ! Woocommerce_Square::instance()->is_allowed_countries()
|
352 |
+
|| ! Woocommerce_Square::instance()->is_allowed_currencies() ) {
|
353 |
+
WC_Square_Sync_Logger::log( '[Square -> WC] Error syncing all inventory - Country or Currency mismatch' );
|
354 |
+
return;
|
355 |
+
}
|
356 |
+
|
357 |
try {
|
358 |
set_time_limit( apply_filters( 'woocommerce_square_inventory_sync_timeout_limit', 200 ) );
|
359 |
|
387 |
$product_id = version_compare( WC_VERSION, '3.0.0', '<' ) ? $wc_variation_product->parent->id : $wc_variation_product->get_parent_id();
|
388 |
}
|
389 |
|
390 |
+
$current_stock = $wc_variation_product->get_stock_quantity();
|
391 |
+
|
392 |
+
// Do not trigger sync if setting same stock quantity
|
393 |
+
if ( $stock === $current_stock ) {
|
394 |
+
WC_Square_Sync_Logger::log( sprintf( '[Square -> WC] Syncing WC product inventory for Square Item ID %s - No change in stock quantity for product/variation, skipping.', $variation_id ) );
|
395 |
+
continue;
|
396 |
+
}
|
397 |
+
|
398 |
if ( is_object( $wc_variation_product ) && ! WC_Square_Utils::skip_product_sync( $product_id ) ) {
|
399 |
version_compare( WC_VERSION, '3.0.0', '<' ) ? $wc_variation_product->set_stock( (int) $stock ) : wc_update_product_stock( $wc_variation_product, (int) $stock );
|
400 |
}
|
includes/class-wc-square-sync-to-square-wp-hooks.php
CHANGED
@@ -49,6 +49,14 @@ class WC_Square_Sync_To_Square_WordPress_Hooks {
|
|
49 |
*/
|
50 |
protected $enabled = true;
|
51 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
52 |
/**
|
53 |
* WC_Square_Sync_To_Square_WordPress_Hooks constructor.
|
54 |
*
|
@@ -115,9 +123,13 @@ class WC_Square_Sync_To_Square_WordPress_Hooks {
|
|
115 |
|
116 |
if ( 'WC_Square_Integration' !== $param ) {
|
117 |
|
118 |
-
|
|
|
|
|
|
|
119 |
|
120 |
-
|
|
|
121 |
}
|
122 |
}
|
123 |
|
@@ -142,16 +154,10 @@ class WC_Square_Sync_To_Square_WordPress_Hooks {
|
|
142 |
}
|
143 |
|
144 |
if ( is_object( $wc_product ) && ! empty( $wc_product ) ) {
|
145 |
-
$this->square->sync_product( $wc_product, $this->sync_categories, $this->
|
146 |
}
|
147 |
|
148 |
WC_Square_Utils::delete_transients();
|
149 |
-
|
150 |
-
if ( version_compare( WC_VERSION, '3.0.0', '<' ) ) {
|
151 |
-
add_action( 'save_post', array( $this, 'pre_wc_30_on_save_post' ), 10, 2 );
|
152 |
-
} else {
|
153 |
-
add_action( 'woocommerce_before_product_object_save', array( $this, 'on_save_post' ), 10, 2 );
|
154 |
-
}
|
155 |
}
|
156 |
|
157 |
/**
|
@@ -166,7 +172,7 @@ class WC_Square_Sync_To_Square_WordPress_Hooks {
|
|
166 |
$post = get_post( $product->get_id() );
|
167 |
|
168 |
if ( ! $this->enabled
|
169 |
-
|| (
|
170 |
|| ( defined( 'WP_LOAD_IMPORTERS' ) && WP_LOAD_IMPORTERS )
|
171 |
|| wp_is_post_revision( $post )
|
172 |
|| wp_is_post_autosave( $post )
|
@@ -176,14 +182,17 @@ class WC_Square_Sync_To_Square_WordPress_Hooks {
|
|
176 |
return;
|
177 |
}
|
178 |
|
|
|
|
|
|
|
|
|
|
|
179 |
$args = array(
|
180 |
$product->get_id(),
|
181 |
uniqid(), // this is needed due to WP not scheduling new events with same name and args
|
182 |
);
|
183 |
|
184 |
wp_schedule_single_event( time() + 60, 'wc_square_save_post_event', $args );
|
185 |
-
|
186 |
-
remove_action( 'woocommerce_before_product_object_save', array( $this, 'on_save_post' ) );
|
187 |
}
|
188 |
|
189 |
/**
|
@@ -213,8 +222,6 @@ class WC_Square_Sync_To_Square_WordPress_Hooks {
|
|
213 |
);
|
214 |
|
215 |
wp_schedule_single_event( time() + 60, 'wc_square_save_post_event', $args );
|
216 |
-
|
217 |
-
remove_action( 'save_post', array( $this, 'pre_wc_30_on_save_post' ) );
|
218 |
}
|
219 |
|
220 |
/**
|
49 |
*/
|
50 |
protected $enabled = true;
|
51 |
|
52 |
+
/**
|
53 |
+
* Keep track of which products have already assigned a sync job
|
54 |
+
*
|
55 |
+
* @var array
|
56 |
+
*/
|
57 |
+
protected $products_synced = array(
|
58 |
+
);
|
59 |
+
|
60 |
/**
|
61 |
* WC_Square_Sync_To_Square_WordPress_Hooks constructor.
|
62 |
*
|
123 |
|
124 |
if ( 'WC_Square_Integration' !== $param ) {
|
125 |
|
126 |
+
// Only add the stock hooks for versions below 3.0. In versions
|
127 |
+
// >= 3.0 the save hook will take care of stock inventory as well.
|
128 |
+
if ( version_compare( WC_VERSION, '3.0.0', '<' ) ) {
|
129 |
+
add_action( 'woocommerce_product_set_stock', array( $this, 'schedule_on_product_set_stock' ) );
|
130 |
|
131 |
+
add_action( 'woocommerce_variation_set_stock', array( $this, 'schedule_on_variation_set_stock' ) );
|
132 |
+
}
|
133 |
}
|
134 |
}
|
135 |
|
154 |
}
|
155 |
|
156 |
if ( is_object( $wc_product ) && ! empty( $wc_product ) ) {
|
157 |
+
$this->square->sync_product( $wc_product, $this->sync_categories, $this->sync_categories, $this->sync_images );
|
158 |
}
|
159 |
|
160 |
WC_Square_Utils::delete_transients();
|
|
|
|
|
|
|
|
|
|
|
|
|
161 |
}
|
162 |
|
163 |
/**
|
172 |
$post = get_post( $product->get_id() );
|
173 |
|
174 |
if ( ! $this->enabled
|
175 |
+
|| in_array( $product->get_id(), $this->products_synced )
|
176 |
|| ( defined( 'WP_LOAD_IMPORTERS' ) && WP_LOAD_IMPORTERS )
|
177 |
|| wp_is_post_revision( $post )
|
178 |
|| wp_is_post_autosave( $post )
|
182 |
return;
|
183 |
}
|
184 |
|
185 |
+
// Because of metaboxes, core may fire save on the product a couple of times.
|
186 |
+
// TODO: This workaround should be resolved once we re-architecture Square to
|
187 |
+
// use Action Scheduler (or something similar, a queue) to manage jobs.
|
188 |
+
$this->products_synced[] = $product->get_id();
|
189 |
+
|
190 |
$args = array(
|
191 |
$product->get_id(),
|
192 |
uniqid(), // this is needed due to WP not scheduling new events with same name and args
|
193 |
);
|
194 |
|
195 |
wp_schedule_single_event( time() + 60, 'wc_square_save_post_event', $args );
|
|
|
|
|
196 |
}
|
197 |
|
198 |
/**
|
222 |
);
|
223 |
|
224 |
wp_schedule_single_event( time() + 60, 'wc_square_save_post_event', $args );
|
|
|
|
|
225 |
}
|
226 |
|
227 |
/**
|
includes/class-wc-square-sync-to-square.php
CHANGED
@@ -174,6 +174,12 @@ class WC_Square_Sync_To_Square {
|
|
174 |
|
175 |
}
|
176 |
|
|
|
|
|
|
|
|
|
|
|
|
|
177 |
// Look for a Square Item with a matching SKU
|
178 |
$square_item = $this->get_square_item_for_wc_product( $wc_product );
|
179 |
|
@@ -219,6 +225,12 @@ class WC_Square_Sync_To_Square {
|
|
219 |
* @param bool $create
|
220 |
*/
|
221 |
public function sync_inventory( WC_Product $wc_product, $create = false ) {
|
|
|
|
|
|
|
|
|
|
|
|
|
222 |
// refresh cache first to get the latest inventory
|
223 |
$this->connect->refresh_inventory_cache();
|
224 |
|
@@ -245,7 +257,25 @@ class WC_Square_Sync_To_Square {
|
|
245 |
|
246 |
$delta = $wc_stock - $square_stock;
|
247 |
|
248 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
249 |
|
250 |
if ( ! $result ) {
|
251 |
|
174 |
|
175 |
}
|
176 |
|
177 |
+
if ( ! Woocommerce_Square::instance()->is_allowed_countries()
|
178 |
+
|| ! Woocommerce_Square::instance()->is_allowed_currencies() ) {
|
179 |
+
WC_Square_Sync_Logger::log( '[WC -> Square] Error syncing inventory for WC Product - Country or Currency mismatch' );
|
180 |
+
return;
|
181 |
+
}
|
182 |
+
|
183 |
// Look for a Square Item with a matching SKU
|
184 |
$square_item = $this->get_square_item_for_wc_product( $wc_product );
|
185 |
|
225 |
* @param bool $create
|
226 |
*/
|
227 |
public function sync_inventory( WC_Product $wc_product, $create = false ) {
|
228 |
+
if ( ! Woocommerce_Square::instance()->is_allowed_countries()
|
229 |
+
|| ! Woocommerce_Square::instance()->is_allowed_currencies() ) {
|
230 |
+
WC_Square_Sync_Logger::log( '[WC -> Square] Error syncing inventory for WC Product - Country or Currency mismatch' );
|
231 |
+
return;
|
232 |
+
}
|
233 |
+
|
234 |
// refresh cache first to get the latest inventory
|
235 |
$this->connect->refresh_inventory_cache();
|
236 |
|
257 |
|
258 |
$delta = $wc_stock - $square_stock;
|
259 |
|
260 |
+
// Do not trigger inventory update if there is no stock changes.
|
261 |
+
if ( $delta == 0 ) {
|
262 |
+
WC_Square_Sync_Logger::log( sprintf( '[WC -> Square] Syncing WC product inventory for WC Product %d - No change in stock quantity for product/variation, skipping.', $wc_variation_id ) );
|
263 |
+
continue;
|
264 |
+
}
|
265 |
+
|
266 |
+
// Assume delta is gt 0, i.e. we received stock
|
267 |
+
$type = 'RECEIVE_STOCK';
|
268 |
+
|
269 |
+
if ( $delta < 0 ) {
|
270 |
+
// Delta is lt 0, so it is treated as sales
|
271 |
+
$type = 'SALE';
|
272 |
+
}
|
273 |
+
|
274 |
+
$result = $this->connect->update_square_inventory(
|
275 |
+
$square_variation_id,
|
276 |
+
$delta,
|
277 |
+
apply_filters( 'woocommerce_square_inventory_type', $type, $delta )
|
278 |
+
);
|
279 |
|
280 |
if ( ! $result ) {
|
281 |
|
languages/woocommerce-square.pot
CHANGED
@@ -2,10 +2,10 @@
|
|
2 |
# This file is distributed under the same license as the WooCommerce Square package.
|
3 |
msgid ""
|
4 |
msgstr ""
|
5 |
-
"Project-Id-Version: WooCommerce Square 1.0.
|
6 |
"Report-Msgid-Bugs-To: "
|
7 |
"https://github.com/woocommerce/woocommerce-square/issues\n"
|
8 |
-
"POT-Creation-Date: 2018-
|
9 |
"MIME-Version: 1.0\n"
|
10 |
"Content-Type: text/plain; charset=utf-8\n"
|
11 |
"Content-Transfer-Encoding: 8bit\n"
|
@@ -615,26 +615,26 @@ msgid ""
|
|
615 |
"GBP, JPY, or USD."
|
616 |
msgstr ""
|
617 |
|
618 |
-
#: woocommerce-square.php:
|
619 |
msgid ""
|
620 |
"This process may take awhile depending on the amount of items that need to "
|
621 |
"be synced. Please do not close this tab/window or else the sync will "
|
622 |
"terminate. Click OK to continue to sync."
|
623 |
msgstr ""
|
624 |
|
625 |
-
#: woocommerce-square.php:
|
626 |
msgid ""
|
627 |
"WooCommerce Square Plugin requires WooCommerce to be installed and active. "
|
628 |
"You can download %s here."
|
629 |
msgstr ""
|
630 |
|
631 |
-
#: woocommerce-square.php:
|
632 |
msgid ""
|
633 |
"WooCommerce Square is almost ready. To get started, %1$sconnect your Square "
|
634 |
"Account.%2$s"
|
635 |
msgstr ""
|
636 |
|
637 |
-
#: woocommerce-square.php:
|
638 |
msgid ""
|
639 |
"WooCommerce Square is almost ready. Please %1$sset your business "
|
640 |
"location.%2$s"
|
2 |
# This file is distributed under the same license as the WooCommerce Square package.
|
3 |
msgid ""
|
4 |
msgstr ""
|
5 |
+
"Project-Id-Version: WooCommerce Square 1.0.28\n"
|
6 |
"Report-Msgid-Bugs-To: "
|
7 |
"https://github.com/woocommerce/woocommerce-square/issues\n"
|
8 |
+
"POT-Creation-Date: 2018-04-04 08:49:02+00:00\n"
|
9 |
"MIME-Version: 1.0\n"
|
10 |
"Content-Type: text/plain; charset=utf-8\n"
|
11 |
"Content-Transfer-Encoding: 8bit\n"
|
615 |
"GBP, JPY, or USD."
|
616 |
msgstr ""
|
617 |
|
618 |
+
#: woocommerce-square.php:331
|
619 |
msgid ""
|
620 |
"This process may take awhile depending on the amount of items that need to "
|
621 |
"be synced. Please do not close this tab/window or else the sync will "
|
622 |
"terminate. Click OK to continue to sync."
|
623 |
msgstr ""
|
624 |
|
625 |
+
#: woocommerce-square.php:389
|
626 |
msgid ""
|
627 |
"WooCommerce Square Plugin requires WooCommerce to be installed and active. "
|
628 |
"You can download %s here."
|
629 |
msgstr ""
|
630 |
|
631 |
+
#: woocommerce-square.php:407
|
632 |
msgid ""
|
633 |
"WooCommerce Square is almost ready. To get started, %1$sconnect your Square "
|
634 |
"Account.%2$s"
|
635 |
msgstr ""
|
636 |
|
637 |
+
#: woocommerce-square.php:411
|
638 |
msgid ""
|
639 |
"WooCommerce Square is almost ready. Please %1$sset your business "
|
640 |
"location.%2$s"
|
readme.txt
CHANGED
@@ -1,10 +1,10 @@
|
|
1 |
=== WooCommerce Square ===
|
2 |
-
Contributors: automattic, royho, woothemes
|
3 |
Tags: credit card, square, woocommerce, inventory sync
|
4 |
Requires at least: 4.4
|
5 |
Tested up to: 4.9
|
6 |
Requires PHP: 5.6
|
7 |
-
Stable tag: 1.0.
|
8 |
License: GPLv3
|
9 |
License URI: https://www.gnu.org/licenses/gpl-3.0.html
|
10 |
|
@@ -57,6 +57,16 @@ If you get stuck, you can ask for help in the Plugin Forum.
|
|
57 |
|
58 |
== Changelog ==
|
59 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
60 |
= 1.0.27 - 2018-02-19 =
|
61 |
* Fix - In some cases request timeouts are not set long enough causing timeout errors.
|
62 |
* Fix - Square to WC sync sets products with 0 quantity to In Stock.
|
1 |
=== WooCommerce Square ===
|
2 |
+
Contributors: automattic, royho, woothemes, bor0
|
3 |
Tags: credit card, square, woocommerce, inventory sync
|
4 |
Requires at least: 4.4
|
5 |
Tested up to: 4.9
|
6 |
Requires PHP: 5.6
|
7 |
+
Stable tag: 1.0.28
|
8 |
License: GPLv3
|
9 |
License URI: https://www.gnu.org/licenses/gpl-3.0.html
|
10 |
|
57 |
|
58 |
== Changelog ==
|
59 |
|
60 |
+
= 1.0.28 - 2018-04-04 =
|
61 |
+
* Fix - Double inventory sync for newly created products.
|
62 |
+
* Fix - Infinite loop with pagination, where Square keeps sending the same link.
|
63 |
+
* Fix - Remove usage of deprecated jQuery method.
|
64 |
+
* Fix - Sync job should not be sending anything if there are no stock changes.
|
65 |
+
* Fix - Trigger to decrease stock upon purchase not working
|
66 |
+
* Tweak - Add logging and skip sync in case store's currency/country is not allowed.
|
67 |
+
* Tweak - Improve debug logging when fetching inventory
|
68 |
+
* Tweak - Inventory reduction in Square will be treated as stock sale.
|
69 |
+
|
70 |
= 1.0.27 - 2018-02-19 =
|
71 |
* Fix - In some cases request timeouts are not set long enough causing timeout errors.
|
72 |
* Fix - Square to WC sync sets products with 0 quantity to In Stock.
|
woocommerce-square.php
CHANGED
@@ -1,7 +1,7 @@
|
|
1 |
<?php
|
2 |
/**
|
3 |
* Plugin Name: WooCommerce Square
|
4 |
-
* Version: 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
|
@@ -23,7 +23,7 @@ if ( ! defined( 'ABSPATH' ) ) {
|
|
23 |
|
24 |
if ( ! class_exists( 'Woocommerce_Square' ) ) :
|
25 |
|
26 |
-
define( 'WC_SQUARE_VERSION', '1.0.
|
27 |
|
28 |
/**
|
29 |
* Main class.
|
@@ -324,9 +324,10 @@ if ( ! class_exists( 'Woocommerce_Square' ) ) :
|
|
324 |
wp_enqueue_script( 'wc-square-admin-scripts' );
|
325 |
|
326 |
$localized_vars = array(
|
327 |
-
'admin_ajax_url'
|
328 |
-
'ajaxSyncNonce'
|
329 |
-
'
|
|
|
330 |
'confirm_sync' => __( 'This process may take awhile depending on the amount of items that need to be synced. Please do not close this tab/window or else the sync will terminate. Click OK to continue to sync.', 'woocommerce-square' ),
|
331 |
),
|
332 |
);
|
1 |
<?php
|
2 |
/**
|
3 |
* Plugin Name: WooCommerce Square
|
4 |
+
* Version: 1.0.28
|
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
|
23 |
|
24 |
if ( ! class_exists( 'Woocommerce_Square' ) ) :
|
25 |
|
26 |
+
define( 'WC_SQUARE_VERSION', '1.0.28' );
|
27 |
|
28 |
/**
|
29 |
* Main class.
|
324 |
wp_enqueue_script( 'wc-square-admin-scripts' );
|
325 |
|
326 |
$localized_vars = array(
|
327 |
+
'admin_ajax_url' => admin_url( 'admin-ajax.php' ),
|
328 |
+
'ajaxSyncNonce' => wp_create_nonce( 'square-sync' ),
|
329 |
+
'country_currency' => $this->is_allowed_countries() && $this->is_allowed_currencies(),
|
330 |
+
'i18n' => array(
|
331 |
'confirm_sync' => __( 'This process may take awhile depending on the amount of items that need to be synced. Please do not close this tab/window or else the sync will terminate. Click OK to continue to sync.', 'woocommerce-square' ),
|
332 |
),
|
333 |
);
|