I'm trying to do a single WP_Query to get the posts that are in 2 different custom post types but the second post type has to be from a specific taxonomy.
This is what I'm currently doing:
$query1 = new WP_Query(array(
'numberposts' => $postsnumber,
'posts_per_page' => $postsnumber,
'orderby' => 'publish_date',
'order' => 'DESC',
'post_type' => 'post',
'post_status' => 'publish',
'suppress_filters' => false
));
$query2 = new WP_Query(array(
'numberposts' => $postsnumber,
'posts_per_page' => $postsnumber,
'orderby' => 'publish_date',
'order' => 'DESC',
'post_type' => 'js_videos',
'tax_query' => array(
array (
'taxonomy' => 'video_category',
'field' => 'tag_ID',
'terms' => '41',
)
),
'post_status' => 'publish',
'suppress_filters' => false
));
$wp_query = null;
$wp_query = new WP_Query();
$wp_query->posts = array_merge( $query1->posts, $query2->posts );
However I need to still order by publish_date after mergining.
I'm trying to do a single WP_Query to get the posts that are in 2 different custom post types but the second post type has to be from a specific taxonomy.
This is what I'm currently doing:
$query1 = new WP_Query(array(
'numberposts' => $postsnumber,
'posts_per_page' => $postsnumber,
'orderby' => 'publish_date',
'order' => 'DESC',
'post_type' => 'post',
'post_status' => 'publish',
'suppress_filters' => false
));
$query2 = new WP_Query(array(
'numberposts' => $postsnumber,
'posts_per_page' => $postsnumber,
'orderby' => 'publish_date',
'order' => 'DESC',
'post_type' => 'js_videos',
'tax_query' => array(
array (
'taxonomy' => 'video_category',
'field' => 'tag_ID',
'terms' => '41',
)
),
'post_status' => 'publish',
'suppress_filters' => false
));
$wp_query = null;
$wp_query = new WP_Query();
$wp_query->posts = array_merge( $query1->posts, $query2->posts );
However I need to still order by publish_date after mergining.
I'm going to take the answer you posted for yourself and suggest a couple of improvements.
Some things I'll address:
have_posts()
and the_post()
(we'll use setup_postdata()
), we should just use get_posts()
to keep things a bit simpler. It should also be a bit quicker as it sets some default query args to optimise it since it won't need pagination info.Taking those points into account, the code can just be:
$posts_args = [
'posts_per_page' => $postsnumber,
'post_type' => 'post',
];
$posts = get_posts( $posts_args );
$video_args = $posts_args;
$video_args['post_type'] = 'js_videos';
$video_args['tax_query'] = [
[
'taxonomy' => 'video_category',
'field' => 'tag_ID',
'terms' => '41',
],
];
$videos = get_posts( $video_args );
$combined = array_merge( $posts, $videos );
usort(
$combined,
function( $a, $b ) {
return get_post_time( 'U', false, $b ) - get_post_time( 'U', false, $a );
}
);
global $post;
foreach ( $combined as $post ) : setup_postdata( $post );
the_title(); // etc.
endforeach;
wp_reset_postdata();
Never mind.
I got it resolved doing it like this:
$query1 = new WP_Query(array(
'fields' => 'ids',
'numberposts' => $postsnumber,
'posts_per_page' => $postsnumber,
'orderby' => 'publish_date',
'order' => 'DESC',
'post_type' => 'post',
'post_status' => 'publish',
'suppress_filters' => false
));
$query2 = new WP_Query(array(
'fields' => 'ids',
'numberposts' => $postsnumber,
'posts_per_page' => $postsnumber,
'orderby' => 'publish_date',
'order' => 'DESC',
'post_type' => 'js_videos',
'tax_query' => array(
array (
'taxonomy' => 'video_category',
'field' => 'tag_ID',
'terms' => '41',
)
),
'post_status' => 'publish',
'suppress_filters' => false
));
$post_ids = array_merge( $query1->posts, $query2->posts);
$args = array(
'numberposts' => $postsnumber,
'posts_per_page' => $postsnumber,
'post__in' => $post_ids,
'post_type' => 'any',
'orderby' => 'publish_date',
'order' => 'DESC',
);
$wp_query = null;
$wp_query = new WP_Query();
$wp_query->query($args);