Редиректим отключенные товары в их родительские категории в PrestaShop
Автоматический Redirect в родительскую категорию при отключении товара в админке PrestaShop 1.6

Привет! Возникла необходимость автоматически редиректить отключенные товары в их родительские категории, чтобы минимизировать растущее число ошибок 404, которые возникают, когда товар отключается на витрине.
Так как товаров огромное количество и вручную выставлять им редиректы не представляется возможным, а покупать и устанавливать какой-либо очередной SEO-модуль с кучей ненужного функционала нет особого желания, решил поискать более простые решения данного вопроса. В глубинках известного форума нашёл то, что искал.
Выкладываю у себя, чтобы инфа была под рукой и тот, кто ищёт подобное решение нашёл его сразу и не тратил своё время на его поиски. В конце записи будет ссылка на первоисточник. Приступим.
Создаём файл «ProductController.php» в /override/controllers/front/
Создаём файл «ProductController.php» в /override/controllers/front/ со следующим содержимым:
<?php
if (!defined('_CAN_LOAD_FILES_'))
exit;
class ProductController extends ProductControllerCore
{
/*
* Redirect 301 на родительскую категорию для отключенных товаров
* у которых не выставлена принудительная переадресация в админке
*/
public function init()
{
FrontController::init();
if ($id_product = (int)Tools::getValue('id_product')) {
$this->product = new Product($id_product, true, $this->context->language->id, $this->context->shop->id);
}
if (Validate::isLoadedObject($this->product)) {
$this->canonicalRedirection();
if (!$this->product->isAssociatedToShop() || !$this->product->active) {
if (Tools::getValue('adtoken') != Tools::getAdminToken('AdminProducts'.(int)Tab::getIdFromClassName('AdminProducts').(int)Tools::getValue('id_employee')) && $this->product->isAssociatedToShop()) {
$this->context->smarty->assign('adminActionDisplay', false);
if (!$this->product->id_product_redirected && $this->product->id_category_default) {
header('HTTP/1.1 301 Moved Permanently');
header('Location: '.$this->context->link->getCategoryLink($this->product->id_category_default));
exit;
}
}
}
}
parent::init();
}
}
Можно заменить заголовок «HTTP/1.1 301 Moved Permanently» на «HTTP/1.1 302 Moved Temporarily», если нет уверенности в том, что товар отключен навсегда.
Сохраняем и закрываем файл «ProductController.php». Далее идём в админку и чистим кэш.

После очистки кэша, в файле /cache/class_index.php элемент массива «ProductController» должен иметь такой вид:

Проверяем как работает
Теперь проверяем как это работает, для этого идём в админку и находим отключенный товар с которого нет редиректа

Копируем ссылку на товар, кликнув ПКМ по иконке с глазом

Вставляем в адресную строку и удаляем всё, что находится после непосредственного URL-адреса товара:

?adtoken=11ca1bexxxxxxxxxxxx7658d2bdxxxc8e&ad=adminxxxxxxxxx&id_employee=1
Если не удалить данную подстроку, то попадём в карточку товара как админ.
Переходим по ссылке и наблюдаем редирект в родительскую категорию отключенного товара.
Вывод
Вывод? С точки зрения SEO, рекомендую использовать вариант с заголовком «HTTP/1.1 302 Moved Temporarily», если нет пущей уверенности в том, что товары отключены навсегда и только в том случае, если количество товаров в каталоге превышает несколько тысяч и состоянием, наличием товаров управляет какая-либо синхронизация. В противном случае старайтесь следить «за чистотой» вручную.
Проверено на PrestaShop 1.6.1.1 и PrestaShop 1.6.1.20
Подсмотрено тут.