1. У WP_Query нет и никогда не было аргумента 'hide_empty'. Этот аргумент у таксономий встречается, в WP_Term_Query. Соответственно, его значения true или false никакого эффекта не дадут, он игнорируется. Уберите его.
2. 'meta_key' => 'sort' инструктирует WP_Query в первую очередь выбрать записи, у которых данное мета-поле есть.
Сортировка происходит (условно) после выборки, сортируются те результаты, которые соответствуют условиям выборки, в данном случае это записи у которых мета-поле sort существует.
3. Попробуйте вот так:
$args = [
'meta_query' => [
'relation' => 'AND',
'meta_exists_clause' => [
'key' => 'sort',
'compare' => 'EXISTS',
],
'meta_value_clause' => [
'key' => 'sort',
'type' => 'numeric',
],
],
'orderby' => [
'meta_exists_clause' => 'ASC',
'meta_value_clause' => 'DESC',
],
];