WooCommerce Services - Version 1.6.1

Version Description

  • Better UX when selecting shipping label payment method
Download this release

Release Info

Developer woothemes
Plugin Icon 128x128 WooCommerce Services
Version 1.6.1
Comparing to
See all releases

Code changes from version 1.6.0 to 1.6.1

classes/class-wc-connect-api-client.php CHANGED
@@ -382,6 +382,33 @@ if ( ! class_exists( 'WC_Connect_API_Client' ) ) {
382
  return $response_body;
383
  }
384
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
385
  /**
386
  * Adds useful WP/WC/WCC information to request bodies
387
  *
382
  return $response_body;
383
  }
384
 
385
+ /**
386
+ * Proxy an HTTP request through the WCS Server
387
+ *
388
+ * @param $path Path of proxy route
389
+ * @param $args WP_Http request args
390
+ *
391
+ * @return array|WP_Error
392
+ */
393
+ public function proxy_request( $path, $args ) {
394
+ $proxy_url = trailingslashit( WOOCOMMERCE_CONNECT_SERVER_URL );
395
+ $proxy_url .= ltrim( $path, '/' );
396
+
397
+ $args['headers']['Authorization'] = $this->authorization_header();
398
+
399
+ $http_timeout = 60; // 1 minute
400
+
401
+ if ( function_exists( 'wc_set_time_limit' ) ) {
402
+ wc_set_time_limit( $http_timeout + 10 );
403
+ }
404
+
405
+ $args['timeout'] = $http_timeout;
406
+
407
+ $response = wp_remote_request( $proxy_url, $args );
408
+
409
+ return $response;
410
+ }
411
+
412
  /**
413
  * Adds useful WP/WC/WCC information to request bodies
414
  *
classes/class-wc-connect-payment-methods-store.php CHANGED
@@ -50,31 +50,28 @@ if ( ! class_exists( 'WC_Connect_Payment_Methods_Store' ) ) {
50
  }
51
 
52
  protected function potentially_update_selected_payment_method_from_payment_methods( $payment_methods ) {
53
- $payment_method_count = count( $payment_methods );
54
-
55
- // No payment methods at all? Clear anything we have stored
56
- if ( 0 === $payment_method_count ) {
57
- $this->service_settings_store->set_selected_payment_method_id( 0 );
58
- return;
59
- }
60
-
61
  $payment_method_ids = array();
 
62
  foreach ( (array) $payment_methods as $payment_method ) {
63
  $payment_method_id = intval( $payment_method->payment_method_id );
 
64
  if ( 0 !== $payment_method_id ) {
65
  $payment_method_ids[] = $payment_method_id;
66
  }
67
  }
68
 
69
- // Just one? Go ahead and use it
70
- if ( 1 === $payment_method_count ) {
71
- $this->service_settings_store->set_selected_payment_method_id( $payment_method_ids[ 0 ] );
72
  return;
73
  }
74
 
75
- // Is the stored method id not in the list? Select the first one
76
  $selected_payment_method_id = $this->service_settings_store->get_selected_payment_method_id();
77
- if ( ! in_array( $selected_payment_method_id, $payment_method_ids ) ) {
 
 
 
78
  $this->service_settings_store->set_selected_payment_method_id( $payment_method_ids[ 0 ] );
79
  }
80
  }
50
  }
51
 
52
  protected function potentially_update_selected_payment_method_from_payment_methods( $payment_methods ) {
 
 
 
 
 
 
 
 
53
  $payment_method_ids = array();
54
+
55
  foreach ( (array) $payment_methods as $payment_method ) {
56
  $payment_method_id = intval( $payment_method->payment_method_id );
57
+
58
  if ( 0 !== $payment_method_id ) {
59
  $payment_method_ids[] = $payment_method_id;
60
  }
61
  }
62
 
63
+ // No payment methods at all? Clear anything we have stored
64
+ if ( 0 === count( $payment_method_ids ) ) {
65
+ $this->service_settings_store->set_selected_payment_method_id( 0 );
66
  return;
67
  }
68
 
69
+ // Has the stored method ID been removed? Select the first available one
70
  $selected_payment_method_id = $this->service_settings_store->get_selected_payment_method_id();
71
+ if (
72
+ $selected_payment_method_id &&
73
+ ! in_array( $selected_payment_method_id, $payment_method_ids )
74
+ ) {
75
  $this->service_settings_store->set_selected_payment_method_id( $payment_method_ids[ 0 ] );
76
  }
77
  }
classes/class-wc-connect-taxjar-integration.php ADDED
@@ -0,0 +1,87 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class WC_Connect_TaxJar_Integration {
4
+
5
+ /**
6
+ * @var WC_Connect_API_Client
7
+ */
8
+ public $api_client;
9
+
10
+ /**
11
+ * @var WC_Taxjar_Integration
12
+ */
13
+ protected $taxjar_integration;
14
+
15
+ const TAXJAR_URL = 'https://api.taxjar.com';
16
+ const PROXY_PATH = 'taxjar';
17
+ const FAKE_TOKEN = '[Managed by WooCommerce Services]';
18
+
19
+ public function __construct( WC_Connect_API_Client $api_client ) {
20
+ $this->api_client = $api_client;
21
+ }
22
+
23
+ public function init() {
24
+ add_filter( 'default_option_woocommerce_taxjar-integration_settings', array( $this, 'override_taxjar_settings' ) );
25
+ add_filter( 'option_woocommerce_taxjar-integration_settings', array( $this, 'check_taxjar_settings' ) );
26
+ }
27
+
28
+ public function check_taxjar_settings( $settings ) {
29
+ if (
30
+ isset( $settings['api_token'] ) &&
31
+ ( $settings['api_token'] === strtolower( self::FAKE_TOKEN ) )
32
+ ) {
33
+ return $this->override_taxjar_settings( $settings );
34
+ }
35
+
36
+ return $settings;
37
+ }
38
+
39
+ public function override_taxjar_settings( $settings ) {
40
+ $store_city = get_option( 'woocommerce_store_city' );
41
+ $store_postcode = get_option( 'woocommerce_store_postcode' );
42
+
43
+ // Check for store address before hijacking requests.
44
+ if ( empty( $store_city ) || empty( $store_postcode ) ) {
45
+ return $settings;
46
+ }
47
+
48
+ // Attach proxy filter.
49
+ add_filter( 'pre_http_request', array( $this, 'proxy_taxjar_requests' ), 10, 3 );
50
+
51
+ if ( ! is_array( $settings ) ) {
52
+ $settings = array();
53
+ }
54
+
55
+ $settings = array_merge( $settings, array(
56
+ 'api_token' => self::FAKE_TOKEN,
57
+ 'enabled' => 'yes',
58
+ 'store_city' => $store_city,
59
+ 'store_zip' => $store_postcode,
60
+ ) );
61
+
62
+ return $settings;
63
+ }
64
+
65
+ public function proxy_taxjar_requests( $pre, $r, $url ) {
66
+ // TODO: get verification requests working through proxy
67
+ if ( 'https://api.taxjar.com/v2/verify' === $url ) {
68
+ return array(
69
+ 'response' => array(
70
+ 'code' => 200,
71
+ ),
72
+ 'body' => '',
73
+ );
74
+ }
75
+
76
+ // Proxy all TaxJar requests through the WCS server
77
+ if ( strpos( $url, self::TAXJAR_URL ) === 0 ) {
78
+ $taxjar_url = trailingslashit( self::TAXJAR_URL );
79
+ $wcs_path = trailingslashit( self::PROXY_PATH );
80
+ $proxy_path = str_replace( $taxjar_url, $wcs_path, $url );
81
+
82
+ return $this->api_client->proxy_request( $proxy_path, $r );
83
+ }
84
+
85
+ return $pre;
86
+ }
87
+ }
readme.txt CHANGED
@@ -3,7 +3,7 @@ Contributors: automattic, woothemes, allendav, kellychoffman, jkudish, jeffstiel
3
  Tags: canada-post, shipping, stamps, usps, woocommerce
4
  Requires at least: 4.6
5
  Tested up to: 4.8
6
- Stable tag: 1.6.0
7
  License: GPLv2 or later
8
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
9
 
@@ -79,6 +79,9 @@ The source code is freely available [in GitHub](https://github.com/Automattic/wo
79
 
80
  == Changelog ==
81
 
 
 
 
82
  = 1.6.0 =
83
  * New streamlined onboarding process for plugin dependencies
84
  * Better packaging workflow for orders not using live rates at checkout
3
  Tags: canada-post, shipping, stamps, usps, woocommerce
4
  Requires at least: 4.6
5
  Tested up to: 4.8
6
+ Stable tag: 1.6.1
7
  License: GPLv2 or later
8
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
9
 
79
 
80
  == Changelog ==
81
 
82
+ = 1.6.1 =
83
+ * Better UX when selecting shipping label payment method
84
+
85
  = 1.6.0 =
86
  * New streamlined onboarding process for plugin dependencies
87
  * Better packaging workflow for orders not using live rates at checkout
woocommerce-services.php CHANGED
@@ -7,7 +7,7 @@
7
  * Author URI: http://woocommerce.com/
8
  * Text Domain: woocommerce-services
9
  * Domain Path: /i18n/languages/
10
- * Version: 1.6.0
11
  *
12
  * Copyright (c) 2017 Automattic
13
  *
@@ -152,6 +152,11 @@ if ( ! class_exists( 'WC_Connect_Loader' ) ) {
152
  */
153
  protected $nux;
154
 
 
 
 
 
 
155
  protected $services = array();
156
 
157
  protected $service_object_cache = array();
@@ -169,7 +174,7 @@ if ( ! class_exists( 'WC_Connect_Loader' ) ) {
169
  public function __construct() {
170
  $this->wc_connect_base_url = trailingslashit( defined( 'WOOCOMMERCE_CONNECT_DEV_SERVER_URL' ) ? WOOCOMMERCE_CONNECT_DEV_SERVER_URL : plugins_url( 'dist/', __FILE__ ) );
171
  add_action( 'plugins_loaded', array( $this, 'load_textdomain' ) );
172
- add_action( 'woocommerce_init', array( $this, 'init' ) );
173
  }
174
 
175
  public function get_logger() {
@@ -332,6 +337,10 @@ if ( ! class_exists( 'WC_Connect_Loader' ) ) {
332
  $this->nux = $nux;
333
  }
334
 
 
 
 
 
335
  /**
336
  * Load our textdomain
337
  *
@@ -342,11 +351,11 @@ if ( ! class_exists( 'WC_Connect_Loader' ) ) {
342
  }
343
 
344
  /**
345
- * Bootstrap our plugin and hook into WP/WC core.
346
  *
347
- * @codeCoverageIgnore
348
  */
349
- public function init() {
350
  $this->load_dependencies();
351
 
352
  add_action( 'admin_init', array( $this, 'admin_enqueue_scripts' ) );
@@ -361,6 +370,16 @@ if ( ! class_exists( 'WC_Connect_Loader' ) ) {
361
  return;
362
  }
363
 
 
 
 
 
 
 
 
 
 
 
364
  $this->schedule_service_schemas_fetch();
365
  $this->service_settings_store->migrate_legacy_services();
366
  $this->attach_hooks();
@@ -370,11 +389,12 @@ if ( ! class_exists( 'WC_Connect_Loader' ) ) {
370
  * Load all plugin dependencies.
371
  */
372
  public function load_dependencies() {
373
- require_once( plugin_basename( 'classes/class-wc-connect-error-notice.php' ) );
374
- require_once( plugin_basename( 'classes/class-wc-connect-compatibility.php' ) );
375
  require_once( plugin_basename( 'classes/class-wc-connect-logger.php' ) );
376
  require_once( plugin_basename( 'classes/class-wc-connect-api-client.php' ) );
377
  require_once( plugin_basename( 'classes/class-wc-connect-service-schemas-validator.php' ) );
 
 
 
378
  require_once( plugin_basename( 'classes/class-wc-connect-shipping-method.php' ) );
379
  require_once( plugin_basename( 'classes/class-wc-connect-service-schemas-store.php' ) );
380
  require_once( plugin_basename( 'classes/class-wc-connect-service-settings-store.php' ) );
@@ -384,6 +404,7 @@ if ( ! class_exists( 'WC_Connect_Loader' ) ) {
384
  require_once( plugin_basename( 'classes/class-wc-connect-shipping-label.php' ) );
385
  require_once( plugin_basename( 'classes/class-wc-connect-nux.php' ) );
386
 
 
387
  $logger = new WC_Connect_Logger( new WC_Logger() );
388
  $validator = new WC_Connect_Service_Schemas_Validator();
389
  $api_client = new WC_Connect_API_Client( $validator, $this );
@@ -393,6 +414,7 @@ if ( ! class_exists( 'WC_Connect_Loader' ) ) {
393
  $tracks = new WC_Connect_Tracks( $logger, __FILE__ );
394
  $shipping_label = new WC_Connect_Shipping_Label( $api_client, $settings_store, $schemas_store, $payment_methods_store );
395
  $nux = new WC_Connect_Nux( $tracks, $shipping_label );
 
396
 
397
  $this->set_logger( $logger );
398
  $this->set_api_client( $api_client );
@@ -403,6 +425,9 @@ if ( ! class_exists( 'WC_Connect_Loader' ) ) {
403
  $this->set_tracks( $tracks );
404
  $this->set_shipping_label( $shipping_label );
405
  $this->set_nux( $nux );
 
 
 
406
  }
407
 
408
  /**
7
  * Author URI: http://woocommerce.com/
8
  * Text Domain: woocommerce-services
9
  * Domain Path: /i18n/languages/
10
+ * Version: 1.6.1
11
  *
12
  * Copyright (c) 2017 Automattic
13
  *
152
  */
153
  protected $nux;
154
 
155
+ /**
156
+ * @var WC_Connect_TaxJar_Integration
157
+ */
158
+ protected $taxjar;
159
+
160
  protected $services = array();
161
 
162
  protected $service_object_cache = array();
174
  public function __construct() {
175
  $this->wc_connect_base_url = trailingslashit( defined( 'WOOCOMMERCE_CONNECT_DEV_SERVER_URL' ) ? WOOCOMMERCE_CONNECT_DEV_SERVER_URL : plugins_url( 'dist/', __FILE__ ) );
176
  add_action( 'plugins_loaded', array( $this, 'load_textdomain' ) );
177
+ add_action( 'before_woocommerce_init', array( $this, 'pre_wc_init' ) );
178
  }
179
 
180
  public function get_logger() {
337
  $this->nux = $nux;
338
  }
339
 
340
+ public function set_taxjar( WC_Connect_TaxJar_Integration $taxjar ) {
341
+ $this->taxjar = $taxjar;
342
+ }
343
+
344
  /**
345
  * Load our textdomain
346
  *
351
  }
352
 
353
  /**
354
+ * Perform plugin bootstrapping that needs to happen before WC init.
355
  *
356
+ * This allows the modification of extensions, integrations, etc.
357
  */
358
+ public function pre_wc_init() {
359
  $this->load_dependencies();
360
 
361
  add_action( 'admin_init', array( $this, 'admin_enqueue_scripts' ) );
370
  return;
371
  }
372
 
373
+ add_action( 'woocommerce_init', array( $this, 'after_wc_init' ) );
374
+ $this->taxjar->init();
375
+ }
376
+
377
+ /**
378
+ * Bootstrap our plugin and hook into WP/WC core.
379
+ *
380
+ * @codeCoverageIgnore
381
+ */
382
+ public function after_wc_init() {
383
  $this->schedule_service_schemas_fetch();
384
  $this->service_settings_store->migrate_legacy_services();
385
  $this->attach_hooks();
389
  * Load all plugin dependencies.
390
  */
391
  public function load_dependencies() {
 
 
392
  require_once( plugin_basename( 'classes/class-wc-connect-logger.php' ) );
393
  require_once( plugin_basename( 'classes/class-wc-connect-api-client.php' ) );
394
  require_once( plugin_basename( 'classes/class-wc-connect-service-schemas-validator.php' ) );
395
+ require_once( plugin_basename( 'classes/class-wc-connect-taxjar-integration.php' ) );
396
+ require_once( plugin_basename( 'classes/class-wc-connect-error-notice.php' ) );
397
+ require_once( plugin_basename( 'classes/class-wc-connect-compatibility.php' ) );
398
  require_once( plugin_basename( 'classes/class-wc-connect-shipping-method.php' ) );
399
  require_once( plugin_basename( 'classes/class-wc-connect-service-schemas-store.php' ) );
400
  require_once( plugin_basename( 'classes/class-wc-connect-service-settings-store.php' ) );
404
  require_once( plugin_basename( 'classes/class-wc-connect-shipping-label.php' ) );
405
  require_once( plugin_basename( 'classes/class-wc-connect-nux.php' ) );
406
 
407
+
408
  $logger = new WC_Connect_Logger( new WC_Logger() );
409
  $validator = new WC_Connect_Service_Schemas_Validator();
410
  $api_client = new WC_Connect_API_Client( $validator, $this );
414
  $tracks = new WC_Connect_Tracks( $logger, __FILE__ );
415
  $shipping_label = new WC_Connect_Shipping_Label( $api_client, $settings_store, $schemas_store, $payment_methods_store );
416
  $nux = new WC_Connect_Nux( $tracks, $shipping_label );
417
+ $taxjar = new WC_Connect_TaxJar_Integration( $api_client );
418
 
419
  $this->set_logger( $logger );
420
  $this->set_api_client( $api_client );
425
  $this->set_tracks( $tracks );
426
  $this->set_shipping_label( $shipping_label );
427
  $this->set_nux( $nux );
428
+ $this->set_taxjar( $taxjar );
429
+
430
+ add_action( 'admin_init', array( $this, 'load_admin_dependencies' ) );
431
  }
432
 
433
  /**