Cách sửa đổi chỉ lọc tests_where cho truy vấn tìm kiếm


8

Tôi đang sử dụng bộ lọc post_where để sửa đổi các tìm kiếm của người dùng trên web, nhưng tôi phát hiện ra rằng một số tiện ích mặc định như "các bài đăng gần đây" cũng sử dụng bộ lọc này và hành vi của chúng cũng được sửa đổi. Tôi đang cố gắng tìm cách để tránh mọi thứ khác ngoài tìm kiếm của người dùng sử dụng bộ lọc tests_where.

Đây là mã của tôi:

add_filter( 'posts_where' , 'posts_where_statement' );

function posts_where_statement( $where ) {
   global $wp_query;
   global $expp;
   global $wpdb;
   $local_db = $wpdb->prefix."posts";
   $front_page_id = get_option('page_on_front');

   if ( ('page' != get_option('show_on_front') || $front_page_id != $wp_query->query_vars['page_id']) && (!($wp_query->is_search)) )
       return $where;

   //some $where modifications

   remove_all_actions ( '__after_loop');
   return $where;
}

Có bất kỳ chức năng nào khác hoặc một cách để làm cho hook / bộ lọc này chỉ hoạt động với truy vấn tìm kiếm không? (một trong đó lấy kết quả từ đầu vào của người dùng)

Câu trả lời:


17

Vấn đề:

Vấn đề với đoạn mã hiện tại của bạn là bạn chỉ đang kiểm tra đối tượng truy vấn chính toàn cầu, bất kể đối tượng truy vấn hiện tại là gì.

Cách giải quyết:

Lưu ý rằng đối số đầu vào thứ hai cho cuộc posts_wheregọi lại bộ lọc, là đối tượng truy vấn hiện tại.

Sử dụng điều đó để xác định xem đó có phải là truy vấn tìm kiếm chính ở mặt trước với:

add_filter( 'posts_where', function ( $where, \WP_Query $q ) 
{
    if( ! is_admin() && $q->is_main_query() && $q->is_search()) // No global $wp_query here
    {
        // ... your modifications
    }

    return $where;      

}, 10, 2 ); // Note the priority 10 and number of input arguments is 2

Ngoài ra còn có posts_searchbộ lọc cho phần tìm kiếm WHERE, nếu đó là những gì bạn cần sửa đổi.

Nhưng nói chung tôi sẽ nói chỉ sửa đổi SQL được tạo bằng tay nếu, bạn thực sự phải và không có lựa chọn thay thế nào khác.


+1 cho gợi ý loại. Không phải là một fan hâm mộ $qmặc dù.
Michael Ecklund

1
cảm ơn, thật tuyệt khi có một giao diện vâng, đó là một điểm hợp lệ liên quan đến tên biến. Tôi phải thừa nhận rằng các thanh cuộn mã trên trang web này, ảnh hưởng đến cách tôi viết câu trả lời - Tôi cố gắng tránh chúng ;-) Một số sử dụng $wp_querynhưng có thể bị nhầm lẫn với toàn cầu $wp_query, sử dụng khác $qryhoặc $query, nhưng điều đó cũng có thể gây nhầm lẫn khi chúng tôi đối phó với truy vấn SQL ;-) Tôi đã giải quyết $qtrong đoạn trích ngắn này và nó cũng có vẻ đơn giản hơn ví dụ. $wp_query_objThông thường, tôi đưa nhiều câu hỏi if vào một dòng riêng biệt
@MichaelEcklund

\ WP_Query $ q nghĩa là gì? Ý tôi là tại sao lại chém?
Brett

@brett Nếu chúng ta sử dụng một không gian tên trong plugin của mình, thì chúng ta cần điều này cho các lớp WordPress, vì WordPress sử dụng không gian toàn cầu.
bạch dương
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.