Isto parece ser um bug no Wordpress. O Wordpress realmente modifica o meta_query se você especificar orderby e meta_key como query vars. Normalmente, essa modificação adiciona a nova meta_key como a primeira matriz na matriz meta_query e, portanto, a orderby é aplicada à primeira meta-chave especificada em meta_query.
Mas quando você modifica orderby, meta_key e meta_value query_vars no filtro pre_get_posts, devido ao bug (parece-me) no Wordpress, ele adiciona a nova matriz na consulta meta existente, mas a nova matriz não é inserida como a primeira matriz, ele é anexado ao meta_query existente. E o orderby sempre é aplicado na primeira meta_key em meta_query.
Então, como uma solução alternativa até que o bug seja corrigido, você pode especificar meta_key novamente no meta_query como o primeiro array, como no exemplo a seguir:
add_filter( 'pre_get_posts', 'my_get_posts' );
function my_get_posts( $query ) {
if ( is_home() ) {
$query->set( 'post_type', 'event' );
$query->set( 'meta_key', '_start_date' );
$query->set( 'orderby', 'meta_value_num' );
$query->set( 'order', 'ASC' );
$query->set( 'meta_query', array(
array(
'key' => '_start_date'
),
array(
'key' => '_end_date',
'value' => time(),
'compare' => '>=',
'type' => 'numeric'
)
));
}
return $query;
}