Popular Posts

The following code allows you to query for popular posts. It’s still up to you to determine the best way to store popular posts, but this example assumes a meta_key is involved. Beware though, meta queries can be expensive!

add_action( 'graphql_register_types', function() {

	// This registers a connection to the Schema at the root of the Graph
	// The connection field name is "popularPosts"
	register_graphql_connection( [
		'fromType'           => 'RootQuery',
		'toType'             => 'Post',
		'fromFieldName'      => 'popularPosts', // This is the field name that will be exposed in the Schema to query this connection by
		'connectionTypeName' => 'RootQueryToPopularPostsConnection',
		'connectionArgs'     => \WPGraphQL\Connection\PostObjects::get_connection_args(), // This adds Post connection args to the connection
		'resolve'            => function( $root, $args, \WPGraphQL\AppContext $context, $info ) {

			$resolver = new \WPGraphQL\Data\Connection\PostObjectConnectionResolver( $root, $args, $context, $info );

			// Note, these args will override anything the user passes in as { where: { ... } } args in the GraphQL Query
			$resolver->set_query_arg( 'meta_key', 'wpb_post_views_count' );
			$resolver->set_query_arg( 'orderby', 'meta_value_num' );
			$resolver->set_query_arg( 'order', 'DESC' );

			return $resolver->get_connection();
		}
	] );

	// This registers a field to the "Post" type so we can query the "viewCount" and see the value of which posts have the most views
	register_graphql_field( 'Post', 'viewCount', [
		'type'    => 'Int',
		'resolve' => function( $post ) {
			return get_post_meta( $post->databaseId, 'wpb_post_views_count', true );
		}
	] );

} );

You can query for the popular posts using this GraphQL query:

{
  popularPosts(first: 10, where: {dateQuery: {after: {year: 2021, month: 10}}}) {
    nodes {
      id
      title
      date
      viewCount
    }
  }
}

Published by Jason Bahl

Jason is a Principal Software Engineer at WP Engine based in Denver, CO where he maintains WPGraphQL. When he's not writing code or evangelizing about GraphQL to the world, he enjoys escaping from escape rooms, playing soccer, board games and Fortnite.