У Drupal 7 при використанні фільтрів на основі модулів Facet API і Facet API Pretty Paths за замовчуванням виникає серйозна проблема в плані SEO - колосальне зростання дублів по суті сторінок, що не існують, але що віддають відповідь сервера 200 ОК. Тобто, якщо до URL дописати будь-яке слово, замість 404 сторінки ми отримуємо індексований результат створеної нами Views для фасетів з усіма наслідками в плані SEO. Так, на одному з моїх проектів лише за кілька днів в індекс потрапило понад 5000 сміттєвих сторінок/дублів.
До речі, ця проблема притаманна не тільки для зв'язування Views + Facet API та Facet API Pretty Paths, але навіть для будь-якої сторінки створеної за допомогою Views (про це я писав у цій статті). Вирішенням проблеми дублів як для стандартних сторінок Views, так і сторінок фасетних фільтрів з використанням Views + Facet API + Facet API Pretty Paths є встановлення модуля Views 404
Але якщо для звичайних в'юх модуль працює без зайвих налаштувань, відразу після установки, то для в'юх фасетів потрібен патч, інакше будь-яке значення фільтра видаватиме 404 помилку. Для того щоб він запрацював і для шляхів генерованих модулем Facet API Pretty Paths, після встановлення модуля Views 404 нам потрібно перейти у файл модуля /sites/all/modules/views404/views404.module і приблизно 65 рядок після коду:
// Add in % for each argument, as needed.
if (count($view_arguments) > 0) {
foreach ($view_arguments as $type => $data) {
if (count($conflicting_in_view) < count($conflicting_in_args)) {
$path_array[] = '%';
// Re-init variables to take into account the % in the path.
$path = implode('/', $path_array);
$matched = array_intersect($path_array, $args);
$conflicting_in_view = array_diff($path_array, $matched);
$conflicting_in_args = array_diff_assoc($args, $matched);
}
else {
break;
}
}
}
вставити цей шматок коду:
// If enable module 'current_search'.
if(function_exists('current_search_get_searcher_options')){
$searcher = str_replace('search_api_index_', 'search_api@', $view->base_table);
$adapter = facetapi_adapter_load($searcher);
// If view using 'index' form search api.
if(!empty($adapter)){
$active_items = $adapter->getAllActiveItems();
// Count facet only with "pretty paths enable."
foreach ($active_items as $key => $item) {
$facet = facetapi_facet_load(reset($item['facets']), $searcher);
$setting = $adapter->getFacetSettingsGlobal($facet);
if (!empty($setting->settings['pretty_paths_disable'])) {
unset($active_items[$key]);
}
}
if (count($active_items) * 2 == count($conflicting_in_args)) {
return;
}
}
}
При цьому повинен бути обов'язково включений модуль Current Search Blocks (current_search) інакше нічого працювати не буде.
- 67 переглядів