Додайте до пошуку спеціальний термін таксономії


33

У мене є дві спеціальні таксономії, застосовані до двох спеціальних типів публікацій. перелік термінів на бічній панелі просто чудовий і перелічить усі публікації, пов’язані з ним. Однак якщо ви шукаєте один із конкретних термінів, він не відображає публікацію з цим терміном.

Приклад: http://dev.andrewnorcross.com/das/all-case-studies/ Шукати термін "PQRI"

Я нічого не отримую. Будь-які ідеї? Я намагався використовувати різні пошукові плагіни, але вони або порушують мої власні параметри пошуку, або просто не працюють.


Nocross, чи можете ви додати відгук до відповіді, запропонованої Яном? Ви, ймовірно, шукаєте плагін, який виконує цю роботу?
хакре

Я закінчився скиданням плану. Оскільки я створив 3 окремі функції пошуку (виходячи з різних потреб у певних областях), усі тестувані плагіни зламали їх. Врешті-решт я сказав клієнтові включити терміни у вміст, якщо він захоче його шукати.
Norcross

Відповіді:


36

Я також рекомендував би плагін Search Everything , але якщо ви хочете реалізувати це за допомогою функції пошуку 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');

Він заснований на плагіні пошуку тегів: http://projects.jesseheap.com/all-projects/wordpress-plugin-tag-search-in-wordpress-23


1
Це чудово - як цей код можна змінити, щоб виключити масив ідентифікаторів таксономії з пошуку?
HandiworkNYC.com

Слід зазначити, що зворотні виклики фільтрів для цих гаків приймають 2 аргументи; другим для всіх є екземпляр WP_Query, який передається посиланням. Будь-які перевірки для is_search()або інших викликів методу WP_Query ( is_search() is_home()тощо) завжди повинні викликатися безпосередньо в екземплярі запиту (наприклад, $query->is_search()якщо припустити, що ім'я змінної екземпляра знаходиться $queryв підписі зворотного виклику), а не функція шаблону, яка завжди буде посилатися на основний запит , а не запит, для якого працює фільтр.
Еван Маттсон

4
Також, мабуть, не дуже гарна ідея вводити необмежену загальнодоступну пошукову рядок безпосередньо в SQL-запит ... рекомендується прочитати
Еван Маттсон

Я хотів би лише додати, що це конфлікт з WPML, оскільки WPML alredy використовує 'T' в частині приєднання, тому використовуючи щось власні замість tr, tt і t виправляє цю проблему
Bobz

7

Це стандартний пошук у WordPress? Тому що це, схоже, не включає таксономії (навіть не стандартні, як категорії та теги) у пошуку. Код шукає 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. Але проблема полягає в тому, що ви намагаєтеся використовувати лише фільтр таксономії - пошуковий гачок додає до запиту порожній рядок, якщо не шукається текст, і з цієї причини ви отримуєте ВСІ повідомлення в результаті, а не лише ті з відфільтрована систематика. Просте твердження IF вирішує проблему. Тож весь модифікований код був би таким (працює для мене чудово!)

функція custom_search_where ($ де) { 
  глобальний $ wpdb;
  if (is_search () && get_search_query ())
    $ where. = "АБО ((t.name LIKE '%". get_search_query (). "%' OR t.slug LIKE '%". get_search_query (). "%") І {$ wpdb-> posts} .post_status = 'опублікувати') ";
  повернути $ де;
}

функція custom_search_join ($ приєднатися) {
  глобальний $ wpdb;
  if (is_search () && get_search_query ())
    $ join. = "ЛІВО ПРИЄДНАЙТЕСЬ {$ wpdb-> term_relationships} tr ON {$ wpdb-> posts} .ID = tr.object_id ВНУТРІШНЕ ПРИЄДНАННЯ {$ wpdb-> term_taxonomy} tt ON tt.term_taxonomy_id = tr.term_taxonomy_id INNER JONER JONER $ wpdb-> terms} t ON t.term_id = tt.term_id ";
  повернути $ join;
}

функція custom_search_groupby ($ groupby) {
  глобальний $ wpdb;

  // нам потрібно згрупуватися за ідентифікатором пошти
  $ groupby_id = "{$ wpdb-> повідомлення} .ID";
  if (! is_search () || strpos ($ groupby, $ groupby_id)! == false 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) - це те, що ви шукаєте. Відповідно до списку функцій, він тепер підтримує власні таксономії.


+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на відповідно до наших потреб у плагінах кошика.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.