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.
Share Improve this question asked Jan 30, 2019 at 11:49 Baadier SydowBaadier Sydow 1231 silver badge5 bronze badges2 Answers
Reset to default 0I'm going to take the answer you posted for yourself and suggest a couple of improvements.
Some things I'll address:
- The 3rd query is unnecessary. There are simpler ways to sort by date. Just make both queries for the full post content and merge the results.
- Since we're not going to be using
have_posts()
andthe_post()
(we'll usesetup_postdata()
), we should just useget_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. - We'll avoid repeating ourselves with the query arguments by re-using a single array of arguments.
- We won't bother specifying arguments that are just the defaults.
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);