Перейти к основному содержанию
Удаляем дубли в 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) иначе ничего работать не будет.

Об авторе

Автор этого блога. В SEO более 10 лет. Кроме SEO интересуюсь всем, что связано с технологиями и заработком в интернете, о чем и стараюсь делиться с читателями.