Skip to content

Commit 30b34aa

Browse files
authored
fix: Customer order connection args priority fixed. (#698)
1 parent c083fa5 commit 30b34aa

File tree

4 files changed

+68
-14
lines changed

4 files changed

+68
-14
lines changed

composer.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@
8989
"/codeception.yml",
9090
"/composer.json",
9191
"/composer.lock",
92-
"/docker-composer.yml",
92+
"/docker-compose.yml",
9393
"/Dockerfile",
9494
"/netlify.toml",
9595
"/README.md"

includes/connection/class-orders.php

Lines changed: 32 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ public static function register_connections() {
3232
'fromType' => 'Customer',
3333
'fromFieldName' => 'orders',
3434
'resolve' => function( $source, array $args, AppContext $context, ResolveInfo $info ) {
35-
$resolver = new PostObjectConnectionResolver( $source, $args, $context, $info, 'shop_order' );
35+
$resolver = new PostObjectConnectionResolver( $source, $args, $context, $info, wc_get_order_types( 'view-orders' ) );
3636

3737
return self::get_customer_order_connection( $resolver, $source );
3838
},
@@ -113,14 +113,37 @@ private static function get_customer_order_connection( $resolver, $customer ) {
113113
return [];
114114
}
115115

116-
// If the querying user has a "billing email" set filter orders by user's billing email, otherwise filter by user's ID.
117-
$meta_key = ! empty( $customer->get_billing_email() ) ? '_billing_email' : '_customer_user';
118-
$meta_value = ! empty( $customer->get_billing_email() )
119-
? $customer->get_billing_email()
120-
: $customer->get_id();
121-
$resolver->set_query_arg( 'meta_key', $meta_key );
122-
$resolver->set_query_arg( 'meta_value', $meta_value );
116+
$meta_query = false;
117+
if ( ! empty ( $customer->get_id() ) ) {
118+
$meta_query = [
119+
[
120+
'key' => '_customer_user',
121+
'value' => $customer->get_id(),
122+
'compare' => '=',
123+
],
124+
];
125+
} else if ( ! empty( $customer->get_billing_email() ) ) {
126+
$meta_query = [
127+
'relation' => 'AND',
128+
[
129+
'key' => '_billing_email',
130+
'value' => $customer->get_billing_email(),
131+
'compare' => '=',
132+
],
133+
[
134+
'key' => '_customer_user',
135+
'value' => 0,
136+
'compare' => '=',
137+
]
138+
];
139+
}
140+
141+
// Bail if needed info not found on customer object.
142+
if ( false === $meta_query ) {
143+
return [];
144+
}
123145

146+
$resolver->set_query_arg( 'meta_query', $meta_query );
124147
return $resolver->get_connection();
125148
}
126149

@@ -342,7 +365,7 @@ public static function map_input_fields_to_wp_query( $query_args, $where_args, $
342365

343366
// Process order meta inputs.
344367
$metas = [ 'customerId', 'customersIn' ];
345-
$meta_query = [];
368+
$meta_query = isset( $query_args['meta_query'] ) ? $query_args['meta_query'] : [];
346369
foreach ( $metas as $field ) {
347370
if ( isset( $query_args[ $field ] ) ) {
348371
$value = $query_args[ $field ];

tests/_support/Factory/OrderFactory.php

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,11 @@ public function create_object( $args ) {
3636
throw new \Exception( $order->get_error_message( $args->get_error_code() ) );
3737
}
3838

39-
// Set meta data.
40-
if ( ! empty( $args['meta_data'] ) ) {
41-
$order->set_meta_data( $args['meta_data'] );
39+
// Set props.
40+
foreach ( $args as $key => $value ) {
41+
if ( is_callable( [ $order, "set_{$key}" ] ) ) {
42+
$order->{"set_{$key}"}( $value );
43+
}
4244
}
4345

4446
return $order->save();
@@ -339,8 +341,10 @@ public function add_tax( $order, $args = [], $save = true ) {
339341

340342
public function set_to_customer_billing_address( $order, $customer, $save = true ) {
341343
$order = \wc_get_order( $order );
344+
if ( ! $customer ) {
345+
return $order;
346+
}
342347
$customer = new \WC_Customer( $customer );
343-
344348
// Set billing address
345349
$order->set_billing_first_name( $customer->get_first_name() );
346350
$order->set_billing_last_name( $customer->get_last_name() );
@@ -363,6 +367,9 @@ public function set_to_customer_billing_address( $order, $customer, $save = true
363367

364368
public function set_to_customer_shipping_address( $order, $customer, $save = true ) {
365369
$order = \wc_get_order( $order );
370+
if ( ! $customer ) {
371+
return $order;
372+
}
366373
$customer = new \WC_Customer( $customer );
367374

368375
// Set shipping address

tests/wpunit/CustomerQueriesTest.php

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -405,13 +405,23 @@ public function testCustomersQueryAndWhereArgs() {
405405

406406
public function testCustomerToOrdersConnection() {
407407
$new_customer_id = $this->factory->customer->create();
408+
408409
$order_1 = $this->factory->order->createNew(
409410
[ 'customer_id' => $this->customer ]
410411
);
411412
$order_2 = $this->factory->order->createNew(
412413
[ 'customer_id' => $new_customer_id ]
413414
);
414415

416+
$guest_customer = new \WC_Customer();
417+
$guest_customer->set_billing_email( 'test@test.com' );
418+
$order_3 = $this->factory->order->createNew(
419+
[
420+
'customer_id' => $guest_customer->get_id(),
421+
'billing_email' => $guest_customer->get_billing_email(),
422+
]
423+
);
424+
415425
$query = '
416426
query {
417427
customer {
@@ -436,5 +446,19 @@ public function testCustomerToOrdersConnection() {
436446
];
437447

438448
$this->assertQuerySuccessful( $response, $expected );
449+
450+
/**
451+
* Assertion Two
452+
*
453+
* Query for a guest's orders.
454+
*/
455+
$this->loginAs( 0 );
456+
WC()->customer = $guest_customer;
457+
$response = $this->graphql( compact( 'query' ) );
458+
$expected = [
459+
$this->expectedField( 'customer.orders.nodes.#.databaseId', $order_3 ),
460+
];
461+
462+
$this->assertQuerySuccessful( $response, $expected );
439463
}
440464
}

0 commit comments

Comments
 (0)