Printful Integration for WooCommerce - Version 2.0.7

Version Description

Bug fixes, security improvements and improved i18n support

Download this release

Release Info

Developer printful
Plugin Icon 128x128 Printful Integration for WooCommerce
Version 2.0.7
Comparing to
See all releases

Code changes from version 2.0.6 to 2.0.7

includes/class-printful-admin-dashboard.php CHANGED
@@ -26,13 +26,14 @@ class Printful_Admin_Dashboard {
26
 
27
  }
28
 
29
- /**
30
- * Show the view
31
- */
 
32
  public static function view() {
33
 
34
  $dashboard = self::instance();
35
- $api_key = Printful_Integration::instance()->get_option('printful_key');
36
  $connect_status = Printful_Integration::instance()->is_connected();
37
 
38
  if ( $connect_status ) {
@@ -52,8 +53,8 @@ class Printful_Admin_Dashboard {
52
  $status = Printful_Admin_Status::instance();
53
  $issues = array();
54
 
55
- $api_enabled = $status->run_single_test('check_WC_API_enabled');
56
- $permalinks_set = $status->run_single_test('check_permalinks');
57
 
58
  if ( $permalinks_set == Printful_Admin_Status::PF_STATUS_FAIL ) {
59
  $message = 'WooCommerce API will not work unless your permalinks are set up correctly. Go to <a href="%s">Permalinks settings</a> and make sure that they are NOT set to "plain".';
26
 
27
  }
28
 
29
+ /**
30
+ * Show the view
31
+ * @throws PrintfulException
32
+ */
33
  public static function view() {
34
 
35
  $dashboard = self::instance();
36
+ $api_key = Printful_Integration::instance()->get_option( 'printful_key' );
37
  $connect_status = Printful_Integration::instance()->is_connected();
38
 
39
  if ( $connect_status ) {
53
  $status = Printful_Admin_Status::instance();
54
  $issues = array();
55
 
56
+ $api_enabled = $status->run_single_test( 'check_WC_API_enabled' );
57
+ $permalinks_set = $status->run_single_test( 'check_permalinks' );
58
 
59
  if ( $permalinks_set == Printful_Admin_Status::PF_STATUS_FAIL ) {
60
  $message = 'WooCommerce API will not work unless your permalinks are set up correctly. Go to <a href="%s">Permalinks settings</a> and make sure that they are NOT set to "plain".';
includes/class-printful-admin-settings.php CHANGED
@@ -85,15 +85,17 @@ class Printful_Admin_Settings {
85
  Printful_Admin::load_template( 'footer' );
86
  }
87
 
88
- /**
89
- * Display the ajax content for carrier settings
90
- */
 
91
  public static function render_carriers_ajax() {
92
 
93
  $carrier_settings = self::instance()->setup_carrier_fields();
94
  Printful_Admin::load_template( 'setting-group', $carrier_settings );
95
  $enable_submit = 'Printful_Settings.enable_submit_btn();';
96
- Printful_Admin::load_template( 'inline-script', array('script' => $enable_submit) );
 
97
  exit;
98
  }
99
 
@@ -118,9 +120,10 @@ class Printful_Admin_Settings {
118
  return $integration_settings;
119
  }
120
 
121
- /**
122
- * @internal param $carrier_settings
123
- */
 
124
  public function setup_carrier_fields() {
125
 
126
  $carrier_settings = array(
@@ -131,7 +134,8 @@ class Printful_Admin_Settings {
131
  );
132
 
133
  if ( ! Printful_Integration::instance()->is_connected() ) {
134
- $carrier_settings['description'] = __('You need to be connected to Printful API to edit carrier settings!', 'printful' );
 
135
  return $carrier_settings;
136
  }
137
 
@@ -191,9 +195,10 @@ class Printful_Admin_Settings {
191
  return $request_body;
192
  }
193
 
194
- /**
195
- * Ajax endpoint for saving the settings
196
- */
 
197
  public static function save_printful_settings() {
198
 
199
  if ( ! empty( $_POST ) ) {
85
  Printful_Admin::load_template( 'footer' );
86
  }
87
 
88
+ /**
89
+ * Display the ajax content for carrier settings
90
+ * @throws PrintfulException
91
+ */
92
  public static function render_carriers_ajax() {
93
 
94
  $carrier_settings = self::instance()->setup_carrier_fields();
95
  Printful_Admin::load_template( 'setting-group', $carrier_settings );
96
  $enable_submit = 'Printful_Settings.enable_submit_btn();';
97
+ Printful_Admin::load_template( 'inline-script', array( 'script' => $enable_submit ) );
98
+
99
  exit;
100
  }
101
 
120
  return $integration_settings;
121
  }
122
 
123
+ /**
124
+ * @internal param $carrier_settings
125
+ * @throws PrintfulException
126
+ */
127
  public function setup_carrier_fields() {
128
 
129
  $carrier_settings = array(
134
  );
135
 
136
  if ( ! Printful_Integration::instance()->is_connected() ) {
137
+ $carrier_settings['description'] = __( 'You need to be connected to Printful API to edit carrier settings!', 'printful' );
138
+
139
  return $carrier_settings;
140
  }
141
 
195
  return $request_body;
196
  }
197
 
198
+ /**
199
+ * Ajax endpoint for saving the settings
200
+ * @throws PrintfulException
201
+ */
202
  public static function save_printful_settings() {
203
 
204
  if ( ! empty( $_POST ) ) {
includes/class-printful-admin-status.php CHANGED
@@ -19,90 +19,85 @@ class Printful_Admin_Status {
19
  public static function getChecklistItems() {
20
  return array(
21
  array(
22
- 'name' => __('Connection to Printful API', 'printful'),
23
- 'description' => __('Is your store successfully connected to Printful API?', 'printful'),
24
  'method' => 'check_PF_API_connect',
25
  ),
26
  array(
27
- 'name' => __('Printful API key is set', 'printful'),
28
- 'description' => __('Your store needs access to Printful API to use most of it\'s features like shipping rates, tax rates and other settings.', 'printful'),
29
  'method' => 'check_PF_API_key',
30
  ),
31
  array(
32
- 'name' => __('WordPress Permalinks', 'printful'),
33
- 'description' => __('WooCommerce API will not work unless your permalinks in Settings > Permalinks are set up correctly. Make sure you that they are NOT set to "plain".', 'printful'),
34
  'method' => 'check_permalinks',
35
  ),
36
  array(
37
- 'name' => __('WordPress version', 'printful'),
38
- 'description' => __('WordPress should always be updated to the latest version. Updates can be installed from your WordPress admin dashboard.', 'printful'),
39
  'method' => 'check_WP_version',
40
  ),
41
  array(
42
- 'name' => __('WooCommerce API enabled', 'printful'),
43
- 'description' => __('Your site needs to enbable WooCommerce API so that Printful can connect to it.', 'printful'),
44
  'method' => 'check_WC_API_enabled',
45
  ),
46
  array(
47
- 'name' => __('WooCommerce Webhooks', 'printful'),
48
- 'description' => __('Printful requires WooCommerce webhooks to be set up to quickly capture you incoming orders, products updates etc.', 'printful'),
49
  'method' => 'check_PF_webhooks',
50
  ),
51
  array(
52
- 'name' => __('WooCommerce API keys are set', 'printful'),
53
- 'description' => __('Printful needs access to your WooCommerce API for the integration to work - otherwise we can\'t sync your store, push or pull your products etc.', 'printful'),
54
  'method' => 'check_WC_API_access',
55
  ),
56
  array(
57
- 'name' => __('WooCommerce authentication URL access', 'printful'),
58
- 'description' => __('Printful needs access to WooCommerce API authorize page. This sometimes may get blocked due to hosts having unnecessarily intrusive security checks in place that prevent WooCommerce API authentication from working (for example mod_security rule #1234234). If this check fails, you will not be able authorize Printful app.', 'printful'),
59
  'method' => 'check_WC_auth_url_access',
60
  ),
61
  array(
62
- 'name' => __('WordPress remote requests', 'printful'),
63
- 'description' => __('WordPress needs to be able to connect to Printful server to call webhooks. If this check fails, contact your hosting support.', 'printful'),
64
  'method' => 'check_remote_requests',
65
  ),
66
  array(
67
- 'name' => __('Recent store sync errors', 'printful'),
68
- 'description' => __('Printful will connect to your store\'s API regularly and sync your latest products, orders etc. If there have been any recent issues with sync, this check will fail.', 'printful'),
69
  'method' => 'check_PF_sync_errors',
70
  ),
71
  array(
72
- 'name' => __('Write permissions', 'printful'),
73
- 'description' => __('Make the uploads directory writable. This is required for mockup generator product push to work correctly. Contact your hosting provider if you need help with this.', 'printful'),
74
  'method' => 'check_uploads_write',
75
  ),
76
  array(
77
- 'name' => __('PHP memory limit', 'printful'),
78
- 'description' => __('Set PHP allocated memory limit to at least 128mb. Contact your hosting provider if you need help with this.', 'printful'),
79
  'method' => 'check_PHP_memory_limit',
80
  ),
81
  array(
82
- 'name' => __('PHP script time limit', 'printful'),
83
- 'description' => __('Set PHP script execution time limit to at least 30 seconds. This is required to successfully push products with many variants. Contact your hosting provider if you need help with this.', 'printful'),
84
  'method' => 'check_PHP_time_limit',
85
  ),
86
- // array(
87
- // 'name' => __('Error logs', 'printful'),
88
- // 'description' => __('Your WordPress site needs to have it\'s error logging set up correctly so in case of issues you can figure out what\'s wrong. Note: your hosting might already have an independent log from WordPress.', 'printful'),
89
- // 'method' => 'check_WP_error_logs',
90
- // ),
91
  array(
92
- 'name' => __('W3 Total Cache DB Cache', 'printful'),
93
- 'description' => __('If you are using W3 Total Cache, the database caching feature needs to be disabled since it can cause issues with product push to store.', 'printful'),
94
  'method' => 'check_W3_db_cache',
95
  'silent' => true,
96
  ),
97
  array(
98
- 'name' => __('WP SpamShield', 'printful'),
99
- 'description' => __('If you are using WP SpamShield, you might experience problems connecting to Printful and pushing products.', 'printful'),
100
  'method' => 'check_wp_spamshield',
101
  'silent' => true,
102
  ),
103
  array(
104
- 'name' => __('Remove Print Aura plugin', 'printful'),
105
- 'description' => __('Print Aura plugin is known to cause issues so it needs to be removed.', 'printful'),
106
  'method' => 'check_printaura_plugin',
107
  'silent' => true,
108
  ),
@@ -166,11 +161,11 @@ class Printful_Admin_Status {
166
  * @param bool $only_cached_results
167
  * @return array
168
  */
169
- public static function get_checklist($only_cached_results = false) {
170
 
171
  $status = self::instance();
172
 
173
- $list = get_transient(Printful_Admin_Status::PF_CACHED_CHECKLIST);
174
 
175
  if ( $only_cached_results || $list ) {
176
  return $list;
@@ -464,9 +459,9 @@ class Printful_Admin_Status {
464
  */
465
  private function check_WC_API_enabled() {
466
 
467
- $enabled = get_option('woocommerce_api_enabled', false);
468
 
469
- if($enabled == 'yes') {
470
  return self::PF_STATUS_OK;
471
  }
472
 
@@ -569,20 +564,4 @@ class Printful_Admin_Status {
569
 
570
  return self::PF_STATUS_FAIL;
571
  }
572
-
573
- /**
574
- * @return int
575
- */
576
- private function check_WP_error_logs() {
577
-
578
- if (
579
- ( defined( 'WP_DEBUG' ) && WP_DEBUG == true )
580
- &&
581
- ( defined( 'WP_DEBUG_LOG' ) && WP_DEBUG_LOG == true )
582
- ) {
583
- return self::PF_STATUS_OK;
584
- }
585
-
586
- return self::PF_STATUS_FAIL;
587
- }
588
  }
19
  public static function getChecklistItems() {
20
  return array(
21
  array(
22
+ 'name' => __( 'Connection to Printful API', 'printful' ),
23
+ 'description' => __( 'Is your store successfully connected to Printful API?', 'printful' ),
24
  'method' => 'check_PF_API_connect',
25
  ),
26
  array(
27
+ 'name' => __( 'Printful API key is set', 'printful' ),
28
+ 'description' => __( 'Your store needs access to Printful API to use most of it\'s features like shipping rates, tax rates and other settings.', 'printful' ),
29
  'method' => 'check_PF_API_key',
30
  ),
31
  array(
32
+ 'name' => __( 'WordPress Permalinks', 'printful' ),
33
+ 'description' => __( 'WooCommerce API will not work unless your permalinks in Settings > Permalinks are set up correctly. Make sure you that they are NOT set to "plain".', 'printful' ),
34
  'method' => 'check_permalinks',
35
  ),
36
  array(
37
+ 'name' => __( 'WordPress version', 'printful' ),
38
+ 'description' => __( 'WordPress should always be updated to the latest version. Updates can be installed from your WordPress admin dashboard.', 'printful' ),
39
  'method' => 'check_WP_version',
40
  ),
41
  array(
42
+ 'name' => __( 'WooCommerce API enabled', 'printful' ),
43
+ 'description' => __( 'Your site needs to enbable WooCommerce API so that Printful can connect to it.', 'printful' ),
44
  'method' => 'check_WC_API_enabled',
45
  ),
46
  array(
47
+ 'name' => __( 'WooCommerce Webhooks', 'printful' ),
48
+ 'description' => __( 'Printful requires WooCommerce webhooks to be set up to quickly capture you incoming orders, products updates etc.', 'printful' ),
49
  'method' => 'check_PF_webhooks',
50
  ),
51
  array(
52
+ 'name' => __( 'WooCommerce API keys are set', 'printful' ),
53
+ 'description' => __( 'Printful needs access to your WooCommerce API for the integration to work - otherwise we can\'t sync your store, push or pull your products etc.', 'printful' ),
54
  'method' => 'check_WC_API_access',
55
  ),
56
  array(
57
+ 'name' => __( 'WooCommerce authentication URL access', 'printful' ),
58
+ 'description' => __( 'Printful needs access to WooCommerce API authorize page. This sometimes may get blocked due to hosts having unnecessarily intrusive security checks in place that prevent WooCommerce API authentication from working (for example mod_security rule #1234234). If this check fails, you will not be able authorize Printful app.', 'printful' ),
59
  'method' => 'check_WC_auth_url_access',
60
  ),
61
  array(
62
+ 'name' => __( 'WordPress remote requests', 'printful' ),
63
+ 'description' => __( 'WordPress needs to be able to connect to Printful server to call webhooks. If this check fails, contact your hosting support.', 'printful' ),
64
  'method' => 'check_remote_requests',
65
  ),
66
  array(
67
+ 'name' => __( 'Recent store sync errors', 'printful' ),
68
+ 'description' => __( 'Printful will connect to your store\'s API regularly and sync your latest products, orders etc. If there have been any recent issues with sync, this check will fail.', 'printful' ),
69
  'method' => 'check_PF_sync_errors',
70
  ),
71
  array(
72
+ 'name' => __( 'Write permissions', 'printful' ),
73
+ 'description' => __( 'Make the uploads directory writable. This is required for mockup generator product push to work correctly. Contact your hosting provider if you need help with this.', 'printful' ),
74
  'method' => 'check_uploads_write',
75
  ),
76
  array(
77
+ 'name' => __( 'PHP memory limit', 'printful' ),
78
+ 'description' => __( 'Set PHP allocated memory limit to at least 128mb. Contact your hosting provider if you need help with this.', 'printful' ),
79
  'method' => 'check_PHP_memory_limit',
80
  ),
81
  array(
82
+ 'name' => __( 'PHP script time limit', 'printful' ),
83
+ 'description' => __( 'Set PHP script execution time limit to at least 30 seconds. This is required to successfully push products with many variants. Contact your hosting provider if you need help with this.', 'printful' ),
84
  'method' => 'check_PHP_time_limit',
85
  ),
 
 
 
 
 
86
  array(
87
+ 'name' => __( 'W3 Total Cache DB Cache', 'printful' ),
88
+ 'description' => __( 'If you are using W3 Total Cache, the database caching feature needs to be disabled since it can cause issues with product push to store.', 'printful' ),
89
  'method' => 'check_W3_db_cache',
90
  'silent' => true,
91
  ),
92
  array(
93
+ 'name' => __( 'WP SpamShield', 'printful' ),
94
+ 'description' => __( 'If you are using WP SpamShield, you might experience problems connecting to Printful and pushing products.', 'printful' ),
95
  'method' => 'check_wp_spamshield',
96
  'silent' => true,
97
  ),
98
  array(
99
+ 'name' => __( 'Remove Print Aura plugin', 'printful' ),
100
+ 'description' => __( 'Print Aura plugin is known to cause issues so it needs to be removed.', 'printful' ),
101
  'method' => 'check_printaura_plugin',
102
  'silent' => true,
103
  ),
161
  * @param bool $only_cached_results
162
  * @return array
163
  */
164
+ public static function get_checklist( $only_cached_results = false ) {
165
 
166
  $status = self::instance();
167
 
168
+ $list = get_transient( Printful_Admin_Status::PF_CACHED_CHECKLIST );
169
 
170
  if ( $only_cached_results || $list ) {
171
  return $list;
459
  */
460
  private function check_WC_API_enabled() {
461
 
462
+ $enabled = get_option( 'woocommerce_api_enabled', false );
463
 
464
+ if ( $enabled == 'yes' ) {
465
  return self::PF_STATUS_OK;
466
  }
467
 
564
 
565
  return self::PF_STATUS_FAIL;
566
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
567
  }
includes/class-printful-admin.php CHANGED
@@ -19,11 +19,11 @@ class Printful_Admin {
19
  */
20
  public function register_admin() {
21
 
22
- add_action( 'admin_menu', array($this, 'register_admin_menu_page'));
23
- add_action( 'admin_enqueue_scripts', array($this, 'add_admin_styles'));
24
- add_action( 'admin_enqueue_scripts', array($this, 'add_admin_scripts'));
25
- add_action( 'wp_enqueue_scripts', array($this, 'add_global_style'));
26
- add_action( 'admin_bar_menu', array($this, 'add_printful_status_toolbar'), 999 );
27
  }
28
 
29
  /**
@@ -70,7 +70,7 @@ class Printful_Admin {
70
  public function register_admin_menu_page() {
71
 
72
  add_menu_page(
73
- __('Dashboard', 'printful'),
74
  self::MENU_TITLE_TOP,
75
  self::CAPABILITY,
76
  self::MENU_SLUG_DASHBOARD,
@@ -98,10 +98,11 @@ class Printful_Admin {
98
  }
99
  }
100
 
101
- /**
102
- * Get the tabs used in printful admin pages
103
- * @return array
104
- */
 
105
  public static function get_tabs() {
106
 
107
  $tabs = array(
19
  */
20
  public function register_admin() {
21
 
22
+ add_action( 'admin_menu', array( $this, 'register_admin_menu_page' ) );
23
+ add_action( 'admin_enqueue_scripts', array( $this, 'add_admin_styles' ) );
24
+ add_action( 'admin_enqueue_scripts', array( $this, 'add_admin_scripts' ) );
25
+ add_action( 'wp_enqueue_scripts', array( $this, 'add_global_style' ) );
26
+ add_action( 'admin_bar_menu', array( $this, 'add_printful_status_toolbar' ), 999 );
27
  }
28
 
29
  /**
70
  public function register_admin_menu_page() {
71
 
72
  add_menu_page(
73
+ __( 'Dashboard', 'printful' ),
74
  self::MENU_TITLE_TOP,
75
  self::CAPABILITY,
76
  self::MENU_SLUG_DASHBOARD,
98
  }
99
  }
100
 
101
+ /**
102
+ * Get the tabs used in printful admin pages
103
+ * @return array
104
+ * @throws PrintfulException
105
+ */
106
  public static function get_tabs() {
107
 
108
  $tabs = array(
includes/class-printful-api-resource.php CHANGED
@@ -1,6 +1,10 @@
1
  <?php
2
  if ( ! defined( 'ABSPATH' ) ) exit;
3
 
 
 
 
 
4
  class Printful_API_Resource extends WC_API_Resource {
5
 
6
  /** @var string $base the route base */
1
  <?php
2
  if ( ! defined( 'ABSPATH' ) ) exit;
3
 
4
+ /**
5
+ * Class Printful_API_Resource
6
+ * @deprecated 2.0.3
7
+ */
8
  class Printful_API_Resource extends WC_API_Resource {
9
 
10
  /** @var string $base the route base */
includes/class-printful-carriers.php CHANGED
@@ -77,7 +77,7 @@ class Printful_Carriers {
77
  $shipping->update_carrier_cache( $carriers );
78
  } catch ( PrintfulApiException $e ) {
79
  $carriers = false;
80
- } catch (PrintfulException $e) {
81
  $carriers = false;
82
  }
83
 
77
  $shipping->update_carrier_cache( $carriers );
78
  } catch ( PrintfulApiException $e ) {
79
  $carriers = false;
80
+ } catch ( PrintfulException $e ) {
81
  $carriers = false;
82
  }
83
 
includes/class-printful-integration.php CHANGED
@@ -20,9 +20,10 @@ class Printful_Integration
20
  self::$_instance = $this;
21
  }
22
 
23
- /**
24
- * @return Printful_Client
25
- */
 
26
  public function get_client() {
27
 
28
  require_once 'class-printful-client.php';
@@ -31,17 +32,18 @@ class Printful_Integration
31
  return $client;
32
  }
33
 
34
- /**
35
- * Check if the connection to printful is working
36
- * @param bool $force
37
- * @return bool
38
- */
39
- public function is_connected($force = false) {
 
40
 
41
  $api_key = $this->get_option( 'printful_key' );
42
 
43
  //dont need to show error - the plugin is simply not setup
44
- if ( empty( $api_key )) {
45
  return false;
46
  }
47
 
@@ -51,6 +53,7 @@ class Printful_Integration
51
  $settings_url = admin_url( 'admin.php?page=printful-dashboard&tab=settings' );
52
  $printful_url = Printful_Base::get_printful_host() . 'dashboard/';
53
  $this->set_connect_error(sprintf( $message, $settings_url, $printful_url ) );
 
54
  return false;
55
  }
56
 
@@ -59,6 +62,7 @@ class Printful_Integration
59
  $connected = get_transient( self::PF_API_CONNECT_STATUS );
60
  if ( $connected && $connected['status'] == 1 ) {
61
  $this->clear_connect_error();
 
62
  return true;
63
  } else if ( $connected && $connected['status'] == 0 ) { //try again in a minute
64
  return false;
@@ -106,30 +110,32 @@ class Printful_Integration
106
  * @param string $error
107
  */
108
  public function set_connect_error($error = '') {
109
- update_option(self::PF_CONNECT_ERROR, $error);
110
  }
111
 
112
  /**
113
  * Get current connect error message
114
  */
115
  public function get_connect_error() {
116
- return get_option(self::PF_CONNECT_ERROR, false);
117
  }
118
 
119
  /**
120
  * Remove option used for storing current connect error
121
  */
122
  public function clear_connect_error() {
123
- delete_option(self::PF_CONNECT_ERROR);
124
  }
125
 
126
- /**
127
- * AJAX call endpoint for connect status check
128
- */
 
129
  public static function ajax_force_check_connect_status() {
130
  if ( Printful_Integration::instance()->is_connected( true ) ) {
131
  die( 'OK' );
132
  }
 
133
  die( 'FAIL' );
134
  }
135
 
@@ -139,11 +145,12 @@ class Printful_Integration
139
  * @param array $default
140
  * @return bool
141
  */
142
- public function get_option($name, $default = array()) {
143
  $options = get_option( 'woocommerce_printful_settings', $default );
144
  if ( ! empty( $options[ $name ] ) ) {
145
  return $options[ $name ];
146
  }
 
147
  return false;
148
  }
149
 
20
  self::$_instance = $this;
21
  }
22
 
23
+ /**
24
+ * @return Printful_Client
25
+ * @throws PrintfulException
26
+ */
27
  public function get_client() {
28
 
29
  require_once 'class-printful-client.php';
32
  return $client;
33
  }
34
 
35
+ /**
36
+ * Check if the connection to printful is working
37
+ * @param bool $force
38
+ * @return bool
39
+ * @throws PrintfulException
40
+ */
41
+ public function is_connected( $force = false ) {
42
 
43
  $api_key = $this->get_option( 'printful_key' );
44
 
45
  //dont need to show error - the plugin is simply not setup
46
+ if ( empty( $api_key ) ) {
47
  return false;
48
  }
49
 
53
  $settings_url = admin_url( 'admin.php?page=printful-dashboard&tab=settings' );
54
  $printful_url = Printful_Base::get_printful_host() . 'dashboard/';
55
  $this->set_connect_error(sprintf( $message, $settings_url, $printful_url ) );
56
+
57
  return false;
58
  }
59
 
62
  $connected = get_transient( self::PF_API_CONNECT_STATUS );
63
  if ( $connected && $connected['status'] == 1 ) {
64
  $this->clear_connect_error();
65
+
66
  return true;
67
  } else if ( $connected && $connected['status'] == 0 ) { //try again in a minute
68
  return false;
110
  * @param string $error
111
  */
112
  public function set_connect_error($error = '') {
113
+ update_option( self::PF_CONNECT_ERROR, $error );
114
  }
115
 
116
  /**
117
  * Get current connect error message
118
  */
119
  public function get_connect_error() {
120
+ return get_option( self::PF_CONNECT_ERROR, false );
121
  }
122
 
123
  /**
124
  * Remove option used for storing current connect error
125
  */
126
  public function clear_connect_error() {
127
+ delete_option( self::PF_CONNECT_ERROR );
128
  }
129
 
130
+ /**
131
+ * AJAX call endpoint for connect status check
132
+ * @throws PrintfulException
133
+ */
134
  public static function ajax_force_check_connect_status() {
135
  if ( Printful_Integration::instance()->is_connected( true ) ) {
136
  die( 'OK' );
137
  }
138
+
139
  die( 'FAIL' );
140
  }
141
 
145
  * @param array $default
146
  * @return bool
147
  */
148
+ public function get_option( $name, $default = array() ) {
149
  $options = get_option( 'woocommerce_printful_settings', $default );
150
  if ( ! empty( $options[ $name ] ) ) {
151
  return $options[ $name ];
152
  }
153
+
154
  return false;
155
  }
156
 
includes/class-printful-request-log.php CHANGED
@@ -13,7 +13,7 @@ class Printful_Request_log {
13
  public static function init() {
14
  $printful_log = new self;
15
  add_filter( 'woocommerce_api_serve_request', array( $printful_log, 'log_incoming_printful_api_requests' ), 10, 3 );
16
- add_filter ('printful_api_result', array($printful_log, 'log_outgoing_printful_api_requests'), 10, 4);
17
  }
18
 
19
  /**
@@ -60,6 +60,8 @@ class Printful_Request_log {
60
 
61
  $original_result = $result;
62
  $request['path'] = $url;
 
 
63
 
64
  if ( ! is_wp_error( $result ) ) {
65
  $result = json_decode( $result['body'], true );
@@ -76,9 +78,9 @@ class Printful_Request_log {
76
  $response_hash = md5( serialize( array( 'request' => $request, 'results' => $result ) ) );
77
 
78
  //save summary in database to be easily accessible for status page
79
- $this->save_to_printful_log( $method . ' ' . $url, $result, $response_hash, self::PF_OPTION_OUTGOING_API_REQUEST_LOG);
80
 
81
- return $original_result; //don't change the result
82
  }
83
 
84
  /**
@@ -89,7 +91,7 @@ class Printful_Request_log {
89
  * @param string $context
90
  * @return bool
91
  */
92
- private function save_to_wc_log( $request, $result, $context) {
93
 
94
  if ( ! function_exists( 'wc_get_logger' ) ) {
95
  return false;
@@ -102,6 +104,8 @@ class Printful_Request_log {
102
  'results' => (array) $result,
103
  );
104
  $logger->error( wc_print_r( $log_item, true ), $context );
 
 
105
  }
106
 
107
  /**
13
  public static function init() {
14
  $printful_log = new self;
15
  add_filter( 'woocommerce_api_serve_request', array( $printful_log, 'log_incoming_printful_api_requests' ), 10, 3 );
16
+ add_filter( 'printful_api_result', array( $printful_log, 'log_outgoing_printful_api_requests'), 10, 4 );
17
  }
18
 
19
  /**
60
 
61
  $original_result = $result;
62
  $request['path'] = $url;
63
+ $params_set = null;
64
+ $code_success = null;
65
 
66
  if ( ! is_wp_error( $result ) ) {
67
  $result = json_decode( $result['body'], true );
78
  $response_hash = md5( serialize( array( 'request' => $request, 'results' => $result ) ) );
79
 
80
  //save summary in database to be easily accessible for status page
81
+ $this->save_to_printful_log( $method . ' ' . $url, $result, $response_hash, self::PF_OPTION_OUTGOING_API_REQUEST_LOG );
82
 
83
+ return $original_result; //don't change the result
84
  }
85
 
86
  /**
91
  * @param string $context
92
  * @return bool
93
  */
94
+ private function save_to_wc_log( $request, $result, $context ) {
95
 
96
  if ( ! function_exists( 'wc_get_logger' ) ) {
97
  return false;
104
  'results' => (array) $result,
105
  );
106
  $logger->error( wc_print_r( $log_item, true ), $context );
107
+
108
+ return true;
109
  }
110
 
111
  /**
includes/{class-printful-rest-api.php → class-printful-rest-api-controller.php} RENAMED
@@ -3,16 +3,31 @@
3
  /**
4
  * API class
5
  */
6
- class Printful_REST_API
7
  {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8
  /**
9
  * Register the REST API routes.
10
  */
11
- public static function init() {
12
- register_rest_route('wc/v2', '/printful/access', array(
13
  array(
14
  'methods' => WP_REST_Server::EDITABLE,
15
- 'callback' => array( 'Printful_REST_API', 'set_printful_access' ),
 
16
  'args' => array(
17
  'accessKey' => array(
18
  'required' => false,
@@ -28,10 +43,11 @@ class Printful_REST_API
28
  )
29
  ) );
30
 
31
- register_rest_route('wc/v2', '/printful/products/(?P<product_id>\d+)/size-chart', array(
32
  array(
33
  'methods' => WP_REST_Server::EDITABLE,
34
- 'callback' => array( 'Printful_REST_API', 'post_size_guide' ),
 
35
  'args' => array(
36
  'product_id' => array(
37
  'description' => __( 'Unique identifier for the resource.', 'printful' ),
@@ -46,17 +62,19 @@ class Printful_REST_API
46
  )
47
  ) );
48
 
49
- register_rest_route('wc/v2', '/printful/version', array(
50
  array(
51
  'methods' => WP_REST_Server::READABLE,
52
- 'callback' => array( 'Printful_REST_API', 'get_version' ),
 
53
  )
54
  ) );
55
 
56
- register_rest_route('wc/v2', '/printful/store_data', array(
57
  array(
58
  'methods' => WP_REST_Server::READABLE,
59
- 'callback' => array( 'Printful_REST_API', 'get_store_data' ),
 
60
  )
61
  ) );
62
  }
@@ -131,11 +149,10 @@ class Printful_REST_API
131
  * Allow remotely get plugin version for debug purposes
132
  */
133
  public static function get_version() {
134
-
135
  $error = false;
136
 
137
  try {
138
- $client = Printful_Integration::instance()->get_client();
139
  $store_data = $client->get( 'store' );
140
  } catch ( Exception $exception ) {
141
  $error = $exception->getMessage();
@@ -177,4 +194,35 @@ class Printful_REST_API
177
  'name' => get_bloginfo( 'title', 'display' )
178
  );
179
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
180
  }
3
  /**
4
  * API class
5
  */
6
+ class Printful_REST_API_Controller extends WC_REST_Controller
7
  {
8
+ /**
9
+ * Endpoint namespace.
10
+ *
11
+ * @var string
12
+ */
13
+ protected $namespace = 'wc/v2';
14
+
15
+ /**
16
+ * Route base.
17
+ *
18
+ * @var string
19
+ */
20
+ protected $rest_base = 'printful';
21
+
22
  /**
23
  * Register the REST API routes.
24
  */
25
+ public function register_routes() {
26
+ register_rest_route( $this->namespace, '/' . $this->rest_base . '/access', array(
27
  array(
28
  'methods' => WP_REST_Server::EDITABLE,
29
+ 'callback' => array( $this, 'set_printful_access' ),
30
+ 'permission_callback' => array( $this, 'get_items_permissions_check' ),
31
  'args' => array(
32
  'accessKey' => array(
33
  'required' => false,
43
  )
44
  ) );
45
 
46
+ register_rest_route( $this->namespace, '/' . $this->rest_base . '/products/(?P<product_id>\d+)/size-chart', array(
47
  array(
48
  'methods' => WP_REST_Server::EDITABLE,
49
+ 'callback' => array( $this, 'post_size_guide' ),
50
+ 'permission_callback' => array( $this, 'update_item_permissions_check' ),
51
  'args' => array(
52
  'product_id' => array(
53
  'description' => __( 'Unique identifier for the resource.', 'printful' ),
62
  )
63
  ) );
64
 
65
+ register_rest_route( $this->namespace, '/' . $this->rest_base . '/version', array(
66
  array(
67
  'methods' => WP_REST_Server::READABLE,
68
+ 'permission_callback' => array( $this, 'get_items_permissions_check' ),
69
+ 'callback' => array( $this, 'get_version' ),
70
  )
71
  ) );
72
 
73
+ register_rest_route( $this->namespace, '/' . $this->rest_base . '/store_data', array(
74
  array(
75
  'methods' => WP_REST_Server::READABLE,
76
+ 'permission_callback' => array( $this, 'get_items_permissions_check' ),
77
+ 'callback' => array( $this, 'get_store_data' ),
78
  )
79
  ) );
80
  }
149
  * Allow remotely get plugin version for debug purposes
150
  */
151
  public static function get_version() {
 
152
  $error = false;
153
 
154
  try {
155
+ $client = Printful_Integration::instance()->get_client();
156
  $store_data = $client->get( 'store' );
157
  } catch ( Exception $exception ) {
158
  $error = $exception->getMessage();
194
  'name' => get_bloginfo( 'title', 'display' )
195
  );
196
  }
197
+
198
+ /**
199
+ * Check whether a given request has permission to read printful endpoints.
200
+ *
201
+ * @param WP_REST_Request $request Full details about the request.
202
+ * @return WP_Error|boolean
203
+ */
204
+ public function get_items_permissions_check( $request ) {
205
+ if ( ! wc_rest_check_user_permissions( 'read' ) ) {
206
+ return new WP_Error( 'woocommerce_rest_cannot_view', __( 'Sorry, you cannot list resources.', 'woocommerce' ), array( 'status' => rest_authorization_required_code() ) );
207
+ }
208
+
209
+ return true;
210
+ }
211
+
212
+ /**
213
+ * Check if a given request has access to update a product.
214
+ *
215
+ * @param WP_REST_Request $request Full details about the request.
216
+ * @return WP_Error|boolean
217
+ */
218
+ public function update_item_permissions_check( $request ) {
219
+ $params = $request->get_url_params();
220
+ $post = get_post( (int) $params['product_id'] );
221
+
222
+ if ( $post && ! wc_rest_check_post_permissions( 'product', 'edit', $post->ID ) ) {
223
+ return new WP_Error( 'woocommerce_rest_cannot_edit', __( 'Sorry, you are not allowed to edit this resource.', 'woocommerce' ), array( 'status' => rest_authorization_required_code() ) );
224
+ }
225
+
226
+ return true;
227
+ }
228
  }
includes/class-printful-shipping.php CHANGED
@@ -84,6 +84,7 @@ class Printful_Shipping extends WC_Shipping_Method
84
  public function woocommerce_load_shipping_methods( $package = array() ) {
85
 
86
  $this->printful_package = false;
 
87
  if ( $package && ! empty( $package['printful'] ) ) {
88
  if ( $this->enabled == 'yes' ) {
89
  $this->printful_package = true;
@@ -123,7 +124,6 @@ class Printful_Shipping extends WC_Shipping_Method
123
  * @return array
124
  */
125
  public function woocommerce_cart_shipping_packages( $packages = array() ) {
126
-
127
  //Printful rates are turned off, do not split products
128
  if ( $this->enabled !== 'yes' ) {
129
  return $packages;
@@ -132,7 +132,6 @@ class Printful_Shipping extends WC_Shipping_Method
132
  $return_packages = array();
133
 
134
  foreach ( $packages as $package ) {
135
-
136
  $ids = array();
137
  foreach ( $package['contents'] as $key => $item ) {
138
  $ids[ $key ] = $item['variation_id'] ? $item['variation_id'] : $item['product_id'];
@@ -223,7 +222,6 @@ class Printful_Shipping extends WC_Shipping_Method
223
  * @return bool
224
  */
225
  public function calculate_shipping( $package = array() ) {
226
-
227
  $request = array(
228
  'recipient' => array(
229
  'address1' => $package['destination']['address'],
@@ -308,7 +306,6 @@ class Printful_Shipping extends WC_Shipping_Method
308
  * @param $error
309
  */
310
  private function set_error( $error ) {
311
-
312
  if ( $this->show_warnings ) {
313
  $this->last_error = $error;
314
  add_filter( 'woocommerce_cart_no_shipping_available_html', array( $this, 'show_error' ) );
@@ -322,9 +319,9 @@ class Printful_Shipping extends WC_Shipping_Method
322
  * @return string
323
  */
324
  public function show_error( $data ) {
325
-
326
  $error = $this->last_error;
327
  $message = $error->getMessage();
 
328
  if ( $error instanceof PrintfulApiException && $error->getCode() == 401 ) {
329
  $message = 'Invalid API key';
330
  }
84
  public function woocommerce_load_shipping_methods( $package = array() ) {
85
 
86
  $this->printful_package = false;
87
+
88
  if ( $package && ! empty( $package['printful'] ) ) {
89
  if ( $this->enabled == 'yes' ) {
90
  $this->printful_package = true;
124
  * @return array
125
  */
126
  public function woocommerce_cart_shipping_packages( $packages = array() ) {
 
127
  //Printful rates are turned off, do not split products
128
  if ( $this->enabled !== 'yes' ) {
129
  return $packages;
132
  $return_packages = array();
133
 
134
  foreach ( $packages as $package ) {
 
135
  $ids = array();
136
  foreach ( $package['contents'] as $key => $item ) {
137
  $ids[ $key ] = $item['variation_id'] ? $item['variation_id'] : $item['product_id'];
222
  * @return bool
223
  */
224
  public function calculate_shipping( $package = array() ) {
 
225
  $request = array(
226
  'recipient' => array(
227
  'address1' => $package['destination']['address'],
306
  * @param $error
307
  */
308
  private function set_error( $error ) {
 
309
  if ( $this->show_warnings ) {
310
  $this->last_error = $error;
311
  add_filter( 'woocommerce_cart_no_shipping_available_html', array( $this, 'show_error' ) );
319
  * @return string
320
  */
321
  public function show_error( $data ) {
 
322
  $error = $this->last_error;
323
  $message = $error->getMessage();
324
+
325
  if ( $error instanceof PrintfulApiException && $error->getCode() == 401 ) {
326
  $message = 'Invalid API key';
327
  }
includes/class-printful-size-chart-tab.php CHANGED
@@ -16,7 +16,7 @@ class Printful_Size_Chart_Tab {
16
  public static function init() {
17
  $size_chart = new self;
18
  add_filter( 'woocommerce_product_tabs', array( $size_chart, 'init_size_chart_tab' ) );
19
- add_action( 'add_meta_boxes', array($size_chart, 'init_metabox'));
20
  add_action( 'save_post', array( $size_chart, 'save_size_chart' ), 1, 2 );
21
  }
22
 
@@ -24,7 +24,7 @@ class Printful_Size_Chart_Tab {
24
  * Initialize meta boxes
25
  */
26
  public function init_metabox() {
27
- add_meta_box( 'pf_size_chart', __( 'Size chart', 'printful' ), array($this, 'size_chart_metabox'), 'product', 'normal' );
28
  }
29
 
30
  /**
@@ -33,7 +33,6 @@ class Printful_Size_Chart_Tab {
33
  * @return mixed
34
  */
35
  public function init_size_chart_tab( $tabs ) {
36
-
37
  if ( strlen( $this->get_size_chart_content() ) > 0 ) {
38
  $tabs['size_chart'] = array(
39
  'title' => __( 'Size Chart', 'printful' ),
@@ -49,7 +48,6 @@ class Printful_Size_Chart_Tab {
49
  * Display the size chart content
50
  */
51
  public function size_chart_tab_content() {
52
-
53
  echo '<h2>' . esc_html__( 'Size Chart', 'printful' ) . '</h2>';
54
  echo $this->get_size_chart_content();
55
  }
@@ -58,8 +56,8 @@ class Printful_Size_Chart_Tab {
58
  * @return mixed
59
  */
60
  public function get_size_chart_content() {
61
-
62
  global $post;
 
63
  return htmlspecialchars_decode(get_post_meta( $post->ID, 'pf_size_chart', true ));
64
  }
65
 
@@ -67,7 +65,6 @@ class Printful_Size_Chart_Tab {
67
  * @param $meta_id
68
  */
69
  public function size_chart_metabox( $meta_id ) {
70
-
71
  $settings = array(
72
  'textarea_name' => 'pf_size_chart',
73
  'tinymce' => array(
@@ -86,7 +83,7 @@ class Printful_Size_Chart_Tab {
86
  * @param $post_id
87
  * @param $post
88
  */
89
- public function save_size_chart($post_id, $post ) {
90
 
91
  // $post_id and $post are required
92
  if ( empty( $post_id ) || empty( $post ) || self::$saved_meta_boxes ) {
16
  public static function init() {
17
  $size_chart = new self;
18
  add_filter( 'woocommerce_product_tabs', array( $size_chart, 'init_size_chart_tab' ) );
19
+ add_action( 'add_meta_boxes', array( $size_chart, 'init_metabox' ) );
20
  add_action( 'save_post', array( $size_chart, 'save_size_chart' ), 1, 2 );
21
  }
22
 
24
  * Initialize meta boxes
25
  */
26
  public function init_metabox() {
27
+ add_meta_box( 'pf_size_chart', __( 'Size chart', 'printful' ), array( $this, 'size_chart_metabox' ), 'product', 'normal' );
28
  }
29
 
30
  /**
33
  * @return mixed
34
  */
35
  public function init_size_chart_tab( $tabs ) {
 
36
  if ( strlen( $this->get_size_chart_content() ) > 0 ) {
37
  $tabs['size_chart'] = array(
38
  'title' => __( 'Size Chart', 'printful' ),
48
  * Display the size chart content
49
  */
50
  public function size_chart_tab_content() {
 
51
  echo '<h2>' . esc_html__( 'Size Chart', 'printful' ) . '</h2>';
52
  echo $this->get_size_chart_content();
53
  }
56
  * @return mixed
57
  */
58
  public function get_size_chart_content() {
 
59
  global $post;
60
+
61
  return htmlspecialchars_decode(get_post_meta( $post->ID, 'pf_size_chart', true ));
62
  }
63
 
65
  * @param $meta_id
66
  */
67
  public function size_chart_metabox( $meta_id ) {
 
68
  $settings = array(
69
  'textarea_name' => 'pf_size_chart',
70
  'tinymce' => array(
83
  * @param $post_id
84
  * @param $post
85
  */
86
+ public function save_size_chart( $post_id, $post ) {
87
 
88
  // $post_id and $post are required
89
  if ( empty( $post_id ) || empty( $post ) || self::$saved_meta_boxes ) {
includes/class-printful-taxes.php CHANGED
@@ -7,7 +7,6 @@ class Printful_Taxes {
7
  * Initialize the values, hooks and actions
8
  */
9
  public static function init() {
10
-
11
  if ( Printful_Integration::instance()->get_option( 'calculate_tax' ) == 'yes' ) {
12
  //Update tax options if taxes are enabled
13
  if ( get_option( 'woocommerce_calc_taxes' ) != 'yes' ) {
@@ -19,7 +18,7 @@ class Printful_Taxes {
19
 
20
  //Override tax rates calculated by Woocommerce
21
  $taxes = new self;
22
- add_filter( 'woocommerce_matched_tax_rates', array($taxes, 'calculate_tax' ), 10, 6 );
23
  }
24
  }
25
 
@@ -34,7 +33,6 @@ class Printful_Taxes {
34
  * @return mixed
35
  */
36
  public function calculate_tax( $matched_tax_rates, $country, $state, $postcode, $city, $tax_class ) {
37
-
38
  //if a tax rate is already matched, avoid adding extra one
39
  if ( ! empty( $matched_tax_rates ) ) {
40
  return $matched_tax_rates;
@@ -44,6 +42,8 @@ class Printful_Taxes {
44
  if ( isset( $countries[ $country ][ $state ] ) && !empty($postcode) ) { //only make the request if country, state and zip are set
45
  $key = 'printful_tax_rate_' . $country . '-' . $state . '-' . $city . '-' . $postcode;
46
  $rate = get_transient( $key );
 
 
47
  if ( $rate === false ) {
48
  try {
49
  $client = Printful_Integration::instance()->get_client();
@@ -97,7 +97,6 @@ class Printful_Taxes {
97
  * @return bool
98
  */
99
  private function isRateUnique( $rate, $matched_tax_rates ) {
100
-
101
  if ( empty( $matched_tax_rates ) ) {
102
  return true;
103
  }
@@ -116,10 +115,11 @@ class Printful_Taxes {
116
  * @return array|mixed
117
  */
118
  private function get_tax_countries() {
119
-
120
  $countries = get_transient( 'printful_tax_countries' );
 
121
  if ( ! $countries ) {
122
  $countries = array();
 
123
  try {
124
  $client = Printful_Integration::instance()->get_client();
125
  $list = $client->get( 'tax/countries' );
@@ -129,6 +129,7 @@ class Printful_Taxes {
129
  $countries[ $country['code'] ][ $state['code'] ] = 1;
130
  }
131
  }
 
132
  if ( ! empty( $countries ) ) {
133
  set_transient( 'printful_tax_countries', $countries, 6 * 3600 );
134
  }
@@ -156,7 +157,7 @@ class Printful_Taxes {
156
  $includeShipping = (int) $includeShipping;
157
 
158
  $states = WC()->countries->get_states( $cc );
159
- $tax_title = ( isset( $states[ $state ] ) ? $states[ $state ] . ' ' : '' ) . 'Sales Tax';
160
  $id = $wpdb->get_var(
161
  $wpdb->prepare( "SELECT tax_rate_id FROM {$wpdb->prefix}woocommerce_tax_rates WHERE tax_rate_class='printful'
162
  and tax_rate_country = %s AND tax_rate_state = %s AND tax_rate_shipping = %s LIMIT 1",
7
  * Initialize the values, hooks and actions
8
  */
9
  public static function init() {
 
10
  if ( Printful_Integration::instance()->get_option( 'calculate_tax' ) == 'yes' ) {
11
  //Update tax options if taxes are enabled
12
  if ( get_option( 'woocommerce_calc_taxes' ) != 'yes' ) {
18
 
19
  //Override tax rates calculated by Woocommerce
20
  $taxes = new self;
21
+ add_filter( 'woocommerce_matched_tax_rates', array( $taxes, 'calculate_tax' ), 10, 6 );
22
  }
23
  }
24
 
33
  * @return mixed
34
  */
35
  public function calculate_tax( $matched_tax_rates, $country, $state, $postcode, $city, $tax_class ) {
 
36
  //if a tax rate is already matched, avoid adding extra one
37
  if ( ! empty( $matched_tax_rates ) ) {
38
  return $matched_tax_rates;
42
  if ( isset( $countries[ $country ][ $state ] ) && !empty($postcode) ) { //only make the request if country, state and zip are set
43
  $key = 'printful_tax_rate_' . $country . '-' . $state . '-' . $city . '-' . $postcode;
44
  $rate = get_transient( $key );
45
+ $response = null;
46
+
47
  if ( $rate === false ) {
48
  try {
49
  $client = Printful_Integration::instance()->get_client();
97
  * @return bool
98
  */
99
  private function isRateUnique( $rate, $matched_tax_rates ) {
 
100
  if ( empty( $matched_tax_rates ) ) {
101
  return true;
102
  }
115
  * @return array|mixed
116
  */
117
  private function get_tax_countries() {
 
118
  $countries = get_transient( 'printful_tax_countries' );
119
+
120
  if ( ! $countries ) {
121
  $countries = array();
122
+
123
  try {
124
  $client = Printful_Integration::instance()->get_client();
125
  $list = $client->get( 'tax/countries' );
129
  $countries[ $country['code'] ][ $state['code'] ] = 1;
130
  }
131
  }
132
+
133
  if ( ! empty( $countries ) ) {
134
  set_transient( 'printful_tax_countries', $countries, 6 * 3600 );
135
  }
157
  $includeShipping = (int) $includeShipping;
158
 
159
  $states = WC()->countries->get_states( $cc );
160
+ $tax_title = ( isset( $states[ $state ] ) ? $states[ $state ] . ' ' : '' ) . __( 'Sales Tax', 'printful' );
161
  $id = $wpdb->get_var(
162
  $wpdb->prepare( "SELECT tax_rate_id FROM {$wpdb->prefix}woocommerce_tax_rates WHERE tax_rate_class='printful'
163
  and tax_rate_country = %s AND tax_rate_state = %s AND tax_rate_shipping = %s LIMIT 1",
printful-shipping.php CHANGED
@@ -3,7 +3,7 @@
3
  Plugin Name: Printful Integration for WooCommerce
4
  Plugin URI: https://wordpress.org/plugins/printful-shipping-for-woocommerce/
5
  Description: Calculate correct shipping and tax rates for your Printful-Woocommerce integration.
6
- Version: 2.0.6
7
  Author: Printful
8
  Author URI: http://www.printful.com
9
  License: GPL2 http://www.gnu.org/licenses/gpl-2.0.html
@@ -20,7 +20,7 @@ if ( ! defined( 'PF_PLUGIN_FILE' ) ) {
20
 
21
  class Printful_Base {
22
 
23
- const VERSION = '2.0.6';
24
  const PF_HOST = 'https://www.printful.com/';
25
  const PF_API_HOST = 'https://api.printful.com/';
26
 
@@ -30,7 +30,9 @@ class Printful_Base {
30
  public function __construct() {
31
  add_action( 'plugins_loaded', array( $this, 'init' ) );
32
  add_action( 'plugins_loaded', array( $this, 'printful_load_plugin_textdomain') );
33
- add_action( 'rest_api_init', array( 'Printful_REST_API', 'init' ) );
 
 
34
  }
35
 
36
  /**
@@ -61,7 +63,7 @@ class Printful_Base {
61
  require_once 'includes/class-printful-admin-support.php';
62
  require_once 'includes/class-printful-size-chart-tab.php';
63
  require_once 'includes/class-printful-size-chart-tab.php';
64
- require_once 'includes/class-printful-rest-api.php';
65
 
66
  //launch init
67
  Printful_Taxes::init();
@@ -96,7 +98,8 @@ class Printful_Base {
96
  */
97
  public function add_api_resource($endpoints) {
98
  require_once 'includes/class-printful-api-resource.php';
99
- $endpoints[]= 'Printful_API_Resource';
 
100
  return $endpoints;
101
  }
102
 
@@ -140,6 +143,22 @@ class Printful_Base {
140
  return self::PF_API_HOST;
141
  }
142
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
143
  }
144
 
145
  new Printful_Base(); //let's go
3
  Plugin Name: Printful Integration for WooCommerce
4
  Plugin URI: https://wordpress.org/plugins/printful-shipping-for-woocommerce/
5
  Description: Calculate correct shipping and tax rates for your Printful-Woocommerce integration.
6
+ Version: 2.0.7
7
  Author: Printful
8
  Author URI: http://www.printful.com
9
  License: GPL2 http://www.gnu.org/licenses/gpl-2.0.html
20
 
21
  class Printful_Base {
22
 
23
+ const VERSION = '2.0.7';
24
  const PF_HOST = 'https://www.printful.com/';
25
  const PF_API_HOST = 'https://api.printful.com/';
26
 
30
  public function __construct() {
31
  add_action( 'plugins_loaded', array( $this, 'init' ) );
32
  add_action( 'plugins_loaded', array( $this, 'printful_load_plugin_textdomain') );
33
+
34
+ // WP REST API.
35
+ $this->rest_api_init();
36
  }
37
 
38
  /**
63
  require_once 'includes/class-printful-admin-support.php';
64
  require_once 'includes/class-printful-size-chart-tab.php';
65
  require_once 'includes/class-printful-size-chart-tab.php';
66
+ require_once 'includes/class-printful-rest-api-controller.php';
67
 
68
  //launch init
69
  Printful_Taxes::init();
98
  */
99
  public function add_api_resource($endpoints) {
100
  require_once 'includes/class-printful-api-resource.php';
101
+ $endpoints[] = 'Printful_API_Resource';
102
+
103
  return $endpoints;
104
  }
105
 
143
  return self::PF_API_HOST;
144
  }
145
 
146
+ private function rest_api_init()
147
+ {
148
+ // REST API was included starting WordPress 4.4.
149
+ if ( ! class_exists( 'WP_REST_Server' ) ) {
150
+ return;
151
+ }
152
+
153
+ // Init REST API routes.
154
+ add_action( 'rest_api_init', array( $this, 'register_rest_routes' ));
155
+ }
156
+
157
+ public function register_rest_routes()
158
+ {
159
+ $printfulRestAPIController = new Printful_REST_API_Controller();
160
+ $printfulRestAPIController->register_routes();
161
+ }
162
  }
163
 
164
  new Printful_Base(); //let's go
readme.txt CHANGED
@@ -3,7 +3,7 @@ Contributors: girts_u, kievins, kberzins
3
  Tags: woocommerce, printful, drop shipping, shipping, shipping rates, fulfillment, printing, fedex, carriers, checkout, t-shirts
4
  Requires at least: 3.8
5
  Tested up to: 5.0
6
- Stable tag: 2.0.6
7
  License: GPLv2 or later
8
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
9
 
@@ -38,6 +38,9 @@ Go to https://www.printful.com/dashboard/store , select your WooCommerce store,
38
 
39
  == Upgrade Notice ==
40
 
 
 
 
41
  = 2.0.6 =
42
  Improvement support for WordPress 5.0 and fixed various minor issues
43
 
@@ -106,6 +109,9 @@ First release
106
 
107
  == Changelog ==
108
 
 
 
 
109
  = 2.0.6 =
110
  * Improvement support for WordPress 5.0 and fixed various minor issues
111
 
3
  Tags: woocommerce, printful, drop shipping, shipping, shipping rates, fulfillment, printing, fedex, carriers, checkout, t-shirts
4
  Requires at least: 3.8
5
  Tested up to: 5.0
6
+ Stable tag: 2.0.7
7
  License: GPLv2 or later
8
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
9
 
38
 
39
  == Upgrade Notice ==
40
 
41
+ = 2.0.7 =
42
+ Bug fixes, security improvements and improved i18n support
43
+
44
  = 2.0.6 =
45
  Improvement support for WordPress 5.0 and fixed various minor issues
46
 
109
 
110
  == Changelog ==
111
 
112
+ = 2.0.7 =
113
+ * Bug fixes, security improvements and improved i18n support
114
+
115
  = 2.0.6 =
116
  * Improvement support for WordPress 5.0 and fixed various minor issues
117