Answers:
有一种非常优雅的方法可以使用似乎未公开的文档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);
}
}
注意:基于出色的Search Config模块,此代码是100%。
用户与内容语言
某些网站可能配置了语言检测,以用户首选的语言显示界面,而页面内容是根据URL或内容语言显示的。
在这种情况下,请考虑更换
$language = i18n_language_interface();
与
$language = i18n_language_content();
您可以使用显示套件模块,在其中可以选择选项“查看模式”->“语言”,该选项以当前语言和当前站点语言提供搜索结果。