Скрыть Drupal узлы от поиска - PullRequest
2 голосов
/ 17 ноября 2009

Я создал приватный раздел на сайте drupal, написав модуль, который проверяет RERQUEST_URI для раздела, а также для роли пользователя. Проблема, с которой я сейчас сталкиваюсь, заключается в том, как предотвратить появление этих узлов / представлений в поиске.

Типы контента, используемые в приватном разделе, используются в других местах сайта.

Какой лучший способ заставить поиск в Druapl игнорировать контент / не индексировать / не отображать его в результатах поиска?

Ответы [ 4 ]

3 голосов
/ 17 ноября 2009

На сайте lullabot есть замечательная статья, объясняющая именно это.

Стоит также прочитать комментарии к посту, потому что люди там предложили альтернативные способы сделать это, в том числе с помощью модулей contrib (вместо реализации некоторых хуков в вашем собственном коде). Код для D6 также в комментарии.

НТН!

1 голос
/ 02 ноября 2010

Статья lullabot немного устарела и содержит множество тупых подходов. Он также содержит ответ в комментариях - модуль Search Restrict , который работает для DP6 и позволяет осуществлять детальное и ролевое управление. Все остальное либо препятствует индексации контента, что может быть нежелательно, если существуют разные уровни доступа к контенту, либо одинаково влияет на все поисковые запросы, что также не будет работать, если существуют разные уровни доступа.

0 голосов
/ 14 июля 2017

для 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');
   }
 }
}
0 голосов
/ 17 ноября 2009

Если типы контента, используемые в разделе Private, также используются в других местах, как вы надеетесь отфильтровать их из результатов поиска (обратите внимание, что я еще не просматривал статью lullabot от mac).

В принципе, если вы посмотрите на детали двух узлов, одного частного и одного открытого, что их отличает?

Примечание. Я предполагаю, что вы хотите, чтобы узлы отображались пользователям с доступом к приватной области, а не «анонимным» пользователям.

...