WordPress как на ладони
Недорогой хостинг для сайтов на WordPress: wordpress.jino.ru Платформа для конвертации и монетизации трафика

Сортировка постов по нескольким полям (метаполе и простое поле)

Как отсортировать записи по метаполю (произвольному полю) или по обычному полю, если мета поля не существует. Т.е. нам нужно объединить несколько полей таблицы в единое поле для сортировки. Сделаем это на примере запроса к постам.

Задача. Нужно отсортировать записи по метаполю 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 );
Комментариев нет
    Войти