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

时间:2010-10-06 作者:Norcross

我有两个自定义分类法应用于两个自定义帖子类型。侧边栏上的术语列表很好,将列出与之相关的所有帖子。然而,如果你搜索其中一个特定的术语,它不会显示带有该术语的帖子。

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

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

6 个回复
最合适的回答,由SO网友:onetrickpony 整理而成

我会推荐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

SO网友:Jan Fabry

这是标准的WordPress搜索吗?因为doesn\'t seem to include taxonomies (甚至不是标准的,比如类别和标签)。代码在中搜索post_titlepost_content, 但是,如果您想包括任何其他内容,您应该将posts_search 滤器

SO网友:Asped

我试过上面提到的一匹小马的解决方案https://wordpress.stackexchange.com/a/5404/37612, 这很好,但我发现了一个问题,它对我不起作用,我会做一个小的修改:

如果我在分类法的标题中搜索一个字符串-如果分类法有特殊字符,例如德语的“Umlauts”(ö,ä,ü),并且搜索oe、ae、ue而不是使用特殊字符,则效果很好-您需要在分类法的slug中添加搜索-OR t.slug LIKE \'%".get_search_query()."%\'

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

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

function custom_search_where($where){ 
  global $wpdb;
  if (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 = \'publish\')";
  return $where;
}

function custom_search_join($join){
  global $wpdb;
  if (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";
  return $join;
}

function custom_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 || !get_search_query()) 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\',\'custom_search_where\');
add_filter(\'posts_join\', \'custom_search_join\');
add_filter(\'posts_groupby\', \'custom_search_groupby\');

SO网友:Mojamba

我发现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\');

SO网友:hakre

我有和Jan一样的信息水平。我知道也可以用插件扩展搜索。

可能Search Everything (Wordpress Plugin) 这就是你要找的。根据功能列表,它现在支持自定义分类法。

SO网友:mroncetwice

我对WooCommerce购物车插件也有同样的问题。。我的搜索结果不包括自定义分类术语“product\\u tag”,因为它不是标准的post标记。我在另一个StackOverflow线程中找到了关于此问题的解决方案:

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

代码示例tkelly 在替换术语时为我工作author 在他的例子中product_tag 根据我们对cart插件的需求。

结束

相关推荐