norcross
  • 0
Гуру

Включить пользовательский термин таксономии в поиск

  • 0

У меня есть две пользовательские таксономии, примененные к двум пользовательским типам сообщений. список терминов на боковой панели просто прекрасен, и в нем будут перечислены все сообщения, связанные с ним. Однако, если вы выполняете поиск по одному из терминов конкретно, сообщение с этим термином не появится.

Пример: http://dev.andrewnorcross.com/das/all-case-studies/ Поиск термина «PQRI»

Я ничего не получаю. Есть идеи? Я пытался использовать различные поисковые плагины, но они либо нарушают мои пользовательские параметры поиска, либо просто не работают.

Share
  1. Nocross, можете ли вы добавить отзыв к ответу, предложенному Яном? Вы, вероятно, ищете плагин, который делает эту работу?

    • 0
    • В итоге я отказался от плана. Поскольку я создал 3 отдельные функции поиска (исходя из разных потребностей в определенных областях), все плагины, которые я тестировал, сломали их. В конце концов, я сказал клиенту включить термины в контент, если он хочет, чтобы он был доступен для поиска.

      • 0
    • Это здорово — как можно изменить этот код, чтобы исключить из поиска массив идентификаторов таксономии?

      • 0
    • Следует отметить, что обратные вызовы фильтра для этих хуков принимают 2 аргумента; второй для всех из них является экземпляром WP_Query, который передается по ссылке. Любые проверки is_search() или другие вызовы метода WP_Query ( и т. д is_search() is_home() .) всегда должны вызываться непосредственно в экземпляре запроса (например $query->is_search(), при условии, что имя переменной экземпляра находится $query в сигнатуре обратного вызова), а не в функции шаблона, которая всегда будет ссылаться на основной запрос., а не запрос, для которого работает фильтр.

      • 0
    • Кроме того, вероятно, не стоит вводить необработанную общедоступную строку поиска непосредственно в SQL-запрос… рекомендуется к прочтению

      • 0
    • @EvanMattson — вы прокомментировали выше, что «вероятно, не очень хорошая идея вводить необработанную общедоступную строку поиска непосредственно в запрос SQL». Как можно свести на нет этот риск? Я прочитал предоставленную вами ссылку, но не понял, как она связана с исходным ответом. Большое спасибо Эм.

      • 0
    • @EvanMattson Привет, Эван, спасибо за вклад. Я новичок как в php, так и в пользовательском коде WP, и это так далеко зашло мне в голову. Сможете ли вы продублировать код с $wpdb->prepare() добавленным, если это не слишком сложно? Я думаю, что пройдут недели, прежде чем я смогу приблизиться к пониманию такого рода вещей.

      • 0
    • +1 Для плагина Search Everything. Он работает так, как ожидалось, и возвращает больше результатов, чем стандартный поиск WordPress.

      • 0
  2. Я бы также порекомендовал плагин 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');
    

    Он основан на плагине Tag-Search: http://projects.jesseheap.com/all-projects/wordpress-plugin-tag-search-in-wordpress-23.

    • 0
  3. Это стандартный поиск WordPress? Потому что это, похоже, не включает таксономии (даже стандартные, такие как категории и теги) в поиске. Код ищет в post_title и post_content, но если вы хотите включить что-то еще, вы должны подключиться к posts_search фильтру.

    • 0
  4. Я попробовал решение Onetrickpony выше https://wordpress.stackexchange.com/a/5404/37612, и это здорово, но я нашел там одну проблему, которая не сработала для меня, и я бы сделал одну небольшую модификацию:

    1. если я искал строку в заголовке таксономии — отлично работает
    2. если в таксономии есть специальные символы, например, с немецкими «умлаутами» (ö, ä, ü), и кто-то ищет oe, ae, ue вместо использования специального символа — вам нужно добавить поиск в слаг таксономии —OR t.slug LIKE '%".get_search_query()."%'

    3. если искать по комбинации поискового запроса и фильтра таксономии — тоже нормально работает

    4. Но проблема в том, что когда вы пытаетесь использовать только фильтр таксономии — поисковый хук добавляет пустую строку к запросу, если текст не ищется, и по этой причине вы получаете ВСЕ сообщения в результате, а не только те, отфильтрованная таксономия. Простой оператор IF решает проблему. Таким образом, весь модифицированный код будет таким (у меня отлично работает!)

    функция custom_search_where($where){
      глобальный $wpdb;
      если (is_search() && get_search_query())
        $where.= "ИЛИ ((t.name LIKE '%".get_search_query()."%' ИЛИ ​​t.slug LIKE '%".get_search_query()."%') AND {$wpdb->posts}.post_status = 'опубликовать')";
      вернуть $где;
    }
    
    функция custom_search_join($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 INNER JOIN { $wpdb->terms} t ON t.term_id = tt.term_id";
      вернуть $присоединиться;
    }
    
    функция custom_search_groupby($groupby){
      глобальный $wpdb;
    
      // нам нужно сгруппировать по идентификатору поста
      $groupby_id = "{$wpdb->сообщения}.ID";
      if(!is_search() || strpos($groupby, $groupby_id) !== false || !get_search_query()) return $groupby;
    
      // groupby был пуст, используйте наш
      if(!strlen(trim($groupby))) return $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');
    
    • 0
  5. Я нашел ответ от 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');
    
    • 0
  6. У меня такой же уровень информации, как у Яна. Я знаю, что поиск можно расширить и с помощью плагинов.

    Вероятно, Search Everything (плагин WordPress) — это то, что вы ищете. Согласно списку функций, теперь он поддерживает пользовательские таксономии.

    • 0
  7. У меня та же проблема с плагином корзины 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 на соответствующий нашим потребностям для плагинов корзины.

    • 0

Оставить ответ

You must login to add an answer.