Skip to content

Commit f686e74

Browse files
authored
feat: Queries and mutations for shipping zones, tax classes, and tax rates. (wp-graphql#856)
* fix: General bugfixes and improvements * devops: New mutations and types tested and compliance with Linter and PHPStan * chore: hooks added to the mutation resolvers * feat: permission checks added * chore: Linter and compliance met * chore: Linter and compliance met
1 parent 6028061 commit f686e74

File tree

49 files changed

+4602
-115
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

49 files changed

+4602
-115
lines changed

includes/class-core-schema-filters.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -271,12 +271,16 @@ public static function graphql_data_loaders( $loaders, $context ) {
271271
$loaders['cart_item'] = &$cart_item_loader;
272272
$downloadable_item_loader = new WC_Db_Loader( $context, 'DOWNLOADABLE_ITEM' );
273273
$loaders['downloadable_item'] = &$downloadable_item_loader;
274+
$tax_class_loader = new WC_Db_Loader( $context, 'TAX_CLASS' );
275+
$loaders['tax_class'] = &$tax_class_loader;
274276
$tax_rate_loader = new WC_Db_Loader( $context, 'TAX_RATE' );
275277
$loaders['tax_rate'] = &$tax_rate_loader;
276278
$order_item_loader = new WC_Db_Loader( $context, 'ORDER_ITEM' );
277279
$loaders['order_item'] = &$order_item_loader;
278280
$shipping_item_loader = new WC_Db_Loader( $context, 'SHIPPING_METHOD' );
279281
$loaders['shipping_method'] = &$shipping_item_loader;
282+
$shipping_zone_loader = new WC_Db_Loader( $context, 'SHIPPING_ZONE' );
283+
$loaders['shipping_zone'] = &$shipping_zone_loader;
280284
return $loaders;
281285
}
282286

includes/class-type-registry.php

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,8 @@ public function init() {
4646
Type\WPEnum\Product_Attribute_Enum::register();
4747
Type\WPEnum\Attribute_Operator_Enum::register();
4848
Type\WPEnum\Currency_Enum::register();
49+
Type\WPEnum\Shipping_Location_Type_Enum::register();
50+
Type\WPEnum\WC_Setting_Type_Enum::register();
4951

5052
/**
5153
* InputObjects.
@@ -67,6 +69,8 @@ public function init() {
6769
Type\WPInputObject\Collection_Stats_Where_Args::register();
6870
Type\WPInputObject\Product_Attribute_Filter_Input::register();
6971
Type\WPInputObject\Product_Attribute_Query_Input::register();
72+
Type\WPInputObject\Shipping_Location_Input::register();
73+
Type\WPInputObject\WC_Setting_Input::register();
7074

7175
/**
7276
* Interfaces.
@@ -112,6 +116,10 @@ public function init() {
112116
Type\WPObject\Payment_Token_Types::register();
113117
Type\WPObject\Country_State_Type::register();
114118
Type\WPObject\Collection_Stats_Type::register();
119+
Type\WPObject\Shipping_Zone_Type::register();
120+
Type\WPObject\Shipping_Location_Type::register();
121+
Type\WPObject\Tax_Class_Type::register();
122+
Type\WPObject\WC_Setting_Type::register();
115123

116124
/**
117125
* Object fields.
@@ -145,6 +153,8 @@ public function init() {
145153
Connection\Tax_Rates::register_connections();
146154
Connection\Shipping_Methods::register_connections();
147155
Connection\Payment_Gateways::register_connections();
156+
Connection\Shipping_Zones::register_connections();
157+
Connection\Tax_Classes::register_connections();
148158

149159
/**
150160
* Mutations.
@@ -175,6 +185,19 @@ public function init() {
175185
Mutation\Coupon_Delete::register_mutation();
176186
Mutation\Payment_Method_Delete::register_mutation();
177187
Mutation\Payment_Method_Set_Default::register_mutation();
188+
Mutation\Shipping_Zone_Create::register_mutation();
189+
Mutation\Shipping_Zone_Delete::register_mutation();
190+
Mutation\Shipping_Zone_Locations_Clear::register_mutation();
191+
Mutation\Shipping_Zone_Locations_Update::register_mutation();
192+
Mutation\Shipping_Zone_Method_Add::register_mutation();
193+
Mutation\Shipping_Zone_Method_Remove::register_mutation();
194+
Mutation\Shipping_Zone_Method_Update::register_mutation();
195+
Mutation\Shipping_Zone_Update::register_mutation();
196+
Mutation\Tax_Class_Create::register_mutation();
197+
Mutation\Tax_Class_Delete::register_mutation();
198+
Mutation\Tax_Rate_Create::register_mutation();
199+
Mutation\Tax_Rate_Delete::register_mutation();
200+
Mutation\Tax_Rate_Update::register_mutation();
178201
Mutation\Update_Session::register_mutation();
179202
}
180203
}

includes/class-wp-graphql-woocommerce.php

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,7 @@ private function includes() {
174174
require $include_directory_path . 'model/class-order.php';
175175
require $include_directory_path . 'model/class-order-item.php';
176176
require $include_directory_path . 'model/class-shipping-method.php';
177+
require $include_directory_path . 'model/class-shipping-zone.php';
177178
require $include_directory_path . 'model/class-tax-rate.php';
178179

179180
// Include data loaders class files.
@@ -190,13 +191,15 @@ private function includes() {
190191
require $include_directory_path . 'data/connection/class-order-item-connection-resolver.php';
191192
require $include_directory_path . 'data/connection/class-payment-gateway-connection-resolver.php';
192193
require $include_directory_path . 'data/connection/class-product-attribute-connection-resolver.php';
194+
require $include_directory_path . 'data/connection/class-product-connection-resolver.php';
193195
require $include_directory_path . 'data/connection/class-shipping-method-connection-resolver.php';
196+
require $include_directory_path . 'data/connection/class-shipping-zone-connection-resolver.php';
197+
require $include_directory_path . 'data/connection/class-tax-class-connection-resolver.php';
194198
require $include_directory_path . 'data/connection/class-tax-rate-connection-resolver.php';
195199
require $include_directory_path . 'data/connection/class-variation-attribute-connection-resolver.php';
196200

197201
// Include deprecated resolver trait/class files.
198202
require $include_directory_path . 'data/connection/class-coupon-connection-resolver.php';
199-
require $include_directory_path . 'data/connection/class-product-connection-resolver.php';
200203
require $include_directory_path . 'data/connection/class-customer-connection-resolver.php';
201204

202205
// Include mutation processor class files.
@@ -205,6 +208,8 @@ private function includes() {
205208
require $include_directory_path . 'data/mutation/class-coupon-mutation.php';
206209
require $include_directory_path . 'data/mutation/class-customer-mutation.php';
207210
require $include_directory_path . 'data/mutation/class-order-mutation.php';
211+
require $include_directory_path . 'data/mutation/class-shipping-mutation.php';
212+
require $include_directory_path . 'data/mutation/class-settings-mutation.php';
208213

209214
// Include factory class file.
210215
require $include_directory_path . 'data/class-factory.php';
@@ -239,6 +244,8 @@ private function includes() {
239244
require $include_directory_path . 'type/enum/class-attribute-operator-enum.php';
240245
require $include_directory_path . 'type/enum/class-product-attribute-enum.php';
241246
require $include_directory_path . 'type/enum/class-currency-enum.php';
247+
require $include_directory_path . 'type/enum/class-shipping-location-type-enum.php';
248+
require $include_directory_path . 'type/enum/class-wc-setting-type-enum.php';
242249

243250
// Include interface type class files.
244251
require $include_directory_path . 'type/interface/class-attribute.php';
@@ -282,6 +289,10 @@ private function includes() {
282289
require $include_directory_path . 'type/object/class-payment-token-types.php';
283290
require $include_directory_path . 'type/object/class-country-state-type.php';
284291
require $include_directory_path . 'type/object/class-collection-stats-type.php';
292+
require $include_directory_path . 'type/object/class-shipping-location-type.php';
293+
require $include_directory_path . 'type/object/class-shipping-zone-type.php';
294+
require $include_directory_path . 'type/object/class-tax-class-type.php';
295+
require $include_directory_path . 'type/object/class-wc-setting-type.php';
285296

286297
// Include input type class files.
287298
require $include_directory_path . 'type/input/class-cart-item-input.php';
@@ -301,6 +312,8 @@ private function includes() {
301312
require $include_directory_path . 'type/input/class-collection-stats-where-args.php';
302313
require $include_directory_path . 'type/input/class-product-attribute-filter-input.php';
303314
require $include_directory_path . 'type/input/class-product-attribute-query-input.php';
315+
require $include_directory_path . 'type/input/class-shipping-location-input.php';
316+
require $include_directory_path . 'type/input/class-wc-setting-input.php';
304317

305318
// Include mutation type class files.
306319
require $include_directory_path . 'mutation/class-cart-add-fee.php';
@@ -329,6 +342,19 @@ private function includes() {
329342
require $include_directory_path . 'mutation/class-review-update.php';
330343
require $include_directory_path . 'mutation/class-payment-method-delete.php';
331344
require $include_directory_path . 'mutation/class-payment-method-set-default.php';
345+
require $include_directory_path . 'mutation/class-shipping-zone-create.php';
346+
require $include_directory_path . 'mutation/class-shipping-zone-delete.php';
347+
require $include_directory_path . 'mutation/class-shipping-zone-locations-clear.php';
348+
require $include_directory_path . 'mutation/class-shipping-zone-locations-update.php';
349+
require $include_directory_path . 'mutation/class-shipping-zone-method-add.php';
350+
require $include_directory_path . 'mutation/class-shipping-zone-method-remove.php';
351+
require $include_directory_path . 'mutation/class-shipping-zone-method-update.php';
352+
require $include_directory_path . 'mutation/class-shipping-zone-update.php';
353+
require $include_directory_path . 'mutation/class-tax-class-create.php';
354+
require $include_directory_path . 'mutation/class-tax-class-delete.php';
355+
require $include_directory_path . 'mutation/class-tax-rate-create.php';
356+
require $include_directory_path . 'mutation/class-tax-rate-delete.php';
357+
require $include_directory_path . 'mutation/class-tax-rate-update.php';
332358
require $include_directory_path . 'mutation/class-update-session.php';
333359

334360
// Include connection class/function files.
@@ -342,6 +368,8 @@ private function includes() {
342368
require $include_directory_path . 'connection/class-product-attributes.php';
343369
require $include_directory_path . 'connection/class-products.php';
344370
require $include_directory_path . 'connection/class-shipping-methods.php';
371+
require $include_directory_path . 'connection/class-shipping-zones.php';
372+
require $include_directory_path . 'connection/class-tax-classes.php';
345373
require $include_directory_path . 'connection/class-tax-rates.php';
346374
require $include_directory_path . 'connection/class-wc-terms.php';
347375

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
<?php
2+
/**
3+
* Connection - Shipping_Zones
4+
*
5+
* Registers connections to ShippingZone
6+
*
7+
* @package WPGraphQL\WooCommerce\Connection
8+
* @since TBD
9+
*/
10+
11+
namespace WPGraphQL\WooCommerce\Connection;
12+
13+
use GraphQL\Type\Definition\ResolveInfo;
14+
use WPGraphQL\AppContext;
15+
use WPGraphQL\WooCommerce\Data\Connection\Shipping_Zone_Connection_Resolver;
16+
17+
/**
18+
* Class - Shipping_Zones
19+
*/
20+
class Shipping_Zones {
21+
/**
22+
* Registers the various connections from other Types to ShippingZone
23+
*
24+
* @return void
25+
*/
26+
public static function register_connections() {
27+
// From RootQuery.
28+
register_graphql_connection( self::get_connection_config() );
29+
}
30+
31+
/**
32+
* Given an array of $args, this returns the connection config, merging the provided args
33+
* with the defaults.
34+
*
35+
* @param array $args - Connection configuration.
36+
* @return array
37+
*/
38+
public static function get_connection_config( $args = [] ): array {
39+
return array_merge(
40+
[
41+
'fromType' => 'RootQuery',
42+
'toType' => 'ShippingZone',
43+
'fromFieldName' => 'shippingZones',
44+
'connectionArgs' => [],
45+
'resolve' => static function ( $source, array $args, AppContext $context, ResolveInfo $info ) {
46+
$resolver = new Shipping_Zone_Connection_Resolver( $source, $args, $context, $info );
47+
48+
return $resolver->get_connection();
49+
},
50+
],
51+
$args
52+
);
53+
}
54+
55+
/**
56+
* Returns array of where args.
57+
*
58+
* @return array
59+
*/
60+
public static function get_connection_args(): array {
61+
return [];
62+
}
63+
}
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
<?php
2+
/**
3+
* Connection - Tax_Classes
4+
*
5+
* Registers connections to TaxClass
6+
*
7+
* @package WPGraphQL\WooCommerce\Connection
8+
* @since TBD
9+
*/
10+
11+
namespace WPGraphQL\WooCommerce\Connection;
12+
13+
use GraphQL\Type\Definition\ResolveInfo;
14+
use WPGraphQL\AppContext;
15+
use WPGraphQL\WooCommerce\Data\Connection\Tax_Class_Connection_Resolver;
16+
17+
/**
18+
* Class - TaxClass
19+
*/
20+
class Tax_Classes {
21+
/**
22+
* Registers the various connections from other Types to TaxClass
23+
*
24+
* @return void
25+
*/
26+
public static function register_connections() {
27+
// From RootQuery.
28+
register_graphql_connection( self::get_connection_config() );
29+
}
30+
31+
/**
32+
* Given an array of $args, this returns the connection config, merging the provided args
33+
* with the defaults.
34+
*
35+
* @param array $args - Connection configuration.
36+
* @return array
37+
*/
38+
public static function get_connection_config( $args = [] ): array {
39+
return array_merge(
40+
[
41+
'fromType' => 'RootQuery',
42+
'toType' => 'TaxClass',
43+
'fromFieldName' => 'taxClasses',
44+
'connectionArgs' => [],
45+
'resolve' => static function ( $source, array $args, AppContext $context, ResolveInfo $info ) {
46+
$resolver = new Tax_Class_Connection_Resolver( $source, $args, $context, $info );
47+
48+
return $resolver->get_connection();
49+
},
50+
],
51+
$args
52+
);
53+
}
54+
55+
/**
56+
* Returns array of where args.
57+
*
58+
* @return array
59+
*/
60+
public static function get_connection_args(): array {
61+
return [];
62+
}
63+
}

includes/data/connection/class-shipping-method-connection-resolver.php

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
namespace WPGraphQL\WooCommerce\Data\Connection;
1212

1313
use WPGraphQL\Data\Connection\AbstractConnectionResolver;
14+
use WPGraphQL\WooCommerce\Model\Shipping_Method;
15+
use WPGraphQL\WooCommerce\Model\Shipping_Zone;
1416

1517
/**
1618
* Class Shipping_Method_Connection_Resolver
@@ -31,6 +33,10 @@ public function get_loader_name() {
3133
* @return bool
3234
*/
3335
public function should_execute() {
36+
if ( ! wc_rest_check_manager_permissions( 'shipping_methods', 'read' ) ) {
37+
graphql_debug( __( 'Permission denied.', 'wp-graphql-woocommerce' ) );
38+
return false;
39+
}
3440
return true;
3541
}
3642

@@ -47,30 +53,32 @@ public function get_query_args() {
4753
/**
4854
* Executes query
4955
*
50-
* @return array|mixed|string[]
56+
* @return int[]
5157
*/
5258
public function get_query() {
53-
// TODO: Implement get_query() method.
54-
$wc_shipping = \WC_Shipping::instance();
55-
$methods = $wc_shipping->get_shipping_methods();
59+
if ( $this->source instanceof Shipping_Zone ) {
60+
$methods = $this->source->methods;
61+
} else {
62+
$wc_shipping = \WC_Shipping::instance();
63+
$methods = $wc_shipping->get_shipping_methods();
64+
}
65+
66+
foreach ( $methods as $method ) {
67+
$this->loader->prime( $method->id, new Shipping_Method( $method ) );
68+
}
5669

5770
// Get shipping method IDs.
58-
$methods = array_map(
59-
static function ( $item ) {
60-
return $item->id;
61-
},
62-
array_values( $methods )
63-
);
71+
$methods = wp_list_pluck( array_values( $methods ), 'id' );
6472

6573
return $methods;
6674
}
6775

6876
/**
6977
* Return an array of items from the query
7078
*
71-
* @return array|mixed
79+
* @return array
7280
*/
73-
public function get_ids() {
81+
public function get_ids_from_query() {
7482
return ! empty( $this->query ) ? $this->query : [];
7583
}
7684

0 commit comments

Comments
 (0)