Сортировка постов по нескольким полям (метаполе и простое поле)
Как отсортировать записи по метаполю (произвольному полю) или по обычному полю, если мета поля не существует. Т.е. нам нужно объединить несколько полей таблицы в единое поле для сортировки. Сделаем это на примере запроса к постам.
Задача. Нужно отсортировать записи по метаполю 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 );