Tôi đã sửa đổi tìm kiếm WP tích hợp bằng pre_get_posts
bộ lọc, cho phép người dùng sắp xếp các bài đăng (bao gồm một loạt các loại bài đăng tùy chỉnh) theo các trường khác nhau.
Vấn đề tôi gặp phải là khi tôi bảo WP sắp xếp theo một giá trị meta, nó sẽ loại trừ tất cả các bài đăng không có giá trị meta đó được đặt. Điều này khiến số lượng kết quả thay đổi nếu bạn thay đổi cách sắp xếp từ nói "Giá" thành "Ngày" vì "Bài đăng" không được đặt "Giá" nhưng "Mục" thì có.
Đây không phải là điều tôi muốn, vì vậy tôi muốn biết liệu có cách nào để bao gồm TẤT CẢ các bài đăng hay không - ngay cả những bài viết thiếu giá trị meta mà tôi sắp xếp - và đặt bài viết không có giá trị cuối cùng.
Tôi biết cách sắp xếp trên nhiều lĩnh vực nhưng điều đó không có ích.
Cảm ơn
Có vẻ như tôi không phải là người duy nhất có câu hỏi này: Cách bao gồm các bài đăng cả có & không có meta_key nhất định trong các đối số cho wp_query? nhưng không có giải pháp ở đó.
Cập nhật
Tôi đã thử câu trả lời nhưng không chắc là tôi đã hiểu đúng chưa, đây là những gì tôi có ngay bây giờ:
<?php
function my_stuff ($qry) {
$qry->set('meta_query', array(array(
'key' => 'item_price',
'value' => '',
'compare' => 'NOT EXISTS'
)));
$qry->set('orderby', 'meta_value date'); # Sorting works with meta_value as well as meta_value_num - I've tried both
$qry->set('order', 'ASC DESC');
$qry->set('meta_key', 'item_price');
}
Giá trị meta là một số (nó được sử dụng để lưu trữ giá như tên cho thấy)
Cập nhật 2
Tôi đã nhận xét các công cụ đặt hàng và tất cả những gì tôi có bây giờ là:
<?php
$qry->set('meta_query', array(array(
'key' => 'item_price',
'value' => '',
'compare' => 'NOT EXISTS'
)));
Với mã này, truy vấn dường như trả về tất cả các bài đăng không có item_price
khóa và không có bài đăng nào có nó. IE vấn đề bây giờ đã đảo ngược.
Nếu tôi thêm vào mã thứ tự, tôi nhận được 0 kết quả.
Chỉnh sửa: ... ba năm sau ... : PI lại gặp vấn đề này. Tôi đã thử tất cả các câu trả lời được đưa ra và không có công việc. Không chắc chắn tại sao một số người dường như nghĩ rằng họ làm việc nhưng ít nhất họ không làm việc cho tôi.
Giải pháp tôi đã kết thúc là sử dụng save_post
bộ lọc - đảm bảo tất cả các bài đăng đều có trường tùy chỉnh tôi muốn sắp xếp. Hơi khó chịu một chút là tôi phải làm điều đó, nhưng miễn là bạn làm sớm thì bạn sẽ không gặp vấn đề gì.
Trong trường hợp này, tôi đã xây dựng một "bộ đếm lượt xem" trên các bài đăng và muốn người dùng có thể sắp xếp các bài đăng được đọc nhiều nhất. Một lần nữa, các bài đăng chưa bao giờ được xem (tôi đoán điều đó khá khó xảy ra - nhưng vẫn) đã biến mất khi sắp xếp theo số lượt xem. Tôi đã thêm đoạn mã này để đảm bảo tất cả các bài đăng đều có số lượt xem:
add_action('save_post', function ($postId) {
add_post_meta($postId, '_sleek_view_count', 0, true);
});
meta_query
và tax_query
là luôn luôn một array( array() )
khi họ kết hợp nhiều mảng. Thứ hai - như đã đề cập trong câu trả lời của tôi - bạn cần sử dụng meta_value_num
cho các số. Cũng có thể cần thiết để xác định thực sự meta_value_num
(xem WP_Query
mục nhập trang -Codex). Cuối cùng, nó không có ý nghĩa order
trong ASC
và DESC
hướng. Đó là không thể. Dấu phân cách không gian chỉ hoạt động orderby
và bạn không thể yêu cầu nó sắp xếp thứ nhất ASC
và thứ hai DESC
. Đó là những gì posts_clauses
bộ lọc dành cho.
meta_value_num
mục của bạn là số thực . Nhìn thấy quá thường xuyên rằng ai đó nói rằng đó là một số, nhưng trên thực tế, lưu nó dưới dạng một chuỗi trong cơ sở dữ liệu.
ASC DESC
là để nó loại trên meta_value
trong ASC
và date
trong DESC
, như xa như tôi có thể nói nó hoạt động.