Есть действительно элегантный способ сделать это, используя явно недокументированное hook_query_node_access_alter()
:
function yourmodule_query_node_access_alter(QueryAlterableInterface $query) {
$search = FALSE;
$node = FALSE;
// Even though we know the node alias is going to be "n", by checking for the
// search_index table we make sure we're on the search page. Omitting this step will
// break the default admin/content page.
foreach ($query->getTables() as $alias => $table) {
if ($table['table'] == 'search_index') {
$search = $alias;
}
elseif ($table['table'] == 'node') {
$node = $alias;
}
}
// Make sure we're on the search page.
if ($node && $search) {
$db_and = db_and();
// I guess you *could* use global $language here instead but this is safer.
$language = i18n_language_interface();
$lang = $language->language;
$db_and->condition($node . '.language', $lang, '=');
$query->condition($db_and);
}
}
Примечание: этот код на 100% основан на превосходном модуле настройки поиска .
Язык пользователя против контента
Некоторые сайты могут иметь обнаружение языка, настроенное для отображения интерфейса на предпочитаемом языке пользователя, в то время как содержимое страницы отображается на основе URL-адреса или языка содержимого.
В этом случае рассмотрите возможность замены
$language = i18n_language_interface();
с
$language = i18n_language_content();