Tôi nghĩ rằng vấn đề chủ yếu liên quan đến cấu trúc truy vấn sql và tôi không phải là một chuyên gia ....
Tôi cần tìm kiếm bài viết (loại bài tùy chỉnh) theo 2 tham số:
pd_city
pd_country
Xin lưu ý rằng mối quan hệ meta_query là 'HOẶC' vì vậy nếu một trong hai điều trên là THÍCH thì chúng ta sẽ có một số kết quả.
Khóa thứ ba (được tài trợ) được sử dụng để sắp xếp bài viết! Nó có thể là 1 hoặc 0 và các bài đăng có giá trị "được tài trợ" bằng 1 nên được liệt kê ở trên cùng.
Vì vậy, đây là điều WordPress:
$sfp_query_args = array(
'sfp_complex_search' => 'yeap',
'tax_query' => array( array( 'taxonomy' => 'sfp_post_category', 'terms' => $term_id ) ),
//'meta_key' => 'is_sponsored',
'post_type' => 'sfpposts',
'post_status' => 'publish',
'showposts' => (int)$per_page,
'paged' => $paged,
'meta_query' => array( 'relation' => 'OR',
array( 'key' => 'pd_city', 'value' => $sfp_search_meta, 'compare' => 'LIKE' ),
array( 'key' => 'pd_country', 'value' => $sfp_search_meta, 'compare' => 'LIKE' ),
array( 'key' => 'is_sponsored' )
)
);
$sfp_search = new WP_Query( $sfp_query_args );
Tôi cũng cần lọc kết quả với "post_orderby" để đưa những người được tài trợ lên đầu:
add_filter( 'posts_orderby', 'sfp_modify_search' );
function sfp_modify_search( $orderby ) {
if( !is_admin() && is_page( $this->options[ 'sfp_page_entries_search' ] ) ) {
global $wpdb;
$orderby = " CASE WHEN mt2.meta_value = 0 THEN 1 END, $wpdb->posts.post_date DESC ";
}
return $orderby;
}
Vấn đề thực sự phụ thuộc vào thực tế là với truy vấn này, TẤT CẢ BÀI VIẾT từ "sfp_post_carget" được trả về, không chỉ những người khớp với "pd_city" hoặc "pd_country" vì TẤT CẢ BÀI VIẾT CÓ "được tài trợ" (và giá trị được đặt thành 1 hoặc 0). Một lần nữa: "được tài trợ" là cần thiết để sắp xếp!
Khi var_dump
var_dump( $sfp_search->request );
... sql của WordPress trông như thế này:
SELECT SQL_CALC_FOUND_ROWS wp_posts.ID
FROM wp_posts
INNER JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id)
INNER JOIN wp_postmeta ON (wp_posts.ID = wp_postmeta.post_id)
INNER JOIN wp_postmeta AS mt1 ON (wp_posts.ID = mt1.post_id)
INNER JOIN wp_postmeta AS mt2 ON (wp_posts.ID = mt2.post_id)
WHERE 1=1
AND ( wp_term_relationships.term_taxonomy_id IN (77) )
AND wp_posts.post_type = 'sfpposts'
AND (wp_posts.post_status = 'publish')
AND ( (wp_postmeta.meta_key = 'pd_city'
AND CAST(wp_postmeta.meta_value AS CHAR)
LIKE '%something%')
OR (mt1.meta_key = 'pd_country'
AND CAST(mt1.meta_value AS CHAR)
LIKE '%something%')
OR mt2.meta_key = 'is_sponsored' )
GROUP BY wp_posts.ID
ORDER BY CASE WHEN mt2.meta_value = 0 THEN 1 END, wp_posts.post_date DESC
LIMIT 0, 10
Làm cách nào để loại bỏ tất cả các bài đăng không khớp với "pd_city" hoặc "pd_country" khỏi kết quả?