That’s a pun because I’m using FacetWP y’all.
As you probably know by now, I have a site that has a lot of weird data. And one of the problems I ran into with FacetWP and my site was that I saved data in a serialized manner.
Simple Arrays
Since characters can have multiple actors, the data is saved in a serialized array like this: a:1:{i:0;s:13:"Lucy Lawless";}
I want to be able to search for all the characters Lucy Lawless plays, even if someone else also played the role, so to do that I need to tell FacetWP to save the data twice, an entry for each actor. To do that, I use this code:
add_filter( 'facetwp_index_row', 'filter_facetwp_index_row', 10, 2 ); function filter_facetwp_index_row( $params, $class ) { // Actors // Saves one value for each actor if ( 'char_actors' == $params['facet_name'] ) { $values = (array) $params['facet_value']; foreach ( $values as $val ) { $params['facet_value'] = $val; $params['facet_display_value'] = $val; $class->insert( $params ); } return false; // skip default indexing } return $params; }
That saves two entries in the FacetWP table like this:
Complex Arrays
Buuuuut I also have a complex array where I list a show’s airdates: a:2:{s:5:"start";s:4:"1994";s:6:"finish";s:4:"2009";}
Now that doesn’t look too weird, I know, but the problem is I wanted to be able to compare the start and end dates, so you could get a list of, say, all shows that were on air between 1950 and 1960 (two, by the way). In order to do that, I had to break the array apart into not only two values, but two separate sources!
In order to make that work, I do this:
// Airdates // Splits array value into two sources if ( 'show_airdates' == $params['facet_name'] ) { $values = (array) $params['facet_value']; $start = ( isset( $values['start'] ) )? $values['start'] : ''; $end = ( isset( $values['finish'] ) )? $values['finish'] : date( 'Y' ); $params['facet_value'] = $start; $params['facet_display_value'] = $start; $class->insert( $params ); $params['facet_source'] = 'cf/lezshows_airdates_end'; $params['facet_name'] = 'show_airdates_end'; $params['facet_value'] = $end; $params['facet_display_value'] = $end; $class->insert( $params ); return false; // skip default indexing }
That gives me two database entries like so:
The reason this is done is because I have a facet that compares the datasets for lezshow_airdates_end
with lezshow_airdates
and if the numbers are between them, that’s what it shows.
And this works because of this filter:
// Filter Facet sources add_filter( 'facetwp_facet_sources', function( $sources ) { $sources['custom_fields']['choices']['cf/lezshows_airdates_end'] = 'Airdates End'; return $sources; });
That creates a new custom field based on the values in cf/lezshows_airdates_end
so I can compare between the two. And with a snazzy slider, I can do this: