Jump to content

Redirection de produits inactifs vers leur catégorie parent


Recommended Posts

Je travaille actuellement avec Prestashop 1.7.8.7. Actuellement, j'ai dans mon catalogue de produits des produits inactifs, et lorsque je tente d'accéder à la page de l'un de ces produits, je suis naturellement redirigée vers une erreur 404. Je sais que dans l'admin de PrestaShop, je peux, pour chaque produit, choisir manuellement le type de redirection et la page cible, mais j'aimerais automatiser cela pour ne pas avoir à le faire manuellement pour chacun de mes produits.

Le résultat final attendu est le suivant : tous mes produits inactifs doivent être redirigés vers leur catégorie parent.

Jusqu'ici, j'ai tenté de créer un module, de créer un fichier override, et de créer un script PHP pour générer les redirections dans mon fichier .htaccess, mais aucune de ces trois solutions n'a fonctionné.

Peux-tu m'éclairer sur la manière de réaliser ces modifications et/ou me proposer des solutions alternatives afin d'automatiser la redirection de mes produits inactifs vers leur catégorie parent ?

Link to comment
Share on other sites

il y a une heure, ambreramos a dit :

Je travaille actuellement avec Prestashop 1.7.8.7. Actuellement, j'ai dans mon catalogue de produits des produits inactifs, et lorsque je tente d'accéder à la page de l'un de ces produits, je suis naturellement redirigée vers une erreur 404. Je sais que dans l'admin de PrestaShop, je peux, pour chaque produit, choisir manuellement le type de redirection et la page cible, mais j'aimerais automatiser cela pour ne pas avoir à le faire manuellement pour chacun de mes produits.

Le résultat final attendu est le suivant : tous mes produits inactifs doivent être redirigés vers leur catégorie parent.

Jusqu'ici, j'ai tenté de créer un module, de créer un fichier override, et de créer un script PHP pour générer les redirections dans mon fichier .htaccess, mais aucune de ces trois solutions n'a fonctionné.

Peux-tu m'éclairer sur la manière de réaliser ces modifications et/ou me proposer des solutions alternatives afin d'automatiser la redirection de mes produits inactifs vers leur catégorie parent ?

Bonjour,

à mon avis, une simplement modification dans la table de la base de données des produits suffit à faire cela, mais attention, certainement que pour tout nouveau produit, il faudra le refaire.

Peut-être faire un script qui passe tous les jours au cas où pour adapter ce point sur chaque produit si ce n'est pas la bonne redirection.

 

Link to comment
Share on other sites

55 minutes ago, Mediacom87 said:

Bonjour,

à mon avis, une simplement modification dans la table de la base de données des produits suffit à faire cela, mais attention, certainement que pour tout nouveau produit, il faudra le refaire.

Peut-être faire un script qui passe tous les jours au cas où pour adapter ce point sur chaque produit si ce n'est pas la bonne redirection.

 

Je pense que cette automatisation est possible sans passer directement par la base de données de PrestaShop, je ne suis pas sûre qu'y toucher soit une très bonne pratique surtout si cela doit être réalisé pour tout nouveau produit...

J'aimerais que cette solution puisse être définitive et dynamique, pour s'adapter à mes produits déjà inactifs et ceux qui le seront dans le futur. Que penses-tu de ce que j'ai essayé jusqu'ici ? 

Pour l'histoire du script, j'ai essayé un script PHP (https://we.tl/t-Yxxrzt3rRA) qui injecte dans mon .htaccess une redirection 301 vers la catégorie parent lorsque le produit est inactif. Celui-ci injecte bien des redirections, mais seulement sur les produits inactifs qui ont déjà été redirigés manuellement via l'admin de Prestashop. Mais je peine à comprendre pourquoi celui-ci ne prend pas en compte les autres produits inactifs...

Quoi qu'il en soit, je pense que la bonne pratique serait de mettre en place un module (test module : https://we.tl/t-8khdTF9Hpd) ou un override (test override : https://we.tl/t-JzpjwDP5OU), de manière à ce que cette solution soit vraiment automatique et non nécessiteuse d'action de ma part.

Si tu vois quelque chose qui t'interpelle, n'hésite pas à m'expliquer :)

Link to comment
Share on other sites

Il y a 2 heures, ambreramos a dit :

Je pense que cette automatisation est possible sans passer directement par la base de données de PrestaShop, je ne suis pas sûre qu'y toucher soit une très bonne pratique surtout si cela doit être réalisé pour tout nouveau produit...

J'aimerais que cette solution puisse être définitive et dynamique, pour s'adapter à mes produits déjà inactifs et ceux qui le seront dans le futur. Que penses-tu de ce que j'ai essayé jusqu'ici ? 

Pour l'histoire du script, j'ai essayé un script PHP (https://we.tl/t-Yxxrzt3rRA) qui injecte dans mon .htaccess une redirection 301 vers la catégorie parent lorsque le produit est inactif. Celui-ci injecte bien des redirections, mais seulement sur les produits inactifs qui ont déjà été redirigés manuellement via l'admin de Prestashop. Mais je peine à comprendre pourquoi celui-ci ne prend pas en compte les autres produits inactifs...

Quoi qu'il en soit, je pense que la bonne pratique serait de mettre en place un module (test module : https://we.tl/t-8khdTF9Hpd) ou un override (test override : https://we.tl/t-JzpjwDP5OU), de manière à ce que cette solution soit vraiment automatique et non nécessiteuse d'action de ma part.

Si tu vois quelque chose qui t'interpelle, n'hésite pas à m'expliquer :)

Pour information, je ne sais pas ce que vous essayez de nous envoyer avec WeTransfer, mais il n'y a aucune chance que je télécharge des données totalement inconnues venant d'un inconnu.

Si vous voulez passer du code, vous pouvez le faire dans le post, si c'est une image, vous pouvez aussi le faire.

Link to comment
Share on other sites

3 minutes ago, Mediacom87 said:

Pour information, je ne sais pas ce que vous essayez de nous envoyer avec WeTransfer, mais il n'y a aucune chance que je télécharge des données totalement inconnues venant d'un inconnu.

Si vous voulez passer du code, vous pouvez le faire dans le post, si c'est une image, vous pouvez aussi le faire.

Désolée, c'est la première fois que je passe par un forum pour demander de l'aide. Je garde ça en mémoire à l'avenir, et voilà le code que j'ai pu réaliser jusqu'ici 😅

 

Voici mon script PHP (generate_redirections.php) :

<?php
// Connexion à la base de données PrestaShop
require_once('config/config.inc.php');
require_once('init.php');

// Obtenir les produits désactivés
$products = Db::getInstance()->executeS('
    SELECT id_product, id_category_default
    FROM '._DB_PREFIX_.'product
    WHERE active = 0
');

// Ouvrir le fichier .htaccess pour écrire les redirections
$htaccessFile = fopen(_PS_ROOT_DIR_.'/.htaccess', 'a');
foreach ($products as $product) {
    $productLink = '/product.php?id_product=' . $product['id_product'];
    $categoryLink = (new Category($product['id_category_default']))->getLink();
    fwrite($htaccessFile, "Redirect 301 $productLink $categoryLink\n");
}
fclose($htaccessFile);

echo 'Règles de redirection mises à jour.';
?>

 

Voici les fichiers du module :

1) ps_inactive_product_redirect.php

<?php
if (!defined('_PS_VERSION_')) {
    exit;
}

class Ps_Inactive_Product_Redirect extends Module
{
    public function __construct()
    {
        $this->name = 'ps_inactive_product_redirect';
        $this->tab = 'front_office_features';
        $this->version = '1.0.0';
        $this->author = 'Your Name';
        $this->need_instance = 0;

        parent::__construct();

        $this->displayName = $this->l('Inactive Product Redirect');
        $this->description = $this->l('Redirect inactive products to their parent category.');
    }

    public function install()
    {
        return parent::install() && $this->registerHook('actionDispatcher');
    }

    public function uninstall()
    {
        return parent::uninstall();
    }
}

2) ProductController.php

<?php
class ProductController extends ProductControllerCore
{
    public function init()
    {
        parent::init();

        // Get the product ID from the request
        $id_product = (int)Tools::getValue('id_product');

        if ($id_product) {
            // Load the product
            $product = new Product($id_product, true, $this->context->language->id);

            // Check if the product is inactive
            if (!$product->active) {
                // Get the product's parent category ID
                $id_category = $product->id_category_default;

                // Get the link to the category
                $category = new Category($id_category, $this->context->language->id);
                $categoryLink = $this->context->link->getCategoryLink($category);

                // Redirect to the category
                Tools::redirect($categoryLink);
            }
        }
    }
}

Pour information, voici la structure de mon module :

ps_inactive_product_redirect

- ps_inactive_product_redirect.php

- override

-- controllers

--- front

---- ProductController.php

 

J'avais également précisé que j'avais tenté d'utiliser un override, placé dans le dossier override à la racine de mon site ; il s'agit du même fichier ProductController.php que j'ai laissé plus haut. Encore une fois, si quoi que ce soit t'interpelle, n'hésite pas à m'expliquer :) 

Link to comment
Share on other sites

Il y a 2 heures, ambreramos a dit :

Voici mon script PHP (generate_redirections.php) :

Cool un script non sécurisé que tout le monde peut utiliser 😉

Code qui va accumuler toutes les redirections à chaque appel, un htaccess de 60 Go au bout d'une semaine.

Il faut éviter à tout pris ce type de fichier et toujours, strictement toujours, passer par un module et un controller sécurisé.

Je suis sur le développement d'un module pour répondre à votre besoin, car cela peut aussi intéresser d'autres utilisateurs.

Link to comment
Share on other sites

13 hours ago, Mediacom87 said:

Cool un script non sécurisé que tout le monde peut utiliser 😉

Code qui va accumuler toutes les redirections à chaque appel, un htaccess de 60 Go au bout d'une semaine.

Il faut éviter à tout pris ce type de fichier et toujours, strictement toujours, passer par un module et un controller sécurisé.

Je suis sur le développement d'un module pour répondre à votre besoin, car cela peut aussi intéresser d'autres utilisateurs.

Comme je l'ai précisé, il s'agit d'un test. Comment suis-je supposée avoir des recommandations si je ne montre pas le code ?

 

Ceci dit, j'ai trouvé une solution à mon problème avec le module Mass modifier le produit v2.0.18 - par SeoSa. J'ai filtré mes produits pour sélectionner les produits inactifs et j'ai pu agir sur le lien de redirection en sélectionnant Redirection 301 vers une catégorie ; lorsqu'on ne lui précise pas de catégorie, le produit est redirigé sur sa catégorie parent. 😁

Link to comment
Share on other sites

il y a une heure, ambreramos a dit :

Comme je l'ai précisé, il s'agit d'un test. Comment suis-je supposée avoir des recommandations si je ne montre pas le code ?

 

Ceci dit, j'ai trouvé une solution à mon problème avec le module Mass modifier le produit v2.0.18 - par SeoSa. J'ai filtré mes produits pour sélectionner les produits inactifs et j'ai pu agir sur le lien de redirection en sélectionnant Redirection 301 vers une catégorie ; lorsqu'on ne lui précise pas de catégorie, le produit est redirigé sur sa catégorie parent. 😁

Ok, donc aucune différence avec le fait d'appliquer une requête SQL pour modifier les produit, cela ne se fait toujours pas automatiquement comme demandé au début.

Je vais finaliser mon module qui lui permet de programmer cela pour tous les nouveaux produits sans intervention.

Link to comment
Share on other sites

3 minutes ago, Mediacom87 said:

Ok, donc aucune différence avec le fait d'appliquer une requête SQL pour modifier les produit, cela ne se fait toujours pas automatiquement comme demandé au début.

Je vais finaliser mon module qui lui permet de programmer cela pour tous les nouveaux produits sans intervention.

C'est aussi pour ça que j'ai précisé dans mon premier message que la vraie bonne pratique serait un module ou un override. En attendant, j'ai trouvé la solution à mon problème ; dans des cas qui nécessitent une vraie automatisation, effectivement, mettre en place un module serait une solution bien plus adaptée :)

Link to comment
Share on other sites

On 7/25/2024 at 6:05 PM, Mediacom87 said:

Salut,

Voilà, module terminé :

 

 

Salut,

Merci de ta réponse, pour ceux qui feront le choix d'acheter un module, c'est effectivement d'une grande aide.

Mais bon, si j'ai pris la peine d'écrire dans le forum PrestaShop, c'est surtout car j'étais en recherche de solutions pour mettre cela en place gratuitement 😁

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...