Почему
По умолчанию движок генерирует ссылки на статьи, включая в путь категории.
при смене категории — меняется урл статьи, она может выпасть из поиска, или чего похуже.
Подумав, было решено на нашем проекте сократить ссылки, убрав из них промежуточные категории
из
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
правим функцию
public function addArticle($article){
а именно строки переменной $sql в ней:
$sql = "INSERT INTO cms_content (category_id, user_id, pubdate, enddate,
is_end, title, description, content,
published, hits, meta_desc, meta_keys,
showtitle, showdate, showlatest,
showpath, ordering, comments, seolink,
canrate, pagetitle, url, tpl)
VALUES ('{$article['category_id']}', '{$article['user_id']}', '{$article['pubdate']}', '{$article['enddate']}',
'{$article['is_end']}', '{$article['title']}', '{$article['description']}', '{$article['content']}', '{$article['published']}', 0,
'{$article['meta_desc']}', '{$article['meta_keys']}', '{$article['showtitle']}', '{$article['showdate']}', '{$article['showlatest']}',
'{$article['showpath']}', {$ordering}, '{$article['comments']}', '{$article['url']}',
'{$article['canrate']}', '{$article['pagetitle']}', '{$article['url']}', '{$article['tpl']}')";
поясню: в поле seolink изначально ничего не вставляется (""), я же вставляю в это поле {$article['url']}
чуть ниже в этой же функции нужно закомментировать строки, обновляющие seolink
//$article['seolink'] = $this->getSeoLink($article);
//$this->inDB->query("UPDATE cms_content SET seolink='{$article['seolink']}' WHERE id = '{$article['id']}'");
С добавлением статьи разобрались, теперь, обновление.
чуть ниже, функция
public function updateArticle($id, $article, $not_upd_seo = false){
заменяем блок "
if(!$not_upd_seo){" на
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'];
}
В общем-то, уже всё, но дополнительно я сделал поле "seolink" уникальным в таблице, через phpmyadmin (правда, не посмотрел, возможно оно и было помечено как уникальное), чтобы не было 2 статей с одним урл.
И я не проверял что будет если добавить 2 статьи с одинаковым урл. По идее база не сохранит, но будет ли при этом выводиться какая-то ошибка — не проверял.