As @Milo brilliantly pointed out, there is no such a thing like a global query object in WordPress.
So I’ve solved the problem via JS, like this:
var isFiltered = false;
var filters;
$(load_more_button).click(function(e) {
load_more_handler(e);
});
$(filters_form).submit(function(e) {
filter_handler(e);
});
function filter_handler(e) {
isFiltered = true;
filters = $(this).serialize();
var data = {
action: 'ajax_filter',
query: php_vars.query, // // query is got from wp_localize_script()
filters: filters
};
$.post(php_vars.adminAjaxUrl, data, function(res) {
[etc]
};
function load_more_handler(e) {
var data = {
action: 'ajax_load_more',
query: php_vars.query, // query is got from wp_localize_script()
page: page,
isFiltered: isFiltered,
filters: filters
};
$.post(php_vars.adminAjaxUrl, data, function(res) {
[etc]
};
and in functions.php something like:
function ajax_load_more_posts() {
$args = isset( $_POST['query'] ) ? array_map( 'esc_attr', $_POST['query'] ) : array();
if( isset($_POST['isFiltered']) && ( $_POST['isFiltered'] ) ) {
$filters = $_POST['filters'];
$args = wp_parse_args(get_ajax_filters($filters), $args); // get_ajax_filters() is a custom utility function of mine to combine filters passed by Ajax and $args
};
[loop]
wp_die();
} ;
add_action( 'wp_ajax_ajax_load_more', 'ajax_load_more_posts' );
add_action( 'wp_ajax_nopriv_ajax_load_more', 'ajax_load_more_posts' );