Php 从搜索中隐藏Drupal节点
我在drupal站点上创建了一个私有部分,通过编写一个模块来检查该部分的RERQUEST_URI以及用户角色。我现在遇到的问题是如何防止这些节点/视图出现在搜索中 “专用”部分中使用的内容类型将在网站的其他位置使用Php 从搜索中隐藏Drupal节点,php,search,drupal,drupal-6,acl,Php,Search,Drupal,Drupal 6,Acl,我在drupal站点上创建了一个私有部分,通过编写一个模块来检查该部分的RERQUEST_URI以及用户角色。我现在遇到的问题是如何防止这些节点/视图出现在搜索中 “专用”部分中使用的内容类型将在网站的其他位置使用 让Druapl search忽略内容/不索引/不在搜索结果中显示内容的最佳方法是什么?网站上有一篇精彩的文章解释了这一点 这篇文章的评论也值得一读,因为那里的人建议了其他方法,也可以通过contrib模块(而不是在自己的代码中实现一些钩子)来实现。注释中也有D6的代码 嗯 如果私人部
让Druapl search忽略内容/不索引/不在搜索结果中显示内容的最佳方法是什么?网站上有一篇精彩的文章解释了这一点 这篇文章的评论也值得一读,因为那里的人建议了其他方法,也可以通过contrib模块(而不是在自己的代码中实现一些钩子)来实现。注释中也有D6的代码
嗯 如果私人部分中使用的内容类型也在其他地方使用,您希望如何从搜索结果中过滤它们(注意,我还没有看过mac的摇篮曲文章) 基本上,如果查看两个节点(一个私有节点和一个公共节点)的详细信息,它们之间的区别是什么
注意:我假设您希望节点显示给有权访问私人区域的用户,而不是“匿名”用户。摇篮曲文章有点过时,包含许多直截了当的方法。它还包含注释中的答案-搜索限制模块,适用于DP6,允许细粒度和基于角色的控制。其他一切要么阻止内容被索引,如果对内容有不同的访问级别,这可能是不可取的;要么同等地影响所有搜索查询,如果有不同的访问级别,这也将不起作用。对于Drupal 7。 可以使用自定义字段从搜索结果中隐藏节点。在我的例子中,我已经创建了一个名为“存档”的自定义字段,以满足所需的内容类型,在该自定义字段的帮助下,您可以编写“我的模块查询更改”功能 代码
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');
}
}
}
它们之间的区别在于URL路径以及它们在菜单中的位置。我并不反对添加只包含“private”标记的分类法,如果它能让我达到目的的话。我明白了-你想根据用户在系统中的位置限制结果。如果它们位于专用区域,则这些节点将被包括在内,但如果它们位于外部,则不包括在内。如果是这样的话(乍一看),摇篮曲的文章可能会让你达到目的。很高兴听到。。。那就快乐编码吧!;)