私は4つの言語のサイトを持っており、ビルトイン検索を使用してサイト上のコンテンツを探しています。検索結果を現在選択されている言語のみに制限するにはどうすればよいですか?
[構成]> [検索ページ]を調べてみましたが、その方法がわかりません。
「高度な」コア検索にはこれが組み込まれています。これをテーマから実行したい場合は、form_alterを使用して実行できます。これにより、基本的には詳細検索設定が非表示になり、検索ブロックと検索ページで結果を取得するための唯一の言語として現在の言語が設定されます。
または、ユーザーが結果を取得したい言語をユーザーが制御できるようにし、単純に高度な検索を使用できるようにすることもできます。
テーマのコード:
/**
* Implements hook_form_FORM_ID_alter().
*/
function hook_form_search_form_alter(&$form, &$form_state) {
$form['help_link']['#access'] = FALSE;
$form['advanced']['#access'] = FALSE;
$form['basic']['keys']['#title'] = '';
$manager = \Drupal::languageManager();
$form['advanced']['lang-fieldset']['language']['#default_value'] = [$manager->getCurrentLanguage()->getId()];
}
/**
* Implements hook_form_FORM_ID_alter().
*/
function hook_form_search_block_form_alter(&$form, &$form_state) {
$manager = \Drupal::languageManager();
$form['advanced-form'] = [
'#type' => 'hidden',
'#value' => 1,
];
$form['f[0]'] = [
'#type' => 'hidden',
'#value' => 'language:' . $manager->getCurrentLanguage()->getId(),
];
}
簡単な方法を使用できます hook_query_TAG_alter
。現在の言語の戻りノードの例。
<?php
use Drupal\Core\Database\Query\AlterableInterface;
/**
* Implements hook_query_TAG_alter(): tag search_$type with $type node_search.
*/
function MYMODULE_query_search_node_search_alter(AlterableInterface $query) {
$language = \Drupal::languageManager()->getCurrentLanguage()->getId();
$query->condition('n.langcode', $language, '=');
}