Убрать названия категорий из url статьи

+19
4.06K

Почему

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

из

site.ru/eda/pervoe/salat.html

сделать

site.ru/salat.html

Как


В базе хранятся 2 урла статьи: url и seolink
url — адрес страницы, seolink — путь + адрес страницы
например:

site.ru/eda/pervoe/salat.html
url — salat.html
seolink — eda/pervoe/salat.html

При вводе адреса, движок выбирает из базы статью с соответствующим seolink.

Всё что нам нужно — при создании либо редактировании статьи записывать одно и тоже значение url как в url, так и в seolink.

Простое решение от Till

Решение оказалось довольно простым. \components\content\model.php, строка примерно 480. Закомментируйте вот этот кусок кода:
  1. if ($path_list){
  2. foreach($path_list as $pcat){
  3. if ($pcat['id']!=1){
  4. $seolink .= cmsCore::strToURL(($pcat['url'] ? $pcat['url'] : $pcat['title'])) . '/';
  5. }
  6. }
  7. }
старое решение, оставлю на всякий случай

Для этого, в файле

components/content/model.php

правим функцию

  1. public function addArticle($article){
а именно строки переменной $sql в ней:
  1. $sql = "INSERT INTO cms_content (category_id, user_id, pubdate, enddate,
  2. is_end, title, description, content,
  3. published, hits, meta_desc, meta_keys,
  4. showtitle, showdate, showlatest,
  5. showpath, ordering, comments, seolink,
  6. canrate, pagetitle, url, tpl)
  7. VALUES ('{$article['category_id']}', '{$article['user_id']}', '{$article['pubdate']}', '{$article['enddate']}',
  8. '{$article['is_end']}', '{$article['title']}', '{$article['description']}', '{$article['content']}', '{$article['published']}', 0,
  9. '{$article['meta_desc']}', '{$article['meta_keys']}', '{$article['showtitle']}', '{$article['showdate']}', '{$article['showlatest']}',
  10. '{$article['showpath']}', {$ordering}, '{$article['comments']}', '{$article['url']}',
  11. '{$article['canrate']}', '{$article['pagetitle']}', '{$article['url']}', '{$article['tpl']}')";
поясню: в поле seolink изначально ничего не вставляется (""), я же вставляю в это поле {$article['url']}

чуть ниже в этой же функции нужно закомментировать строки, обновляющие seolink

  1. //$article['seolink'] = $this->getSeoLink($article);
  2. //$this->inDB->query("UPDATE cms_content SET seolink='{$article['seolink']}' WHERE id = '{$article['id']}'");
С добавлением статьи разобрались, теперь, обновление.
чуть ниже, функция
  1. public function updateArticle($id, $article, $not_upd_seo = false){
заменяем блок "if(!$not_upd_seo){" на
  1. if(!$not_upd_seo){
  2. if ($article['url']) {
  3. $article['url'] = cmsCore::strToURL($article['url']);
  4. }
  5. /*$article['seolink'] = $this->getSeoLink($article);
  6. $article_seo_sql = "url='{$article['url']}', seolink='{$article['seolink']}',";
  7. */
  8. $article['seolink']=$article['url'];
  9. }
В общем-то, уже всё, но дополнительно я сделал поле "seolink" уникальным в таблице, через phpmyadmin (правда, не посмотрел, возможно оно и было помечено как уникальное), чтобы не было 2 статей с одним урл.
И я не проверял что будет если добавить 2 статьи с одинаковым урл. По идее база не сохранит, но будет ли при этом выводиться какая-то ошибка — не проверял.



Оставлю оба решения на случай новых обновлений инстанта, мало ли.


После применения минихака делайте исправления: 1.10.1 Решение проблемы из-за "Убрать названия категорий из url статьи"
+3
picaboo picaboo 11 лет назад #
лучше добавить туда id новости. так не будет дублей, можно делать выборку по id (нагрузка меньше).
+2
Soul Soul 11 лет назад #
Пока eoleg еще не написал "нужно еще указать для какой версии." smile - напишу я - поработайте над вопросом подачи предлагаемого Вами материала (относится не к данной статье, а ко всем Вашим, увиденным мной).
0
artscripts artscripts 11 лет назад #
Я видимо туплю, но я так и не понял как это все применить, закоментировал строки
//$article['seolink'] = $this->getSeoLink($article);
//$this->inDB->query("UPDATE cms_content SET seolink='{$article['seolink']}' WHERE id = '{$article['id']}'");

потом сделал замену на

if(!$not_upd_seo){
if ($article['url']) {
$article['url'] = cmsCore::strToURL($article['url']);
}
/*$article['seolink'] = $this->getSeoLink($article);
$article_seo_sql = "url='{$article['url']}', seolink='{$article['seolink']}',";
*/
$article['seolink']=$article['url'];
}
И ниче не открывается вообще. Веосия 1.10.1 Что я не так делаю.
0
Cruzka Cruzka 11 лет назад #
попробуйте всё откатить (вернуть как было) и воспользоваться более простым решением
0
Kotanol Kotanol 11 лет назад #
Очень полезный хак. А под 1.10.3 как реализовать?

Еще от автора

Адаптируем стандартный диз 1.10.х под мобильные устройства
Для тех кто не в курсе, Гугл и Яндекс обещают понижать в выдаче сайты с неадаптивным дизайном (которые неудобно просматривать с телефона).
Добавленные статьи из админки не отображаются в ленте активности - фикс
При добавлении статей из админки, не создаются почему-то метки в ленте активности.
Чутка правим поиск по сайту
При поиске по сайту, если ничего не нашлось (а бывает что не находится то что точно есть), то Инстант предлагает поискать в яндексе.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.