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

示例:http://dev.andrewnorcross.com/das/all-case- Studies /
搜索“ PQRI”一词

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

评论

诺克罗斯,您能为Jan提出的答案添加一些反馈吗?您是否可能正在寻找可以完成这项工作的插件?

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

#1 楼

我也建议您使用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

评论


太好了-如何修改此代码以从搜索中排除分类法ID数组?

– HandiworkNYC.com
2012年1月6日于20:23

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

–埃文·马特森(Evan Mattson)
2014年6月7日在2:55

另外,将原始的公开可用搜索字符串直接注入到SQL查询中可能不是一个好主意...推荐阅读

–埃文·马特森(Evan Mattson)
2014年6月7日在3:03

@EvanMattson —您在上面评论说“将原始的公开可用搜索字符串直接注入到SQL查询中可能不是一个好主意”。如何消除这种风险?我阅读了您提供的链接,但看不到它如何链接到原始答案。非常感谢Em。

–耐嚼
20年4月5日,1:11

@EvanMattson嗨,埃文,谢谢您的投入。我是php和自定义WP代码的新手,这已经超出了我的范围。如果不太难,您是否能够使用添加的$ wpdb-> prepare()复制代码?我认为距离了解这类事情还需要几周的时间。

–耐嚼
20年4月21日在0:07

#2 楼

这是标准的WordPress搜索吗?因为这似乎没有在搜索中包括分类法(甚至不包括分类和标签之类的标准分类法)。该代码在post_titlepost_content中进行搜索,但是如果要包含其他内容,则应插入posts_search过滤器。

#3 楼

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

如果我在分类法的标题中搜索了一个字符串-效果很好
如果分类法具有特殊字符,例如与德语“ Umlauts”(ö,ä,ü)一起使用一种特殊字符搜索oe,ae和ue insteda-您需要将搜索添加到分类法的子弹中-
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');


#4 楼

我拥有与Jan相同的信息水平。我知道也可以使用插件扩展搜索。

搜索所有内容(Wordpress插件)正是您所需要的。根据功能列表,它现在支持自定义分类法。

评论


+1搜索所有插件。它可以按预期工作,并且比标准的Wordpress搜索返回更多结果。

–PNMG
2010-12-02 22:00

#5 楼

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时,对我有用。

#6 楼

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