我在drupal网站上创建了一个私有部分,编写了一个模块,用于检查RERQUEST_URI的部分以及用户角色。我现在遇到的问题是如何防止这些节点/视图出现在搜索中。
私人部分中使用的内容类型将在网站的其他位置使用。
让Druapl搜索忽略内容/不是索引/不在搜索结果中显示它的最佳方法是什么?
答案 0 :(得分:3)
有一篇精彩的文章在lullabot网站上解释了这一点。
值得一读这篇文章的评论,因为那里的人建议采用其他方式,也就是使用contrib模块(而不是在你自己的代码中实现一些钩子)。 D6的代码也在评论中。
HTH!
答案 1 :(得分:1)
lullabot文章有点过时,包含许多直言不讳的方法。它还包含评论中的答案 - 适用于DP6的搜索限制模块,允许细粒度和基于角色的控制。其他所有内容都阻止内容被编入索引,如果内容的访问级别不同,或者平等地影响所有搜索查询,这可能是不可取的,如果存在不同的访问级别,这也将无效。
答案 2 :(得分:0)
如果私有部分中使用的内容类型也在其他地方使用,您希望如何将它们从搜索结果中过滤出来(请注意,我还没有看过mac的lullabot文章)。
基本上,如果你看一下两个节点的细节,一个私有节点和一个公共节点,它们有什么区别?
注意:我假设您希望节点对有权访问私有区域的用户显示,但对“匿名”用户不显示。
答案 3 :(得分:0)
Drupal 7。 您可以使用自定义字段隐藏搜索结果中的节点。在我的情况下,我创建了一个名为存档的自定义字段到所需的内容类型,在该自定义字段的帮助下,您可以编写 my_module_query_alter 功能。
<强>代码强>
function my_module_query_alter(QueryAlterableInterface $query) {
$is_search = $is_node_search = FALSE;
$node_alias = FALSE;
foreach ( $query->getTables() as $table ) {
if ( $table['table'] == 'search_index' || $table['table'] == 'tracker_user') {
$is_search = TRUE;
}
if ( $table['table'] == 'node' || $table['table'] == 'tracker_user') {
$node_alias = $table['alias'];
$is_node_search = TRUE;
}
}
if ( $is_search && $is_node_search ) {
$nids = [];
// Run entity field query to get nodes that are 'suppressed from public'.
$efq = new EntityFieldQuery();
$efq->entityCondition('entity_type', 'node')
->fieldCondition('field_archive', 'value', 1, '=');
$result = $efq->execute();
if ( isset($result['node']) ) {
$nids = array_keys($result['node']);
}
if ( count($nids) > 0 ) {
$query->condition(sprintf('%s.nid', $node_alias), $nids, 'NOT IN');
}
}
}