Bao gồm thuật ngữ phân loại tùy chỉnh trong tìm kiếm


33

Tôi có hai nguyên tắc phân loại tùy chỉnh được áp dụng cho hai loại bài tùy chỉnh. danh sách các điều khoản trên thanh bên chỉ tốt và sẽ liệt kê tất cả các bài viết liên quan đến nó. Tuy nhiên, nếu bạn tìm kiếm một trong những thuật ngữ cụ thể, nó sẽ không hiển thị một bài đăng với cụm từ đó.

Ví dụ: http://dev.andrewnorcross.com/das/all-case-studies/ Tìm kiếm cụm từ "PQRI"

Tôi không có gì cả. Có ý kiến ​​gì không? Tôi đã thử sử dụng nhiều plugin tìm kiếm khác nhau nhưng chúng đều phá vỡ các tham số tìm kiếm tùy chỉnh của tôi hoặc chỉ không hoạt động.


Nacer, bạn có thể thêm một số phản hồi cho câu trả lời được đề xuất bởi Jan không? Bạn có thể đang tìm kiếm một plugin thực hiện công việc?
hakre

Tôi đã kết thúc việc bỏ kế hoạch. Vì tôi đã tạo 3 chức năng tìm kiếm riêng biệt (dựa trên các nhu cầu khác nhau trong các khu vực nhất định), tất cả các plugin tôi đã thử nghiệm đã phá vỡ các chức năng đó. Cuối cùng, tôi đã nói với khách hàng bao gồm các thuật ngữ trong nội dung nếu họ muốn nó có thể tìm kiếm được.
Norcross

Câu trả lời:


36

Tôi cũng muốn giới thiệu plugin Tìm kiếm mọi thứ , nhưng nếu bạn muốn triển khai chức năng này bằng chức năng tìm kiếm của WP, thì đây là mã tôi đang sử dụng trong chủ đề Atom của mình:

// search all taxonomies, based on: http://projects.jesseheap.com/all-projects/wordpress-plugin-tag-search-in-wordpress-23

function atom_search_where($where){
  global $wpdb;
  if (is_search())
    $where .= "OR (t.name LIKE '%".get_search_query()."%' AND {$wpdb->posts}.post_status = 'publish')";
  return $where;
}

function atom_search_join($join){
  global $wpdb;
  if (is_search())
    $join .= "LEFT JOIN {$wpdb->term_relationships} tr ON {$wpdb->posts}.ID = tr.object_id INNER JOIN {$wpdb->term_taxonomy} tt ON tt.term_taxonomy_id=tr.term_taxonomy_id INNER JOIN {$wpdb->terms} t ON t.term_id = tt.term_id";
  return $join;
}

function atom_search_groupby($groupby){
  global $wpdb;

  // we need to group on post ID
  $groupby_id = "{$wpdb->posts}.ID";
  if(!is_search() || strpos($groupby, $groupby_id) !== false) return $groupby;

  // groupby was empty, use ours
  if(!strlen(trim($groupby))) return $groupby_id;

  // wasn't empty, append ours
  return $groupby.", ".$groupby_id;
}

add_filter('posts_where','atom_search_where');
add_filter('posts_join', 'atom_search_join');
add_filter('posts_groupby', 'atom_search_groupby');

Nó dựa trên plugin Tìm kiếm thẻ: http://projects.jesseheap.com/all-projects/wordpress-plugin-tag-search-in-wordpress-23


1
Điều này thật tuyệt-- làm thế nào mã này có thể được sửa đổi để loại trừ một mảng ID phân loại khỏi tìm kiếm?
HandiworkNYC.com

Cần lưu ý rằng các cuộc gọi lại bộ lọc cho các hook này chấp nhận 2 đối số; thứ 2 cho tất cả chúng là phiên bản WP_Query được truyền tham chiếu. Mọi kiểm tra cho is_search()hoặc các lệnh gọi phương thức WP_Query khác ( is_search() is_home()v.v.) phải luôn được gọi trực tiếp trên cá thể truy vấn (ví dụ: $query->is_search()giả sử tên của biến đối tượng nằm $querytrong chữ ký gọi lại) thay vì hàm mẫu sẽ luôn tham chiếu đến truy vấn chính , không phải truy vấn mà bộ lọc đang chạy.
Evan Mattson

4
Ngoài ra, có lẽ không nên đưa chuỗi tìm kiếm có sẵn công khai trực tiếp vào truy vấn SQL ... nên đọc
Evan Mattson

Tôi chỉ muốn nói thêm rằng điều này có mâu thuẫn với WPML vì sự hợp tác của WPML sử dụng 'T' trong phần tham gia, vì vậy sử dụng một cái gì đó tùy chỉnh thay vì tr, tt và t khắc phục vấn đề này
Bobz


5

Tôi đã thử giải pháp Onetrickpony ở trên https://wordpress.stackexchange.com/a/5404/37612 , thật tuyệt, nhưng tôi đã tìm thấy một vấn đề ở đó, không hiệu quả với tôi và tôi sẽ thực hiện một sửa đổi nhỏ:

  1. nếu tôi tìm kiếm một chuỗi trong tiêu đề của phân loại học - nó hoạt động rất tốt
  2. nếu phân loại có các ký tự đặc biệt, ví dụ như với "Umlauts" của Đức (ö, ä, ü) và một tìm kiếm cho oe, ae, ue insteda về việc sử dụng char đặc biệt - bạn cần thêm tìm kiếm trong slug của phân loại - OR t.slug LIKE '%".get_search_query()."%'

  3. nếu bạn tìm kiếm kết hợp truy vấn tìm kiếm và bộ lọc phân loại - điều này cũng hoạt động tốt

  4. Nhưng vấn đề là, khi bạn cố gắng chỉ sử dụng bộ lọc phân loại - móc tìm kiếm sẽ nối một chuỗi trống vào truy vấn nếu không có văn bản nào được tìm kiếm và vì lý do đó, bạn nhận được TẤT CẢ các bài đăng trong kết quả, thay vì chỉ những bài đăng từ phân loại lọc. Một câu lệnh IF đơn giản giải quyết vấn đề. Vì vậy, toàn bộ mã sửa đổi sẽ là cái này (hoạt động hoàn toàn tốt đối với tôi!)

chức năng custom_search_where ($ where) { 
  $ wpdb toàn cầu;
  if (is_search () && get_search_query ())
    $ where. = "HOẶC ((t.name THÍCH '%". get_search_query (). "%' HOẶC t.slug THÍCH '%". = 'xuất bản') ";
  trả lại $ ở đâu;
}

chức năng custom_search_join ($ tham gia) {
  $ wpdb toàn cầu;
  if (is_search () && get_search_query ())
    $ tham gia. = "LEFT THAM GIA {$ wpdb-> term_relationships} tr ON {$ wpdb-> bài đăng} $ wpdb-> điều khoản} t TRÊN t.term_id = tt.term_id ";
  trả lại $ tham gia;
}

chức năng custom_search_groupby ($ groupby) {
  $ wpdb toàn cầu;

  // chúng ta cần nhóm trên ID bài
  $ groupby_id = "{$ wpdb-> bài viết} .ID";
  if (! is_search () || strpose ($ groupby, $ groupby_id)! == false ||! get_search_query ()) trả về $ groupby;

  // nhóm đã trống, sử dụng chúng ta
  if (! strlen (trim ($ groupby))) trả về $ groupby_id;

  // không trống, nối thêm chúng ta
  trả lại $ groupby. ",". $ groupby_id;
}

add_filter ('post_where', 'custom_search_where');
add_filter ('post_join', 'custom_search_join');
add_filter ('post_groupby', 'custom_search_groupby');

3

Tôi có cùng mức thông tin như tháng 1. Tôi biết cũng có thể mở rộng tìm kiếm với các plugin.

Có lẽ Tìm kiếm mọi thứ (Plugin Wordpress) là những gì bạn đang tìm kiếm. Theo danh sách tính năng, nó hiện hỗ trợ các phân loại tùy chỉnh.


+1 Đối với plugin Tìm kiếm mọi thứ. Nó hoạt động như mong đợi và trả về nhiều kết quả hơn so với tìm kiếm Wordpress tiêu chuẩn.
PNMG

2

Tôi thấy câu trả lời từ onetrickpony là tuyệt vời nhưng nó coi bất kỳ tìm kiếm nào là một thuật ngữ duy nhất và cũng sẽ không đối phó với một cụm từ tìm kiếm kèm theo dấu ngoặc kép. Tôi đã sửa đổi mã của anh ấy (cụ thể là atom_search_wherehàm) một chút để xử lý hai tình huống này. Đây là phiên bản sửa đổi mã của tôi:

// search all taxonomies, based on: http://projects.jesseheap.com/all-projects/wordpress-plugin-tag-search-in-wordpress-23

function atom_search_where($where){ 
    global $wpdb, $wp_query;
    if (is_search()) {
        $search_terms = get_query_var( 'search_terms' );

        $where .= " OR (";
        $i = 0;
        foreach ($search_terms as $search_term) {
            $i++;
            if ($i>1) $where .= " AND";     // --- make this OR if you prefer not requiring all search terms to match taxonomies
            $where .= " (t.name LIKE '%".$search_term."%')";
        }
        $where .= " AND {$wpdb->posts}.post_status = 'publish')";
    }
  return $where;
}

function atom_search_join($join){
  global $wpdb;
  if (is_search())
    $join .= "LEFT JOIN {$wpdb->term_relationships} tr ON {$wpdb->posts}.ID = tr.object_id INNER JOIN {$wpdb->term_taxonomy} tt ON tt.term_taxonomy_id=tr.term_taxonomy_id INNER JOIN {$wpdb->terms} t ON t.term_id = tt.term_id";
  return $join;
}

function atom_search_groupby($groupby){
  global $wpdb;

  // we need to group on post ID
  $groupby_id = "{$wpdb->posts}.ID";
  if(!is_search() || strpos($groupby, $groupby_id) !== false) return $groupby;

  // groupby was empty, use ours
  if(!strlen(trim($groupby))) return $groupby_id;

  // wasn't empty, append ours
  return $groupby.", ".$groupby_id;
}

add_filter('posts_where','atom_search_where');
add_filter('posts_join', 'atom_search_join');
add_filter('posts_groupby', 'atom_search_groupby');

1

Tôi có cùng một vấn đề xảy ra với plugin giỏ hàng WooC Commerce .. Kết quả tìm kiếm của tôi không bao gồm cụm từ phân loại tùy chỉnh, 'product_tag', vì đây không phải là thẻ bài tiêu chuẩn. Tôi đã tìm thấy một giải pháp trong luồng StackOverflow khác về vấn đề này:

https://stackoverflow.com/questions/13491828/how-to-amend-wordpress-search-so-it-queries-taxonomy-terms-and-carget-terms

Ví dụ mã của tkelly đã làm việc cho tôi khi thay thế thuật ngữ authortrong ví dụ của anh ấy bằngproduct_tag theo nhu cầu của chúng tôi cho các plugin giỏ hà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.