OK, the final workaround would be to split query:
$sfp_query_args = array(
'tax_query' => array( array( 'taxonomy' => 'sfp_post_category', 'terms' => $cat_id_arr ) ),
'meta_key' => 'is_sponsored',
'post_type' => 'sfpposts',
'post_status' => 'publish',
'showposts' => (int)$per_page,
'paged' => $paged
);
…and use “posts_orderby” filter to modify ORDER part:
add_filter( 'posts_orderby', 'sfp_modify_orderby' );
function sfp_modify_orderby( $orderby ) {
if( !is_admin() && is_tax( 'sfp_post_category' ) ) {
global $wpdb;
$orderby = " $wpdb->postmeta.meta_value DESC, $wpdb->posts.post_date DESC ";
}
return $orderby;
}
The most probably you’ll need to remove filter after the loop on page in order to prevent ‘posts_orderby’ affect any other query (sidebar or footer). So here’s another function to put in “functions.php”:
function sfp_remove_orderby_filter() {
remove_filter( 'posts_orderby', 'sfp_modify_orderby' );
}
…and on the page using our query discard filter:
if( have_posts() ) : while( have_posts() ) : the_post();
// code
endwhile;
else :
// code
endif;
sfp_remove_orderby_filter();
Hopefully it makes sense!