Skip to content

Instantly share code, notes, and snippets.

@jasonbahl
Last active July 10, 2024 20:41
Show Gist options
  • Save jasonbahl/da87dbccb58f1323a324a9b3e8952d6c to your computer and use it in GitHub Desktop.
Save jasonbahl/da87dbccb58f1323a324a9b3e8952d6c to your computer and use it in GitHub Desktop.
Shows how to add a custom order value to a connection to order by a custom field.
add_filter( 'graphql_PostObjectsConnectionOrderbyEnum_values', function( $values ) {
$values['LIKE_COUNT'] = [
'value' => 'like_count',
'description' => __( 'The number of likes on the post', 'wp-graphql' ),
];
return $values;
} );
add_filter( 'graphql_post_object_connection_query_args', function( $query_args, $source, $input ) {
if ( isset( $input['where']['orderby'] ) && is_array( $input['where']['orderby'] ) ) {
foreach( $input['where']['orderby'] as $orderby ) {
if ( ! isset( $orderby['field'] ) || 'like_count' !== $orderby['field'] ) {
continue;
}
$query_args['meta_type'] = 'NUMERIC';
$query_args['meta_key'] = 'like_count';
$query_args['orderby']['meta_value_num'] = $orderby['order'];
}
}
return $query_args;
}, 10, 3);
@jasonbahl
Copy link
Author

@juanu96 I believe if the field is storing numbers, you need:

  $query_args['orderby'] = 'meta_value_num';

instead of:

$query_args['orderby'] = 'meta_value';

@juanu96
Copy link

juanu96 commented Dec 12, 2022

@juanu96 I believe if the field is storing numbers, you need:

  $query_args['orderby'] = 'meta_value_num';

instead of:

$query_args['orderby'] = 'meta_value';

yes, this worked for me, thank you very much for your help

@ndigenpcc
Copy link

Hi all,

I've used this solution in my own code.

add_filter( 'graphql_PostObjectsConnectionOrderbyEnum_values', function( $values ) {

    $values['PARTNER_TIER'] = [
	    'value' => 'partner_tier',
	    'description' => __( 'Tier Level of the partner'),
    ];

    return $values;} 
);


add_filter( 'graphql_post_object_connection_query_args', function( $query_args, $source, $input ) {

    if ( isset( $input['where']['orderby'] ) && is_array( $input['where']['orderby'] ) ) {

	    foreach( $input['where']['orderby'] as $orderby ) {

		    if ( ! isset( $orderby['field'] ) || 'partner_tier' !== $orderby['field'] ) {
		    	continue;
		    }

		    $query_args['meta_type'] = 'NUMERIC';
		    $query_args['meta_key'] = 'partner_tier';
		    $query_args['orderby']['meta_value_num'] = $orderby['order'];

	    }

    }

    return $query_args;

}, 10, 3);

And while the initial call works, the cursor pagination is not working, and returning and empty set of partners when calling the next page.

Here's the working initial query.
correctQuery

And here's the query calling the next page
errorQuery

Was wondering if anyone else here had a similar issue or if there's something I am doing incorrectly

@mickras
Copy link

mickras commented Jun 13, 2023

Was wondering if anyone else here had a similar issue or if there's something I am doing incorrectly

@ndigenpcc Did you ever find a solution to your problem? I'm facing something similar, and can't seem to find the bug.

@ndigenpcc
Copy link

@mickras I never ended up finding a solution, so I had moved back to the Wordpress REST API and created my own search filters

@8ctopotamus
Copy link

Thanks for posting this example, @jasonbahl ! It worked flawlessly for my use case (ordering posts by a Number ACF field VIEW_COUNT).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment