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.

14 tanker om “Redirect brugerne fra udgået produkter til default kategori”

  1. 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. 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

    1. 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

  3. 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?

  4. 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?

  5. 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.

  6. 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.

    1. Jesper@ 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.

Skriv et svar