Sử dụng meta_query, làm cách nào tôi có thể lọc theo trường tùy chỉnh và đặt hàng theo trường khác?


10

Với đoạn mã sau (trong hàm.php), các bài đăng của tôi (của sự kiện CPT) được sắp xếp theo _end_date thay vì _start_date. Giải pháp thích hợp cho vấn đề này là gì của WP 3.1.3? Tất nhiên tôi muốn tránh sử dụng không dùng nữa 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;
}

Câu trả lời:


15

Đây dường như là một lỗi trong Wordpress. Wordpress thực sự sửa đổi meta_query nếu bạn chỉ định orderby và meta_key làm vars truy vấn. Thông thường sửa đổi này thêm meta_key mới làm mảng đầu tiên trong mảng meta_query và do đó thứ tự được áp dụng cho khóa meta đầu tiên được chỉ định trong meta_query.

Nhưng khi bạn sửa đổi orderby, meta_key và meta_value query_vars trong bộ lọc pre_get_posts, do lỗi (có vẻ như là tôi) trong Wordpress, nó thêm mảng mới vào truy vấn meta hiện có nhưng mảng mới không được chèn vào như mảng đầu tiên, nó được thêm vào đến meta_query hiện có. Và orderby luôn được áp dụng cho meta_key đầu tiên trong meta_query.

Vì vậy, như một cách giải quyết cho đến khi lỗi được khắc phục, bạn có thể chỉ định lại meta_key trong meta_query làm mảng đầu tiên, như trong ví dụ sau:

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;
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.