0

I have two post types (type-A and type-B) and two taxonomies (tax-1 and tax-2), both assigned to each post type. This means that posts from type-A can contain terms from tax-1 and tax-2 and posts from type-B can also contain terms from tax-1 and tax-2.

I want my WP_Query to output all posts from type-A that contain certain terms of tax-1. But I don't want to output type-B posts that contain these tax-1 terms, which my WP_Query unfortunately does. The same should apply to tax-2, whereby only posts from type-B that contain terms from tax-2 should be output.

I have already tried to create two $args for this, but I did not manage to merge the two $args.

function my_function($args) {
    global $post;

    $args = array(
            'post_type' => array('type-A','type-B'),
            'tax_query' => array(
                'relation'  => 'OR',
                 array(
                    'taxonomy' => 'tax-1',
                    'field'    => 'term_id',
                    'terms'    => array(11, 12, 13),
                ),
                array(
                    'taxonomy' => 'tax-2',
                    'field'    => 'term_id',
                    'terms'    => array(21, 22, 23),
                ),
            ),
        );

    return $args;
} 

1 Answer 1

1

You could use pre_get_posts to conditionally add the tax_query depending on post-type, here's a simple example.

<?php
function wpse_377928( $the_query ){
  $post_type = $the_query->get('post_type');
  if ( 'type_a' === $post_type ) {
    $tax_query = [
        [
            'taxonomy' => 'tax-1',
            'field'    => 'term_id',
            'terms'    => array(11, 12, 13),
        ]   
    ];
  } 
  elseif ( 'type_b' === $post_type ) {
      $tax_query = [
        [
            'taxonomy' => 'tax-2',
            'field'    => 'term_id',
            'terms'    => array(21, 22, 23),
        ]   
    ];
  }

  if ( !empty( $tax_query ) ) {
      $the_query->set( 'tax_query', $tax_query );
  }

}
add_action('pre_get_posts', 'wpse_377928');
2
  • Using pre_get_posts seems to be a clever solution. Thanks for your help.
    – RaWa
    Commented Nov 11, 2020 at 11:46
  • Oh no problem @RaWa ... I was going to say you can use $query->set to set arbitrary variables on wp_query, so if before running a query, we run $query->set('magic_query', true) then we can check $query->get('magic_query') in our pre_get_posts function rather than checking against other conditions (which may vary)
    – admcfajn
    Commented Nov 11, 2020 at 23:58

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

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