При переносе интернет-магазина на OctoberCMS возникла задача сделать ридеректы со старых ссылок на новые. Логика роутинга немного изменилась, например, было - site.com/catalog/b4312
, где b4312 - товар, а стало - site.com/category/best_product
.
Итак, первое, что я сделал - создал плагин с моделью Link
, с полями:
Далее сделал консольную команду для категорий, товаров, статей и т.д.
В ней скрипт для создания линков, пример для категорий:
DB::transaction(function () {
DB::table('categories')->select('slug', 'id')
->orderBy('id')
->chunk(1000, function ($cats) {
foreach ($cats as $cat) {
Link::create([
'newLink' => 'category/' . $cat->slug,
'oldLink' => 'catalog/c' . $cat->id,
]);
}
});
});
Как создавать плагин и все из него вытекающее можете прочитать тут.
Сам редирект я делал используя ServiceProvider. Их регистрация находится в config/app.php
- providers
.
Вписываем имя и расположение будущего провайдера под System\ServiceProvider
.
Создаем сам провайдер, у меня это linkServiceProvider
и находится он в корневой папке плагина, рядом с Plugin.php
.
Внутри провайдера нам нужен только метод boot:
class LinksServiceProvider extends ModuleServiceProvider
{
public function boot()
{
$uri = Request::path();
$link = DB::table('links')->where('oldLink',$uri.'/')
->first();
if(!empty($link)){
Route::get($uri,function() use($link){
return redirect(ENV('APP_URL').'/'.$link->newLink);
});
}
}
}
Request::path()
возвращает нам URI, то есть наша предположительная старая ссылка. Далее мы ищем в базе объект с таким же адресом в колонке oldLink
, и если находим - делаем редирект на новую ссылку.
ENV('APP_URL')
- этот параметр мы прописываем в нашем конфиге или env. Вот и все.
P.s. В сео ничего не понимаю, есть задача - есть решение =)