Version Description
- 2019.07.23 =
- Fix - Don't display the "unsupported" payment processing admin notice for UK-based merchants
Download this release
Release Info
Developer | cshultz88 |
Plugin | WooCommerce Square |
Version | 2.0.1 |
Comparing to | |
See all releases |
Code changes from version 2.0.0 to 2.0.1
- includes/Plugin.php +2 -2
- includes/admin/Privacy.php +0 -106
- includes/admin/Products.php +0 -663
- includes/admin/Settings_Page.php +0 -197
- includes/admin/Sync_Page.php +0 -379
- readme.txt +4 -1
- vendor/autoload.php +1 -1
- vendor/composer/autoload_real.php +4 -4
- vendor/composer/autoload_static.php +3 -3
- woocommerce-square.php +1 -1
includes/Plugin.php
CHANGED
@@ -41,7 +41,7 @@ class Plugin extends Framework\SV_WC_Payment_Gateway_Plugin {
|
|
41 |
|
42 |
|
43 |
/** plugin version number */
|
44 |
-
const VERSION = '2.0.
|
45 |
|
46 |
/** plugin ID */
|
47 |
const PLUGIN_ID = 'square';
|
@@ -406,7 +406,7 @@ class Plugin extends Framework\SV_WC_Payment_Gateway_Plugin {
|
|
406 |
$accepted_countries = [
|
407 |
'US',
|
408 |
'CA',
|
409 |
-
'
|
410 |
'AU',
|
411 |
'JP',
|
412 |
];
|
41 |
|
42 |
|
43 |
/** plugin version number */
|
44 |
+
const VERSION = '2.0.1';
|
45 |
|
46 |
/** plugin ID */
|
47 |
const PLUGIN_ID = 'square';
|
406 |
$accepted_countries = [
|
407 |
'US',
|
408 |
'CA',
|
409 |
+
'GB',
|
410 |
'AU',
|
411 |
'JP',
|
412 |
];
|
includes/admin/Privacy.php
DELETED
@@ -1,106 +0,0 @@
|
|
1 |
-
<?php
|
2 |
-
/**
|
3 |
-
* WooCommerce Square
|
4 |
-
*
|
5 |
-
* This source file is subject to the GNU General Public License v3.0
|
6 |
-
* that is bundled with this package in the file license.txt.
|
7 |
-
* It is also available through the world-wide-web at this URL:
|
8 |
-
* http://www.gnu.org/licenses/gpl-3.0.html
|
9 |
-
* If you did not receive a copy of the license and are unable to
|
10 |
-
* obtain it through the world-wide-web, please send an email
|
11 |
-
* to license@woocommerce.com so we can send you a copy immediately.
|
12 |
-
*
|
13 |
-
* DISCLAIMER
|
14 |
-
*
|
15 |
-
* Do not edit or add to this file if you wish to upgrade WooCommerce Square to newer
|
16 |
-
* versions in the future. If you wish to customize WooCommerce Square for your
|
17 |
-
* needs please refer to https://docs.woocommerce.com/document/woocommerce-square/
|
18 |
-
*
|
19 |
-
* @author WooCommerce
|
20 |
-
* @copyright Copyright: (c) 2019, Automattic, Inc.
|
21 |
-
* @license http://www.gnu.org/licenses/gpl-3.0.html GNU General Public License v3.0
|
22 |
-
*/
|
23 |
-
|
24 |
-
namespace WooCommerce\Square\Admin;
|
25 |
-
|
26 |
-
defined( 'ABSPATH' ) or exit;
|
27 |
-
|
28 |
-
use SkyVerge\WooCommerce\PluginFramework\v5_4_0 as Framework;
|
29 |
-
|
30 |
-
/**
|
31 |
-
* Privacy admin handler.
|
32 |
-
*
|
33 |
-
* @since 2.0.0
|
34 |
-
*/
|
35 |
-
class Privacy extends \WC_Abstract_Privacy {
|
36 |
-
|
37 |
-
|
38 |
-
/**
|
39 |
-
* Privacy class constructor.
|
40 |
-
*
|
41 |
-
* @since 2.0.0
|
42 |
-
*/
|
43 |
-
public function __construct() {
|
44 |
-
|
45 |
-
|
46 |
-
parent::__construct( __( 'Square', 'woocommerce-square' ) );
|
47 |
-
|
48 |
-
$this->add_eraser( 'woocommerce-square-customer-data', __( 'WooCommerce Square Customer Data', 'woocommerce-square' ), [ $this, 'customer_data_eraser' ] );
|
49 |
-
}
|
50 |
-
|
51 |
-
|
52 |
-
/**
|
53 |
-
* Gets the message to display.
|
54 |
-
*
|
55 |
-
* @since 2.0.0
|
56 |
-
*/
|
57 |
-
public function get_message() {
|
58 |
-
|
59 |
-
return wpautop(
|
60 |
-
sprintf(
|
61 |
-
/* translators: Placeholder: %1$s - <a> tag, %2$s - </a> tag */
|
62 |
-
__( 'By using this extension, you may be storing personal data or sharing data with an external service. %1$sLearn more about how this works, including what you may want to include in your privacy policy.%2$s', 'woocommerce-square' ),
|
63 |
-
'<a href="https://docs.woocommerce.com/document/privacy-payments/#woocommerce-square" target="_blank">', '</a>'
|
64 |
-
)
|
65 |
-
);
|
66 |
-
}
|
67 |
-
|
68 |
-
|
69 |
-
/**
|
70 |
-
* Finds and erases customer data by email address.
|
71 |
-
*
|
72 |
-
* @since 2.0.0
|
73 |
-
*
|
74 |
-
* @param string $email_address the user email address
|
75 |
-
* @param int $page page
|
76 |
-
* @return array an array of personal data in name => value pairs
|
77 |
-
*/
|
78 |
-
public function customer_data_eraser( $email_address, $page ) {
|
79 |
-
|
80 |
-
// check if user has an ID to load stored personal data
|
81 |
-
$user = get_user_by( 'email', $email_address );
|
82 |
-
$square_customer_id = get_user_meta( $user->ID, 'wc_square_customer_id', true );
|
83 |
-
|
84 |
-
$items_removed = false;
|
85 |
-
$messages = [];
|
86 |
-
|
87 |
-
if ( ! empty( $square_customer_id ) ) {
|
88 |
-
|
89 |
-
$items_removed = true;
|
90 |
-
|
91 |
-
delete_user_meta( $user->ID, 'wc_square_customer_id' );
|
92 |
-
|
93 |
-
$messages[] = __( 'Square User Data Erased.', 'woocommerce-square' );
|
94 |
-
}
|
95 |
-
|
96 |
-
return [
|
97 |
-
'items_removed' => $items_removed,
|
98 |
-
'items_retained' => false,
|
99 |
-
'messages' => $messages,
|
100 |
-
'done' => true,
|
101 |
-
];
|
102 |
-
}
|
103 |
-
|
104 |
-
|
105 |
-
}
|
106 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
includes/admin/Products.php
DELETED
@@ -1,663 +0,0 @@
|
|
1 |
-
<?php
|
2 |
-
/**
|
3 |
-
* WooCommerce Square
|
4 |
-
*
|
5 |
-
* This source file is subject to the GNU General Public License v3.0
|
6 |
-
* that is bundled with this package in the file license.txt.
|
7 |
-
* It is also available through the world-wide-web at this URL:
|
8 |
-
* http://www.gnu.org/licenses/gpl-3.0.html
|
9 |
-
* If you did not receive a copy of the license and are unable to
|
10 |
-
* obtain it through the world-wide-web, please send an email
|
11 |
-
* to license@woocommerce.com so we can send you a copy immediately.
|
12 |
-
*
|
13 |
-
* DISCLAIMER
|
14 |
-
*
|
15 |
-
* Do not edit or add to this file if you wish to upgrade WooCommerce Square to newer
|
16 |
-
* versions in the future. If you wish to customize WooCommerce Square for your
|
17 |
-
* needs please refer to https://docs.woocommerce.com/document/woocommerce-square/
|
18 |
-
*
|
19 |
-
* @author WooCommerce
|
20 |
-
* @copyright Copyright: (c) 2019, Automattic, Inc.
|
21 |
-
* @license http://www.gnu.org/licenses/gpl-3.0.html GNU General Public License v3.0
|
22 |
-
*/
|
23 |
-
|
24 |
-
namespace WooCommerce\Square\Admin;
|
25 |
-
|
26 |
-
defined( 'ABSPATH' ) or exit;
|
27 |
-
|
28 |
-
use SkyVerge\WooCommerce\PluginFramework\v5_4_0 as Framework;
|
29 |
-
use WooCommerce\Square\Handlers\Product;
|
30 |
-
use WooCommerce\Square\Sync\Records;
|
31 |
-
|
32 |
-
/**
|
33 |
-
* Products admin handler.
|
34 |
-
*
|
35 |
-
* @since 2.0.0
|
36 |
-
*/
|
37 |
-
class Products {
|
38 |
-
|
39 |
-
|
40 |
-
/** @var array associative array of product error codes and messages */
|
41 |
-
private $product_errors;
|
42 |
-
|
43 |
-
/** @var array associative array of memoized errors being output for a product at one time */
|
44 |
-
private $output_errors = [];
|
45 |
-
|
46 |
-
/** @var int[] array of product IDs that have been scheduled for sync in this request */
|
47 |
-
private $products_to_sync = [];
|
48 |
-
|
49 |
-
/** @var int[] array of product IDs that have been scheduled for deletion in this request */
|
50 |
-
private $products_to_delete = [];
|
51 |
-
|
52 |
-
|
53 |
-
/**
|
54 |
-
* Sets up the products admin handler.
|
55 |
-
*
|
56 |
-
* @since 2.0.0
|
57 |
-
*/
|
58 |
-
public function __construct() {
|
59 |
-
|
60 |
-
// add common errors
|
61 |
-
$this->product_errors = [
|
62 |
-
'missing_sku' => __( "Please add a SKU to sync this product with Square. The SKU must match the item's SKU in your Square account.", 'woocommerce-square' ),
|
63 |
-
'missing_variation_sku' => __( "Please add a SKU to every variation of this variable product for syncing with Square. Each SKU must match the corresponding item's SKU in your Square account.", 'woocommerce-square' ),
|
64 |
-
'multiple_attributes' => __( 'Products with more than one attribute cannot be synced with Square.', 'woocommerce-square' ),
|
65 |
-
'custom_attributes' => __( 'Products with more than one custom attribute cannot be synced with Square. Remove the attribute(s) and update the product to dismiss this notice.', 'woocommerce-square' ),
|
66 |
-
];
|
67 |
-
|
68 |
-
// add hooks
|
69 |
-
$this->add_products_edit_screen_hooks();
|
70 |
-
$this->add_product_edit_screen_hooks();
|
71 |
-
$this->add_product_sync_hooks();
|
72 |
-
}
|
73 |
-
|
74 |
-
|
75 |
-
/**
|
76 |
-
* Adds hooks to the admin products edit screen.
|
77 |
-
*
|
78 |
-
* Products filtering, bulk actions, etc.
|
79 |
-
*
|
80 |
-
* @since 2.0.0
|
81 |
-
*/
|
82 |
-
private function add_products_edit_screen_hooks() {
|
83 |
-
|
84 |
-
// adds an option to the "Filter by product type" dropdown
|
85 |
-
add_action( 'restrict_manage_posts', [ $this, 'add_filter_products_synced_with_square_option' ] );
|
86 |
-
// allow filtering products by sync status by altering results
|
87 |
-
add_filter( 'request', [ $this, 'filter_products_synced_with_square' ] );
|
88 |
-
|
89 |
-
// prevent copying Square data when duplicating a product automatically
|
90 |
-
add_action( 'woocommerce_product_duplicate', [ $this, 'handle_product_duplication' ], 20, 2 );
|
91 |
-
|
92 |
-
// handle quick/bulk edit actions in the products edit screen for setting sync status
|
93 |
-
add_action( 'woocommerce_product_quick_edit_end', [ $this, 'add_quick_edit_inputs' ] );
|
94 |
-
add_action( 'woocommerce_product_bulk_edit_end', [ $this, 'add_bulk_edit_inputs' ] );
|
95 |
-
add_action( 'woocommerce_product_quick_edit_save', [ $this, 'set_synced_with_square' ] );
|
96 |
-
add_action( 'woocommerce_product_bulk_edit_save', [ $this, 'set_synced_with_square' ] );
|
97 |
-
}
|
98 |
-
|
99 |
-
|
100 |
-
/**
|
101 |
-
* Adds hooks to individual products edit screens.
|
102 |
-
*
|
103 |
-
* Product data input fields, variations, etc.
|
104 |
-
*
|
105 |
-
* @since 2.0.0
|
106 |
-
*/
|
107 |
-
private function add_product_edit_screen_hooks() {
|
108 |
-
|
109 |
-
// handle individual products input fields for setting sync status
|
110 |
-
add_action( 'woocommerce_product_options_general_product_data', [ $this, 'add_product_data_fields' ] );
|
111 |
-
add_action( 'woocommerce_admin_process_product_object', [ $this, 'process_product_data' ], 20 );
|
112 |
-
add_action( 'woocommerce_before_product_object_save', [ $this, 'maybe_adjust_square_stock'] );
|
113 |
-
|
114 |
-
add_action( 'admin_notices', [ $this, 'add_notice_product_hidden_from_catalog' ] );
|
115 |
-
}
|
116 |
-
|
117 |
-
|
118 |
-
/**
|
119 |
-
* Adds hooks to sync products that have been updated.
|
120 |
-
*
|
121 |
-
* @since 2.0.0
|
122 |
-
*/
|
123 |
-
private function add_product_sync_hooks() {
|
124 |
-
|
125 |
-
add_action( 'woocommerce_update_product', [ $this, 'maybe_stage_product_for_sync' ] );
|
126 |
-
add_action( 'trashed_post', [ $this, 'maybe_stage_products_for_deletion' ] );
|
127 |
-
add_action( 'shutdown', [ $this, 'maybe_sync_staged_products' ] );
|
128 |
-
add_action( 'shutdown', [ $this, 'maybe_delete_staged_products' ] );
|
129 |
-
}
|
130 |
-
|
131 |
-
|
132 |
-
/**
|
133 |
-
* Adds an option to filter products by sync status.
|
134 |
-
*
|
135 |
-
* @internal
|
136 |
-
*
|
137 |
-
* @since 2.0.0
|
138 |
-
*
|
139 |
-
* @param string $post_type the post type context
|
140 |
-
*/
|
141 |
-
public function add_filter_products_synced_with_square_option( $post_type ) {
|
142 |
-
|
143 |
-
if ( 'product' !== $post_type ) {
|
144 |
-
return;
|
145 |
-
}
|
146 |
-
|
147 |
-
$label = esc_html__( 'Synced with Square', 'woocommerce-square' );
|
148 |
-
$selected = isset( $_GET['product_type'] ) && 'synced-with-square' === $_GET['product_type'] ? 'selected=\"selected\"' : '';
|
149 |
-
|
150 |
-
wc_enqueue_js( "
|
151 |
-
jQuery( document ).ready( function( $ ) {
|
152 |
-
$( 'select#dropdown_product_type' ).append( '<option value=\"synced-with-square\" ' + '" . $selected . "' + '>' + '" . $label ."' + '</option>' );
|
153 |
-
} );
|
154 |
-
" );
|
155 |
-
}
|
156 |
-
|
157 |
-
|
158 |
-
/**
|
159 |
-
* Filters products in admin edit screen by sync status with Square.
|
160 |
-
*
|
161 |
-
* @internal
|
162 |
-
*
|
163 |
-
* @since 2.0.0
|
164 |
-
*
|
165 |
-
* @param array $query_vars query variables
|
166 |
-
* @return array
|
167 |
-
*/
|
168 |
-
public function filter_products_synced_with_square( $query_vars ){
|
169 |
-
global $typenow;
|
170 |
-
|
171 |
-
if ( 'product' === $typenow && isset( $_GET['product_type'] ) && 'synced-with-square' === $_GET['product_type'] ) {
|
172 |
-
|
173 |
-
// not really a product type, otherwise WooCommerce will handle it as such
|
174 |
-
unset( $query_vars['product_type'] );
|
175 |
-
|
176 |
-
if ( ! isset( $query_vars['tax_query'] ) ) {
|
177 |
-
$query_vars['tax_query'] = [];
|
178 |
-
} else {
|
179 |
-
$query_vars['tax_query']['relation'] = 'AND';
|
180 |
-
}
|
181 |
-
|
182 |
-
$query_vars['tax_query'][] = [
|
183 |
-
'taxonomy' => Product::SYNCED_WITH_SQUARE_TAXONOMY,
|
184 |
-
'field' => 'slug',
|
185 |
-
'terms' => [ 'yes' ],
|
186 |
-
];
|
187 |
-
}
|
188 |
-
|
189 |
-
return $query_vars;
|
190 |
-
}
|
191 |
-
|
192 |
-
|
193 |
-
/**
|
194 |
-
* Adds general product data options to a product metabox.
|
195 |
-
*
|
196 |
-
* @internal
|
197 |
-
*
|
198 |
-
* @since 2.0.0
|
199 |
-
*/
|
200 |
-
public function add_product_data_fields() {
|
201 |
-
global $product_object;
|
202 |
-
|
203 |
-
if ( ! $product_object instanceof \WC_Product ) {
|
204 |
-
return;
|
205 |
-
}
|
206 |
-
|
207 |
-
?>
|
208 |
-
<div class="wc-square-sync-with-square options_group show_if_simple show_if_variable">
|
209 |
-
<?php
|
210 |
-
|
211 |
-
$selector = '_' . Product::SYNCED_WITH_SQUARE_TAXONOMY;
|
212 |
-
$value = Product::is_synced_with_square( $product_object ) ? 'yes' : 'no';
|
213 |
-
$errors = [];
|
214 |
-
|
215 |
-
if ( $product_object->is_type( 'variable' ) ) {
|
216 |
-
|
217 |
-
$attributes = $product_object->get_attributes();
|
218 |
-
|
219 |
-
if ( count( $attributes ) > 1 ) {
|
220 |
-
|
221 |
-
/* @type \WC_Product_Attribute[] $attributes */
|
222 |
-
foreach ( $attributes as $attribute ) {
|
223 |
-
|
224 |
-
if ( ! $attribute->is_taxonomy() ) {
|
225 |
-
|
226 |
-
$errors[] = 'custom_attributes';
|
227 |
-
echo '<span style="display:none;" id="wc-square-has-multiple-custom-attributes"></span>';
|
228 |
-
break;
|
229 |
-
}
|
230 |
-
}
|
231 |
-
|
232 |
-
if ( ! in_array( 'custom_attributes', $errors, true ) ) {
|
233 |
-
$errors[] = 'multiple_attributes';
|
234 |
-
}
|
235 |
-
}
|
236 |
-
|
237 |
-
foreach ( $product_object->get_children() as $child ) {
|
238 |
-
|
239 |
-
$child = wc_get_product( $child );
|
240 |
-
|
241 |
-
if ( $child && ! $child->get_sku() ) {
|
242 |
-
$errors[] = 'missing_variation_sku';
|
243 |
-
}
|
244 |
-
}
|
245 |
-
|
246 |
-
} elseif ( ! $product_object->get_sku() ) {
|
247 |
-
|
248 |
-
$errors[] = 'missing_sku';
|
249 |
-
}
|
250 |
-
|
251 |
-
$setting_label = wc_square()->get_settings_handler()->is_system_of_record_square() ? __( 'Update product data with Square data', 'woocommerce-square' ) : __( 'Send product data to Square', 'woocommerce-square' );
|
252 |
-
|
253 |
-
woocommerce_wp_checkbox( [
|
254 |
-
'id' => $selector,
|
255 |
-
'label' => __( 'Sync with Square', 'woocommerce-square' ),
|
256 |
-
'value' => $value,
|
257 |
-
'cbvalue' => 'yes',
|
258 |
-
'default' => 'no',
|
259 |
-
'description' => $setting_label,
|
260 |
-
'custom_attributes' => ! empty( $errors ) ? [ 'disabled' => 'disabled' ] : [],
|
261 |
-
] );
|
262 |
-
|
263 |
-
?>
|
264 |
-
<p class="form-field wc-square-sync-with-square-errors">
|
265 |
-
<?php foreach ( $this->product_errors as $error_code => $error_message ) : ?>
|
266 |
-
<?php $styles = ! in_array( $error_code, $errors, true ) ? 'display:none; color:#A00;' : 'display:block; color:#A00;'; ?>
|
267 |
-
<span class="wc-square-sync-with-square-error <?php echo sanitize_html_class( $error_code ); ?>" style="<?php echo $styles; ?>"><?php echo esc_html( $error_message ); ?></span>
|
268 |
-
<?php endforeach; ?>
|
269 |
-
</p>
|
270 |
-
|
271 |
-
<input type="hidden" id="<?php echo esc_attr( Product::SQUARE_VARIATION_ID_META_KEY ); ?>" value="<?php echo esc_attr( $product_object->get_meta( Product::SQUARE_VARIATION_ID_META_KEY ) ); ?>" />
|
272 |
-
|
273 |
-
</div>
|
274 |
-
<?php
|
275 |
-
}
|
276 |
-
|
277 |
-
|
278 |
-
/**
|
279 |
-
* Outputs HTML with a dropdown field to mark a product to be synced with Square.
|
280 |
-
*
|
281 |
-
* @since 2.0.0
|
282 |
-
*
|
283 |
-
* @param bool $bulk whether the field is meant for bulk edit
|
284 |
-
*/
|
285 |
-
private function output_synced_with_square_edit_field( $bulk = false ) {
|
286 |
-
|
287 |
-
?>
|
288 |
-
<div class="inline-edit-group wc-square-sync-with-square">
|
289 |
-
<label>
|
290 |
-
<span class="title"><?php esc_html_e( 'Sync with Square?', 'woocommerce-square' ); ?></span>
|
291 |
-
<span class="input-text-wrap">
|
292 |
-
<select class="square-synced" name="<?php echo esc_attr( Product::SYNCED_WITH_SQUARE_TAXONOMY ); ?>">
|
293 |
-
<?php if ( true === $bulk ) : // in bulk actions there's the option to leave the value unchanged (or unset) ?>
|
294 |
-
<option value="">— <?php esc_html_e( 'No change', 'woocommerce-square' ); ?> —</option>
|
295 |
-
<?php endif; ?>
|
296 |
-
<option value="no"><?php esc_html_e( 'No', 'woocommerce-square' ); ?></option>
|
297 |
-
<option value="yes"><?php esc_html_e( 'Yes', 'woocommerce-square' ); ?></option>
|
298 |
-
</select>
|
299 |
-
</span>
|
300 |
-
</label>
|
301 |
-
<p class="form-field wc-square-sync-with-square-errors">
|
302 |
-
<?php foreach ( $this->product_errors as $error_code => $error_message ) : ?>
|
303 |
-
<span class="wc-square-sync-with-square-error <?php echo $error_code; ?>" style="display:none; color:#A00;"><?php echo esc_html( $error_message ); ?></span>
|
304 |
-
<?php endforeach; ?>
|
305 |
-
</p>
|
306 |
-
</div>
|
307 |
-
<?php
|
308 |
-
}
|
309 |
-
|
310 |
-
|
311 |
-
/**
|
312 |
-
* Adds quick edit fields to the products screen.
|
313 |
-
*
|
314 |
-
* @internal
|
315 |
-
*
|
316 |
-
* @since 2.0.0
|
317 |
-
*/
|
318 |
-
public function add_quick_edit_inputs() {
|
319 |
-
|
320 |
-
$this->output_synced_with_square_edit_field();
|
321 |
-
}
|
322 |
-
|
323 |
-
|
324 |
-
/**
|
325 |
-
* Adds bulk edit fields to the products screen.
|
326 |
-
*
|
327 |
-
* @internal
|
328 |
-
*
|
329 |
-
* @since 2.0.0
|
330 |
-
*/
|
331 |
-
public function add_bulk_edit_inputs() {
|
332 |
-
|
333 |
-
$this->output_synced_with_square_edit_field( true );
|
334 |
-
}
|
335 |
-
|
336 |
-
|
337 |
-
/**
|
338 |
-
* Stages a product for sync with Square on product save if Woo is the SOR and the product is set to 'synced with square'.
|
339 |
-
*
|
340 |
-
* @internal
|
341 |
-
*
|
342 |
-
* @since 2.0.0
|
343 |
-
*
|
344 |
-
* @param int $product_id the product ID
|
345 |
-
*/
|
346 |
-
public function maybe_stage_product_for_sync( $product_id ) {
|
347 |
-
|
348 |
-
if ( ! defined( 'DOING_SQUARE_SYNC' ) && ! in_array( $product_id, $this->products_to_sync ) && wc_square()->get_settings_handler()->is_system_of_record_woocommerce() ) {
|
349 |
-
|
350 |
-
$product = wc_get_product( $product_id );
|
351 |
-
|
352 |
-
if ( $product && Product::is_synced_with_square( $product ) ) {
|
353 |
-
|
354 |
-
// the triggering action for this method can be called multiple times in a single request - keep track
|
355 |
-
// of product IDs that have been scheduled for sync here to avoid multiple syncs on the same request
|
356 |
-
$this->products_to_sync[] = $product_id;
|
357 |
-
}
|
358 |
-
}
|
359 |
-
}
|
360 |
-
|
361 |
-
|
362 |
-
/**
|
363 |
-
* Initializes a synchronization event for any staged products in this request.
|
364 |
-
*
|
365 |
-
* @internal
|
366 |
-
*
|
367 |
-
* @since 2.0.0
|
368 |
-
*/
|
369 |
-
public function maybe_sync_staged_products() {
|
370 |
-
|
371 |
-
if ( ! defined( 'DOING_SQUARE_SYNC' ) && ! empty( $this->products_to_sync ) && wc_square()->get_settings_handler()->is_system_of_record_woocommerce() ) {
|
372 |
-
|
373 |
-
wc_square()->get_sync_handler()->start_manual_sync( true, $this->products_to_sync );
|
374 |
-
}
|
375 |
-
}
|
376 |
-
|
377 |
-
|
378 |
-
/**
|
379 |
-
* Removes a product from Square if it is deleted locally and Woo is the SOR.
|
380 |
-
*
|
381 |
-
* @since 2.0.0
|
382 |
-
*
|
383 |
-
* @param int $product_id the product ID
|
384 |
-
*/
|
385 |
-
public function maybe_stage_products_for_deletion( $product_id ) {
|
386 |
-
|
387 |
-
if ( wc_square()->get_settings_handler()->is_system_of_record_woocommerce() ) {
|
388 |
-
|
389 |
-
$product = wc_get_product( $product_id );
|
390 |
-
|
391 |
-
if ( $product && Product::is_synced_with_square( $product ) ) {
|
392 |
-
|
393 |
-
// the triggering action for this method can be called multiple times in a single request - keep track
|
394 |
-
// of product IDs that have been scheduled for sync here to avoid multiple syncs on the same request
|
395 |
-
$this->products_to_delete[] = $product_id;
|
396 |
-
}
|
397 |
-
}
|
398 |
-
}
|
399 |
-
|
400 |
-
|
401 |
-
/**
|
402 |
-
* Deletes any products staged for remote deletion.
|
403 |
-
*
|
404 |
-
* @since 2.0.0
|
405 |
-
*/
|
406 |
-
public function maybe_delete_staged_products() {
|
407 |
-
|
408 |
-
if ( ! empty( $this->products_to_delete ) && wc_square()->get_settings_handler()->is_system_of_record_woocommerce() ) {
|
409 |
-
|
410 |
-
wc_square()->get_sync_handler()->start_manual_deletion( $this->products_to_delete );
|
411 |
-
}
|
412 |
-
}
|
413 |
-
|
414 |
-
|
415 |
-
/**
|
416 |
-
* Sets a product's synced with Square status for quick/bulk edit action.
|
417 |
-
*
|
418 |
-
* @internal
|
419 |
-
*
|
420 |
-
* @since 2.0.0
|
421 |
-
*
|
422 |
-
* @param \WC_Product $product a product object
|
423 |
-
*/
|
424 |
-
public function set_synced_with_square( $product ) {
|
425 |
-
|
426 |
-
$posted_data_key = Product::SYNCED_WITH_SQUARE_TAXONOMY;
|
427 |
-
|
428 |
-
if ( 'woocommerce_product_bulk_edit_save' === current_action() ) {
|
429 |
-
$default_value = null; // in bulk actions this will preserve the existing setting if nothing is specified
|
430 |
-
} else {
|
431 |
-
$default_value = 'no'; // in individual products context, the value should be always an explicit yes or no
|
432 |
-
}
|
433 |
-
|
434 |
-
$square_synced = isset( $_REQUEST[ $posted_data_key ] ) && in_array( $_REQUEST[ $posted_data_key ], [ 'yes', 'no' ], true ) ? $_REQUEST[ $posted_data_key ] : $default_value;
|
435 |
-
|
436 |
-
if ( is_string( $square_synced ) ) {
|
437 |
-
|
438 |
-
Product::set_synced_with_square( $product, $square_synced );
|
439 |
-
}
|
440 |
-
}
|
441 |
-
|
442 |
-
|
443 |
-
/**
|
444 |
-
* Updates Square sync status for a product upon saving.
|
445 |
-
*
|
446 |
-
* @internal
|
447 |
-
*
|
448 |
-
* @since 2.0.0
|
449 |
-
*
|
450 |
-
* @param \WC_Product $product product object
|
451 |
-
*/
|
452 |
-
public function process_product_data( $product ) {
|
453 |
-
|
454 |
-
// bail if no valid product found, if it's a variation, errors have already been output
|
455 |
-
if ( ! $product || ( $product instanceof \WC_Product_Variation || $product->is_type( 'product_variation' ) ) || ! empty( $this->output_errors[ $product->get_id() ] ) ) {
|
456 |
-
return;
|
457 |
-
}
|
458 |
-
|
459 |
-
$errors = [];
|
460 |
-
$posted_key = '_' . Product::SYNCED_WITH_SQUARE_TAXONOMY;
|
461 |
-
$set_synced = isset( $_POST[ $posted_key ] ) && 'yes' === $_POST[ $posted_key ];
|
462 |
-
$was_synced = Product::is_synced_with_square( $product );
|
463 |
-
|
464 |
-
// condition has unchanged
|
465 |
-
if ( ! $set_synced && ! $was_synced ) {
|
466 |
-
return;
|
467 |
-
}
|
468 |
-
|
469 |
-
$is_variable = $product->is_type( 'variable' ) && $product->has_child();
|
470 |
-
|
471 |
-
if ( $set_synced || $was_synced ) {
|
472 |
-
|
473 |
-
if ( $is_variable ) {
|
474 |
-
|
475 |
-
if ( isset( $this->product_errors['multiple_attributes'] ) && count( $product->get_attributes() ) > 1 ) {
|
476 |
-
$errors['multiple_attributes'] = $this->product_errors['multiple_attributes'];
|
477 |
-
}
|
478 |
-
|
479 |
-
// if the product is variable, also its variations should have a matching SKU
|
480 |
-
if ( isset( $this->product_errors['missing_variation_sku'] ) ) {
|
481 |
-
|
482 |
-
foreach ( $product->get_children() as $variation_id ) {
|
483 |
-
|
484 |
-
$variation = wc_get_product( $variation_id );
|
485 |
-
|
486 |
-
if ( $variation && empty( $variation->get_sku() ) ) {
|
487 |
-
|
488 |
-
$errors['missing_variation_sku'] = $this->product_errors['missing_variation_sku'];
|
489 |
-
break;
|
490 |
-
}
|
491 |
-
}
|
492 |
-
}
|
493 |
-
|
494 |
-
} elseif ( isset( $this->product_errors['missing_sku'] ) && empty( $product->get_sku() ) ) {
|
495 |
-
|
496 |
-
$errors['missing_sku'] = $this->product_errors['missing_sku'];
|
497 |
-
}
|
498 |
-
}
|
499 |
-
|
500 |
-
if ( ! empty( $errors ) ) {
|
501 |
-
|
502 |
-
// if the instruction is to sync the Product but there are errors, remove the link and display the errors
|
503 |
-
Product::unset_synced_with_square( $product );
|
504 |
-
|
505 |
-
foreach ( $errors as $error ) {
|
506 |
-
wc_square()->get_message_handler()->add_error( $error );
|
507 |
-
}
|
508 |
-
|
509 |
-
} elseif ( $set_synced && $is_variable ) {
|
510 |
-
|
511 |
-
// if there are no errors, and the product is variable, force enable stock management for all its variations
|
512 |
-
foreach ( $product->get_children() as $variation_id ) {
|
513 |
-
|
514 |
-
if ( $variation = wc_get_product( $variation_id ) ) {
|
515 |
-
$variation->set_manage_stock( true );
|
516 |
-
$variation->save();
|
517 |
-
}
|
518 |
-
}
|
519 |
-
}
|
520 |
-
|
521 |
-
// finally, set the product sync with Square flag
|
522 |
-
Product::set_synced_with_square( $product, $set_synced ? 'yes' : 'no' );
|
523 |
-
}
|
524 |
-
|
525 |
-
|
526 |
-
/**
|
527 |
-
* Adjusts a product's Square stock.
|
528 |
-
*
|
529 |
-
* @since 2.0.0
|
530 |
-
*
|
531 |
-
* @param \WC_Product $product product object
|
532 |
-
*/
|
533 |
-
public function maybe_adjust_square_stock( $product ) {
|
534 |
-
|
535 |
-
// this is hooked in to general product object save, so scope to specifically saving products via the admin
|
536 |
-
if ( ! doing_action( 'wp_ajax_woocommerce_save_variations' ) && ! doing_action( 'woocommerce_admin_process_product_object' ) ) {
|
537 |
-
return;
|
538 |
-
}
|
539 |
-
|
540 |
-
// only send stock updates for Woo SOR
|
541 |
-
if ( ! wc_square()->get_settings_handler()->is_system_of_record_woocommerce() ) {
|
542 |
-
return;
|
543 |
-
}
|
544 |
-
|
545 |
-
if ( ! $product instanceof \WC_Product || ! Product::is_synced_with_square( $product ) ) {
|
546 |
-
return;
|
547 |
-
}
|
548 |
-
|
549 |
-
$product->set_manage_stock( true );
|
550 |
-
|
551 |
-
$square_id = $product->get_meta( Product::SQUARE_VARIATION_ID_META_KEY );
|
552 |
-
|
553 |
-
// only send when the product has an associated Square ID
|
554 |
-
if ( ! $square_id ) {
|
555 |
-
return;
|
556 |
-
}
|
557 |
-
|
558 |
-
$data = $product->get_data();
|
559 |
-
$changes = $product->get_changes();
|
560 |
-
$change = 0;
|
561 |
-
|
562 |
-
if ( isset( $data['stock_quantity'], $changes['stock_quantity'] ) ) {
|
563 |
-
$change = (int) $changes['stock_quantity'] - $data['stock_quantity'];
|
564 |
-
}
|
565 |
-
|
566 |
-
if ( $change !== 0 ) {
|
567 |
-
|
568 |
-
try {
|
569 |
-
|
570 |
-
if ( $change > 0 ) {
|
571 |
-
wc_square()->get_api()->add_inventory( $square_id, $change );
|
572 |
-
} else {
|
573 |
-
wc_square()->get_api()->remove_inventory( $square_id, $change );
|
574 |
-
}
|
575 |
-
|
576 |
-
} catch ( Framework\SV_WC_Plugin_Exception $exception ) {
|
577 |
-
|
578 |
-
$quantity = (float) $data['stock_quantity'];
|
579 |
-
|
580 |
-
// if the API request fails, set the product quantity back from whence it came
|
581 |
-
$product->set_stock_quantity( $quantity );
|
582 |
-
}
|
583 |
-
}
|
584 |
-
}
|
585 |
-
|
586 |
-
|
587 |
-
/**
|
588 |
-
* Prevents copying Square data when duplicating a product in admin.
|
589 |
-
*
|
590 |
-
* @internal
|
591 |
-
*
|
592 |
-
* @since 2.0.0
|
593 |
-
*
|
594 |
-
* @param \WC_Product $duplicated_product product duplicate
|
595 |
-
* @param \WC_Product $original_product product duplicated
|
596 |
-
*/
|
597 |
-
public function handle_product_duplication( $duplicated_product, $original_product ) {
|
598 |
-
|
599 |
-
if ( Product::is_synced_with_square( $original_product ) ) {
|
600 |
-
Product::unset_synced_with_square( $duplicated_product );
|
601 |
-
}
|
602 |
-
|
603 |
-
$duplicated_product->delete_meta_data( Product::SQUARE_ID_META_KEY );
|
604 |
-
$duplicated_product->delete_meta_data( Product::SQUARE_VARIATION_ID_META_KEY );
|
605 |
-
|
606 |
-
if ( $duplicated_product->is_type( 'variable' ) ) {
|
607 |
-
|
608 |
-
foreach ( $duplicated_product->get_children() as $duplicated_variation_id ) {
|
609 |
-
|
610 |
-
if ( $duplicated_product_variation = wc_get_product( $duplicated_variation_id ) ) {
|
611 |
-
|
612 |
-
$duplicated_product_variation->delete_meta_data( Product::SQUARE_VARIATION_ID_META_KEY );
|
613 |
-
$duplicated_product_variation->save_meta_data();
|
614 |
-
}
|
615 |
-
}
|
616 |
-
}
|
617 |
-
|
618 |
-
$duplicated_product->save_meta_data();
|
619 |
-
}
|
620 |
-
|
621 |
-
|
622 |
-
/**
|
623 |
-
* Outputs an admin notice when a product was hidden from catalog upon a sync error.
|
624 |
-
*
|
625 |
-
* @internal
|
626 |
-
*
|
627 |
-
* @since 2.0.0
|
628 |
-
*/
|
629 |
-
public function add_notice_product_hidden_from_catalog() {
|
630 |
-
global $current_screen, $post;
|
631 |
-
|
632 |
-
if ( $post && $current_screen && 'product' === $current_screen->id ) {
|
633 |
-
|
634 |
-
$product = wc_get_product( $post );
|
635 |
-
|
636 |
-
if ( $product && 'hidden' === $product->get_catalog_visibility() ) {
|
637 |
-
|
638 |
-
$product_id = $product->get_id();
|
639 |
-
$records = Records::get_records( [ 'product' => $product_id ] );
|
640 |
-
|
641 |
-
foreach ( $records as $record ) {
|
642 |
-
|
643 |
-
if ( $record->was_product_hidden() && $product_id === $record->get_product_id() ) {
|
644 |
-
|
645 |
-
wc_square()->get_message_handler()->add_warning(
|
646 |
-
sprintf(
|
647 |
-
/* translators: Placeholder: %1$s - date (localized), %2$s - time (localized), %3$s - opening <a> HTML link tag, %4$s closing </a> HTML link tag */
|
648 |
-
esc_html__( 'The product catalog visibility has been set to "hidden", as a matching product could not be found in Square on %1$s at %2$s. %3$sCheck sync records%4$s.', 'woocommerce-square' ),
|
649 |
-
date_i18n( wc_date_format(), $record->get_timestamp() ),
|
650 |
-
date_i18n( wc_time_format(), $record->get_timestamp() ),
|
651 |
-
'<a href="' . esc_url( add_query_arg( [ 'section' => 'update' ], wc_square()->get_settings_url() ) ) . '">', '</a>'
|
652 |
-
)
|
653 |
-
);
|
654 |
-
|
655 |
-
break;
|
656 |
-
}
|
657 |
-
}
|
658 |
-
}
|
659 |
-
}
|
660 |
-
}
|
661 |
-
|
662 |
-
|
663 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
includes/admin/Settings_Page.php
DELETED
@@ -1,197 +0,0 @@
|
|
1 |
-
<?php
|
2 |
-
/**
|
3 |
-
* WooCommerce Square
|
4 |
-
*
|
5 |
-
* This source file is subject to the GNU General Public License v3.0
|
6 |
-
* that is bundled with this package in the file license.txt.
|
7 |
-
* It is also available through the world-wide-web at this URL:
|
8 |
-
* http://www.gnu.org/licenses/gpl-3.0.html
|
9 |
-
* If you did not receive a copy of the license and are unable to
|
10 |
-
* obtain it through the world-wide-web, please send an email
|
11 |
-
* to license@woocommerce.com so we can send you a copy immediately.
|
12 |
-
*
|
13 |
-
* DISCLAIMER
|
14 |
-
*
|
15 |
-
* Do not edit or add to this file if you wish to upgrade WooCommerce Square to newer
|
16 |
-
* versions in the future. If you wish to customize WooCommerce Square for your
|
17 |
-
* needs please refer to https://docs.woocommerce.com/document/woocommerce-square/
|
18 |
-
*
|
19 |
-
* @author WooCommerce
|
20 |
-
* @copyright Copyright: (c) 2019, Automattic, Inc.
|
21 |
-
* @license http://www.gnu.org/licenses/gpl-3.0.html GNU General Public License v3.0
|
22 |
-
*/
|
23 |
-
|
24 |
-
namespace WooCommerce\Square\Admin;
|
25 |
-
|
26 |
-
defined( 'ABSPATH' ) or exit;
|
27 |
-
|
28 |
-
use SkyVerge\WooCommerce\PluginFramework\v5_4_0 as Framework;
|
29 |
-
use WooCommerce\Square;
|
30 |
-
|
31 |
-
/**
|
32 |
-
* The settings page class.
|
33 |
-
*
|
34 |
-
* @see \WooCommerce\Square\Settings handles settings registration
|
35 |
-
*
|
36 |
-
* @since 2.0.0
|
37 |
-
*/
|
38 |
-
class Settings_Page extends \WC_Settings_Page {
|
39 |
-
|
40 |
-
|
41 |
-
/** @var Square\Settings settings handler instance */
|
42 |
-
protected $settings_handler;
|
43 |
-
|
44 |
-
|
45 |
-
/**
|
46 |
-
* Constructs the settings page.
|
47 |
-
*
|
48 |
-
* @since 2.0.0
|
49 |
-
*
|
50 |
-
* @param Square\Settings $settings_handler a settings handler instance, for displaying and saving the settings
|
51 |
-
*/
|
52 |
-
public function __construct( Square\Settings $settings_handler ) {
|
53 |
-
|
54 |
-
$this->id = Square\Plugin::PLUGIN_ID;
|
55 |
-
$this->label = __( 'Square', 'woocommerce-square' );
|
56 |
-
$this->settings_handler = $settings_handler;
|
57 |
-
|
58 |
-
parent::__construct();
|
59 |
-
}
|
60 |
-
|
61 |
-
|
62 |
-
/**
|
63 |
-
* Outputs the settings page.
|
64 |
-
*
|
65 |
-
* @internal
|
66 |
-
*
|
67 |
-
* @since 2.0.0
|
68 |
-
*/
|
69 |
-
public function output() {
|
70 |
-
global $current_section;
|
71 |
-
|
72 |
-
if ( 'update' === $current_section ) {
|
73 |
-
$this->output_update_section();
|
74 |
-
} else {
|
75 |
-
$this->output_general_section();
|
76 |
-
}
|
77 |
-
}
|
78 |
-
|
79 |
-
|
80 |
-
/**
|
81 |
-
* Outputs the general settings section.
|
82 |
-
*
|
83 |
-
* @since 2.0.0
|
84 |
-
*/
|
85 |
-
private function output_general_section() {
|
86 |
-
|
87 |
-
$this->settings_handler->admin_options();
|
88 |
-
self::output_import_products_modal_template();
|
89 |
-
}
|
90 |
-
|
91 |
-
|
92 |
-
/**
|
93 |
-
* Outputs the "Update" settings section.
|
94 |
-
*
|
95 |
-
* @since 2.0.0
|
96 |
-
*/
|
97 |
-
private function output_update_section() {
|
98 |
-
global $hide_save_button;
|
99 |
-
|
100 |
-
// removes the save/update button from the screen
|
101 |
-
$hide_save_button = true;
|
102 |
-
|
103 |
-
Sync_Page::output();
|
104 |
-
}
|
105 |
-
|
106 |
-
|
107 |
-
/**
|
108 |
-
* Saves the settings.
|
109 |
-
*
|
110 |
-
* @internal
|
111 |
-
*
|
112 |
-
* @since 2.0.0
|
113 |
-
*/
|
114 |
-
public function save() {
|
115 |
-
|
116 |
-
$this->settings_handler->process_admin_options();
|
117 |
-
}
|
118 |
-
|
119 |
-
|
120 |
-
/**
|
121 |
-
* Gets the settings.
|
122 |
-
*
|
123 |
-
* @since 2.0.0
|
124 |
-
*
|
125 |
-
* @return array
|
126 |
-
*/
|
127 |
-
public function get_settings() {
|
128 |
-
|
129 |
-
return (array) apply_filters( 'woocommerce_get_settings_' . $this->get_id(), $this->settings_handler->get_form_fields() );
|
130 |
-
}
|
131 |
-
|
132 |
-
|
133 |
-
/**
|
134 |
-
* Gets the settings sections.
|
135 |
-
*
|
136 |
-
* @internal
|
137 |
-
*
|
138 |
-
* @since 2.0.0
|
139 |
-
*
|
140 |
-
* @return array
|
141 |
-
*/
|
142 |
-
public function get_sections() {
|
143 |
-
|
144 |
-
$sections = [
|
145 |
-
'' => __( 'Settings', 'woocommerce-square' ), // this key is intentionally blank
|
146 |
-
'update' => __( 'Update', 'woocommerce-square' ),
|
147 |
-
];
|
148 |
-
|
149 |
-
/**
|
150 |
-
* Filters the WooCommerce Square settings sections.
|
151 |
-
*
|
152 |
-
* @since 2.0.0
|
153 |
-
*
|
154 |
-
* @param array $sections settings sections
|
155 |
-
*/
|
156 |
-
return (array) apply_filters( 'woocommerce_get_sections_' . $this->get_id(), $sections );
|
157 |
-
}
|
158 |
-
|
159 |
-
|
160 |
-
/**
|
161 |
-
* Outputs a backbone modal template for importing products from Square.
|
162 |
-
*
|
163 |
-
* @since 2.0.0
|
164 |
-
*/
|
165 |
-
private static function output_import_products_modal_template() {
|
166 |
-
|
167 |
-
?>
|
168 |
-
<script type="text/template" id="tmpl-wc-square-import-products">
|
169 |
-
<div class="wc-backbone-modal">
|
170 |
-
<div class="wc-backbone-modal-content">
|
171 |
-
<section class="wc-backbone-modal-main" role="main">
|
172 |
-
<header class="wc-backbone-modal-header">
|
173 |
-
<h1><?php esc_html_e( 'Import Products From Square', 'woocommerce-square' ); ?></h1>
|
174 |
-
<button class="modal-close modal-close-link dashicons dashicons-no-alt">
|
175 |
-
<span class="screen-reader-text"><?php esc_html_e( 'Close modal window', 'woocommerce-square' ); ?></span>
|
176 |
-
</button>
|
177 |
-
</header>
|
178 |
-
<article>
|
179 |
-
<?php /* translators: Placeholders: %1$s - <strong>, %2%s - </strong> */ ?>
|
180 |
-
<?php printf( esc_html__( 'You are about to import all products from Square. This will create a new product in WooCommerce for every product retrieved from Square. %1$sOnly use this action to perform a one-time import!%2$s', 'woocommerce-square' ), '<strong>', '</strong>' ); ?>
|
181 |
-
</article>
|
182 |
-
<footer>
|
183 |
-
<div class="inner">
|
184 |
-
<button id="btn-close" class="button button-large"><?php esc_html_e( 'Cancel', 'woocommerce-square' ); ?></button>
|
185 |
-
<button id="btn-ok" class="button button-large button-primary"><?php esc_html_e( 'Import Products', 'woocommerce-square' ); ?></button>
|
186 |
-
</div>
|
187 |
-
</footer>
|
188 |
-
</section>
|
189 |
-
</div>
|
190 |
-
</div>
|
191 |
-
<div class="wc-backbone-modal-backdrop modal-close"></div>
|
192 |
-
</script>
|
193 |
-
<?php
|
194 |
-
}
|
195 |
-
|
196 |
-
|
197 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
includes/admin/Sync_Page.php
DELETED
@@ -1,379 +0,0 @@
|
|
1 |
-
<?php
|
2 |
-
/**
|
3 |
-
* WooCommerce Square
|
4 |
-
*
|
5 |
-
* This source file is subject to the GNU General Public License v3.0
|
6 |
-
* that is bundled with this package in the file license.txt.
|
7 |
-
* It is also available through the world-wide-web at this URL:
|
8 |
-
* http://www.gnu.org/licenses/gpl-3.0.html
|
9 |
-
* If you did not receive a copy of the license and are unable to
|
10 |
-
* obtain it through the world-wide-web, please send an email
|
11 |
-
* to license@woocommerce.com so we can send you a copy immediately.
|
12 |
-
*
|
13 |
-
* DISCLAIMER
|
14 |
-
*
|
15 |
-
* Do not edit or add to this file if you wish to upgrade WooCommerce Square to newer
|
16 |
-
* versions in the future. If you wish to customize WooCommerce Square for your
|
17 |
-
* needs please refer to https://docs.woocommerce.com/document/woocommerce-square/
|
18 |
-
*
|
19 |
-
* @author WooCommerce
|
20 |
-
* @copyright Copyright: (c) 2019, Automattic, Inc.
|
21 |
-
* @license http://www.gnu.org/licenses/gpl-3.0.html GNU General Public License v3.0
|
22 |
-
*/
|
23 |
-
|
24 |
-
namespace WooCommerce\Square\Admin;
|
25 |
-
|
26 |
-
defined( 'ABSPATH' ) or exit;
|
27 |
-
|
28 |
-
use SkyVerge\WooCommerce\PluginFramework\v5_4_0 as Framework;
|
29 |
-
use WooCommerce\Square\Handlers\Product;
|
30 |
-
use WooCommerce\Square\Sync\Records;
|
31 |
-
|
32 |
-
/**
|
33 |
-
* Handles HTML output for the "Update" section of the Settings page with sync status handling and UI.
|
34 |
-
*
|
35 |
-
* @since 2.0.0
|
36 |
-
*/
|
37 |
-
class Sync_Page {
|
38 |
-
|
39 |
-
|
40 |
-
/**
|
41 |
-
* Outputs the page HTML.
|
42 |
-
*
|
43 |
-
* @since 2.0.0
|
44 |
-
*/
|
45 |
-
public static function output() {
|
46 |
-
|
47 |
-
?>
|
48 |
-
<div id="wc-square-sync-page">
|
49 |
-
|
50 |
-
<h2><?php esc_html_e( 'Update', 'woocommerce-sync' ); ?></h2>
|
51 |
-
<?php self::output_system_record_of_data_info(); ?>
|
52 |
-
<?php self::output_sync_status(); ?>
|
53 |
-
|
54 |
-
<h2><?php esc_html_e( 'Sync records', 'woocommerce-sync' ); ?></h2>
|
55 |
-
<?php self::output_sync_records(); ?>
|
56 |
-
<?php self::output_sync_with_square_modal_template(); ?>
|
57 |
-
|
58 |
-
</div>
|
59 |
-
<?php
|
60 |
-
}
|
61 |
-
|
62 |
-
|
63 |
-
/**
|
64 |
-
* Outputs notice-like tabular HTML with information on the current system of record handling.
|
65 |
-
*
|
66 |
-
* @since 2.0.0
|
67 |
-
*/
|
68 |
-
private static function output_system_record_of_data_info() {
|
69 |
-
|
70 |
-
?>
|
71 |
-
<table class="wc_square_table sor widefat" cellspacing="0">
|
72 |
-
<tbody>
|
73 |
-
<?php if ( wc_square()->get_settings_handler()->is_system_of_record_square() ) : ?>
|
74 |
-
|
75 |
-
<tr>
|
76 |
-
<td>
|
77 |
-
<?php printf(
|
78 |
-
/* translators: Placeholders: %1$s, %3$s - opening <strong> HTML tag, %2$s, $4%s - closing </strong> HTML tag */
|
79 |
-
esc_html__( '%1$sSquare%2$s is the system of record. The following data from Square will overwrite WooCommerce data for synced products: %3$sname, price, inventory%4$s.', 'woocommerce-square' ),
|
80 |
-
'<strong>', '</strong>', '<strong>', '</strong>'
|
81 |
-
); ?>
|
82 |
-
</td>
|
83 |
-
</tr>
|
84 |
-
<tr>
|
85 |
-
<td>
|
86 |
-
<?php printf(
|
87 |
-
/* translators: Placeholders: %1$s - opening <strong> HTML tag, %2$s closing </strong> HTML tag */
|
88 |
-
esc_html__( '%1$sProduct images%2$s will be imported from Square if no featured image is set in WooCommerce.', 'woocommerce-square' ),
|
89 |
-
'<strong>', '</strong>'
|
90 |
-
);?>
|
91 |
-
</td>
|
92 |
-
</tr>
|
93 |
-
|
94 |
-
<?php elseif ( wc_square()->get_settings_handler()->is_system_of_record_woocommerce() ) : ?>
|
95 |
-
|
96 |
-
<tr>
|
97 |
-
<td>
|
98 |
-
<?php printf(
|
99 |
-
/* translators: Placeholders: %1$s, %3$s - opening <strong> HTML tag, %2$s, %4$s - closing </strong> HTML tag */
|
100 |
-
esc_html__( '%1$sWooCommerce%2$s is the system of record. The following data from WooCommerce will overwrite Square data for synced products: %3$sname, price, inventory, category, image%4$s.', 'woocommerce-square' ),
|
101 |
-
'<strong>', '</strong>', '<strong>', '</strong>'
|
102 |
-
); ?>
|
103 |
-
</td>
|
104 |
-
</tr>
|
105 |
-
|
106 |
-
<?php else : ?>
|
107 |
-
|
108 |
-
<tr>
|
109 |
-
<td>
|
110 |
-
<?php printf(
|
111 |
-
/* translators: Placeholders: %1$s - opening <strong> HTML tag, %2$s closing </strong> HTML tag*/
|
112 |
-
esc_html__( '%1$sNo chosen system of record.%2$s Products will not be synced between Square and WooCommerce.', 'woocommerce-square' ),
|
113 |
-
'<strong>', '</strong>'
|
114 |
-
); ?>
|
115 |
-
</td>
|
116 |
-
</tr>
|
117 |
-
|
118 |
-
<?php endif; ?>
|
119 |
-
</tbody>
|
120 |
-
</table>
|
121 |
-
<?php
|
122 |
-
}
|
123 |
-
|
124 |
-
|
125 |
-
/**
|
126 |
-
* Outputs tabular HTML with information on sync status and a button to trigger a manual sync.
|
127 |
-
*
|
128 |
-
* @since 2.0.0
|
129 |
-
*/
|
130 |
-
private static function output_sync_status() {
|
131 |
-
|
132 |
-
$is_connected = wc_square()->get_settings_handler()->is_connected();
|
133 |
-
$sync_in_progress = $is_connected ? wc_square()->get_sync_handler()->is_sync_in_progress() : false;
|
134 |
-
$synced_products = wc_square()->get_settings_handler()->is_product_sync_enabled() ? Product::get_products_synced_with_square() : [];
|
135 |
-
$synced_count = count( $synced_products );
|
136 |
-
$is_product_import = false;
|
137 |
-
|
138 |
-
if ( $sync_in_progress ) {
|
139 |
-
|
140 |
-
$current_job = wc_square()->get_sync_handler()->get_job_in_progress();
|
141 |
-
$is_product_import = isset( $current_job->action ) && 'product_import' === $current_job->action;
|
142 |
-
}
|
143 |
-
|
144 |
-
if ( ! $is_connected ) {
|
145 |
-
$disabled_reason = esc_html__( 'Please connect to Square to enable product sync.', 'woocommerce-square' );
|
146 |
-
} elseif ( 0 === $synced_count ) {
|
147 |
-
$disabled_reason = esc_html__( 'There are currently no products marked to be synced with Square.', 'woocommerce-square' );
|
148 |
-
} elseif ( $sync_in_progress ) {
|
149 |
-
$disabled_reason = esc_html__( 'A sync is currently in progress. Please try again later.', 'woocommerce-square' );
|
150 |
-
}
|
151 |
-
|
152 |
-
if ( ! empty( $disabled_reason ) ) {
|
153 |
-
/* translators: Placeholder: %s - reason text */
|
154 |
-
$disabled_reason = sprintf( esc_html__( 'Product sync between WooCommerce and Square is currently unavailable. %s', 'woocommerce-square' ), $disabled_reason );
|
155 |
-
}
|
156 |
-
|
157 |
-
?>
|
158 |
-
<table class="wc_square_table sync widefat" cellspacing="0">
|
159 |
-
<thead>
|
160 |
-
<tr>
|
161 |
-
<th class="synced-products"><?php esc_html_e( 'Synced products', 'woocommerce-square' ); ?></th>
|
162 |
-
<th class="latest-sync"><?php esc_html_e( 'Latest sync', 'woocommerce-square' ); ?></th>
|
163 |
-
<th class="next-sync"><?php esc_html_e( 'Next sync', 'woocommerce-square' ); ?></th>
|
164 |
-
<th class="actions"><?php esc_html_e( 'Actions', 'woocommerce-square' ); ?></th>
|
165 |
-
</tr>
|
166 |
-
</thead>
|
167 |
-
<tbody>
|
168 |
-
<tr>
|
169 |
-
<td class="synced-products">
|
170 |
-
<a href="<?php echo esc_url( admin_url( 'edit.php?s&post_status=all&post_type=product&product_type=synced-with-square&stock_status&paged=1' ) ); ?>">
|
171 |
-
<?php printf(
|
172 |
-
/* translators: Placeholder: %d number of products synced with Square */
|
173 |
-
_n( '%d product', '%d products', $synced_count, 'woocommerce-square' ),
|
174 |
-
$synced_count
|
175 |
-
); ?>
|
176 |
-
</a>
|
177 |
-
<input
|
178 |
-
type="hidden"
|
179 |
-
id="wc-square-sync-products-count"
|
180 |
-
value="<?php echo esc_attr( $synced_count ); ?>"
|
181 |
-
/>
|
182 |
-
</td>
|
183 |
-
|
184 |
-
<?php $date_time_format = wc_date_format() . ' ' . wc_time_format(); ?>
|
185 |
-
|
186 |
-
<td class="latest-sync">
|
187 |
-
<p class="sync-result">
|
188 |
-
<?php if ( $sync_in_progress ) : ?>
|
189 |
-
<?php if ( $is_product_import ) : ?>
|
190 |
-
<em><?php esc_html_e( 'Importing now…', 'woocommerce-square' ); ?></em>
|
191 |
-
<?php else : ?>
|
192 |
-
<em><?php esc_html_e( 'Syncing now…', 'woocommerce-square' ); ?></em>
|
193 |
-
<?php endif; ?>
|
194 |
-
<?php else : ?>
|
195 |
-
|
196 |
-
<?php if ( $last_synced_at = wc_square()->get_sync_handler()->get_last_synced_at() ) : ?>
|
197 |
-
|
198 |
-
<?php
|
199 |
-
$last_synced_date = new \DateTime();
|
200 |
-
$last_synced_date->setTimestamp( $last_synced_at );
|
201 |
-
$last_synced_date->setTimezone( new \DateTimeZone( wc_timezone_string() ) );
|
202 |
-
?>
|
203 |
-
|
204 |
-
<?php echo esc_html( $last_synced_date->format( $date_time_format ) ); ?>
|
205 |
-
|
206 |
-
<?php else : ?>
|
207 |
-
<em><?php esc_html_e( 'Not synced yet.', 'woocommerce-square' ); ?></em>
|
208 |
-
<?php endif; ?>
|
209 |
-
<?php endif; ?>
|
210 |
-
</p>
|
211 |
-
</td>
|
212 |
-
<td class="next-sync">
|
213 |
-
<p>
|
214 |
-
<?php if ( $sync_in_progress ) : ?>
|
215 |
-
—
|
216 |
-
<?php else : ?>
|
217 |
-
|
218 |
-
<?php if ( $next_sync_at = wc_square()->get_sync_handler()->get_next_sync_at() ) : ?>
|
219 |
-
|
220 |
-
<?php
|
221 |
-
$next_sync_date = new \DateTime();
|
222 |
-
$next_sync_date->setTimestamp( $next_sync_at );
|
223 |
-
$next_sync_date->setTimezone( new \DateTimeZone( wc_timezone_string() ) );
|
224 |
-
?>
|
225 |
-
|
226 |
-
<?php echo esc_html( $next_sync_date->format( $date_time_format ) ); ?>
|
227 |
-
|
228 |
-
<?php else : ?>
|
229 |
-
—
|
230 |
-
<?php endif; ?>
|
231 |
-
<?php endif; ?>
|
232 |
-
</p>
|
233 |
-
</td>
|
234 |
-
<td class="actions">
|
235 |
-
<button
|
236 |
-
id="wc-square-sync"
|
237 |
-
class="button button-large"
|
238 |
-
<?php echo ! empty( $disabled_reason ) ? sprintf( 'disabled="disabled" title="%s"', esc_attr( $disabled_reason ) ) : ''; ?>
|
239 |
-
><?php esc_html_e( 'Sync now', 'woocommerce-square' ); ?></span></button>
|
240 |
-
<div id="wc-square-sync-progress-spinner" class="spinner" style="float:none; <?php echo $sync_in_progress ? 'visibility:visible;' : ''; ?>"></div>
|
241 |
-
</td>
|
242 |
-
</tr>
|
243 |
-
</tbody>
|
244 |
-
</table>
|
245 |
-
<?php
|
246 |
-
}
|
247 |
-
|
248 |
-
|
249 |
-
/**
|
250 |
-
* Outputs tabular HTML with sync record logs and UI.
|
251 |
-
*
|
252 |
-
* @since 2.0.0
|
253 |
-
*/
|
254 |
-
private static function output_sync_records() {
|
255 |
-
|
256 |
-
$records = Records::get_records(); ?>
|
257 |
-
|
258 |
-
<button
|
259 |
-
id="wc-square_clear-sync-records"
|
260 |
-
class="button button-large"
|
261 |
-
<?php if ( empty( $records ) ) { echo 'disabled="disabled"'; } ?>
|
262 |
-
><?php echo esc_html_x( 'Clear history', 'Delete all records', 'woocommerce-square' ); ?></button>
|
263 |
-
|
264 |
-
<table class="wc_square_table records widefat" cellspacing="0">
|
265 |
-
<thead>
|
266 |
-
<tr>
|
267 |
-
<th class="date-time"><?php echo esc_html_x( 'Time', 'Date - Time', 'woocommerce-square' ); ?></th>
|
268 |
-
<th class="type"><?php esc_html_e( 'Status', 'woocommerce-square' ); ?></th>
|
269 |
-
<th class="message"><?php esc_html_e( 'Message', 'woocommerce-square' ); ?></th>
|
270 |
-
<th class="actions"><?php esc_html_e( 'Actions', 'woocommerce-square' ); ?></th>
|
271 |
-
</tr>
|
272 |
-
</thead>
|
273 |
-
<tbody>
|
274 |
-
<?php if ( ! empty( $records ) ) : ?>
|
275 |
-
|
276 |
-
<?php foreach ( $records as $record ) : ?>
|
277 |
-
|
278 |
-
<tr id="record-<?php echo esc_attr( $record->get_id() ); ?>">
|
279 |
-
<td class="date-time"><?php echo $record->get_local_date(); ?></td>
|
280 |
-
<td class="type"><mark class="<?php echo esc_attr( sanitize_html_class( $record->get_type() ) ); ?>"><span><?php echo esc_html( $record->get_label() ); ?></span></mark></td>
|
281 |
-
<td class="message"><?php echo wp_kses_post( $record->get_message() ); ?></td>
|
282 |
-
<td class="actions">
|
283 |
-
<?php foreach ( $record->get_actions() as $action ) : ?>
|
284 |
-
<button
|
285 |
-
class="button action <?php echo sanitize_html_class( $action->name ); ?> tips"
|
286 |
-
data-id="<?php echo esc_attr( $record->get_id() ); ?>"
|
287 |
-
data-action="<?php echo esc_attr( $action->name ); ?>"
|
288 |
-
data-tip="<?php echo esc_attr( $action->label ); ?>"
|
289 |
-
><?php echo $action->icon; ?></button>
|
290 |
-
<?php endforeach; ?>
|
291 |
-
</td>
|
292 |
-
</tr>
|
293 |
-
|
294 |
-
<?php endforeach; ?>
|
295 |
-
|
296 |
-
<?php else : ?>
|
297 |
-
|
298 |
-
<tr>
|
299 |
-
<td colspan="4">
|
300 |
-
<em><?php esc_html_e( 'No records found.', 'woocommerce-square' ) ?></em>
|
301 |
-
</td>
|
302 |
-
</tr>
|
303 |
-
|
304 |
-
<?php endif; ?>
|
305 |
-
</tbody>
|
306 |
-
<tfoot>
|
307 |
-
<tr>
|
308 |
-
<th class="date-time"><?php echo esc_html_x( 'Time', 'Date - Time', 'woocommerce-square' ); ?></th>
|
309 |
-
<th class="type"><?php esc_html_e( 'Status', 'woocommerce-square' ); ?></th>
|
310 |
-
<th class="message"><?php esc_html_e( 'Message', 'woocommerce-square' ); ?></th>
|
311 |
-
<th class="actions"><?php esc_html_e( 'Actions', 'woocommerce-square' ); ?></th>
|
312 |
-
</tr>
|
313 |
-
</tfoot>
|
314 |
-
</table>
|
315 |
-
<?php
|
316 |
-
}
|
317 |
-
|
318 |
-
|
319 |
-
/**
|
320 |
-
* Outputs a backbone modal template for starting a manual sync process.
|
321 |
-
*
|
322 |
-
* @since 2.0.0
|
323 |
-
*/
|
324 |
-
private static function output_sync_with_square_modal_template() {
|
325 |
-
|
326 |
-
?>
|
327 |
-
<script type="text/template" id="tmpl-wc-square-sync">
|
328 |
-
<div class="wc-backbone-modal">
|
329 |
-
<div class="wc-backbone-modal-content">
|
330 |
-
<section class="wc-backbone-modal-main" role="main">
|
331 |
-
<header class="wc-backbone-modal-header">
|
332 |
-
<h1><?php esc_html_e( 'Sync products with Square', 'woocommerce-square' ); ?></h1>
|
333 |
-
<button class="modal-close modal-close-link dashicons dashicons-no-alt">
|
334 |
-
<span class="screen-reader-text"><?php esc_html_e( 'Close modal window', 'woocommerce-square' ); ?></span>
|
335 |
-
</button>
|
336 |
-
</header>
|
337 |
-
<article>
|
338 |
-
<?php $square_settings = wc_square()->get_settings_handler(); ?>
|
339 |
-
<?php ob_start(); ?>
|
340 |
-
<ul>
|
341 |
-
<?php if ( $square_settings->is_system_of_record_square() ) : ?>
|
342 |
-
<li><?php esc_html_e( 'If a match is found in Square, product data in WooCommerce will be overwritten with Square data.', 'woocommerce-square' ); ?></li>
|
343 |
-
<?php elseif ( $square_settings->is_system_of_record_woocommerce() ) : ?>
|
344 |
-
<li><?php esc_html_e( 'If a match is found in WooCommerce, product data in Square will be overwritten with WooCommerce data.', 'woocommerce-square' ); ?></li>
|
345 |
-
<?php endif; ?>
|
346 |
-
<?php if ( $square_settings->is_system_of_record_square() ) : ?>
|
347 |
-
<?php if ( $square_settings->hide_missing_square_products() ) : ?>
|
348 |
-
<li><?php esc_html_e( 'If a match is not found in Square, the product will be hidden from the catalog in WooCommerce.', 'woocommerce-square' ); ?></li>
|
349 |
-
<?php else : ?>
|
350 |
-
<li><?php esc_html_e( 'If a match is not found in Square, the product will be skipped in the sync.', 'woocommerce-square' ); ?></li>
|
351 |
-
<?php endif; ?>
|
352 |
-
<?php else : ?>
|
353 |
-
<li><?php esc_html_e( 'If a match is not found, a new product will be created in Square.', 'woocommerce-square' ); ?></li>
|
354 |
-
<?php endif; ?>
|
355 |
-
</ul>
|
356 |
-
<?php $additional_info = ob_get_clean(); ?>
|
357 |
-
<?php printf(
|
358 |
-
/* translators: Placeholders: %1$s - the system of record name (e.g. Square or WooCommerce), %3%s - unordered HTML list of additional information item(s) */
|
359 |
-
esc_html__( 'You are about to sync products with Square. %1$s is your system of record. For all products synced with Square: %2$s', 'woocommerce-square' ),
|
360 |
-
$square_settings->get_system_of_record_name(),
|
361 |
-
$additional_info
|
362 |
-
); ?>
|
363 |
-
</article>
|
364 |
-
<footer>
|
365 |
-
<div class="inner">
|
366 |
-
<button id="btn-close" class="button button-large"><?php esc_html_e( 'Cancel', 'woocommerce-square' ); ?></button>
|
367 |
-
<button id="btn-ok" class="button button-large button-primary"><?php esc_html_e( 'Start sync', 'woocommerce-square' ); ?></button>
|
368 |
-
</div>
|
369 |
-
</footer>
|
370 |
-
</section>
|
371 |
-
</div>
|
372 |
-
</div>
|
373 |
-
<div class="wc-backbone-modal-backdrop modal-close"></div>
|
374 |
-
</script>
|
375 |
-
<?php
|
376 |
-
}
|
377 |
-
|
378 |
-
|
379 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
readme.txt
CHANGED
@@ -4,7 +4,7 @@ Tags: credit card, square, woocommerce, inventory sync
|
|
4 |
Requires at least: 4.6
|
5 |
Tested up to: 5.2.0
|
6 |
Requires PHP: 5.6
|
7 |
-
Stable tag: 2.0.
|
8 |
License: GPLv3
|
9 |
License URI: https://www.gnu.org/licenses/gpl-3.0.html
|
10 |
|
@@ -72,6 +72,9 @@ If you get stuck, you can ask for help in the [Plugin Forum](https://wordpress.o
|
|
72 |
|
73 |
== Changelog ==
|
74 |
|
|
|
|
|
|
|
75 |
= 2.0.0 - 2019.07.22 =
|
76 |
* Feature - Support Square customer profiles for saved payment methods
|
77 |
* Feature - Customers can label their saved payment methods for easy identification when choosing how to pay
|
4 |
Requires at least: 4.6
|
5 |
Tested up to: 5.2.0
|
6 |
Requires PHP: 5.6
|
7 |
+
Stable tag: 2.0.1
|
8 |
License: GPLv3
|
9 |
License URI: https://www.gnu.org/licenses/gpl-3.0.html
|
10 |
|
72 |
|
73 |
== Changelog ==
|
74 |
|
75 |
+
= 2.0.1 - 2019.07.23 =
|
76 |
+
* Fix - Don't display the "unsupported" payment processing admin notice for UK-based merchants
|
77 |
+
|
78 |
= 2.0.0 - 2019.07.22 =
|
79 |
* Feature - Support Square customer profiles for saved payment methods
|
80 |
* Feature - Customers can label their saved payment methods for easy identification when choosing how to pay
|
vendor/autoload.php
CHANGED
@@ -4,4 +4,4 @@
|
|
4 |
|
5 |
require_once __DIR__ . '/composer/autoload_real.php';
|
6 |
|
7 |
-
return
|
4 |
|
5 |
require_once __DIR__ . '/composer/autoload_real.php';
|
6 |
|
7 |
+
return ComposerAutoloaderInite107ddb09701c5bfa4c03e7854d385e4::getLoader();
|
vendor/composer/autoload_real.php
CHANGED
@@ -2,7 +2,7 @@
|
|
2 |
|
3 |
// autoload_real.php @generated by Composer
|
4 |
|
5 |
-
class
|
6 |
{
|
7 |
private static $loader;
|
8 |
|
@@ -19,15 +19,15 @@ class ComposerAutoloaderInit9bc8708bc6e6fe7ce2e37866264686ad
|
|
19 |
return self::$loader;
|
20 |
}
|
21 |
|
22 |
-
spl_autoload_register(array('
|
23 |
self::$loader = $loader = new \Composer\Autoload\ClassLoader();
|
24 |
-
spl_autoload_unregister(array('
|
25 |
|
26 |
$useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());
|
27 |
if ($useStaticLoader) {
|
28 |
require_once __DIR__ . '/autoload_static.php';
|
29 |
|
30 |
-
call_user_func(\Composer\Autoload\
|
31 |
} else {
|
32 |
$map = require __DIR__ . '/autoload_namespaces.php';
|
33 |
foreach ($map as $namespace => $path) {
|
2 |
|
3 |
// autoload_real.php @generated by Composer
|
4 |
|
5 |
+
class ComposerAutoloaderInite107ddb09701c5bfa4c03e7854d385e4
|
6 |
{
|
7 |
private static $loader;
|
8 |
|
19 |
return self::$loader;
|
20 |
}
|
21 |
|
22 |
+
spl_autoload_register(array('ComposerAutoloaderInite107ddb09701c5bfa4c03e7854d385e4', 'loadClassLoader'), true, true);
|
23 |
self::$loader = $loader = new \Composer\Autoload\ClassLoader();
|
24 |
+
spl_autoload_unregister(array('ComposerAutoloaderInite107ddb09701c5bfa4c03e7854d385e4', 'loadClassLoader'));
|
25 |
|
26 |
$useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());
|
27 |
if ($useStaticLoader) {
|
28 |
require_once __DIR__ . '/autoload_static.php';
|
29 |
|
30 |
+
call_user_func(\Composer\Autoload\ComposerStaticInite107ddb09701c5bfa4c03e7854d385e4::getInitializer($loader));
|
31 |
} else {
|
32 |
$map = require __DIR__ . '/autoload_namespaces.php';
|
33 |
foreach ($map as $namespace => $path) {
|
vendor/composer/autoload_static.php
CHANGED
@@ -4,7 +4,7 @@
|
|
4 |
|
5 |
namespace Composer\Autoload;
|
6 |
|
7 |
-
class
|
8 |
{
|
9 |
public static $prefixLengthsPsr4 = array (
|
10 |
'S' =>
|
@@ -23,8 +23,8 @@ class ComposerStaticInit9bc8708bc6e6fe7ce2e37866264686ad
|
|
23 |
public static function getInitializer(ClassLoader $loader)
|
24 |
{
|
25 |
return \Closure::bind(function () use ($loader) {
|
26 |
-
$loader->prefixLengthsPsr4 =
|
27 |
-
$loader->prefixDirsPsr4 =
|
28 |
|
29 |
}, null, ClassLoader::class);
|
30 |
}
|
4 |
|
5 |
namespace Composer\Autoload;
|
6 |
|
7 |
+
class ComposerStaticInite107ddb09701c5bfa4c03e7854d385e4
|
8 |
{
|
9 |
public static $prefixLengthsPsr4 = array (
|
10 |
'S' =>
|
23 |
public static function getInitializer(ClassLoader $loader)
|
24 |
{
|
25 |
return \Closure::bind(function () use ($loader) {
|
26 |
+
$loader->prefixLengthsPsr4 = ComposerStaticInite107ddb09701c5bfa4c03e7854d385e4::$prefixLengthsPsr4;
|
27 |
+
$loader->prefixDirsPsr4 = ComposerStaticInite107ddb09701c5bfa4c03e7854d385e4::$prefixDirsPsr4;
|
28 |
|
29 |
}, null, ClassLoader::class);
|
30 |
}
|
woocommerce-square.php
CHANGED
@@ -1,7 +1,7 @@
|
|
1 |
<?php
|
2 |
/**
|
3 |
* Plugin Name: WooCommerce Square
|
4 |
-
* Version: 2.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
|
1 |
<?php
|
2 |
/**
|
3 |
* Plugin Name: WooCommerce Square
|
4 |
+
* Version: 2.0.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
|