Перейти до основного вмісту
Видаляємо дублі в Drupal Facet API Pretty Paths замінюючи їх на 404 сторінку

У 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) інакше нічого працювати не буде.