Использование Orderby и meta_value_num для сортировки сначала чисел, затем строк
У меня есть список товаров, каждый с ценой в произвольном поле, сохраненной как текст, например "2.50" или "5.00", и я отображаю их на странице с помощью пользовательского запроса, который сортирует по цене:
if(!$wp_query) {
global $wp_query;
}
$args = array(
'meta_key' => 'price',
'orderby' => 'meta_value_num',
'order' => 'ASC'
);
query_posts( array_merge( $args , $wp_query->query ) );
Это хорошо работает для цен, но некоторые цены имеют значение "POA" (цена по запросу), и я хотел бы показывать их последними, однако приведенный выше код сортирует так, что "POA" показывается первым.
Есть ли способ изменить это или какое-нибудь быстрое решение, которое я мог бы использовать для последующей сортировки массива и размещения всех цен "POA" в конце?

Это просто сортирует в алфавитном порядке, так как второй параметр не выполняет никаких действий, сортируя по тому же полю без эффекта. Чтобы числа сортировались численно, а буквы — алфавитно, вам нужно использовать фильтр для настройки orderby с использованием какого-либо SQL-условия, например: ORDER BY CASE WHEN wp_postmeta.meta_value RLIKE '^[0-9]' THEN '' ELSE wp_postmeta.meta_value END ASC, wp_postmeta.meta_value+0 ASC

Я нашел это решение, объединив код от @bonger и https://stackoverflow.com/questions/18084199/wordpress-query-order-by-case-when
И оно отлично работает.
Функция
function filter_case($orderby = '') {
$orderby .= "CASE WHEN wp_postmeta.meta_value RLIKE '^[0-9]' THEN '' ELSE wp_postmeta.meta_value END ASC, wp_postmeta.meta_value+0 ASC";
return $orderby;
}
Перед запросом
add_filter( 'posts_orderby', 'filter_case' );
$wp_query = new WP_Query($args);
remove_filter( 'posts_orderby', 'filter_case' );
