Jump to content

Redireccionamiento a home... es posible?


Recommended Posts

Hola a todos,

 

Me gustaría saber si existe la posibilidad de que en caso de desactivar un producto, si alguien accede a la URL del producto se le redireccione automáticamente a la home...

 

He buscado en el foro información al respecto pero solo he encontrado temas relacionados con redireccionamiento 301 y no estoy seguro de si esto es lo correcto o de como hacerlo.

 

Gracias :rolleyes:

Link to comment
Share on other sites

Puedes modificar (haciendo copia de seguridad por si las moscas) el archivo .htaccess que se encuentra en el directorio raíz de prestashop. Añadiendo al principio

 

RewriteRule ^url_producto_desactivado$ /index.php [L]

 

Lo malo es que hay que ir uno por uno..se podría automatizar que al desactivar un producto se añadiese la regla automáticamente, pero para salir del paso...

Edited by egomezpe (see edit history)
  • Like 1
Link to comment
Share on other sites

Puedes modificar (haciendo copia de seguridad por si las moscas) el archivo .htaccess que se encuentra en el directorio raíz de prestashop. Añadiendo al principio

 

RewriteRule ^url_producto_desactivado$ /index.php [L]

 

Lo malo es que hay que ir uno por uno..se podría automatizar que al desactivar un producto se añadiese la regla automáticamente, pero para salir del paso...

 

Gracias por la respuesta...

 

Y de qué modo se podría automatizar? por ahora no hay demasiados productos a los que hubiera que hacer eso pero en caso de haberlos sería interesante incorporar algún tipo de proceso automatizado para que con solo "desactivar" el producto redireccionara a la home o a la categoría o a lo que interesara...

Link to comment
Share on other sites

Una opción sencilla es que en el archivo ProductController.php (controllers/front/ProductController.php) para la versión 1.5.4.0 línea 128:

 

 

 

Comentes lo que hace por defecto (página 404, producto no disponible) y hagas una redirección al home (que es lo que hace el código que le sigue)

 

/*header('HTTP/1.1 404 Not Found');
 header('Status: 404 Not Found');
 $this->errors[] = Tools::displayError('This product is no longer available.');*/	
 $id_lang = Context::getContext()->language->id;	  
 $shop = Context::getContext()->shop;
 $url = 'http://'.$shop->domain.$shop->getBaseURI().Language::getIsoById($id_lang).'/';
 header('HTTP/1.1 301 Moved Permanently');	  
header('Location: '.$url);

 

Ten en cuenta que futuras actualizaciones de Prestashop machacarán estos cambios.

Link to comment
Share on other sites

Se puede sobrescribir el método init() en override/controllers/front/ProductController.php pero no quedaría tampoco muy limpio porque si copiamos todo el código (con la modificación) y lo metemos en esta clase hija, necesitamos que llame al código de la clase "abuela"..., en fin un rollo de herencia.

 

Si que se puede copiar una buena parte del código y mirar de hacer algo. Pero bien mirado también esta la opción de en el init de esta clase hija poner:

<?php
class ProductController extends ProductControllerCore
{


 public function init(){
  parent::init();
  //Habría que mirar también que en los errores estuviese el error de este producto no disponible...
  if(in_array('Status: 404 Not Found', headers_list() )){
header_remove('Status');
$id_lang = Context::getContext()->language->id;
$shop = Context::getContext()->shop;
$url = 'http://'.$shop->domain.$shop->getBaseURI().Language::getIsoById($id_lang).'/';
header('HTTP/1.1 301 Moved Permanently');
header('Location: '.$url);
  }

 }

}

 

A mi en local también me va bien, lo que hace es mirar si hay un 404, aunque se debería mirar en concreto que exista el error de producto no disponible (pero el error sera diferente en cada idioma ya que no se guarda ningún código...)

 

En este caso la herencia funciona bien porque dejamos al código de prestashop hacer su trabajo y luego hacemos lo nuestro.

Edited by egomezpe (see edit history)
Link to comment
Share on other sites

Me parece que esto debería funcionar

 

class ProductController extends ProductControllerCore
{


 public function init(){

   //llamamos al init() del Abuelo
  $reflectionMethod = new ReflectionMethod(get_parent_class(get_parent_class($this)),
									 'init');
  $reflectionMethod->invoke($this);
  //Código modificado de ProductControllerCore
  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))
  {
header('HTTP/1.1 404 Not Found');
header('Status: 404 Not Found');
$this->errors[] = Tools::displayError('Product not found');
  }
  else
  {
$this->canonicalRedirection();


  //**************** ETC ETC*****************************************************************************

 }

Edited by egomezpe (see edit history)
Link to comment
Share on other sites

Me parece que esto debería funcionar

 

class ProductController extends ProductControllerCore
{


 public function init(){

//llamamos al init() del Abuelo
  $reflectionMethod = new ReflectionMethod(get_parent_class(get_parent_class($this)),
									 'init');
  $reflectionMethod->invoke($this);
  //Código modificado de ProductControllerCore
  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))
  {
header('HTTP/1.1 404 Not Found');
header('Status: 404 Not Found');
$this->errors[] = Tools::displayError('Product not found');
  }
  else
  {
$this->canonicalRedirection();


  //**************** ETC ETC*****************************************************************************

 }

 

Gracias, voy a probarlo.

 

---

 

Gracias.

  • Like 1
Link to comment
Share on other sites

Guest
This topic is now closed to further replies.
×
×
  • Create New...