i18n: Automatically filtering search by current language with Druapl 7
The problem I was handled at work was pretty simple - we're putting together a multi-language site, with English and Spanish data. However, if you search on something that's part of a proper name which shows on both English and Spanish data, then you were getting a mix of English and Spanish nodes. What we wanted was a way to automatically filter the search by the current language, something that I couldn't find anywhere. So, I rolled up my sleeves and created this:
<?php
/**
* Implements hook_query_TAG_alter().
*
* Attempts to insure the query is a select query going across the search_index and node tables.
*/
function i18n_search_query_node_access_alter(QueryAlterableInterface $query) {
global $language;
$tables = $query->getTables();
$match_count = 0;
foreach ($tables as $table) {
if ($table['table'] == 'search_index' || $table['table'] == 'node') {
$match_count++;
}
}
if ($match_count < 2) {
return;
}
$option = 'language';
$column = 'n.language';
$exists = FALSE;
foreach ($query->conditions() as $condition) {
if (is_array($condition) && is_string($condition['field']) && $condition['field'] == $column) {
$exists = TRUE;
}
}
if (!$exists) {
$query->condition($column, $language->language);
}
}
?>
The first half of the function is trying to solve the problem of only affecting queries for search. Unfortunately, the only tag applied to search queries is 'node_access', and although that tag makes sense, there's nothing more specific. So, we check to see if this node_access query includes both node and search_index - if it doesn't, then we stop.
The second half is testing to see if there's already a language filter on the query - if there is, then we don't want to add another one that could screw things up. Only if we don't find a language condition do we finally add a filter to only show nodes with the language in the global $language
variable.
As you can see, this is part of a module - but this is also all of the module, other than a tiny info file that requires the search and locale modules. I suppose it could get added to drupal.org, but it seems pretty slight to create a module just for this.
Also note the discussion at
Also note the discussion at http://drupal.stackexchange.com/questions/11290/search-only-for-the-curr..., which has the same fix for the +250 answer.