Here is a rough outline of how you’d go about making a UNION
work with WP_Query
.
add_filter(
'posts_request',
function ($clauses) {
$clauses = str_replace('SQL_CALC_FOUND_ROWS','',$clauses,$scfr);
$scfr = (0 < $scfr) : 'SQL_CALC_FOUND_ROWS' : '';
$clause2 = $clauses; // manipulate this
return "SELECT {$scfr} u.* FROM (({$clauses}) UNION ({$clause2})) as u";
},
1,
2
);
Set up your WP_Query
arguments to generate the first half of the UNION
then manipulate that to create the whole query. Something like this should be close.
add_action('pre_get_posts', 'my_search_price');
function my_search_price( $query ) {
if ($query->get('maxprice') != "" && $query->get('minprice') != "" && $query->is_main_query()) {
$maxprice = intval($query->get('maxprice'));
$minprice = intval($query->get('minprice'));
$meta = array();
$meta[] =
array (
'key' => 'price',
'value' => array($maxprice,$minprice),
'compare' => 'between',
);
$meta[] =
array (
'key' => 'app_updated',
'value' => time()-(60*60*24*14),
'compare' => '>',
'type' => 'numeric'
);
$query->set('meta_query', $meta);
}
}
add_filter(
'posts_request',
function ($clauses) {
$clauses = str_replace('SQL_CALC_FOUND_ROWS','',$clauses,$scfr);
$scfr = (0 < $scfr) ? 'SQL_CALC_FOUND_ROWS' : '';
$clause2 = str_replace('price','price_used',$clauses); // manipulate this
$clause2 = str_replace('app_updated','price_used_updated',$clauses);
return "SELECT {$scfr} u.* FROM (({$clauses}) UNION ({$clause2})) as u";
},
1,
2
);
You will need to add logic to the post_requests
filter so that it does not run when you don’t want it to.