Skip to content

Commit 2ea8591

Browse files
authored
Fix: product connection sorting (#522)
1 parent cb970f3 commit 2ea8591

File tree

2 files changed

+50
-19
lines changed

2 files changed

+50
-19
lines changed

includes/connection/class-products.php

Lines changed: 49 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,8 @@ function() {
195195
$resolver->set_query_arg( 'orderby', 'post__in' );
196196
}
197197

198+
$resolver = self::set_ordering_query_args( $resolver, $args );
199+
198200
return $resolver->get_connection();
199201
},
200202
)
@@ -216,6 +218,8 @@ function() {
216218
$resolver = new PostObjectConnectionResolver( $source, $args, $context, $info, 'product' );
217219
$resolver->set_query_arg( 'p', $source->parent_id );
218220

221+
$resolver = self::set_ordering_query_args( $resolver, $args );
222+
219223
return $resolver->one_to_one()->get_connection();
220224
},
221225
)
@@ -234,6 +238,8 @@ function() {
234238
);
235239
$resolver->set_query_arg( 'tax_query', $tax_query );
236240

241+
$resolver = self::set_ordering_query_args( $resolver, $args );
242+
237243
return $resolver->get_connection();
238244
};
239245

@@ -294,6 +300,8 @@ function() {
294300
$resolver->set_query_arg( 'post__in', $variation_ids );
295301
$resolver->set_query_arg( 'post_type', 'product_variation' );
296302

303+
$resolver = self::set_ordering_query_args( $resolver, $args );
304+
297305
return $resolver->get_connection();
298306
},
299307
)
@@ -319,31 +327,54 @@ public static function get_connection_config( $args = array() ): array {
319327
'resolve' => function( $source, array $args, AppContext $context, ResolveInfo $info ) {
320328
$resolver = new PostObjectConnectionResolver( $source, $args, $context, $info, 'product' );
321329

322-
if ( ! empty( $args['where']['orderby'] ) ) {
323-
foreach ( $args['where']['orderby'] as $orderby_input ) {
324-
switch ( $orderby_input['field'] ) {
325-
case '_price':
326-
case '_regular_price':
327-
case '_sale_price':
328-
case '_wc_rating_count':
329-
case '_wc_average_rating':
330-
case '_sale_price_dates_from':
331-
case '_sale_price_dates_to':
332-
case 'total_sales':
333-
$resolver->set_query_arg( 'orderby', array( 'meta_value_num' => $orderby_input['order'] ) );
334-
$resolver->set_query_arg( 'meta_key', esc_sql( $orderby_input['field'] ) );
335-
$resolver->set_query_arg( 'meta_type', 'NUMERIC' );
336-
break 2;
337-
}
338-
}
339-
}
330+
$resolver = self::set_ordering_query_args( $resolver, $args );
331+
340332
return $resolver->get_connection();
341333
},
342334
),
343335
$args
344336
);
345337
}
346338

339+
/**
340+
* Undocumented function
341+
*
342+
* @param PostObjectConnectionResolver $resolver Connection resolver instance.
343+
* @param array $args Connection provided args.
344+
*
345+
* @return PostObjectConnectionResolver
346+
*/
347+
public static function set_ordering_query_args( $resolver, $args ) {
348+
$backward = isset( $args['last'] ) ? true : false;
349+
350+
if ( ! empty( $args['where']['orderby'] ) ) {
351+
foreach ( $args['where']['orderby'] as $orderby_input ) {
352+
switch ( $orderby_input['field'] ) {
353+
case '_price':
354+
case '_regular_price':
355+
case '_sale_price':
356+
case '_wc_rating_count':
357+
case '_wc_average_rating':
358+
case '_sale_price_dates_from':
359+
case '_sale_price_dates_to':
360+
case 'total_sales':
361+
$order = $orderby_input['order'];
362+
363+
if ( $backward ) {
364+
$order = 'ASC' === $order ? 'DESC' : 'ASC';
365+
}
366+
367+
$resolver->set_query_arg( 'orderby', array( 'meta_value_num' => $order ) );
368+
$resolver->set_query_arg( 'meta_key', esc_sql( $orderby_input['field'] ) );
369+
$resolver->set_query_arg( 'meta_type', 'NUMERIC' );
370+
break 2;
371+
}
372+
}
373+
}
374+
375+
return $resolver;
376+
}
377+
347378
/**
348379
* Returns array of where args.
349380
*

includes/type/object/class-cart-type.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -324,7 +324,7 @@ public static function register_cart_item_connections() {
324324

325325
return $attributes;
326326
},
327-
)
327+
),
328328
),
329329
'resolve' => function ( $source, array $args, AppContext $context, ResolveInfo $info ) {
330330
$id = $source['product_id'];

0 commit comments

Comments
 (0)