Intereting Posts

Используя meta_query, как я могу фильтровать пользовательское поле и заказывать другим?

Со следующим кодом (в functions.php) мои сообщения (события CPT) упорядочиваются _end_date вместо _start_date. Каково надлежащее решение этого вопроса с WP 3.1.3? Конечно, я бы хотел избежать использования устаревшей meta_key .

 add_filter( 'pre_get_posts', 'my_get_posts' ); function my_get_posts( $query ) { if ( is_home() ) { $query->set( 'post_type', 'event' ); $query->set( 'meta_key', '_start_date' ); $query->set( 'orderby', 'meta_value_num' ); $query->set( 'order', 'ASC' ); $query->set( 'meta_query', array( array( 'key' => '_end_date', 'value' => time(), 'compare' => '>=', 'type' => 'numeric' ) ) ); } return $query; } 

Solutions Collecting From Web of "Используя meta_query, как я могу фильтровать пользовательское поле и заказывать другим?"

Кажется, это ошибка в WordPress. WordPress фактически изменяет meta_query, если вы укажете orderby и meta_key в качестве запросов. Обычно эта модификация добавляет новую meta_key в качестве первого массива в массив meta_query, и поэтому orderby применяется к первому мета-ключу, указанному в meta_query.

Но когда вы изменяете orderby, meta_key и meta_value query_vars в файле pre_get_posts, из-за ошибки (кажется мне) в WordPress, он добавляет новый массив в существующий мета-запрос, но новый массив не вставлен в первый массив, он добавляется к существующей meta_query. И orderby всегда применяется к первой meta_key в meta_query.

Так как обходной путь до исправления ошибки, вы можете указать meta_key снова в meta_query как первый массив, как в следующем примере:

 add_filter( 'pre_get_posts', 'my_get_posts' ); function my_get_posts( $query ) { if ( is_home() ) { $query->set( 'post_type', 'event' ); $query->set( 'meta_key', '_start_date' ); $query->set( 'orderby', 'meta_value_num' ); $query->set( 'order', 'ASC' ); $query->set( 'meta_query', array( array( 'key' => '_start_date' ), array( 'key' => '_end_date', 'value' => time(), 'compare' => '>=', 'type' => 'numeric' ) )); } return $query; }