Version Description
Support calculating shipping rates for both Printful and non-Printful products at the same time
Download this release
Release Info
Developer | printful |
Plugin | Printful Integration for WooCommerce |
Version | 1.2 |
Comparing to | |
See all releases |
Code changes from version 1.1.2 to 1.2
- includes/class-printful-integration.php +23 -18
- includes/class-printful-shipping.php +129 -6
- printful-shipping.php +3 -10
- readme.txt +11 -3
includes/class-printful-integration.php
CHANGED
@@ -121,24 +121,30 @@ class Printful_Integration extends WC_Integration
|
|
121 |
$countries = $this->get_tax_countries();
|
122 |
if(isset($countries[$country][$state]))
|
123 |
{
|
124 |
-
$
|
125 |
-
|
126 |
-
|
127 |
-
|
128 |
-
|
129 |
-
|
130 |
-
'
|
131 |
-
|
132 |
-
|
133 |
-
|
134 |
-
|
135 |
-
|
136 |
-
|
137 |
-
|
|
|
|
|
138 |
|
139 |
-
|
140 |
-
|
141 |
-
|
|
|
|
|
|
|
|
|
142 |
}
|
143 |
|
144 |
if ($rate)
|
@@ -173,7 +179,6 @@ class Printful_Integration extends WC_Integration
|
|
173 |
|
174 |
foreach($list as $country)
|
175 |
{
|
176 |
-
$list[$country['country']] = array();
|
177 |
foreach($country['states'] as $state){
|
178 |
$countries[$country['code']][$state['code']] = 1;
|
179 |
}
|
121 |
$countries = $this->get_tax_countries();
|
122 |
if(isset($countries[$country][$state]))
|
123 |
{
|
124 |
+
$key = 'printful_tax_' . $country.'-'.$state.'-'.$city.'-'.$postcode;
|
125 |
+
$rate = get_transient($key);
|
126 |
+
if ($rate === false) {
|
127 |
+
try {
|
128 |
+
$client = $this->get_client();
|
129 |
+
$response = $client->post('tax/rates', array(
|
130 |
+
'recipient' => array(
|
131 |
+
'country_code' => $country,
|
132 |
+
'state_code' => $state,
|
133 |
+
'city' => $city,
|
134 |
+
'zip' => $postcode,
|
135 |
+
)
|
136 |
+
));
|
137 |
+
}
|
138 |
+
catch(Exception $e)
|
139 |
+
{}
|
140 |
|
141 |
+
if(isset($response['rate']))
|
142 |
+
{
|
143 |
+
$rate = $response['rate'];
|
144 |
+
} else {
|
145 |
+
$rate = 0;
|
146 |
+
}
|
147 |
+
set_transient($key, $rate, 1800);
|
148 |
}
|
149 |
|
150 |
if ($rate)
|
179 |
|
180 |
foreach($list as $country)
|
181 |
{
|
|
|
182 |
foreach($country['states'] as $state){
|
183 |
$countries[$country['code']][$state['code']] = 1;
|
184 |
}
|
includes/class-printful-shipping.php
CHANGED
@@ -7,6 +7,9 @@ class Printful_Shipping extends WC_Shipping_Method
|
|
7 |
public $calculate_tax = false;
|
8 |
private $last_error = false;
|
9 |
|
|
|
|
|
|
|
10 |
public function __construct()
|
11 |
{
|
12 |
$this->id = 'printful_shipping';
|
@@ -21,7 +24,14 @@ class Printful_Shipping extends WC_Shipping_Method
|
|
21 |
$this->enabled = $this->get_option('enabled');
|
22 |
$this->show_warnings = $this->get_option('show_warnings') == 'yes';
|
23 |
|
24 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
25 |
}
|
26 |
|
27 |
public function generate_settings_html($form_fields = false)
|
@@ -58,10 +68,116 @@ class Printful_Shipping extends WC_Shipping_Method
|
|
58 |
'type' => 'checkbox',
|
59 |
'label' => 'Display Printful status messages if rate API request fails',
|
60 |
'default' => 'yes'
|
61 |
-
)
|
62 |
);
|
63 |
}
|
64 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
65 |
public function calculate_shipping($package = array())
|
66 |
{
|
67 |
$request = array(
|
@@ -83,7 +199,8 @@ class Printful_Shipping extends WC_Shipping_Method
|
|
83 |
}
|
84 |
$request['items'] []= array(
|
85 |
'external_variant_id' => $item['variation_id'] ? $item['variation_id'] : $item['product_id'],
|
86 |
-
'quantity' => $item['quantity']
|
|
|
87 |
);
|
88 |
}
|
89 |
|
@@ -99,9 +216,15 @@ class Printful_Shipping extends WC_Shipping_Method
|
|
99 |
}
|
100 |
|
101 |
try {
|
102 |
-
$
|
103 |
-
|
104 |
-
)
|
|
|
|
|
|
|
|
|
|
|
|
|
105 |
|
106 |
foreach ($response as $rate) {
|
107 |
$rateData = array(
|
7 |
public $calculate_tax = false;
|
8 |
private $last_error = false;
|
9 |
|
10 |
+
//Store whether currently processed package contains Printful products (for WC<2.6)
|
11 |
+
private $printful_package = true;
|
12 |
+
|
13 |
public function __construct()
|
14 |
{
|
15 |
$this->id = 'printful_shipping';
|
24 |
$this->enabled = $this->get_option('enabled');
|
25 |
$this->show_warnings = $this->get_option('show_warnings') == 'yes';
|
26 |
|
27 |
+
//Initialize shipping methods for specific package (or no package)
|
28 |
+
add_filter('woocommerce_load_shipping_methods', array($this, 'woocommerce_load_shipping_methods'), 10000);
|
29 |
+
|
30 |
+
//Remove other shipping methods for Printful package on WC < 2.6
|
31 |
+
add_filter('woocommerce_shipping_methods', array($this, 'woocommerce_shipping_methods'), 10000);
|
32 |
+
|
33 |
+
add_filter('woocommerce_cart_shipping_packages', array($this, 'woocommerce_cart_shipping_packages'));
|
34 |
+
|
35 |
}
|
36 |
|
37 |
public function generate_settings_html($form_fields = false)
|
68 |
'type' => 'checkbox',
|
69 |
'label' => 'Display Printful status messages if rate API request fails',
|
70 |
'default' => 'yes'
|
71 |
+
)
|
72 |
);
|
73 |
}
|
74 |
|
75 |
+
//Enable only Printful shipping method for Printful packages
|
76 |
+
public function woocommerce_load_shipping_methods( $package = array() ) {
|
77 |
+
$this->printful_package = false;
|
78 |
+
if($package && !empty($package['printful'])) {
|
79 |
+
if($this->enabled == 'yes') {
|
80 |
+
$this->printful_package = true;
|
81 |
+
//Remove default methods if we process Printful package
|
82 |
+
WC()->shipping()->unregister_shipping_methods();
|
83 |
+
WC()->shipping()->register_shipping_method($this);
|
84 |
+
}
|
85 |
+
} else if(!$package) {
|
86 |
+
//Show Printful tab on Shipping rate settings
|
87 |
+
WC()->shipping()->register_shipping_method($this);
|
88 |
+
}
|
89 |
+
}
|
90 |
+
|
91 |
+
//Remove non-Printful methods for Printful packages on WC < 2.6
|
92 |
+
public function woocommerce_shipping_methods($methods) {
|
93 |
+
if($this->printful_package && version_compare(WC()->version, '2.6', '<')) {
|
94 |
+
//For WC < 2.6 woocommerce_shipping_methods is executed after woocommerce_load_shipping_methods
|
95 |
+
//So we need to clean up unnecessary methods from there
|
96 |
+
return array();
|
97 |
+
}
|
98 |
+
return $methods;
|
99 |
+
}
|
100 |
+
|
101 |
+
//Split Printul products to a separate package if there are any
|
102 |
+
public function woocommerce_cart_shipping_packages($packages = array()) {
|
103 |
+
|
104 |
+
//Printful rates are turned off, do not split products
|
105 |
+
if ($this->enabled !== 'yes') {
|
106 |
+
return $packages;
|
107 |
+
}
|
108 |
+
|
109 |
+
$return_packages = array();
|
110 |
+
|
111 |
+
foreach ($packages as $package) {
|
112 |
+
|
113 |
+
$ids = array();
|
114 |
+
foreach ($package['contents'] as $key => $item) {
|
115 |
+
$ids[$key]= $item['variation_id'] ? $item['variation_id'] : $item['product_id'];
|
116 |
+
}
|
117 |
+
|
118 |
+
$printful_ids = array();
|
119 |
+
if($ids) {
|
120 |
+
asort($ids);
|
121 |
+
$values = implode(',', array_unique($ids));
|
122 |
+
$key = 'printful_productids_'.md5($values);
|
123 |
+
$printful_ids = get_transient($key);
|
124 |
+
if ($printful_ids === false) {
|
125 |
+
try {
|
126 |
+
$client = Printful_Integration::instance()->get_client();
|
127 |
+
$status = $client->get('sync/variants', array(
|
128 |
+
'external_ids' => $values
|
129 |
+
));
|
130 |
+
if(!empty($status['sync_variants'])) {
|
131 |
+
foreach($status['sync_variants'] as $variant) {
|
132 |
+
if($variant['synced']) {
|
133 |
+
$printful_ids[]= $variant['external_id'];
|
134 |
+
}
|
135 |
+
}
|
136 |
+
}
|
137 |
+
set_transient($key, $printful_ids, 1800);
|
138 |
+
} catch (PrintfulException $e) {
|
139 |
+
$this->set_error($e);
|
140 |
+
//Failed to get Printful status, return default packages
|
141 |
+
return $packages;
|
142 |
+
}
|
143 |
+
}
|
144 |
+
}
|
145 |
+
$new_contents = array(
|
146 |
+
'printful' => array(),
|
147 |
+
'woocommerce' => array()
|
148 |
+
);
|
149 |
+
|
150 |
+
foreach($ids as $key => $external_id) {
|
151 |
+
if(in_array($external_id,$printful_ids)) {
|
152 |
+
$new_contents['printful'][$key] = $package['contents'][$key];
|
153 |
+
} else {
|
154 |
+
$new_contents['woocommerce'][$key] = $package['contents'][$key];
|
155 |
+
}
|
156 |
+
}
|
157 |
+
|
158 |
+
foreach ($new_contents as $key => $contents) {
|
159 |
+
if($contents) {
|
160 |
+
$new_package = $package;
|
161 |
+
$new_package['contents_cost'] = 0;
|
162 |
+
$new_package['contents'] = $contents;
|
163 |
+
foreach ($contents as $item ) {
|
164 |
+
if ( $item['data']->needs_shipping() ) {
|
165 |
+
if ( isset( $item['line_total'] ) ) {
|
166 |
+
$new_package['contents_cost'] += $item['line_total'];
|
167 |
+
}
|
168 |
+
}
|
169 |
+
}
|
170 |
+
if ($key == 'printful') {
|
171 |
+
$new_package['printful'] = true;
|
172 |
+
}
|
173 |
+
$return_packages[]= $new_package;
|
174 |
+
}
|
175 |
+
}
|
176 |
+
}
|
177 |
+
return $return_packages;
|
178 |
+
}
|
179 |
+
|
180 |
+
|
181 |
public function calculate_shipping($package = array())
|
182 |
{
|
183 |
$request = array(
|
199 |
}
|
200 |
$request['items'] []= array(
|
201 |
'external_variant_id' => $item['variation_id'] ? $item['variation_id'] : $item['product_id'],
|
202 |
+
'quantity' => $item['quantity'],
|
203 |
+
'value' => $item['line_total'] / $item['quantity']
|
204 |
);
|
205 |
}
|
206 |
|
216 |
}
|
217 |
|
218 |
try {
|
219 |
+
$key = 'printful_rates_' . md5(json_encode($request));
|
220 |
+
$response = get_transient($key);
|
221 |
+
if($response === false) {
|
222 |
+
$response = $client->post('shipping/rates', $request, array(
|
223 |
+
'expedited' => true,
|
224 |
+
));
|
225 |
+
//Cache locally, since WC < 2.6 had problems with caching rates form ultiple packages internally
|
226 |
+
set_transient($key, $response, 1800);
|
227 |
+
}
|
228 |
|
229 |
foreach ($response as $rate) {
|
230 |
$rateData = array(
|
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: 1.
|
7 |
Author: Printful
|
8 |
Author URI: http://www.theprintful.com
|
9 |
License: GPL2 http://www.gnu.org/licenses/gpl-2.0.html
|
@@ -16,7 +16,7 @@ new Printful_Base();
|
|
16 |
|
17 |
class Printful_Base {
|
18 |
|
19 |
-
const VERSION = '1.
|
20 |
|
21 |
/**
|
22 |
* Construct the plugin.
|
@@ -34,18 +34,11 @@ class Printful_Base {
|
|
34 |
//Register integration section
|
35 |
add_filter('woocommerce_integrations', array($this, 'add_integration'));
|
36 |
|
37 |
-
//Register shipping method
|
38 |
-
add_filter('woocommerce_shipping_methods', array($this, 'add_shipping'));
|
39 |
-
|
40 |
//Register API endpoint
|
41 |
add_filter('woocommerce_api_classes', array($this, 'add_api_resource'));
|
42 |
|
43 |
-
}
|
44 |
-
|
45 |
-
public function add_shipping( $methods ) {
|
46 |
require_once 'includes/class-printful-shipping.php';
|
47 |
-
|
48 |
-
return $methods;
|
49 |
}
|
50 |
|
51 |
public function add_integration( $integrations ) {
|
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: 1.2
|
7 |
Author: Printful
|
8 |
Author URI: http://www.theprintful.com
|
9 |
License: GPL2 http://www.gnu.org/licenses/gpl-2.0.html
|
16 |
|
17 |
class Printful_Base {
|
18 |
|
19 |
+
const VERSION = '1.2';
|
20 |
|
21 |
/**
|
22 |
* Construct the plugin.
|
34 |
//Register integration section
|
35 |
add_filter('woocommerce_integrations', array($this, 'add_integration'));
|
36 |
|
|
|
|
|
|
|
37 |
//Register API endpoint
|
38 |
add_filter('woocommerce_api_classes', array($this, 'add_api_resource'));
|
39 |
|
|
|
|
|
|
|
40 |
require_once 'includes/class-printful-shipping.php';
|
41 |
+
new Printful_Shipping();
|
|
|
42 |
}
|
43 |
|
44 |
public function add_integration( $integrations ) {
|
readme.txt
CHANGED
@@ -2,8 +2,8 @@
|
|
2 |
Contributors: girts_u
|
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: 4.
|
6 |
-
Stable tag: 1.
|
7 |
License: GPLv2 or later
|
8 |
License URI: http://www.gnu.org/licenses/gpl-2.0.html
|
9 |
|
@@ -18,7 +18,6 @@ This plugin will also automatically calculate taxes where it is required for Pri
|
|
18 |
= Known Limitations =
|
19 |
|
20 |
* Works with WooCommmerce 2.1 and up
|
21 |
-
* Works only if every item in the order is fulfilled by Printful
|
22 |
|
23 |
== Installation ==
|
24 |
1. Upload 'printful-shipping' to the '/wp-content/plugins/' directory
|
@@ -42,6 +41,9 @@ Go to https://www.theprintful.com/dashboard/store , select your WooCommerce stor
|
|
42 |
|
43 |
== Upgrade Notice ==
|
44 |
|
|
|
|
|
|
|
45 |
= 1.1.2 =
|
46 |
Removed check for Curl extension
|
47 |
|
@@ -62,6 +64,12 @@ First release
|
|
62 |
|
63 |
== Changelog ==
|
64 |
|
|
|
|
|
|
|
|
|
|
|
|
|
65 |
= 1.1.2 =
|
66 |
* Removed check for Curl extension (since we already used wp_remote_get and it is no longer necessary)
|
67 |
|
2 |
Contributors: girts_u
|
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: 4.5.2
|
6 |
+
Stable tag: 1.2
|
7 |
License: GPLv2 or later
|
8 |
License URI: http://www.gnu.org/licenses/gpl-2.0.html
|
9 |
|
18 |
= Known Limitations =
|
19 |
|
20 |
* Works with WooCommmerce 2.1 and up
|
|
|
21 |
|
22 |
== Installation ==
|
23 |
1. Upload 'printful-shipping' to the '/wp-content/plugins/' directory
|
41 |
|
42 |
== Upgrade Notice ==
|
43 |
|
44 |
+
= 1.2 =
|
45 |
+
Support calculating shipping rates for both Printful and non-Printful products at the same time
|
46 |
+
|
47 |
= 1.1.2 =
|
48 |
Removed check for Curl extension
|
49 |
|
64 |
|
65 |
== Changelog ==
|
66 |
|
67 |
+
= 1.2 =
|
68 |
+
* Support calculating shipping rates for both Printful and non-Printful products at the same time (non-Printful
|
69 |
+
products will get default rates provided by Woocommerce)
|
70 |
+
* Added caching to tax rates
|
71 |
+
* Improved compatibility with Woocommerce 2.6
|
72 |
+
|
73 |
= 1.1.2 =
|
74 |
* Removed check for Curl extension (since we already used wp_remote_get and it is no longer necessary)
|
75 |
|