sắp xếp meta_query theo 2 phím


8

Tôi cần sắp xếp (tùy chỉnh) bài đăng theo 2 giá trị trường tùy chỉnh ...

tên trường tùy chỉnh 1: is_sponsored[giá trị có thể 1hoặc 0]

tên trường tùy chỉnh 2: sfp_date[ timestampaka ngày đăng hiện tại tính bằng giây]

Các bài đăng có is_sponsoredgiá trị "" là 1 cần được đặt lên hàng đầu, được sắp xếp theo " sfp_date" theo DESCthứ tự kết thúc. Tất cả các bài đăng khác có is_sponsoredgiá trị "" là 0 nên được liệt kê bên dưới - theo thứ tự giảm dần (theo " sfp_date").

Tôi có một cái gì đó như:

$sfp_query_args = array(
    'tax_query'   => array( 
        array( 
            'taxonomy' => 'sfp_posts',
            'terms'    => array( 1, 5, 8 )
        )
    ),
    'post_type'   => 'sfpposts',
    'post_status' => 'publish',
    'showposts'   => 15,
    'paged'       => $paged,
    'meta_key'    => 'sfp_date', 
    'orderby'     => 'meta_value_num', 
    'order'       => 'DESC', 
    'meta_query'  => array(
        'key'          => 'is_sponsored',
        'value'        => 2,
        'type'         => 'NUMERIC',
        'compare'      => '<='
    )
);
$wp_q = new WP_Query( $sfp_query_args );

... nhưng không hoạt động. Có ý kiến ​​gì không?


Biên tập Lưu ý: Đây là một plugin nhỏ sẽ hiển thị truy vấn trông như thế nào, vì chúng tôi có thể không có bất kỳ bộ dữ liệu nào có sẵn để kiểm tra điều này.

<?php
/** Plugin Name: (#67600) Dump Query parts */
function wpse67600_dump_query_parts( $pieces )
{
    echo '<pre>'.var_export( $pieces, true ).'</pre>';
    return $pieces;
}
add_filter( 'posts_clauses', 'wpse67600_dump_query_parts' );

OP VUI LÒNG THÊM VÀO PLUGIN TẠI ĐÂY - sử dụng liên kết "chỉnh sửa" .

EDIT của Bà

OK, sau khi theo dõi yêu cầu và nhiều cách giải quyết, tôi đã đưa ra ...

Nếu tôi đơn giản hóa "$ sfp_query_args" một chút thì kết quả gần với những gì được yêu cầu, tuy nhiên, không thể sắp xếp các bài đăng vẫn như cũ. Đây là:

$sfp_query_args1 = array(
    'tax_query' => array( array( 'taxonomy' => 'sfp_post_category', 'terms' => $cat_id_arr ) ),
    'post_type' => 'sfpposts',
    'post_status' => 'publish',
    'showposts' => (int)$per_page,
    'paged' => $paged,
    'meta_key' => 'is_sponsored', 
    'orderby' => 'meta_value date'
);
  • * orderby có hai thuộc tính: meta_value và ngày *

Vì vậy, $ wpdb-> yêu cầu với các đối số trên trong truy vấn trông như thế này:

SELECT SQL_CALC_FOUND_ROWS $wpdb->posts.ID 
FROM $wpdb->posts 
INNER JOIN $wpdb->term_relationships 
ON ($wpdb->posts.ID = $wpdb->term_relationships.object_id) 
INNER JOIN $wpdb->postmeta 
ON ($wpdb->posts.ID = $wpdb->postmeta.post_id) 
WHERE 1=1 
AND $wpdb->posts.post_type = 'sfpposts' 
AND ($wpdb->posts.post_status = 'publish') 
AND ($wpdb->postmeta.meta_key = 'is_sponsored' ) 
GROUP BY $wpdb->posts.ID 
ORDER BY $wpdb->postmeta.meta_value, $wpdb->posts.post_date DESC 
LIMIT 0, $per_page

Và cuối cùng, để có thể sắp xếp theo meta_value, truy vấn nên được đặt chỉ với một sự khác biệt nhỏ:

SELECT SQL_CALC_FOUND_ROWS $wpdb->posts.ID 
FROM $wpdb->posts 
INNER JOIN $wpdb->term_relationships 
ON ($wpdb->posts.ID = $wpdb->term_relationships.object_id) 
INNER JOIN $wpdb->postmeta 
ON ($wpdb->posts.ID = $wpdb->postmeta.post_id) 
WHERE 1=1 
AND $wpdb->posts.post_type = 'sfpposts' 
AND ($wpdb->posts.post_status = 'publish') 
AND ($wpdb->postmeta.meta_key = 'is_sponsored' ) 
GROUP BY $wpdb->posts.ID 
ORDER BY $wpdb->postmeta.meta_value [!ORDER MISSING!], $wpdb->posts.post_date DESC 
LIMIT 0, $per_page

Vui lòng phát hiện chỗ giữ chỗ [! ĐẶT HÀNG!]. Tôi đoán ở trên nên giải thích chính xác nơi xảy ra vấn đề.


Tôi không tin rằng bạn có thể làm điều đó với lớp WP_Query mặc định. Ngay cả trong các tài liệu có ghi "Bạn có biết cách sắp xếp truy vấn nếu meta_value là một mảng không? Viết nó ở đây". Bạn có thể sẽ phải viết truy vấn SQL của riêng bạn cho việc này.
Miha Rekar

Yeap, tôi biết nó chưa được giải quyết nhưng tôi nghĩ đây là nơi thích hợp để sắp xếp nó :)
Dameer

Tôi đã thêm một plugin nhỏ vào câu hỏi của bạn, để bạn có thể chỉ cho chúng tôi các phần truy vấn SQL cuối cùng. Vui lòng chỉnh sửa câu hỏi của bạn với thông tin đó. Cảm ơn.
kaiser

Ồ và đây là một số thông tin từ một câu hỏi liên quan về cách sắp xếp hoạt động nói chung.
kaiser

Câu trả lời:


2

OK, cách giải quyết cuối cùng sẽ là phân tách truy vấn:

$sfp_query_args = array(
    'tax_query' => array( array( 'taxonomy' => 'sfp_post_category', 'terms' => $cat_id_arr ) ),
    'meta_key' => 'is_sponsored',
    'post_type' => 'sfpposts',
    'post_status' => 'publish',
    'showposts' => (int)$per_page,
    'paged' => $paged
);

... và sử dụng bộ lọc "post_orderby" để sửa đổi phần ĐẶT HÀNG:

add_filter( 'posts_orderby', 'sfp_modify_orderby' );
function sfp_modify_orderby( $orderby ) {
    if( !is_admin() && is_tax( 'sfp_post_category' ) ) {
        global $wpdb;
        $orderby = " $wpdb->postmeta.meta_value DESC, $wpdb->posts.post_date DESC ";
    }
    return $orderby;
}

Rất có thể bạn sẽ cần xóa bộ lọc sau vòng lặp trên trang để ngăn 'bài viết_orderby' ảnh hưởng đến bất kỳ truy vấn nào khác (thanh bên hoặc chân trang). Vì vậy, đây là một chức năng khác để đưa vào "Hàm.php":

function sfp_remove_orderby_filter() {
    remove_filter( 'posts_orderby', 'sfp_modify_orderby' );
}

... và trên trang sử dụng bộ lọc loại bỏ truy vấn của chúng tôi:

if( have_posts() ) : while( have_posts() ) : the_post();
    // code
endwhile;
else :
    // code
endif;

sfp_remove_orderby_filter();

Hy vọng nó có ý nghĩa!


-1

Tôi đang viết truy vấn của bạn sửa đổi một chút. Tôi hy vọng nó có thể giúp đỡ.

$sfp_query_args = array(
    'tax_query' => array( array( 'taxonomy' => 'sfp_posts', 'terms' => array( 1, 5, 8) ) ),
    'post_type' => 'sfpposts',
    'post_status' => 'publish',
    'showposts' => 15,
    'paged' => $paged, 
    'meta_key'=>'sfp_date', 
    'meta_query' => array(
    array(
        'key' => 'sfp_date',
            'type' => 'NUMERIC',
    ),
    array(
        'key' => 'is_sponsored',
        'value' => '2',
        'compare' => '<='
    )       
    ),
    'orderby' => 'meta_value_num', 
    'order' => 'DESC',
);
$wp_q = new WP_Query( $sfp_query_args );

Xin vui lòng cho tôi biết liệu nó hoạt động hay không :-)


2
Điều này sẽ sắp xếp mặc định (theo ngày), vì bạn không cung cấp 'meta_key'.
Miha Rekar

Cảm ơn bạn @MihaRekar, Đó là một sai lầm cảm ơn vì sự điều chỉnh của bạn
Md Toufiqul Hồi giáo

Tôi e rằng nó không hoạt động, nó chỉ tiếp tục sắp xếp các bài đăng theo ngày mà không đặt những người có giá trị "được tài trợ" lên 1.
Nhà thờ

Tôi đang tìm kiếm một giải pháp cho việc này. Có thể @MihaRekar đúng. Bạn có thể phải viết truy vấn sql tùy chỉnh cho việc này
Md Toufiqul Hồi giáo

Có cách nào bạn có thể cung cấp một ví dụ về truy vấn myQuery "bình thường" không?
Nhà thờ
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.