Как убрать ID материала из ссылок в Joomla 2.5 и Joomla 3

Приветствую Вас, уважаемые посетители моего блога о Joomla. В данной статье я покажу Вам, как можно быстро и безопасно избавиться от ID (идентификатор) материала в адресе ссылки в Joomla 2.5 и Joomla 3.
Как известно, движок Joomla добавляет в URL числовой идентификатор, который является, грубо говоря, порядковым номером материала или категории. В принципе, в нем нет ничего плохого, но выглядеть такая ссылка будет не очень красиво. Однако учтите, что ID - это специальный числовой номер, который присваивается каждому материалу отдельно. Служит он для уникализации ссылки в случае одинакового названия заголовков (например, у Вас есть 2 статьи с одинаковым названием - вот для их различия и существует ID). Соответственно, при его отключении, нельзя будет давать материалам одинаковые названия (только если они не будут находится в разных категориях).
Вот так выглядит ссылка с ID в адресе: _http://joofaq.ru/poleznie-stati-dlya-vebmastera/onlayn-servisi/68-reg-ru-domeny-hosting-servera
Нам же нужно сделать ссылку без ID: _http://joofaq.ru/poleznie-stati-dlya-vebmastera/onlayn-servisi/reg-ru-domeny-hosting-servera
Удалить идентификаторы из адреса ссылок можно с помощью специальных расширений, таких как ARTIO JoomSEF, SH404SEF и других аналогичных программ для создания красивых ЧПУ ссылок, но эти компоненты несут большую нагрузку на сервер и устанавливаются в крайнем случае. Как правило, их ставят тогда, когда на сайте используются другие компоненты, для которых не получается сделать ЧПУ ссылки стандартным SEF плагином Joomla.
Мы же будем реализовывать удаление ID из ссылок с помощью небольших модификаций в системных файлах. Главное - не забывайте сохранять данные файлы при обновлении Joomla!
Отключение ID материала в Joomla 2.5 и Joomla 3 - Вариант 1
Для всего этого нам нужно будет лишь сделать некоторые модификации файлов движка, которые помогут нам добиться нужного результата. В самой Joomla (начиная с версии 1.6) уже предусмотрена функция отключения ID материала из адреса ссылок, но для открытия этой возможности нам нужно добавить в файле: корень_сайта/administrator/components/com_content/config.xml строки:
<field name="sef_advanced_link"
type="radio"
default="1"
label="SEF: Удалить ID материала в ссылке?"
description="Удалить ID материала в ссылке?">
<option value="0">JNO</option>
<option value="1">JYES</option>
</field>
В принципе, эти строки можно добавить в любое место в данном файле, даже в самое начало (только не забудьте сохранить файл в кодировке UTF-8 без BOM, иначе вместо русских символов Вы увидите иероглифы). После добавления этих строк кода, Вы получили возможность включать и отключать ID из ссылок прямо из административной панели своего сайта. Для этого Вам нужно перейти в менеджер материалов и нажать "Настройки". И в настройках теперь у Вас будет находиться строка: "Удалить ID материала в ссылке?":
Нажимаете "Да". После этого очистите кэш сайта. Теперь ссылки в Joomla 2.5 будут отображаться без ID.
Если на некоторых ссылках выскакивает 404 ошибка, то следует в файле _ваш-сайт/components/com_content/router.php найти строку:
// then we assume it is a category. If they don't we assume it is an article if ($count === 1) {
И заменить её на:
// then we assume it is a category. If they don't we assume it is an article if ($count === 1 && !$advanced) {
Внимание: Обратите внимание, что данный параметр может отличаться в разных версиях Joomla. Например, в Joomla 3 у меня было так:
if ($count === 1 {
А в Joomla 2.5 может быть вот так:
if ($count == 1 {
Поэтому старайтесь быть очень внимательными, чтобы не пришлось потом долго искать ошибку.
Важно: все категории должны быть привязаны к пунктам меню - если этого не будет, то могут возникнуть ошибки при генерации ссылок. Так же обратите внимание, что не будут работать ссылки, если название материала состоит из одного слова. Для решения этого косяка нужно опять открыть файл _ваш-сайт/components/com_content/router.php и найти строку:
->where($db->quoteName('alias'). ' = ' . $db->quote($db->quote($segment)));
И заменить её на:
->where($db->quoteName('alias'). ' = ' . $db->quote($segment) );
Только не забудьте, что при обновлении Joomla этот файл будет заменен! Поэтому настоятельно рекомендую сохранить его в отдельном месте, чтобы потом заново не вносить изменения.
Отключение ID материала в Joomla 2.5 и Joomla 3 - Вариант 2
Второй метод так же работает на Joomla 2.5 и Joomla 3. Но его минус в том, что при каждом обновлении движка нужно будет заново вносить эти изменения или просто перезаписывать файл роутера поверх нового. Итак, в этом способе мы будем работать только с файлом _ваш-сайт/components/com_content/router.php.
Для начала найдите строку (примерно 27 строка):
$advanced = $params->get('sef_advanced_link', 0);
И замените её на:
$advanced = $params->get('sef_advanced_link', 1);
Затем найдите вот эту строку (в Joomla 2.5 - 228 строка, в Joomla 3 - 250):
$advanced = $params->get('sef_advanced_link', 0);
И замените её на:
$advanced = $params->get('sef_advanced_link', 1);
Теперь опускайтесь чуть ниже (в Joomla 2.5 - строка 228, в Joomla 3 - строка 272) и находите вот этот кусок кода:
if (strpos($segments[0], ':') === false) { $vars['view'] = 'article'; $vars['id'] = (int) $segments[0]; return $vars; }
И закомментируйте его (при комментировании, код перестает обрабатываться), чтобы получилось вот так:
/*if (strpos($segments[0], ':') === false) { $vars['view'] = 'article'; $vars['id'] = (int) $segments[0]; return $vars; }*/
Ну или полностью удалите, тут уже решать Вам. Но лучше закомментировать его, чтобы с случае чего можно было вернуть все на место.
Теперь ссылки на Вашем сайте в Joomla 2.5 и Joomla 3 будут отображаться без ID материалов. Но в Joomla 3 могут появиться ошибки 404 при использовании данного способа - чтобы избежать этого, читайте примечание ниже.
Важное примечание для Joomla 3: если при переходе по ссылкам без ID у Вас возникает 404 ошибка, то найдите в файле _ваш-сайт/components/com_content/router.php строку 376 (в разных версиях Joomla эта строка может отличаться):
->where($db->quoteName('alias') . ' = ' . $db->quote($db->quote($segment)));
И замените её на:
->where($db->quoteName('alias') . ' = ' . $db->quote($segment));
Теперь все ссылки должны заработать и отображаться правильно и без ошибок. Я проверил ссылки, состоящие из одного слова, цифр и нескольких слов - все открывается и работает отлично без глюков и ошибок!
Если данная статья оказалась для Вас полезна, то подписывайтесь на получение материалов любым удобным для Вас способом.
Предыдущие статьи:
- Добавляем модуль "Сейчас на сайте". Стандартный счетчик онлайн посетителей и пользователей сайта в Joomla - 03/04/2011
- Модуль поиска по сайту на Joomla - 30/03/2011
- Добавляем модуль "Последние новости" - 28/03/2011
- Добавляем модуль "Самые читаемые" материалы - 27/03/2011
- Добавляем модуль "Навигация по сайту" или хлебные крошки в Joomla - 26/03/2011
Комментарии
Вы даже не представляете, как мне помогли!
Восстановление оригинальных файлов должно помочь. Так же не забудьте " Для этого Вам нужно перейти в менеджер материалов и нажать "Настройки". И в настройках теперь у Вас будет находиться строка: "Удалить ID материала в ссылке?":" Вот тут вернуть настройку!
А то половина сайта ошибку 404 выдает.
Файлы config.xml и router.php заменил на оригинальные, но это не помогло.
Удалил материал нечайно, следовательно создал новый по быстрому и в меню разумеется указал на новый материал... Теперь ссылка на материал, то была в поисковиках 404 ((( Как вернуть в Joomle туже ссылку? Потому что там (на сайте самом) сейчас новая идёт (((
"Так же обратите внимание, что не будут работать ссылки, если название материала состоит из одного слова."
Подскажите решение
->where($db->qu oteName('alias' ) . ' = ' . $db->quote($segment));
и не работает
У меня такая же ситуация с Joomla! 3.3.6
Статья, снова помогла, восстановил сайт после обновления))) СпАсИбО!!!
joomla 2.5
второй способ работает
но не могу победить 404 на модулях "Последние новости" и "Список материалов категорий"
ссылки стали новые - но ведут в 404
Но почему в canonical - адрес стал относительный.
После того, как Вы зашли в менеджер материалов - нажмите кнопку "Настройки". А уже там ищите эти строки.
Сдела по вартанту 1 на Joomla 3.3.
Зашел в менеджер материалов.
Просмотрел все ссылки.
Не вижу в меню: "Отключить ID материала в ссылке".
На какой вкладке эта опция?
Честно сказать, я не знаю. Как-то не заморачивался по этому поводу. Но сейчас ради интереса я попробовал на этом сайте вставить ID в урл и выпала 404 ошибка.
Но на этом сайте я ещё вносил изменения, указанные на форуме Joomlaforum (но не помню, где именно я нашел их, так как это было очень давно).
Посмотрите так же вот сюда http://joomline.ru/rasshirenija/plugin/jlnodubles.html
В 3.3 я ещё сам не тестировал. Попробуйте поэкспериментир овать или комбинировать несколько способов. Я чуть позже отпишу, если руки дойдут попробовать.
Огромное спасибо от RusJoomla
Скиньте мне ссылку на сайт по контактам, указанным на этой странице http://joofaq.ru/avtor-bloga
Иван, я делал эти изменения и в 3.2.0 и с каждым новым обновлением я снова делаю эти процедуры и у меня все получается. Попробуйте сделать первым вариантом, только не забудьте потом в админке включить "Отключение ID"
Сделал как написано в п.1 - в итоге всё работает как надо, кроме новостей - выскакивает 404 ошибка (строчку от избавления от 404-как Вы писали прописал).
Что может быть?
Спасибо! На других сайтах рекомендации были неполными. Делал по Варианту 2 учитывая "Важное примечание для Joomla 3" (без него 404 была)
Ребят, Вы бы хоть написали, что именно у Вас не работает и каким способом Вы делали?
У меня на всех сайтах стоит Joomla 3.2.2 и везде работает!! Просто где-то что-то сделали не так.
Поддерживаю, симптом такой же! Joomla 3.2.0.
Админ - напиши как в новой версии, не в службу, а ...
Заранее спасибо!
Аналогично не работает на Joomle 3.2.
Алексей, данный сайт, как и все мои проекты, сделан на Joomla 3.2. И везде все работает адекватно.
Поэтому Вам нужно поискать причину у себя и разобраться до конца.
При первом способе перестает открывать материалы, тыкаешь на кнопку подробнее, а он просто обновляет уже открытую страницу.
При втором способе вообще никаких изменений не увидел)) ИД из ссылки не пропали, даже кеш очищал.
Вам стоит разобраться, проверить, и возможно пометить, что не работает для джумлы 3.2, что бы не вводить людей в заблуждение.
У меня стоит К2
Во втором варианте опечатка с номером строки - первая замена на 7-ой строке, вторая на 208 (а написано 228), и третья - комментирование на 228.
А откуда у Вас item в ссылках? Как я понял, у Вас стоит Zoo или аналогичный компонент?
Второй способ помог.
за $db->quote($seg ment)); отдельное спасибо :)
Сергей, если мне не изменяет память, на версии Joomla 2.5.14 не было глюка с однословным урлом.
Данный код актуален для версии Joomla 3
И где же в файле router.php в joomla 2.5 эта строка?
$db->quote($segment));
Метод очень распространен в сети, но фишку для J3 нашел только у вас.
Еще раз спасибо. Все работает отлично.
Не за что. Очень приятно, когда оказываешься хоть кому-то полезен ))