You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法排除自定义内容类型出现在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 03:17:35