Truy vấn tùy chỉnh với meta_value của trường tùy chỉnh


37

Aa bạn biết, kể từ WP3.0, có các tùy chọn cho các truy vấn nâng cao tùy chỉnh, rất tuyệt vời. Về điều này, một số tham số truy vấn của các trường tùy chỉnh như meta_key, meta_value không được dùng cho tham số meta_query mới ( xem tại đây )

Tôi cố gắng có một truy vấn khá đơn giản với cú pháp mới, các bài đăng truy vấn của một post_type (dịch vụ) nhất định có chứa meta_key (order_in_archive) được chỉ định - điều này sẽ diễn ra tốt như mong đợi. Nhưng - tôi muốn đặt hàng truy vấn theo meta_value và không thành công.

Đây là truy vấn của tôi -

   query_posts(
    array(  'post_type' => 'services',
        'order' => 'ASC',
        'orderby' => 'meta_value',
        'meta_query' => array(
            array('key' => 'order_in_archive'))
    )
);

Tôi cũng đã thử orderby bởi meta_value_numeric và meta_value, nhưng trong mọi trường hợp, kết quả sẽ được sắp xếp theo ngày xuất bản (như các bài đăng thông thường). Bất cứ ai biết làm thế nào điều này có thể được thực hiện?

Cảm ơn

Câu trả lời:


35

Bạn có thể xác định khóa meta cho tham số orderby bằng phương thức cũ (tôi đã thử nghiệm trên WP 3.1.1) ...

query_posts(
    array(  'post_type' => 'services',
            'order'     => 'ASC',
            'meta_key' => 'some_key',
            'orderby'   => 'meta_value', //or 'meta_value_num'
            'meta_query' => array(
                                array('key' => 'order_in_archive',
                                      'value' => 'some_value'
                                )
                            )
    )
);

15

Vấn đề này nói chung được làm rõ trong WordPress 4.2 bằng cách sử dụng các truy vấn được đặt tên. ví dụ

$args = array(
  'post_type' => 'services',
  'orderby'   => 'order_clause',
  'meta_query' => array(
       'order_clause' => array(
            'key' => 'order_in_archive',
            'value' => 'some_value',
            'type' => 'NUMERIC' // unless the field is not a number
)));

Đối với tôi, tôi muốn đặt hàng theo trường số và tôi phải sử dụng 'type' => 'NUMERIC'bên trong truy vấn meta.


1
Tìm tuyệt vời trên các truy vấn được đặt tên!
Kaji

Đúng, các truy vấn được đặt tên cũng trả lời câu hỏi cho tôi.
Dalton

Xuất sắc. Tôi không chắc tầm quan trọng của 'giá trị' trong thứ tự đó bởi vì nó không bắt buộc vì nó sẽ sắp xếp theo giá trị cao nhất đến thấp nhất của 'order_in_archive'.
Andrew Schultz

10

Codex WP thực sự khó hiểu khi giải quyết vấn đề này.

Bạn thực sự không cần meta_query param để sử dụng orderby, thay vào đó, nó sử dụng param_key param, mặc dù bởi WP Codex không được dùng nữa đã được thiết lập ở đây: Làm thế nào để bạn sử dụng orderby với meta_query trong Wordpress 3.1? mà orderyby vẫn cần meta_key.

Nên nó phải là

query_posts( array(
  'post_type' => 'services',
  'order' => 'ASC',
  'orderby' => 'meta_value',
  'meta_key' => 'order_in_archive'
) )

2
Vâng, vâng, đây là phương pháp cũ để thực hiện truy vấn này và dường như nó đang hoạt động cho truy vấn được chỉ định này. Dù sao, đối với các truy vấn phức tạp hơn, nó sẽ không hoạt động. Tôi thấy đây là một vấn đề đã được quan tâm, chi tiết có thể được tìm thấy trong vé trac # 15031# 17065
Maor Barazany

2

Dễ thôi:

Đây là mã của tôi:

query_posts(array( 
        'post_type' => 'directors',
        'posts_per_page' => -1,
        'order'    => 'ASC',
        'orderby'  => 'director_weight',
        'meta_key' => 'director_weight'
) );

Chi tiết chính là: bao gồm meta_key, mã của tôi đã không đặt hàng trừ khi meta_keyđược bao gồm, và đó là tất cả:

Dưới đây là mã đầy đủ của một danh sách các directorsthứ tự hình ảnh bằng cách director_weight:

<?php 
    query_posts(array( 
        'post_type' => 'directors',
        'posts_per_page' => -1,
        'order'    => 'ASC',
        'orderby'  => 'director_weight',
        'meta_key' => 'director_weight'
    ) );
    while (have_posts()) : the_post();
?>  
    <li <?php echo get_field('director_weight') ?>>
        <img src="<?php echo get_field('director_imagen') ?>">
    </li>
<?php
    endwhile;
    wp_reset_query();
?>

order_by tùy chỉnh fpress wordpress


1

Đừng sử dụng query_posts.

$meta_query = new WP_Meta_Query( $meta_query_args );

$meta_query_args = array(
   'post_type' => 'services',
    'order'     => 'ASC',
    'meta_key' => 'your_key',
    'orderby'   => 'meta_value', //or 'meta_value_num'
    'meta_query' => array(
                    array('key' => 'order_in_archive',
                        'value' => 'some_value'
)));

Sử dụng các tham số WP_Meta_Query


0

Tôi thấy điều này để làm việc khá tốt.

<?php 
query_posts(
array(  'posts_per_page' => '-1',
        'post_type' => 'services',
        'order'     => 'DESC',
        'meta_key' => '_order',
        'orderby'   => 'meta_value_num', //or 'meta_value_num'
      )
);

3
Câu hỏi là về meta_querytham số new-ish và bắt đầu orderbylàm việc với nó, chứ không phải về tham số meta_key/ chức năng / cũ hơn meta_value. Ngoài ra, chúng ta không khuyến khích việc sử dụng query_posts.
s_ha_dum

Câu trả lời này chứa nhiều thực tiễn xấu: sử dụng -1, chuyển nó dưới dạng chuỗi, sử dụng query_posts. Nó nên được gỡ bỏ.
Ihor Vorotnov

0

Tôi đã có một bộ ngày sự kiện tùy chỉnh mà tôi cần để sắp xếp theo ngày giảm dần. Vì ngày sự kiện tùy chỉnh của tôi được lưu trữ trong bảng wp_postmeta của tôi và thường khác với ngày post_date hoặc ngày sửa đổi, điều này hiệu quả với tôi:

  $args = array(
    'post_type' => 'events', // my post type - yours can be 'posts'
    'post_status' => 'publish', // only get posts with this status
    'orderby' => 'meta_value', // orderby the meta_value of the following meta_key
    'meta_key' => 'my_custom_eventdate', // the custom meta_key name
    'order'=> 'DESC' // sort descending
  );

  $posts = new WP_Query($args);

Sau đó, bạn có thể lặp qua $ bài viết như vậy:

foreach($posts->posts as $p){

    $post_id = $p->ID;
    // and so on ...

    // # example of how I retrieve my event date
    $event = get_post_meta($post_id, 'my_custom_eventdate', true);
}

0

Công việc này cho tôi

    $args = array(
        'post_type' => 'services',
        'order' => 'ASC',
        'orderby'   => 'order_clause',   
        'meta_query' => array(
        'order_clause' => array(
        'key' => 'order_in_archive'
    )));

Chỉ cần cung cấp khóa cho order_clause

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.