Drupal 7)のデフォルト検索の結果を制限して、現在の言語のノードのみを表示するにはどうすればよいですか?
私のウェブサイトには3言語のスイッチャーがあります。ユーザーは、サイトを表示するときに使用する言語を選択します。彼が何かを検索すると、結果ページには他の言語の結果が表示されます。現在、使用できる言語は3つだけですが、これを6つ以上に拡張する予定です。
グローバル$language
あなたがどの言語であるかを知る。ビューでは、「content:language->現在のユーザー言語」を使用してフィルタリングできます。
明らかに文書化されていない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();
同じ要件があり、 Custom search モジュールを使用しました。これには、Custom Search Internationalizationというサブモジュールが含まれています: "すべてまたは現在の言語のみのコンテンツを検索し、すべてのラベルとセレクターの翻訳処理 "(このモジュールには、カスタム検索ブロックなど、他にも役立つ機能がいくつかあります)。完璧に動作します。
表示スイートモジュールを使用して、現在のサイト言語の現在の言語で検索結果を表示するオプションの[表示モード]-> [言語]を選択できます。
検索コアがそれをサポートするかどうかはわかりません。
プロジェクト i18nluceneapi が表示されますが、現時点ではバージョン7をサポートしていません。
私は searchapi を使用して、ファセット言語を作成しています:)。それはあなたのケースに使用でき、検索ページでファセットとデフォルトのフィルターを作成します。