PrestaShop – Redirect su errore 404 su prodotto mancate

Se un prodotto viene cancellato o disabilitato, la url del prodotto restituisce un errore 404 ed una pagina 404. Un errore http 404 dice anche ai motori dir ricerca che quella pagina non esiste più (e potrà essere rimossa dal motore di ricerca).

Possono esserci casi in cui si vuole modificare questa dinamica e rispondere con un comportamento diverso, che può essere:

  • redirect su pagina specifica
  • risposta http 200 invece di 404
  • personalizzazione della pagina predefinita per errore 404

Come si modifica questo comportamento ?

Il modo più rapido (e il peggiore dal punto di vista della manutenzione dell’applicazione) è modificare direttamente i controller nel punto in cui questa azione viene gestita.

Questa operazione è gestita separatamente da ogni controller

  • Prodotto
  • Categoria
  • Pagina

Controller Prodotto

La gestione di questo evento si trova in “controllers/front/ProductController.php”

questo il codice predefinito

 public function init()

{

....

if (!Validate::isLoadedObject($this->product)) {

header('HTTP/1.1 404 Not Found');

header('Status: 404 Not Found');

$this->errors[] = $this->trans('This product is no longer available.', [], 'Shop.Notifications.Error');

$this->setTemplate('errors/404');

return;

Ecco cosa succede

  1. Dalla Url viene estratto il prodotto da caricare
  2. Il caricamento del prodotto non va a buon fine (es.: non esiste più)
  3. Viene generato codice HTTP 404
  4. Viene caricata la pagina template errors/404

Mostrare un contenuto personalizzato

Ora se vogliamo restituire un codice 200 invece del 404, e personalizzare, basta semplicemente modificare il template di risposta e commentare le funzioni che restituiscono il codice 404.

public function init()

{

....

if (!Validate::isLoadedObject($this->product)) {

$this->setTemplate('errors/404-product.tpl');

return;

...

Per personalizzare il contenuto si può creare il file template ../errors/404-product.tpl ed inserire in contenuto desiderato

Redirect in Home

Invece per un redirect in homepage, il codice è come segue

...

if (!Validate::isLoadedObject($this->product)) {

header('HTTP/1.1 302 Moved Temporarily');

header('Cache-Control: no-cache');

header('Location: /' );

exit;

...

    Richiesta informazioni o preventivo

    Sono al corrente che i miei dati saranno trattati nel rispetto della mia Privacy

    Torna in alto