0

I have a two custom taxonomies:

  • Type
  • Product

Type can be the following:

  1. Blog
  2. Case study
  3. Webinar

Subject can be:

  1. Indoor
  2. Outdoor

I have two drop down menus in WordPress backend where a user can select what type and subject they want to show from resources (my custom post type).

Say, for example, the following posts exist in resources:

  • Post 1: Tagged with type blog and subject outdoor.
  • Post 2: Tagged with type blog and subject indoor.
  • Post 3: Tagged with subject indoor.

The user can either filter by type or subject. By this I mean not both are required, only one can be selected. But, if the user does choose both a type and subject, I want it to display posts with both tags.

Current approach:

$args = array(  
  'post_type' => 'resources',
  'post_status' => 'publish',
  'posts_per_page' => 8,
  'tax_query' => array(
    'relation' => 'AND',
    array(
        'taxonomy' => 'type',
        'field'    => 'slug',
        'terms'    => $resource_type,
    ),
    array(
        'taxonomy' => 'subject',
        'field'    => 'slug',
        'terms'    => $resource_subject,
    ),
  ),
  'tax_query' => array(
    'relation' => 'OR',
    array(
        'taxonomy' => 'type',
        'field'    => 'slug',
        'terms'    => $resource_type,
    ),
    array(
        'taxonomy' => 'subject',
        'field'    => 'slug',
        'terms'    => $resource_subject,
    ),
  )

);
  • $resource_type: Is the variable holding the dropdown value for type.
  • $resource_subject: Is the variable holding the dropdown value for subject.

Current results:

  • When filtering by subject alone - it works.

  • When filtering by type alone - it works.

  • When filtering with both - it doesn't work. I.e. I've filtered by type blog and subject indoor and it is showing me subject outdoor posts.

Alternatively, the following works when querying both, but does not work when only choosing one:

 $args = array(  
    'post_type' => 'resources',
    'post_status' => 'publish',
    'posts_per_page' => $card_count,
    'tax_query' => array(
      'relation' => 'AND',
      array(
          'taxonomy' => 'type',
          'field'    => 'slug',
          'terms'    => $resource_type,
      ),
      array(
          'taxonomy' => 'subject',
          'field'    => 'slug',
          'terms'    => $resource_subject,
      ),
    )

  );
2

If you add another tax_query to the args, the last tax_query will replace the previous tax_query.

But anyway, if these are the criteria:

  1. When filtering by type alone, show only resources posts in that type.

  2. When filtering by subject alone, show only resources posts in that subject.

  3. When filtering by type and subject, show only resources posts which are assigned to both type and subject.

Then try this:

$args = array(
    'post_type'      => 'resources',
    'post_status'    => 'publish',
    'posts_per_page' => 8,
);

// Filtering by both 'type' and 'subject'.
if ( $resource_type && $resource_subject ) {
    $args['tax_query'] = array(
        'relation' => 'AND',
        array(
            'taxonomy' => 'type',
            'field'    => 'slug',
            'terms'    => $resource_type,
        ),
        array(
            'taxonomy' => 'subject',
            'field'    => 'slug',
            'terms'    => $resource_subject,
        ),
    );
}
// Filtering by 'type' only.
elseif ( $resource_type && ! $resource_subject ) {
    $args['tax_query'] = array(
        array(
            'taxonomy' => 'type',
            'field'    => 'slug',
            'terms'    => $resource_type,
        ),
    );
}
// Filtering by 'subject' only.
elseif ( $resource_subject ) {
    $args['tax_query'] = array(
        array(
            'taxonomy' => 'subject',
            'field'    => 'slug',
            'terms'    => $resource_subject,
        ),
    );
}
  • 1
    Perfect! exactly what I was after. Thank you :) – Freddy Oct 22 at 10:54

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.