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

Приветствую Вас, уважаемые посетители моего блога о Joomla. В данной статье я покажу Вам, как можно быстро и безопасно избавиться от ID (идентификатор) материала в адресе ссылки в Joomla 2.5 и Joomla 3.

article-sef-urlКак известно, движок Joomla добавляет в URL числовой идентификатор, который является, грубо говоря, порядковым номером материала или категории. В принципе, в нем нет ничего плохого, но выглядеть такая ссылка будет не очень красиво. Однако учтите, что ID - это специальный числовой номер, который присваивается каждому материалу отдельно. Служит он для уникализации ссылки в случае одинакового названия заголовков (например, у Вас есть 2 статьи с одинаковым названием - вот для их различия и существует ID). Соответственно, при его отключении, нельзя будет давать материалам одинаковые названия (только если они не будут находится в разных категориях).

Вот так выглядит ссылка с ID в адресе: http://joomla4.ru/voprosy/243-plagin-dlya-vydelenie-teksta-dlya-joomla

Нам же нужно сделать ссылку без ID: http://joomla4.ru/voprosy/plagin-dlya-vydelenie-teksta-dlya-joomla

Удалить идентификаторы из адреса ссылок можно с помощью специальных расширений, таких как 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));

Теперь все ссылки должны заработать и отображаться правильно и без ошибок. Я проверил ссылки, состоящие из одного слова, цифр и нескольких слов - все открывается и работает отлично без глюков и ошибок!

При копировании материала ссылка на сайт joomla4.ru обязательна.