Date

WPGraphQL for FacetWP

I am pleased to announce the beta release of my FacetWP integration plugin for WPGraphQL. 

The main functionality was written quickly in late 2018 to fill a need to provide client-side access to FacetWP’s index and filtering functionality via WPGraphQL. As a proof-of-concept it worked exactly as needed. It was a lot less effort to create this plugin than it would have been to roll my own facet indexing module. 

Recently, I have had some down time between changing jobs and have been able to refactor and clean up the original code into something more usable by the larger WordPress and WPGraphQL community. If you have the need to expose the functionality of FacetWP via the GraphQL schema, I hope you find this plugin helpful!

Usage

To register WP Post Type(s) to be added to the schema, simply use the facet query registration function register_graphql_facet_type() as follows: 

// Register facet for Posts 
register_graphql_facet_type( 'post' ); // replace post with your CPT name as necessary 

Prerequisites: To use the plugin users must have already configured at least one facet in FacetWP and configured WPGraphQL.

Input

The plugin uses reflection to expose all configured facets are available for querying. Each facet is added as an input argument to the query. 

Different facet types have unique inputs (eg a Slider has a min and max while Checkboxes is a simple array of strings). 

Given the post registration above the query variables might look something like this: 

const variables = { 
    after: '', // Use endCursor for paging 
    query: { 
        // example facet filtered on post ID 
        facet_name: [1, 2, 3], 
        // sample facet filtered on taxonomy term 
        term_facet_name: ['category-1', 'category-3'], 
    }, 
    orderBy: { 
        field: 'DATE', 
        order: 'DESC', 
    }, 
} 

Payload

Registering a facet type will result in a new field on the Root Query. The field name is determined by the type to be queried. 

The payload of the new facet field includes: 

  • facets: The returned facet information
  • type connection: A WPGraphQL connection to the post type query 

Given the post registration earlier, the query and response payload might look like this: 

postFacet(where: {status: PUBLISH, query: $query}) { 
  facets { 
    selected 
    name 
    label 
    choices { 
      value 
      label 
      count 
    } 
  } 
  posts(first: 10, after: $after, where: {search: $search, orderby: $orderBy}) { 
    pageInfo { 
      hasNextPage 
      endCursor 
    } 
    nodes { 
      title 
      excerpt 
    } 
  } 
} 

Facets

This payload includes all information relating to the queried facets and input variables. Available choices (including available count), settings and other relevant information are exposed in this field. 

Connection

This payload is a connection to the configured post type. It accepts all the pertinent GraphQL arguments (paging, sorting etc). 

This connection only returns posts that match the facet filter. 

Conclusion 

This plugin provides users of WPGraphQL with access to an established and popular WordPress plugin for server-side filtering; FacetWP. I hope the WordPress community finds it helpful. It certainly was a great time saver for our project. 

Disclaimer and limitations: I have thoroughly tested Checkbox, fSelect and Radio facet types, as these are used in my app. There is provisional support for all other facet types, however these are not fully tested. As with any open source project, a detailed issue (or better yet a pull request) would be appreciated. 

Please see GitHub for further documentation and commentary.