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

[решение] для 1.9

#1 26 октября 2012 в 02:03

Почему

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

из

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.

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

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 статьи с одинаковым урл. По идее база не сохранит, но будет ли при этом выводиться какая-то ошибка — не проверял.
#2 26 октября 2012 в 02:17
А почему нельзя тогда не внося изменений просто брать урл?
#3 26 октября 2012 в 02:19


А почему нельзя тогда не внося изменений просто брать урл?

eoleg

можно, так даже проще будет.
#4 26 октября 2012 в 02:22
если найти где…
#5 26 октября 2012 в 02:43
Жаль настройки не позволяют второй плюс поставить.
Постараюсь не забыть.
#6 26 октября 2012 в 08:25

И я не проверял что будет если добавить 2 статьи с одинаковым урл.

Cruzka
Вот с этого стоило бы начать!
#7 26 октября 2012 в 09:39
Cruzka, ваше решение упрется в дубли страниц. для решения этой проблемы придется вводить в урл индентификатор (id новости) и делать выборку статей по нему. некоторые утверждают что выборка по id быстрее чем по урлу. может даже ускорите своим хаком движок.
#8 26 октября 2012 в 11:50
Вот здесь — простое решение: instantcms.ru/forum/thread6216.html. В InstantCMS 1.10 RC5 работает, в RC6 ещё не проверял. Или, может, с этим способом что-то не так?

А у кого-нибудь есть решения
— как уменьшить таким же образом вложенность постов блогов,
— как убрать из урла профиля users/?

Встречал много на форуме по этим темам, но решения не законченные (либо я других не видел).
#9 26 октября 2012 в 12:44

если найти где...

Cruzka
А это, если я правильно понимаю, находится не в 1 месте: это и ссылки редактирования, и лента обновлений, и комментарии..

Cruzka:
И я не проверял что будет если добавить 2 статьи с одинаковым урл.
Вот с этого стоило бы начать!

Ленивый
вторая статья с тем же урл не добавится, будет ошибка mysql. другое дело, как на неё среагирует Instant.

Cruzka, ваше решение упрется в дубли страниц. для решения этой проблемы придется вводить в урл индентификатор (id новости) и делать выборку статей по нему. некоторые утверждают что выборка по id быстрее чем по урлу. может даже ускорите своим хаком движок.

picaboo
Вроде как
site.ru/grecheskij-123.html, где 123 — id? тогда будут рабочими и указывающими на эту же статью любые урл вида site.ru/asdasdads-123.html, где просто тот же id. Запросто могут и дубли появиться

Вот здесь — простое решение: instantcms.ru/forum/thread6216.html. В InstantCMS 1.10 RC5 работает, в RC6 ещё не проверял. Или, может, с этим способом что-то не так?

Positive
Я, честно говоря, не искал на форуме готовых решений..
А так в том способе делается то же, что и в моём: в базе сохраняется в seolink то же что в url, и всё
#10 26 октября 2012 в 18:48

Вроде как
site.ru/grecheskij-123.html, где 123 — id? тогда будут рабочими и указывающими на эту же статью любые урл вида site.ru/asdasdads-123.html, где просто тот же id. Запросто могут и дубли появиться

Cruzka

не будут.

мы формируем урл: 'id'-'seolink'

пользователь может менять seolink, а id автоматом подставится.

поэтом удублей не будет при урле вида site.ru/123-grecheskij-salat.html
#11 26 октября 2012 в 21:36
ЕЩЕ бы редирект со старых URL 301-ый получить…
#12 26 октября 2012 в 22:45


Вроде как
site.ru/grecheskij-123.html, где 123 — id? тогда будут рабочими и указывающими на эту же статью любые урл вида site.ru/asdasdads-123.html, где просто тот же id. Запросто могут и дубли появиться

Cruzka

не будут.

мы формируем урл: 'id'-'seolink'

пользователь может менять seolink, а id автоматом подставится.

поэтом удублей не будет при урле вида site.ru/123-grecheskij-salat.html

picaboo

понял. нужно чтобы выборка была по id, а если пользователь зашёл на страницу с верным id, но неверным seolink, редиректить его 301 на правильный сеолинк с ид
#13 27 октября 2012 в 13:48
А стоит ли убирать названия категорий?
В названиях категорий содержатся ключи, которые поисковики тоже учитывают при выдаче
ИМХО для поисковика адрес вида

site.ru/salat/123-grecheskij-salat.html

будет иметь больший вес, чем адрес

site.ru/123-grecheskij-salat.html

или я не прав?
#14 27 октября 2012 в 14:18

А стоит ли убирать названия категорий?
В названиях категорий содержатся ключи, которые поисковики тоже учитывают при выдаче
ИМХО для поисковика адрес вида

site.ru/salat/123-grecheskij-salat.html

будет иметь больший вес, чем адрес

site.ru/123-grecheskij-salat.html

или я не прав?

MobiSSS
Стерень вложенности урлов определяет значимость контента в пределах сайта. Чем ближе к корню, тем больше значимость. Поэтому и рекомендуется вложенность не более двух уровней.

P.S. Спорить на эту тему ни с кем не буду. Руководствуюсь инструкциями эксперта, которому у меня есть основания доверять.

И буду очень благодарен, если кто-то подскажет как решить проблемы, озвученные в моём посте #8:

— как уменьшить таким же образом вложенность постов блогов,
— как убрать из урла профиля users/?

Positive
.
#15 27 октября 2012 в 14:37

— как убрать из урла профиля /users/


я думаю, users нужно переводить на поддомены. Было бы здорово
Вы не можете отвечать в этой теме.
Войдите или зарегистрируйтесь, чтобы писать на форуме.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.