searchpress icon indicating copy to clipboard operation
searchpress copied to clipboard

Facet query var helper doesn't support 3+ terms

Open mboynes opened this issue 7 years ago • 0 comments

Basic example

add_filter( 'sp_search_wp_query_args', function( $wp_args ) {
	$wp_args['facets'] = [
		'Category' => [
			'type' => 'taxonomy',
			'taxonomy' => 'category',
			'count' => 10,
		],
	];

	return $wp_args;
} );

When outputting the facets, e.g. as links, the query_vars entry in the processed facet data contains the query vars needed to generate a link to filter the results:

$facet_data = SP_Integration()->search_obj->get_facet_data();
if ( ! empty( $facet_data['Category']['items'] ) ) :
	foreach ( $facet_data['Category']['items'] as $cat ) :
		?>
		<li>
			<a href="<?php echo esc_url( add_query_arg( $cat['query_vars'] ) ) ?>">
				<?php echo esc_html( $cat['name'] ) ?>
			</a>
		</li>
		<?php
	endforeach;
endif;

If you run a search and click a category, this works great. If you click a second category, it still works great. If you click a third category, the second is replaced with the third.

Problem and Proposed Solution

This is a problem with core, where core replaces the query var value with only the first in the list.

To fix this, we should be using $GLOBALS['wp_query']->tax_query->queries. It's important to note that union queries (?taxonomy=term1+term2) will add multiple arrays to $GLOBALS['wp_query']->tax_query->queries, whereas intersection queries (?taxonomy=term1,term2) will add multiple terms a single array entry. Here's a var_export() dump illustrating this:

?s=markup&category_name=antiquarianism,aciform
$GLOBALS['wp_query']->tax_query->queries
array (
  0 => 
  array (
    'taxonomy' => 'category',
    'terms' => 
    array (
      0 => 'antiquarianism',
      1 => 'aciform',
    ),
    'field' => 'slug',
    'operator' => 'IN',
    'include_children' => true,
  ),
)

‌‌?s=markup&category_name=antiquarianism+aciform
$GLOBALS['wp_query']->tax_query->queries
array (
  0 => 
  array (
    'taxonomy' => 'category',
    'terms' => 
    array (
      0 => 'antiquarianism',
    ),
    'field' => 'slug',
    'operator' => 'IN',
    'include_children' => true,
  ),
  1 => 
  array (
    'taxonomy' => 'category',
    'terms' => 
    array (
      0 => 'aciform',
    ),
    'field' => 'slug',
    'operator' => 'IN',
    'include_children' => true,
  ),
)

In addition, it looks like we're not fully accounting for union queries when building the query var arrays in the facet data. Relevant code in core to mimic for consistency.

mboynes avatar Mar 01 '17 19:03 mboynes