Redirect brugerne fra udgået produkter til default kategori

Jeg besluttede egentlig at lave det her indlæg da debatten var oppe og vende på prestashop forum for noget tid siden, men har først nu haft tid til det. Jeg tror alle sammen at vi synes det er irriterende at brugerne skal lande på en produktside med et udgået produkt.

Det kunne enden være fra et bogmærke i browseren eller et link fra et forum eller en anden hjemmeside som sender god og købe stærk trafik over til dig.

Egentlig så burde man fra case til case vurdere hvor man vil sende brugeren hen. For nogen shops er der måske et andet produkt som erstatter det udgået produkt, og så bør man helt sikkert sende brugeren videre til den side. Faktisk vil jeg anbefale at man bruger den gamle produkt side til det nye produkt, for hvis man så bruger prestashop version 1.3.6 eller nyere, så redirecter prestashop selv brugeren til den nye brugervenlig URL, hvis man altså retter den.

Hvis man ligesom os fx sælger bumpits, andre accessories og tøj, hvor produkt sortiment ofte skiftes ud, og de gamle produkter sjælent erstattes af nogen tilsvarende så vil jeg anbefale følgende core ændring. Den er indtil videre kun testet i version 1.3.x, og min umiddelbare vurdering er at koden vil se anderledes ud i 1.4.x, gør den det så vil jeg indenfor en overskuelig frem tid komme med en rettelse der også.

Find og åben /Product.php og find: (kan variere lidt alt efter version)


	if (!Validate::isLoadedObject($product) OR !$product->active)
		$errors[] = Tools::displayError('product is no longer available');

Erstat med:


	$product = new Product($id_product, true, intval($cookie->id_lang));
	if (!Validate::isLoadedObject($product) OR !$product->active)
	{
		$category = new Category($product->id_category_default, intval($cookie->id_lang));
		$categorylink = $link->getCategoryLink($category);
		Header( "HTTP/1.1 301 Moved Permanently" );
   	 	Header( "Location: ".$categorylink);
   		exit;
	}

Som lovet også en 1.4 ændring
find /controllers/ProductController.php:


	if ((!$this->product->active AND (Tools::getValue('adtoken') != Tools::encrypt('PreviewProduct'.$this->product->id))
	|| !file_exists(dirname(__FILE__).'/../'.Tools::getValue('ad').'/ajax.php')))
	{
		header('HTTP/1.1 404 page not found');
		$this->errors[] = Tools::displayError('Product is no longer available.');
	}

Erstat det med:


	if ((!$this->product->active AND (Tools::getValue('adtoken') != Tools::encrypt('PreviewProduct'.$this->product->id))
	|| !file_exists(dirname(__FILE__).'/../'.Tools::getValue('ad').'/ajax.php')))
	{
		$this->product->id_category_default;
		$category = new Category($this->product->id_category_default, self::$cookie->id_lang);
		$currentURL = self::$link->getCategoryLink($this->product->id_category_default, $category->link_rewrite, self::$cookie->id_lang);
		Tools::redirectLink($currentURL);
	}

Det som koden gør er at redirect brugeren fra udgået produkter til den default kategori som produktet tilhører, altså en relevant side. SEO folket har selvfølgelig allerede set værdien i det, produktsider med produkter der ikke findes returnere nemlig en kode 404.

Tilmeld dig nyhedsbrevet, så står du forrest i køen når jeg finder de lækre tips og tricks eller gode tilbud frem.

14 Kommentarer

  1. Timpet-Reply
    25. februar 2012 at 19:16

    Lad mig lige hører om det har interesse til 1.4.x, ellers er der jo ikke nogen grund til at jeg kaster mig ud i det?!

  2. Martin Hansen-Reply
    26. februar 2012 at 11:38

    Jo tak til 1.4

  3. Martin Hansen-Reply
    26. februar 2012 at 11:43

    Hvor har du fundet product.php med overstående tekst ?
    Da jeg ikke kan finde noget andet indhold end

    require(dirname(__FILE__).’/config/config.inc.php’);
    ControllerFactory::getController(‘ProductController’)->run();

    i min .php 🙂
    Og i min .tpl er der ikke noget lign tekst

    • Timpet-Reply
      26. februar 2012 at 11:46

      Hej Martin.

      Som jeg skriver så er det noget andet til 1.4 🙂 Der vil ligge noget lignende indhold i /controllers/productcontroller.php, men det er ikke ens kan jeg sige allerede nu, for jeg ved at generingen af URLs er anderledes i 1.4

  4. Martin Hansen-Reply
    26. februar 2012 at 11:51

    Vendter spændt på 1.4 udgave så 🙂

  5. Timpet-Reply
    4. marts 2012 at 15:46

    Som lovet også en ændring til 1.4.x, jeg har opdateret koden ovenfor. 🙂

    Tim

  6. 4. marts 2012 at 15:49

    Tak for 1.4 opdateringen, guld værd 🙂

  7. 10. april 2012 at 17:58

    hvis jeg præcis erstatter det som du har skrevet i dette indlæg, vil den så automatisk sende kunderne over i den kategori som den slettede vare var i før?

  8. 12. april 2012 at 15:29

    Hej Timpet,

    Jeg kan ikke helt finde den linie du snakker om. Men næsten. Ved mig hedder den sådan her:

    if (!Validate::isLoadedObject($product) OR !$product->active)
    {
    header(‘HTTP/1.1 404 page not found’);
    $errors[] = Tools::displayError(‘product is no longer available’);

    Er det den du henviser til eller har jeg fat i en forkert en?

  9. Timpet-Reply
    12. april 2012 at 20:05

    Hej Danny, ja det er helt korrekt, jeg ved ikke lige hvor header 404 delen er blevet af i mit indlæg, men du har helt ret.

  10. 24. april 2012 at 17:40

    Så fik jeg det til at virke.. men må sige at det var lidt forvirrende at denne linje: $product = new Product($id_product, true, intval($cookie->id_lang)); Skulle komme to gange lige efter hinanden. Troede at det var en fejl, så fjernede den ene, men det skulle jeg aldrig have gjort.. 🙂 Men nu virker det og selvfølgelig efter at jeg tilføjede den linje igen 🙂
    men tak for hjælpen i hvert fald.

  11. 24. juni 2012 at 15:31

    Din fine guide her virker ikke på PS 1.4.8.5 🙁

    • Timpet-Reply
      24. juni 2012 at 18:29

      [email protected] Okey, det var ærgeligt, jeg har desværre ikke lige tid til at installere en test shop i den version for at lave en ændring der matcher.

  12. 21. oktober 2013 at 11:04

    Hej Tim,

    Har du en løsning til version 1.5.5.0??

    Mvh.rnDanny

Skriv en kommentar