Làm cách nào để thực hiện tìm kiếm WP_Query với các loại bài đăng tùy chỉnh?


8

Tôi đã đăng ký một loại bài tùy chỉnh được gọi là "nút".

Khi tôi tạo một WP_Query cơ bản để nhận các bài đăng thuộc loại đó, nó hoạt động tốt. Thí dụ:

$args = array(  
'post_status' => 'publish',
'post_type' => 'node');

$query = new WP_Query($args);       

Điều này sẽ nhận được tất cả các bài viết được xuất bản của loại "nút".

Tuy nhiên, ngay khi tôi kết hợp điều này với một tìm kiếm, không có gì được trả lại. Thí dụ:

$args = array(  
'post_status' => 'publish',
'post_type' => 'node',
's' => 'My search term');

$query = new WP_Query($args);

Điều này sẽ không nhận được gì, mặc dù nó sẽ nhận được một số bài đăng thuộc loại 'nút' có chứa 'Thuật ngữ tìm kiếm của tôi'.

Theo như tôi có thể thấy, các loại bài đăng sẽ tự động được đặt thành "bài" và "trang" ngay khi tôi đưa tham số "s" vào $ args. Nếu tôi in ra một var_dump của $ query, nó sẽ hiển thị như sau:

Không có "s":

object(WP_Query)
  public 'query' => 
    array (size=2)
      'post_status' => string 'publish' (length=7)
      'post_type' => string 'node' (length=4)
  public 'query_vars' => 
    array (size=63)
      'post_status' => string 'publish' (length=7)
      'post_type' => string 'node' (length=4)
...

Với "s":

object(WP_Query)
  public 'query' => 
    array (size=2)
      'post_status' => string 'publish' (length=7)
      's' => string 'My search term' (length=14)
      'post_type' => string 'node' (length=4)
  public 'query_vars' => 
    array (size=66)
      'post_status' => string 'publish' (length=7)
      's' => string 'My search term' (length=14)
      'post_type' => 
        array (size=2)
          0 => string 'post' (length=4)
          1 => string 'page' (length=4)
...

Vì vậy, Wordpress dường như ghi đè các loại bài đăng ngay khi tìm kiếm.

Lam sao tôi co thể sửa no?


1
Tôi không thể xác nhận điều này. Tôi vừa thử nghiệm một cái gì đó rất giống nhau - thành công. Bạn đã thử mà không có bất kỳ plugin và / hoặc sử dụng một chủ đề mặc định? Ngay cả các tìm kiếm (ví dụ, việc tìm kiếm chính, sử dụng các hình thức tìm kiếm) bao gồm tất cả các loại bài tùy chỉnh mà không bị loại trừ một cách rõ ràng từ tìm kiếm.
tfrommen

2
Tôi thực sự đã viết một tìm kiếm sáng nay đã sử dụng post_type (một cpt), post_status (xuất bản) và s và nó hoạt động tốt. Bạn gần như chắc chắn có một bộ lọc hoặc một cái gì đó trong một plugin / chủ đề theo đề xuất của @tf.
Andrew Bartel

Tôi chưa thể kiểm tra điều này nhưng tôi chắc chắn khoảng 95% tôi đã tặng một thứ tương tự và nó đã hoạt động. Tôi đồng ý với suy đoán về hành động của nhiễu bộ lọc.
s_ha_dum

1
Bạn nói đúng, tôi đã thử nó trong một bản cài đặt Wordpress sạch và nó hoạt động. Có vẻ như một trong những plugin tôi sử dụng trong môi trường của mình đang tự móc vào một trong những sự kiện truy vấn trước. Cảm ơn!
Sebastian

Câu trả lời:


4

Bạn nói đúng, tôi đã thử nó trong một bản cài đặt Wordpress sạch và nó hoạt động.

Có vẻ như một trong những plugin tôi sử dụng trong môi trường của mình đang tự móc vào một trong những sự kiện truy vấn trước.

Cảm ơn!


2
Bạn có biết plugin nào gây ra vấn đề này không?
stefano1

1

Khi cài đặt WordPress stock, WP_Query sẽ mặc định là post_type= 'post'.

Hãy xem xét ví dụ đơn giản này:

$args = array(
  "posts_per_page"=>5,
  "ignore_sticky_posts"=>true
);

$itposts = new WP_Query( $args );

Nó sẽ dẫn đến truy vấn sau đây sẽ được thực hiện:

SELECT SQL_CALC_FOUND_ROWS wp_posts.ID FROM wp_posts WHERE 1=1 AND wp_posts.post_type = 'post' AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'private') ORDER BY wp_posts.post_date DESC LIMIT 0, 5

GIẢI PHÁP TỐT NHẤT

Giải pháp là thêm một post_typeđối số được đặt thành 'any'. Bằng cách này, WordPress sẽ tự động tìm kiếm trong số tất cả các loại trừ các phiên bản và các loại exclude_from_searchđược đặt thành true. Vấn đề, theo mặc định, tệp đính kèm không được loại trừ khỏi tìm kiếm. Miễn là bạn không có post_statusđối số được đặt thành 'inherit', bạn không nên khó chịu vì các tệp đính kèm luôn được post_statusđặt thành 'inherit'.

Bằng cách này, truy vấn sẽ thay đổi thành:

SELECT SQL_CALC_FOUND_ROWS wp_posts.ID FROM wp_posts WHERE 1=1 AND wp_posts.post_type IN ('post', 'page', 'attachment') AND (wp_posts.post_status = 'publish' OR wp_posts.post_author = 1 AND wp_posts.post_status = 'private') ORDER BY wp_posts.post_date DESC LIMIT 0, 5

Nếu cần, bạn có thể loại trừ tệp đính kèm khỏi tìm kiếm bằng cách sử dụng mã này:

add_action('init', 'exclude_attachments_from_search');

function exclude_attachments_from_search() {
  global $wp_post_types;

  $wp_post_types['attachment']->exclude_from_search = true;
}

-1

Tôi biết đây là một câu hỏi thực sự cũ nhưng tôi đã gặp nó bởi vì tôi có cùng một vấn đề. Tôi không thể nhận xét vì danh tiếng, nhưng tôi muốn giúp những người như @Stefano để bạn không phải xem qua tất cả các plugin của mình và kiểm tra xem cái nào gây ra thay đổi cho truy vấn.

Đối với tôi đó là một plugin có tên " Tìm kiếm tùy chỉnh theo BestWebSoft ". Nhưng đó không phải là lỗi của plugin, tôi chỉ đánh dấu vào ô cho loại bài đăng tùy chỉnh của mình trong cài đặt của nó.

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.