→ How to Create Facets from ACF Relationship Fields

UPDATE: FacetWP now includes built-in ACF integration.

Advanced Custom Fields is a popular custom fields plugin for WordPress. It includes basic field types (text, file upload, date), but also includes relationship fields. A relationship field is used to “connect” posts together. They can allow you to¬†filter by related posts.

The only issue with ACF relationship fields is the way they’re saved to the database. They’re stored as a serialized string, which makes them a little trickier to interpret. Fortunately, we can tell FacetWP how to properly index relationship fields.

Indexing Relationship Fields

Let’s say you’ve created a new facet named “related_resources”, and you’ve chosen the ACF relationship field from the ¬†Data Source dropdown.

add_filter( 'facetwp_index_row', function( $params, $class ) {
    if ( 'related_resources' == $params['facet_name'] ) {
        $values = (array) $params['facet_value']; // an array of post IDs (it's already unserialized)
        foreach ( $values as $val ) {
            $params['facet_value'] = $val;
            $params['facet_display_value'] = get_the_title( $val );
            $class->insert( $params ); // insert each value to the database
        }
        // skip the default indexing query
        return false;
    }
    return $params;
}, 10, 2 );

The above code says, “If the field name is related_resources, then loop through the array of values and insert each value into the FacetWP index table”.