รวมคำอนุกรมวิธานที่กำหนดเองในการค้นหา


33

ฉันมี taxonomies แบบกำหนดเองสองแบบที่ใช้กับโพสต์แบบกำหนดเองสองประเภท รายการเงื่อนไขบนแถบด้านข้างใช้ได้และจะแสดงรายการโพสต์ทั้งหมดที่เกี่ยวข้อง อย่างไรก็ตามหากคุณค้นหาคำใดคำหนึ่งโดยเฉพาะข้อความนั้นจะไม่ปรากฏในข้อความนั้น

ตัวอย่าง: http://dev.andrewnorcross.com/das/all-case-studies/ ค้นหาคำว่า "PQRI"

ฉันไม่ได้อะไรเลย ความคิดใด ๆ ฉันได้ลองใช้ปลั๊กอินการค้นหาต่างๆ แต่พวกเขาอาจแบ่งพารามิเตอร์การค้นหาที่กำหนดเองของฉันหรือไม่ทำงาน


Nocross คุณสามารถเพิ่มความคิดเห็นในคำตอบที่แจนเสนอได้หรือไม่? คุณอาจกำลังมองหาปลั๊กอินที่ทำงานอยู่หรือไม่?
hakre

ฉันลงเอยที่แผน เนื่องจากฉันสร้างฟังก์ชั่นการค้นหาแยกต่างหาก 3 ฟังก์ชั่น (ขึ้นอยู่กับความต้องการที่แตกต่างกันในบางพื้นที่) ปลั๊กอินทั้งหมดที่ฉันทดสอบจึงแตกออก ในท้ายที่สุดฉันบอกให้ลูกค้ารวมคำต่างๆไว้ในเนื้อหาหากพวกเขาต้องการให้ค้นหาได้
Norcross

คำตอบ:


36

ฉันขอแนะนำปลั๊กอินค้นหาทุกอย่างด้วยเช่นกัน แต่ถ้าคุณต้องการใช้งานโดยใช้ฟังก์ชั่นการค้นหาของ WP นี่คือรหัสที่ฉันใช้ในชุดรูปแบบ Atom ของฉัน:

// 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');

มันขึ้นอยู่กับปลั๊กอินของ Tag-Search: http://projects.jesseheap.com/all-projects/wordpress-plugin-tag-search-in-wordpress-23


1
นี่เป็นสิ่งที่ยอดเยี่ยม - จะแก้ไขรหัสนี้อย่างไรเพื่อแยกรหัสอนุกรมวิธานจากการค้นหา
HandiworkNYC.com

ควรสังเกตว่าตัวกรอง callbacks สำหรับ hooks เหล่านี้ยอมรับอาร์กิวเมนต์2 ตัว ที่สองสำหรับพวกเขาทั้งหมดเป็นอินสแตนซ์WP_Queryซึ่งถูกส่งผ่านโดยการอ้างอิง การตรวจสอบใด ๆis_search()หรือการเรียกเมธอดWP_Queryอื่น ๆ( is_search() is_home()ฯลฯ ) ควรถูกเรียกโดยตรงบนอินสแตนซ์ของแบบสอบถาม (เช่น$query->is_search()สมมติว่าชื่อของตัวแปรอินสแตนซ์อยู่$queryในลายเซ็นการเรียกกลับ) แทนที่จะใช้ฟังก์ชันเทมเพลตซึ่งจะอ้างถึงแบบสอบถามหลักเสมอ ไม่ใช่แบบสอบถามที่ตัวกรองใช้งานอยู่
Evan Mattson

4
นอกจากนี้อาจไม่ใช่ความคิดที่ดีในการแทรกสตริงการค้นหาข้อมูลดิบที่เปิดเผยต่อสาธารณะโดยตรงในแบบสอบถาม SQL ... การอ่านที่แนะนำ
Evan Mattson

ฉันแค่อยากจะเพิ่มว่านี่มีข้อขัดแย้งกับ WPML เพราะ WPML alredy ใช้ 'T' ในการเข้าร่วมเป็นส่วนหนึ่งดังนั้นการใช้สิ่งที่กำหนดเองแทน tr, tt และ t แก้ไขปัญหานี้
Bobz

7

นี่คือการค้นหา WordPress มาตรฐานหรือไม่ เนื่องจากดูเหมือนจะไม่รวม taxonomies (ไม่ใช่แม้แต่มาตรฐานเช่นหมวดหมู่และแท็ก) ในการค้นหา รหัสค้นหาในpost_titleและpost_contentแต่ถ้าคุณต้องการรวมสิ่งอื่นคุณควรขอลงในposts_searchตัวกรอง


5

ฉันลองวิธีแก้ปัญหาของ Onetrickpony ด้านบนhttps://wordpress.stackexchange.com/a/5404/37612ซึ่งเยี่ยมมาก แต่ฉันพบปัญหาหนึ่งที่นั่นซึ่งไม่ได้ผลสำหรับฉันและฉันจะทำการแก้ไขเล็กน้อย:

  1. ถ้าฉันค้นหาสตริงในชื่อเรื่องของอนุกรมวิธาน - มันใช้งานได้ดี
  2. ถ้าอนุกรมวิธานมีอักขระพิเศษเช่นกับภาษาเยอรมัน "Umlauts" (ö, ä, ü) และอีกหนึ่งการค้นหา oe, ae, ue insteda ของการใช้อักขระพิเศษ - คุณต้องเพิ่มการค้นหาลงในกระสุนของอนุกรมวิธาน - OR t.slug LIKE '%".get_search_query()."%'

  3. หากคุณค้นหาคำค้นหาและตัวกรองอนุกรมวิธานร่วมกัน - สิ่งนี้ก็ใช้ได้เช่นกัน

  4. แต่ปัญหาคือเมื่อคุณพยายามใช้เฉพาะตัวกรอง taxonomy - hook การค้นหาจะเพิ่มสตริงว่างต่อท้ายแบบสอบถามหากไม่มีการค้นหาข้อความและด้วยเหตุนี้คุณจึงได้รับโพสต์ทั้งหมดในผลลัพธ์แทนที่จะเป็นเฉพาะจาก อนุกรมวิธานที่กรองแล้ว คำสั่ง IF ง่าย ๆ แก้ปัญหาได้ ดังนั้นรหัสที่แก้ไขทั้งหมดจะเป็นเช่นนี้ (ทำงานได้ดีอย่างสมบูรณ์สำหรับฉัน!)

ฟังก์ชั่น custom_search_where ($ ที่ไหน) { 
  ทั่วโลก $ wpdb;
  ถ้า (is_search () && get_search_query ())
    $ where. = "OR ((t.name LIKE '%". get_search_query (). "%' OR t.slug LIKE '%". get_search_query (). "%') และ {$ wpdb-> โพสต์} .post_status = 'เผยแพร่') ";
  ส่งคืน $ where;
}

ฟังก์ชั่น custom_search_join ($ เข้าร่วม) {
  ทั่วโลก $ wpdb;
  ถ้า (is_search () && get_search_query ())
    $ 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 $ wpdb-> ข้อตกลง} t ON t.term_id = tt.term_id ";
  กลับ $ เข้าร่วม;
}

ฟังก์ชั่น custom_search_groupby ($ groupby) {
  ทั่วโลก $ wpdb;

  // เราจำเป็นต้องจัดกลุ่มตามรหัสโพสต์
  $ groupby_id = "{$ wpdb-> posts} .ID";
  if (! is_search () || strpos ($ groupby, $ groupby_id)! == false ||! get_search_query ()) ส่งกลับ $ groupby;

  // groupby ว่างเปล่าใช้ของเรา
  if (! strlen (trim ($ groupby))) ส่งกลับ $ groupby_id;

  // ไม่ว่างต่อท้ายเรา
  ส่งคืน $ groupby. ",". $ groupby_id;
}

add_filter ( 'posts_where', 'custom_search_where');
add_filter ('posts_join', 'custom_search_join');
add_filter ('posts_groupby', 'custom_search_groupby');

3

ฉันมีข้อมูลในระดับเดียวกันเช่น ม.ค. ฉันรู้ว่าเป็นไปได้ที่จะขยายการค้นหาด้วยปลั๊กอินเช่นกัน

อาจค้นหาทุกอย่าง (ปลั๊กอิน Wordpress)เป็นสิ่งที่คุณกำลังมองหา ตามรายการคุณลักษณะตอนนี้สนับสนุน taxonomies แบบกำหนดเอง


+1 สำหรับการค้นหาปลั๊กอินทุกอย่าง มันทำงานได้ตามที่คาดหวังและให้ผลลัพธ์มากกว่าการค้นหา Wordpress มาตรฐาน
PNMG

2

ฉันพบคำตอบจาก onetrickpony ว่ายอดเยี่ยม แต่ก็ถือว่าการค้นหาใด ๆ เป็นคำเดียวและจะไม่จัดการกับวลีค้นหาที่อยู่ในเครื่องหมายคำพูด ฉันแก้ไขโค้ดของเขา (โดยเฉพาะatom_search_whereฟังก์ชั่น) เล็กน้อยเพื่อจัดการกับสถานการณ์ทั้งสองนี้ นี่คือรหัสแก้ไขของฉัน:

// 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

ฉันมีปัญหาเดียวกันกับปลั๊กอินรถเข็น WooCommerce ผลการค้นหาของฉันไม่รวมถึงคำศัพท์เฉพาะทางอนุกรมวิธานที่กำหนดเอง 'product_tag' เพราะไม่ใช่แท็กโพสต์มาตรฐาน ฉันพบวิธีแก้ไขปัญหาในเธรด StackOverflow อื่น ๆ เกี่ยวกับเรื่องนี้:

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

ตัวอย่างรหัสโดยtkellyทำงานสำหรับฉันเมื่อแทนที่คำauthorในตัวอย่างของเขาด้วยproduct_tagตามความต้องการของเราสำหรับปลั๊กอินรถเข็น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.