Jump to content

[RESOLU]Réécriture url sans id attribute


Recommended Posts

Bonjour,

Je migre un iste en 1.6 sur un 1.7.8. Il faut bien sûr que les url des produits correspondent aux anciennes. Dans cette version 1.7.8, il n'est toujours pas possible de supprimer {id_attribute} de l'url. J'ai donc trouve un override de Link.php fourni par Team-ever. Le souci est que quand le mode debug est activé, il m'indique une erreur : Undefined variable:anchor. La versionde PHP : 7.4. En cherchant sur le Net j'ai vu qu'il fallait mettre le paramètre $addAnchor à 'true' mais cela ne résout pas le problème. Quelqu'un aurait une idée ? Voici le code de l'override :

 public function getProductLink(
        $product,
        $alias = null,
        $category = null,
        $ean13 = null,
        $idLang = null,
        $idShop = null,
        $ipa = 0,
        $force_routes = false,
        $relativeProtocol = false,
        $addAnchor = true,
        $extraParams = array()
    ) {
        $dispatcher = Dispatcher::getInstance();
 
        if (!$idLang) {
            $idLang = Context::getContext()->language->id;
        }
 
        $url = $this->getBaseLink($idShop, null, $relativeProtocol) . $this->getLangLink($idLang, null, $idShop);
 
        // Set available keywords
        $params = array();
 
        if (!is_object($product)) {
            if (is_array($product) && isset($product['id_product'])) {
                $params['id'] = $product['id_product'];
            } elseif ((int) $product) {
                $params['id'] = $product;
            } else {
                throw new PrestaShopException('Invalid product vars');
            }
        } else {
            $params['id'] = $product->id;
        }
 
        $params['id_product_attribute'] = '';
        if (!$alias) {
            $product = $this->getProductObject($product, $idLang, $idShop);
        }
        $params['rewrite'] = (!$alias) ? $product->getFieldByLang('link_rewrite') : $alias;
        if (!$ean13) {
            $product = $this->getProductObject($product, $idLang, $idShop);
        }
        $params['ean13'] = (!$ean13) ? $product->ean13 : $ean13;
        if ($dispatcher->hasKeyword('product_rule', $idLang, 'meta_keywords', $idShop)) {
            $product = $this->getProductObject($product, $idLang, $idShop);
            $params['meta_keywords'] = Tools::str2url($product->getFieldByLang('meta_keywords'));
        }
        if ($dispatcher->hasKeyword('product_rule', $idLang, 'meta_title', $idShop)) {
            $product = $this->getProductObject($product, $idLang, $idShop);
            $params['meta_title'] = Tools::str2url($product->getFieldByLang('meta_title'));
        }
 
        if ($dispatcher->hasKeyword('product_rule', $idLang, 'manufacturer', $idShop)) {
            $product = $this->getProductObject($product, $idLang, $idShop);
            $params['manufacturer'] = Tools::str2url($product->isFullyLoaded ? $product->manufacturer_name : Manufacturer::getNameById($product->id_manufacturer));
        }
 
        if ($dispatcher->hasKeyword('product_rule', $idLang, 'supplier', $idShop)) {
            $product = $this->getProductObject($product, $idLang, $idShop);
            $params['supplier'] = Tools::str2url($product->isFullyLoaded ? $product->supplier_name : Supplier::getNameById($product->id_supplier));
        }
 
        if ($dispatcher->hasKeyword('product_rule', $idLang, 'price', $idShop)) {
            $product = $this->getProductObject($product, $idLang, $idShop);
            $params['price'] = $product->isFullyLoaded ? $product->price : Product::getPriceStatic($product->id, false, null, 6, null, false, true, 1, false, null, null, null, $product->specificPrice);
        }
 
        if ($dispatcher->hasKeyword('product_rule', $idLang, 'tags', $idShop)) {
            $product = $this->getProductObject($product, $idLang, $idShop);
            $params['tags'] = Tools::str2url($product->getTags($idLang));
        }
 
        if ($dispatcher->hasKeyword('product_rule', $idLang, 'category', $idShop)) {
            if (!$category) {
                $product = $this->getProductObject($product, $idLang, $idShop);
            }
            $params['category'] = (!$category) ? $product->category : $category;
        }
 
        if ($dispatcher->hasKeyword('product_rule', $idLang, 'reference', $idShop)) {
            $product = $this->getProductObject($product, $idLang, $idShop);
            $params['reference'] = Tools::str2url($product->reference);
        }
 
        if ($dispatcher->hasKeyword('product_rule', $idLang, 'categories', $idShop)) {
            $product = $this->getProductObject($product, $idLang, $idShop);
            $params['category'] = (!$category) ? $product->category : $category;
            $cats = array();
            foreach ($product->getParentCategories($idLang) as $cat) {
                if (!in_array($cat['id_category'], Link::$category_disable_rewrite)) {
                    //remove root and home category from the URL
                    $cats[] = $cat['link_rewrite'];
                }
            }
            $params['categories'] = implode('/', $cats);
        }
        if ($ipa) {
            $product = $this->getProductObject($product, $idLang, $idShop);
        }
        if ((bool)Configuration::get('EVERSEO_RMV_ANCHOR')) {
            $anchor = '';
        }
 
        return $url . $dispatcher->createUrl('product_rule', $idLang, array_merge($params, $extraParams), $force_routes, $anchor, $idShop);
    }

Merci d'avance !

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

1 hour ago, idnovate.com said:
//if ((bool)Configuration::get('EVERSEO_RMV_ANCHOR')) {
    $anchor = '';
//}

 

Merci ! (en fait j'avais essayé /// mais en englobant la dernière parenthèse, ce qui provoquait une erreur ... suis pas au top avec le PHP !!)

Bon, j'ai essayé. L'url du produit est correcte mais il y a maintenant un warning Warning: Declaration of Link::getProductLink($product, $alias = NULL, $category = NULL, $ean13 = NULL, $idLang = NULL, $idShop = NULL, $ipa = NULL, $force_routes = false, $relativeProtocol = false, $addAnchor = false, $extraParams = Array) should be compatible with LinkCore::getProductLink($product, $alias = NULL, $category = NULL, $ean13 = NULL, $idLang = NULL, $idShop = NULL, $idProductAttribute = NULL, $force_routes = false, $relativeProtocol = false, $withIdInAnchor = false, $extraParams = Array, bool $addAnchor = true)

 

Et la home est vide à part le header et le slider, cela ne doit pas plaire au thème panda.

Je vais essayer la méthode mediacom

Link to comment
Share on other sites

1 hour ago, Mediacom87 said:

Bonjour,

cette solution est radicale et pénalise le fonctionnement de PrestaShop en version 1.7.

Voici une solution simple pour conserver le fonctionnement de PrestaShop https://www.mediacom87.fr/seo-et-url-de-vos-produits-sur-prestashop-17/

Merci Mediacom,

J'ai donc fait la manip (uniquement 2 instances à remplacer) mais cela crée une erreur line 66 "<a href="{product.canonical_url}" title="{$product.name}" class="product_img_link {if $is_lazy && !$tm_stop_lazy} is_lazy {/if} {if $sttheme.pro_img_hover_scale} pro_img_hover_scale {/if}" {if isset($for_w) && $for_w == 'category' && $sttheme.infinite_blank} target="_blank" {/if}>" - Unexpected ".", expected one of: "}"

Si je comprends bien il attend une parenthèse fermante à la place d'un point, mais je ne vois pas où et je n'ai rien modifié d'autre.

 

Link to comment
Share on other sites

raaa ! l'oeil du maître 😉 j'avais beau relire, je n'ai pas percuté sur l'absence du $ ! Merci.
Plus d'erreur maintenant. Sauf que quand on sélectionne une déclinaison, l'id_attribute se remet dans l'url. Bon, après, ce n'est peut-être pas grave dans le sens que l'url indexée amène bien sur la page du produit ? il ne devrait donc pas y avoir de perte de référencement.

Merci encore ! je n'avais pas trouvé ce tuto en cherchant une solution.

Link to comment
Share on other sites

  • Cirice changed the title to [RESOLU]Réécriture url sans id attribute
il y a 59 minutes, Cirice a dit :

raaa ! l'oeil du maître 😉 j'avais beau relire, je n'ai pas percuté sur l'absence du $ ! Merci.
Plus d'erreur maintenant. Sauf que quand on sélectionne une déclinaison, l'id_attribute se remet dans l'url. Bon, après, ce n'est peut-être pas grave dans le sens que l'url indexée amène bien sur la page du produit ? il ne devrait donc pas y avoir de perte de référencement.

Merci encore ! je n'avais pas trouvé ce tuto en cherchant une solution.

Il est important qu'une URL spécifique pour chaque déclinaison existe afin de pouvoir partager la déclinaison exacte comme la diffuser sur les market place.

Link to comment
Share on other sites

Oui, mais si déjà, à l'url s'ajoute le n° de l'attribut ? par exemple mon_domaine/1124-monproduit.html:#60-rouge ? Car le souci est que l'est url sont de cette forme actuellement. Si je laisse l'id de la déclinaison s'ajouter après l'id du produit, le site va perdre tout son référencement. A moins de faire des redirections pour un millier de produits ??

Link to comment
Share on other sites

On 5/31/2023 at 2:30 PM, Cirice said:

Merci ! (en fait j'avais essayé /// mais en englobant la dernière parenthèse, ce qui provoquait une erreur ... suis pas au top avec le PHP !!)

Bon, j'ai essayé. L'url du produit est correcte mais il y a maintenant un warning Warning: Declaration of Link::getProductLink($product, $alias = NULL, $category = NULL, $ean13 = NULL, $idLang = NULL, $idShop = NULL, $ipa = NULL, $force_routes = false, $relativeProtocol = false, $addAnchor = false, $extraParams = Array) should be compatible with LinkCore::getProductLink($product, $alias = NULL, $category = NULL, $ean13 = NULL, $idLang = NULL, $idShop = NULL, $idProductAttribute = NULL, $force_routes = false, $relativeProtocol = false, $withIdInAnchor = false, $extraParams = Array, bool $addAnchor = true)

 

Et la home est vide à part le header et le slider, cela ne doit pas plaire au thème panda.

Je vais essayer la méthode mediacom

Cette erreur apparaît parce que la fonction getProductLink de la classe Link a été surchargée, et que la signature est différente de celle de la fonction originale du Core.

Edited by idnovate.com (see edit history)
Link to comment
Share on other sites

  • 1 year later...

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