我通过编写一个模块来检查该部分的 RERQUEST_URI 以及用户角色,从而在 drupal 站点上创建了一个私有部分。我现在遇到的问题是如何防止这些节点/视图出现在搜索中。
私有部分中使用的内容类型在站点的其他地方使用。
让 Druapl 搜索忽略内容/不索引/不在搜索结果中显示它的最佳方法是什么?
在lullabot网站上有一篇精彩的文章解释了这一点。
这篇文章的评论也值得一读,因为那里的人建议了替代方法,也可以通过 contrib 模块(而不是在您自己的代码中实现一些挂钩)。D6 的代码也在评论中。
!
摇篮曲的文章有点过时,包含许多生硬的方法。它还包含评论中的答案 -适用于 DP6 并允许细粒度和基于角色的控制的搜索限制模块。其他一切要么阻止内容被索引,如果对内容有不同的访问级别,这可能是不可取的,或者平等地影响所有搜索查询,如果有不同的访问级别,这也将不起作用。
如果 Private 部分中使用的内容类型也在其他地方使用,您希望如何将它们从搜索结果中过滤掉(请注意,我还没有看过 mac 的 lullabot 文章)。
基本上,如果您查看两个节点(一个私有节点和一个公共节点)的详细信息,它们的区别是什么?
注意:我假设您希望节点显示给有权访问私有区域的用户,而不是“匿名”用户。
对于 Drupal 7。您可以使用自定义字段从搜索结果中隐藏节点。在我的例子中,我创建了一个名为Archive的自定义字段到所需的内容类型,并且在该自定义字段的帮助下,您可以编写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');
}
}
}