Views только по конкретному url адресу

Аватар пользователя zniki.ru

Задача

Создать представление доступное только по одному адресу: www.example.com/portfolio.

  1. Создавать новое представление-страницу (page).
  2. Указать путь: /portfolio.
  3. Вывести нужные поля.

Этого не достаточно!
Если оставить всё как есть, то мы обнаружим, что наше представление открывается по адресам:

Содержание этих страниц абсолютно одинаковое.
И если у нас не прописан rel canonical, то поисковые роботы могут на сайте найти одинаковый контент, что может негативно сказаться на позиции сайта в поисковой выдаче.

Пояснение.

Причина в том, что всё что идет после /portfolio/ views воспринимает как аргумент для контекстного фильтра.
То есть для страницы www.example.com/portfolio/foo/bar/ у нас задано два аргумента:
1ый аргумент: foo, 2ой аргумент: bar.

Решение.

Чтобы страница открывалась только по заданному пути, нужно настроить проверку первого аргумента контекстного фильтра.

Для этого создаем новый контекстный фильтр в настройках представления:

  1. Вкладка Расширенный (Advanced)
    • Контекстные фильтры (contextual filters) -> Добавить (Add).
  2. Глобальный: Ноль.
    1. Когда значение не доступно: отобразить все результаты для указанного.
    2. Укажите критерий проверки: поставить галочку.
    • Проверка: Простая проверка.
    • Действие в случае если значение фильтра недействительно: Вывести текст "Ничего не найдено".
  3. Вкладка Еще
    • Провалить проверку, если будет получен любой аргумент.

views_contextual.jpg
Теперь из рабочих останется только адрес www.example.com/portfolio.
А по адресам www.example.com/portfolio/foo/, www.example.com/portfolio/foo/bar/ получаем 404 ошибку (Страница не найдена).

По мотивам http://drupal.stackexchange.com/a/48455/13772.

Комментарии

Аватар пользователя Konstantin Komelin

И если у нас не прописан rel

И если у нас не прописан rel canonical, то поисковые роботы могут на сайте найти одинаковый контент

Не могут, если нет ссылки на этот дубликат.

Провалить проверку, если будет получен любой аргумент.

Всегда удивлялся таланту русских переводчиков, поэтому до сих пор модуль Yandex.Metrics содержит папку translations :)

Аватар пользователя kalabro

Знаю этот трюк, но не

Знаю этот трюк, но не применяю, потому что это вносит путаницу во вьюхи (а там и так путаницы хватает).
Это особенность друпала, а не Views: https://drupal.org/user/1399638/is-awesome-Drupalista
CMS'ки все с 404-ми не дружат. Поисковики уже должны как-то привыкнуть, особенно с учётом доли битрикса в рунете :)

Аватар пользователя zniki.ru

Знаю этот трюк, но не

kalabro: Знаю этот трюк, но не применяю, потому что это вносит путаницу во вьюхи (а там и так путаницы хватает).

Это дело вкуса, но статью писал, чтобы люди ожидали такое поведение.
А там уже сами выбирали подход.

kalabro: https://drupal.org/user/1399638/is-awesome-Drupalista

Катя, ты отличный Drupal разработчик. Бесспорно.

Plazik: Если вьюх много, то проще поставить модуль Views 404.

Спасибо, Plazik. Надо попробовать этот модуль.
Но для Drupal 7, только dev версия.

Аватар пользователя kalabro

Это дело вкуса

Это дело вкуса

Ну, если поисковики недовольны, то уже не вкуса, а денег. Просто я проблем подобного рода пока не встречала, хотя в друпале такое поведение по умолчанию для большинства путей.

Аватар пользователя zniki.ru

typo

  1. typo
  2. конкурент может создать пару ссылок

Ну а вообще, в данном случае пример простой.
На сложных проектах, если например ты при помощи pathauto задашь у вьюхи адрес /portfolio/, а у нод будет /portfolio/*, то после редактирования/удаления материалов, может получиться ситуация.

Аватар пользователя agentseo

с этой проблемой столкнулся

с этой проблемой столкнулся еще лет 5 назад. В индекс попадали дубли страниц списка новостей с совершенно непредсказуемыми хвостами. Проследить логику их появления в индексе особенно на большом сайте весьма проблематично, поэтому лучше сразу делать так чтобы 404 отрабатывала корректно.

Аватар пользователя zniki.ru

Хочу все предупредить!

Хочу все предупредить!
во views 3 (для Drupal 6, 7) есть небольшой баг из-за которого, если аргумент Global:null принимает значение 'all', то он игнорируется.

Если брать пример из статьи, то адреса

Будут работать.

есть патч для Drupal 7 https://www.drupal.org/files/issues/views-no_way_to_remove_all-1951456-5...
Помогите его потестировать.