Sắp xếp theo DESC, ASC trong WP_Query tùy chỉnh


8

Tôi cần phải thực hiện đặt hàng đa cấp trong một truy vấn. Vấn đề là với việc đặt hàng một giá trị DESC và ASC khác như trong SQL. SQL sau đây dường như cung cấp cho tôi những gì tôi muốn khi tôi chạy nó trong thiết bị đầu cuối:

SELECT DISTINCT * FROM wp_posts 
INNER JOIN wp_postmeta 
ON wp_posts.ID = wp_postmeta.post_id 
WHERE wp_posts.post_type = 'post' 
AND wp_postmeta.meta_key = 'pb_issue_featured'
AND wp_posts.post_status = 'publish' 
ORDER BY wp_postmeta.meta_value DESC, wp_posts.menu_order ASC;

Đây pb_issue_featuredlà một giá trị boolean. Kết quả cuối cùng tôi cần là truy vấn để hiển thị các bài đăng có giá trị meta là 1 cho trường này ở trên cùng, sau đó tất cả các mục khác dưới đây. Sau đó, thứ tự tầng thứ hai là chỉ định menu_order(Tôi đang sử dụng plugin thứ tự loại bài đăng).

Vấn đề là giá trị boolean của tôi cần phải được sắp xếp từ cao đến thấp (1 đến 0) nhưng menu_order thì ngược lại. Những gì được đặt hàng đầu tiên với plugin có thứ tự menu là 1. Vì vậy, sử dụng 'orderby' tích hợp trong WP_Query không hoạt động. Bất cứ ai có đề nghị? Tôi đã xem xét bộ lọc 'post_orderby' nhưng không thể lấy nó. Không thực sự chắc chắn nơi nào nên được áp dụng hoặc làm thế nào tôi có thể khắc phục sự cố. Nó chỉ không đặt hàng theo cách tôi đã có nó.

Cảm ơn đã giúp đỡ! Tôi sẽ đăng WP_Query thực tế nếu nó có liên quan nhưng tôi muốn giữ nó càng ngắn càng tốt.

Các truy vấn lập luận:

$args = array(
        'post_type' => 'post',
        'meta_key' => 'pb_issue_featured',
        'orderby'   => 'meta_value',
        'order' => 'DESC',
        'post_status' => 'publish',
        'posts_per_page' => $posts,
        'paged' => $paged,
        'meta_query' => array(
            array(
                'key' => 'headline',
                'value' => 1,
                'compare' => '!=' 
                )
            )
        );
$q = new WP_Query($args);

Chà, bạn nên đăng WP_Query, để xem nó có được hình thành đúng không.
Marin Bînzari

Đó là trong tất cả vinh quang của nó. Tôi hiện không đặt hàng bởi bất cứ thứ gì ngoại trừ giá trị meta boolean đó là cách duy nhất để làm cho mức đó hoặc sắp xếp hoạt động. Trang web cũng sử dụng các bài đăng 'tiêu đề' được ưu tiên hơn các bài đăng 'nổi bật'. Vì vậy, tôi loại trừ chúng trong truy vấn này
ian

Câu trả lời:


19

Thử cái này:

$args = array(
        'post_type' => 'post',
        'meta_key' => 'pb_issue_featured',
        'orderby'   => 'meta_value',
        'order' => 'DESC',
        'posts_per_page' => $posts,
        'paged' => $paged,
        'paged' => 1,
        'meta_query' => array(
            array(
                'key' => 'headline',
                'value' => 1,
                'compare' => '!=' 
                )
            )
        );

add_filter( 'posts_orderby', 'filter_query' );
$q = new WP_Query($args);
remove_filter( 'posts_orderby', 'filter_query' );

function filter_query( $query ) {
    $query .= ', wp_posts.menu_order ASC';
    return $query;
}

Giống như một ông chủ Spartakus. Cảm ơn câu trả lời súc tích và chính xác. Điều này hoạt động như một sự quyến rũ
ian

1
Bạn cũng có thể sử dụng một mảng theo thứ tự theo mệnh đề (WP 4.0 và mới hơn)
Blueriver
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.