Сортировка постов по нескольким полям (метаполе и простое поле)
Как отсортировать записи по метаполю (произвольному полю) или по обычному полю, если мета поля не существует. Т.е. нам нужно объединить несколько полей таблицы в единое поле для сортировки. Сделаем это на примере запроса к постам.
Задача. Нужно отсортировать записи по метаполю comment_date, а если его нет, то по дате публикации записи (post_date).
final class MyQuery {
static $meta_key;
static $order;
static function posts_clauses( $clauses ){
global $wpdb;
$clauses['join'] = "LEFT JOIN $wpdb->postmeta ON ( ID = post_id AND meta_key = '". self::$meta_key ."' )";
$clauses['orderby'] = "IF( meta_value, CAST( meta_value AS UNSIGNED ), post_date ) ". self::$order;
return $clauses;
}
static function get_posts( $args ){
remove_all_filters( 'posts_clauses' );
add_filter( 'posts_clauses', [ __CLASS__, 'posts_clauses' ] );
foreach( [ 'meta_key', 'order' ] as $key ){
self::${ $key } = $args[ $key ];
unset( $args[ $key ] );
}
$query = new WP_Query( $args );
remove_filter( 'posts_clauses', [ __CLASS__, 'posts_clauses' ] );
return $query->posts;
}
}
$posts = MyQuery::get_posts( [
'posts_per_page' => 10,
'meta_key' => 'func_Since', // comment_date
'post_type' => 'func', // idea
'no_found_rows' => 1,
'order' => 'ASC',
] );
foreach( $posts as $pst ){
echo $pst->{ MyQuery::$meta_key } ." - $pst->post_title \n";
}
//print_r( $wpdb->last_query );