Bạn có thể tìm thấy tài liệu trên pre_get_post
lọc tại đây http://codex.wordpress.org/Plugin_API/Action_Reference/pre_get_posts
Đối với tôi, có vẻ như vấn đề trên thực tế là cách bạn thiết lập post_ids mà bạn muốn truy xuất. Nếu bạn tham khảo liên kết ở trên, bạn có thể thấy các giá trị khác nhau có thể được đặt trên $query
đối tượng được chuyển tới bộ lọc và post_id
không phải là một trong số chúng, đó là lý do tại sao nó "hoạt động" khi bạn đặt nó và "không hoạt động" khi bạn đặt p
. Cái sau dành cho một ID bài đăng, vì vậy nếu bạn chỉ muốn 100, bạn sẽ sử dụng $query->set('p', 100)
. Nếu bạn muốn trả về kết quả trong đó ID bài đăng nằm trong một mảng, bạn sử dụng $query->set('post__in', array(100, 120))
. Mã SQL của bạn chỉ trả về ID, vì vậy thay vì trả về các đối tượng, bạn chỉ có thể nhận một mảng trực tiếp - tôi giả sử rằng lặp lại tiêu đề và print_r
dòng chỉ đang gỡ lỗi:
// get results as a numeric array
$post_ids = $wpdb->get_results($request, ARRAY_N);
// pass post id array to $query
$query->set( 'post__in', $post_ids );
Bạn cũng có thể không nhận được kết quả nếu có các tham số xung đột hiện có được đặt trên $query
. Bạn có thể kiểm tra các giá trị này bằng var_dump($query->query_vars)
và đặt bất kỳ chuỗi nào có thể xung đột thành một chuỗi trống - trong trường hợp của bạn là $query->set( 'm', '' );