Different options per post type in WP_Query

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;
}

Answers:

Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.

Method 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');


All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0

0 0 votes
Article Rating
Subscribe
Notify of
guest

0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x