Скрыть узлы Drupal из поиска

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

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

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

Есть замечательная статья, которая объясняет это только на сайте lullabot .

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

НТН!

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

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

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

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

Для 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'); } } }