Toujours avoir la catégorie du produit dans l'url magento
Article d'archive. Publié il y a plus de six ans, il peut décrire des versions ou des pratiques qui ont depuis évolué. Nous le laissons en ligne pour sa valeur documentaire.
Bonjour,
J’ai rencontré le problème suivant lors d’un projet sous magento : dans les recherches, les urls produits ne gardent pas la catégorie dans l’url. Pour résoudre ce problème, j’ai modifié le coeur de magento (à ne pas faire en temps normal) :
Tout se passe dans la fonction getUrl du Model Product_Url : app/code/core/Mage/Catalog/Model/Product/Url.php
Voici le code la nouvelle fonction :
/**
* Retrieve Product URL using UrlDataObject
*
* @param Mage_Catalog_Model_Product $product
* @param array $params
* @return string
*/
public function getUrl(Mage_Catalog_Model_Product $product, $params = array())
{
$routePath = '';
$routeParams = $params;
$storeId = $product->getStoreId();
if (isset($params['_ignore_category'])) {
unset($params['_ignore_category']);
$categoryId = null;
} else {
$categoryId = $product->getCategoryId() && !$product->getDoNotUseCategoryId()
? $product->getCategoryId() : null;
if (!$categoryId && count($product->getCategoryIds()) > 0) {
$categoryId = end($product->getCategoryIds());
}
error_log(print_r($categoryId,true));
}
if ($product->hasUrlDataObject()) {
$requestPath = $product->getUrlDataObject()->getUrlRewrite();
$routeParams['_store'] = $product->getUrlDataObject()->getStoreId();
} else {
$requestPath = $product->getRequestPath();
if (true) {
$idPath = sprintf('product/%d', $product->getEntityId());
if ($categoryId) {
$idPath = sprintf('%s/%d', $idPath, $categoryId);
}
error_log($idPath);
$rewrite = $this->getUrlRewrite();
$rewrite->setStoreId($storeId)
->loadByIdPath($idPath);
if ($rewrite->getId()) {
$requestPath = $rewrite->getRequestPath();
$product->setRequestPath($requestPath);
} else {
$product->setRequestPath(false);
}
}
}
if (isset($routeParams['_store'])) {
$storeId = Mage::app()->getStore($routeParams['_store'])->getId();
}
if ($storeId != Mage::app()->getStore()->getId()) {
$routeParams['_store_to_url'] = true;
}
if (!empty($requestPath)) {
$routeParams['_direct'] = $requestPath;
} else {
$routePath = 'catalog/product/view';
$routeParams['id'] = $product->getId();
$routeParams['s'] = $product->getUrlKey();
if ($categoryId) {
$routeParams['category'] = $categoryId;
}
}
// reset cached URL instance GET query params
if (!isset($routeParams['_query'])) {
$routeParams['_query'] = array();
}
return $this->getUrlInstance()->setStore($storeId)
->getUrl($routePath, $routeParams);
}
En gros, quand la catégorie n’est pas spécifiée, celui-ci prendra par défaut la catégorie plus bas niveau. Cela fonctionne dans mon cas car un produit n’appartient pas à plusieurs sous catégories direct par rapport à la root catégorie.