无法排除自定义内容类型出现在Search Autocomplete搜索结果中求助
解决Search Autocomplete排除特定内容类型的问题
嘿,看你折腾了好几个模块都没搞定,咱直接从代码层面来解决——毕竟你已经在碰template.php了,咱把这条路走通!
首先,你之前的form_alter代码没写完,先补全它,不过真正关键的是拦截搜索查询,因为Search Autocomplete可能会绕过一些常规的模块限制,直接修改查询才是最靠谱的:
方法1:针对原生Node搜索(不用Search API的情况)
第一步:完善form_alter(可选,也可以直接硬编码排除类型)
先把你的template.php里的代码补全,给搜索表单加个隐藏参数标记要排除的类型:
function MYSITE_form_alter(&$form, &$form_state, $form_id) { // 匹配搜索块表单ID,注意如果是其他搜索表单要替换成对应的ID if ($form_id == 'search_block_form') { // 这里填你要排除的内容类型机器名,比如'page'、'article' $form['exclude_content_types'] = array( '#type' => 'hidden', '#value' => array('article', 'page'), ); } }
第二步:用hook修改搜索查询
在template.php里再加一个钩子,直接修改搜索的数据库查询,把指定内容类型排除在外:
function MYSITE_search_query_alter($query) { // 只处理节点类型的搜索 if ($query->module == 'node') { // 可以从表单里取排除类型,或者直接硬编码(更简单) $exclude_types = array('article', 'page'); // 添加查询条件:内容类型不在排除列表中 $query->add_where(1, 'node.type NOT IN (:exclude_types)', array(':exclude_types' => $exclude_types)); } }
方法2:如果用了Search API(很多Drupal站点会用这个)
如果你的搜索是基于Search API的,那换成下面这个钩子:
function MYSITE_search_api_query_alter(SearchApiQueryInterface $query) { // 替换成你的搜索索引机器名,比如'default_node_index' if ($query->getIndex()->machine_name == 'default_node_index') { // 添加过滤器,排除指定内容类型 $query->filter('type', 'NOT IN', array('article', 'page')); } }
关键注意事项
- 清空缓存! 每次修改
template.php或者自定义模块代码后,一定要清空Drupal的缓存,不然新代码不会生效。 - 检查Search Autocomplete配置:在模块的配置页面,找到你用的自动补全规则,确保它的“搜索结果来源”选的是「站点默认搜索」,而不是自定义查询——这样你的钩子修改才会作用到自动补全的结果里。
- 之前的Search Configuration模块没用是因为它管的是用户搜索权限,不是排除内容类型;search restrict插件可能和Search Autocomplete兼容性不好,所以代码钩子是最稳定的方案。
内容的提问来源于stack exchange,提问作者WSW
相关产品推荐
相关产品推荐

