在搜索中包括自定义分类术语


33

我有两个自定义分类法应用于两个自定义帖子类型。边栏上的术语列表就可以了,它将列出与之关联的所有帖子。但是,如果您搜索特定的术语之一,则不会显示该术语的帖子。

示例:http : //dev.andrewnorcross.com/das/all-case-studies/搜索术语“ PQRI”

我什么都没有。有任何想法吗?我尝试使用各种搜索插件,但它们要么破坏了我的自定义搜索参数,要么就不起作用。


Nocross,您能为Jan提出的答案添加一些反馈吗?您是否正在寻找可以完成此工作的插件?
hakre 2010年

我最终放弃了这个计划。由于我创建了3个单独的搜索功能(基于某些领域的不同需求),因此我测试的所有插件都将其破坏了。最后,我告诉客户如果他们希望内容可搜索,请在内容中包含字词。
Norcross

Answers:


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
太好了-如何修改此代码以从搜索中排除分类法ID数组?
HandiworkNYC.com 2012年

应该注意的是,这些钩子的过滤器回调函数接受两个参数。第二个是所有这些都是通过引用传递的WP_Query实例。任何检查is_search()或其他WP_Query方法调用(is_search() is_home()等等)都应始终直接在查询实例上调用(例如,$query->is_search()假设实例变量的名称$query在回调签名中),而不是始终引用主查询的模板函数,而不是过滤器正在运行的查询。
埃文·马特森

4
另外,将原始的公开搜索字符串直接注入到SQL查询中可能不是一个好主意... 建议阅读
Evan Mattson 2014年

我只想补充一点,这与WPML存在冲突,因为WPML alredy在连接部分使用了“ T”,因此使用自定义内容而不是tr,tt和t可以解决此问题
Bobz,2016年


5

我在https://wordpress.stackexchange.com/a/5404/37612上面尝试了Onetrickpony的解决方案,虽然很好,但是我发现那里的一个问题对我不起作用,我将做一个小修改:

  1. 如果我在分类法的标题中搜索了一个字符串,则效果很好
  2. 如果分类法具有特殊字符,例如德语“ Umlauts”(ö,ä,ü),并且使用特殊字符搜索oe,ae,uesteda,那么您需要在分类法的子句中添加搜索- OR t.slug LIKE '%".get_search_query()."%'

  3. 如果您搜索搜索查询和分类过滤器的组合,则也可以正常工作

  4. 但是问题是,当您尝试仅使用分类过滤器时,如果没有搜索到任何文本,则搜索挂钩会将空字符串添加到查询中,因此您将在结果中获得所有帖子,而不是仅从过滤的分类法。一个简单的IF语句即可解决该问题。因此,整个修改后的代码将是这样(对我来说很好用!)

函数custom_search_where($ where){ 
  全局$ wpdb;
  如果(is_search()&& get_search_query())
    $ where。=“ OR(((t.name LIKE'%”。get_search_query()。“%'OR t.slug LIKE'%”。get_search_query()。“%')AND {$ wpdb-> posts} .post_status ='发布')“;
  返回$ where;
}

函数custom_search_join($ join){
  全局$ wpdb;
  如果(is_search()&& get_search_query())
    $ join。=“”左联接{$ wpdb-> term_relationships} tr ON {$ wpdb-> posts} .ID = tr.object_id内联接{$ wpdb-> term_taxonomy} tt上tt.term_taxonomy_id = tr.term_taxonomy_id内联接{ $ wpdb-> terms} t ON t.term_id = tt.term_id“;
  返回$ join;
}

函数custom_search_groupby($ groupby){
  全局$ wpdb;

  //我们需要按帖子ID分组
  $ 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

我拥有与Jan相同级别的信息。我知道也可以通过插件扩展搜索。

可能搜索所有内容(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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.