@@ -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 *
0 commit comments