我通过编写一个模块检查RERQUEST_URI以获取该部分以及用户角色,从而在drupal站点上创建了一个私有部分。我现在遇到的问题是如何防止这些节点/视图出现在搜索中。从搜索中隐藏Drupal节点
私人部分中使用的内容类型在网站的其他地方使用。
什么是让Druapl搜索忽略内容/不索引/不在搜索结果中显示的最佳方式?
我通过编写一个模块检查RERQUEST_URI以获取该部分以及用户角色,从而在drupal站点上创建了一个私有部分。我现在遇到的问题是如何防止这些节点/视图出现在搜索中。从搜索中隐藏Drupal节点
私人部分中使用的内容类型在网站的其他地方使用。
什么是让Druapl搜索忽略内容/不索引/不在搜索结果中显示的最佳方式?
有一篇很好的文章解释了这个在lullabot网站上。
这篇文章也值得阅读,因为那里的人们建议使用替代方法来做到这一点,也是通过contrib模块的意思(而不是在你自己的代码中实现一些钩子)。代码D6也在评论中。
HTH!
如果私人部分中使用的内容类型也在其他地方使用,你希望如何过滤它们的搜索结果(请注意,我还没有看过Mac的lullabot文章)。
基本上,如果你看看两个节点的细节,一个是私人的还是一个公共的,它们有什么区别?
注意:我假设您希望节点出现给有权访问“私有”区域的用户,而不是“匿名”用户。
区别它们的是URL路径,可能在菜单中的位置。我不反对添加只包含“私人”标签的分类标准,如果它能让我到达那里。 – easement 2009-11-17 17:03:25
我明白了 - 您希望根据用户在系统中的位置限制结果。如果他们在私人区域,那么这些节点将被包括在内,但如果他们在外面则不会。如果是这样的话(乍一看)lullabot文章可能会让你到那里。 – DilbertDave 2009-11-17 17:08:05
lullabot文章有点过时,包含许多钝的方法。它还包含评论中的答案 - 搜索限制模块,适用于DP6并允许进行细粒度和基于角色的控制。其他一切都会阻止内容被索引,如果内容访问级别不同,或者同样影响所有搜索查询,这可能并不合适,如果访问级别不同,这也不起作用。
对于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');
}
}
}
尼斯 - 我喜爱的一个;-) – DilbertDave 2009-11-17 17:09:46
Lullabot的我指出了正确的方向。谢谢! – easement 2009-11-20 20:07:10
很高兴听到...快乐编码吧! ;) – mac 2009-11-21 14:31:04