You can use the WP_Query::get method to get whatever is in the meta query like this:
add_action('pre_get_posts','add_another_meta_query');
function add_another_meta_query($query){
//Be sure to only use the main query on frontend
if($query->is_main_query() && !is_admin()){
$meta_query = $query->get('meta_query',array());
$new_meta_query = array();
//now, $meta_query has the meta_query if set (or an array)
//check if the old version of meta_query is used
if($meta_key = $query->get('meta_key',NULL)){
$old_type_of_meta = array();
$old_type_of_meta['key'] = $meta_key;
$query->unset('meta_key');
if($meta_value = $query->get('meta_value',NULL)){
$old_type_of_meta['value'] = $meta_value;
$query->unset('meta_value');
} elseif($meta_value = $query->get('meta_value_num',NULL)){
$old_type_of_meta['value'] = $meta_value;
$query->unset('meta_value_num');
} else {
$old_type_of_meta['compare'] = 'EXISTS';
}
if($meta_compare = $query->get('meta_compare',NULL)){
$old_type_of_meta['compare'] = $meta_compare;
$query->unset('meta_compare');
}
if($meta_type = $query->get('meta_type',NULL)){
$old_type_of_meta['type'] = $meta_type;
$query->unset('meta_type');
}
$new_meta_query[] = $old_type_of_meta;
if($orderby = $query->get('orderby')){
if(!is_array($orderby)){
$orderby = str_replace(array('meta_value','meta_value_num'),array($meta_key,$meta_key),$orderby);
$query->set('orderby',$orderby);
}
}
}
if(isset($meta_query['relation'])){
//there is a special relation set within the meta_query.
//to preserve this, we have to encapsulate the old meta queries
$new_meta_query[] = $meta_query;
} else {
//there is no special relation set on global level ("AND" is used)
//we can just merge them all together
foreach($meta_query as $old_single_meta_query){
$new_meta_query[] = $old_single_meta_query;
}
}
//now we got all the "old" meta_queries in our $new_meta_query array.
//let's add our own!
$new_meta_query[] = array(
'key' => 'my_awesome_meta_key',
'value' => 'whatever_i_need',
'compare' => '=',
'type' => '',
);
//Last but not least: put it back into the $query
$query->set('meta_query',$new_meta_query);
}
}
Happy Coding!