As t31os said, you can’t do that using WP_Query directy.
You can attempt to use the ‘posts_clauses’ filter to modify the individual SQL clauses generated by WP_Query, but it will be quite tricky, however you do it.
Instead, it might be easier to replace the entire SQL query. You can use get_tax_sql() to take care of the taxonomy part (not tested):
function my_posts_request( $old_query, $wp_query ) {
global $wpdb;
$ptypes = $wp_query->get('post_type');
if ( 'page' != $ptypes[2]['post_type'] )
return $old_query; // This is not the WP_Query you are looking for
// Do the conditional tax_query
$tax_query = array(
array(
'taxonomy' => 'options',
'terms' => array( 'set-as-news-item' ),
'field' => 'slug',
)
);
$clauses = get_tax_sql( $tax_query, $wpdb->posts, 'ID' );
$join = "FROM $wpdb->posts {$clauses['join']}";
$where = "WHERE (
post_type="aucc_publication" OR
post_type="aucc_media" OR
(post_type="page" {$clauses['where']})
)";
// Do the other tax query
$tax_query = array(
array(
'taxonomy' => 'section',
'terms' => array( 'programs-and-services' ),
'field' => 'slug',
),
array(
'taxonomy' => 'regions',
'terms' => array( 'ghana' ),
'field' => 'slug',
)
);
$clauses = get_tax_sql( $tax_query, $wpdb->posts, 'ID' );
$join .= $clauses['join'];
$where .= $clauses['where'];
return "SELECT $wpdb->posts.* $join $where ORDER BY post_date LIMIT 10";
}
add_filter( 'posts_request', 'my_posts_request' );
You’ll still have to take care of pagination etc. Take a look at how WP_Query does it.