$ _product-> getProductUrl () donnant le chemin de l'url sans clé URL


15

Je reçois une collection de produits d'une certaine catégorie sur une page dans quelques sites Magento différents. Mon code pour obtenir la collection est:

        $category = new Mage_Catalog_Model_Category();
        $category->load($id);
        $collection = $category->getProductCollection();
        $collection->addAttributeToSelect('*');
        $collection->addAttributeToFilter('status', 1);
        $collection->addFieldToFilter(array(array('attribute'=>'visibility', 'neq'=>"1" )));
        $collection->getSelect()->limit(12);

        foreach ($collection as $shopProduct) :

            echo $shopProduct->getProductUrl();

        endforeach;

Mon problème est que sur l'un des sites Magento que nous exécutons, la ProductUrl()récupération est une URL similaire http://www.my site.com/catalog/product/view/id/2309/s/shopcat/category/373/et non plus similaire http://www.site.com/shopcat/product-url-key.html. Mais sur tous les autres sites, il apparaît comme nous le voulons.

Est-ce que quelqu'un sait pourquoi cela pourrait être? Merci! J'ai essayé d'utiliser getUrlPath()aussi mais cela n'a rien retourné. Je sais que je peux contourner cela en faisant quelque chose comme, <?php echo $this->getBaseUrl().$shopProduct->getUrlKey().".html"; ?>mais cette méthode semble un peu inefficace!

EDIT 21/03/14: J'ai toujours ce problème. J'ai réalisé que getProductUrl()l'URL recherchée est récupérée sur certains fichiers modèles du site mais pas sur d'autres. Par exemple, je charge une collection sur la page d'accueil et cela me donne les URL que je veux. Mais getProductUrl()ne me donne pas les URL que je veux avec le même code sur une vue de catégorie.


Avez-vous essayé de réindexer les "réécritures d'URL d'index"?
oleksii.svarychevskyi

oui Veuillez réindexer vos données et supprimer le cache
Keyul Shah

J'ai essayé les deux. J'ai réindexé dans la gestion d'index et j'ai vidé le cache, le cache a été désactivé de toute façon.
Sarah

Entrez admin-> catalof-> gestion de la réécriture d'URL. Y a-t-il des réérites d'URL? Si oui, essayez de filtrer la grille: Chemin cible -> [category / some_category_id]
mageUz

Désolé pour le retard de réponse. Il y a une réécriture d'URL configurée pour le produit en question, donc si vous allez sur site.com/shopcat/product-url-key.html ou site.com/catalog/product/view/id/2309/s/shopcat/ catégorie / 373 vous obtenez toujours la même page de produit, c'est juste que la boucle foreach tire à travers le mauvais type d'URL pour une raison quelconque.
Sarah

Réponses:


18

Essayez d'obtenir la collection comme ceci:

$collection = $category->getProductCollection();
$collection->addAttributeToSelect('*');
$collection->addAttributeToFilter('status', 1);
$collection->addFieldToFilter(array(array('attribute'=>'visibility', 'neq'=>"1" )));
//Where the magic happens
//this will add the url rewrite.
//addUrlRewrite can also be left without a parameter to generate url without category.
$collection->addUrlRewrite($category->getId()); 
$collection->getSelect()->limit(12);

En d'autres termes, indiquez au modèle de donner la clé d'URL au lieu de la longue URL moche avec $collection->addUrlRewrite();.


question - pourquoi avez-vous besoin de $ category-> getId () dans addUrlRewrite? Je vois que cela fonctionne dans les deux sens (par exemple, même sans elle). Merci!
Ronen Ness

2
Bonjour @Ness, cela dépend si vous avez "Utiliser les chemins d'accès aux catégories pour les URL de produits activés" dans Système / Configuration / Catalogue / Catalogue / Optimisations des moteurs de recherche. Si vous ne le faites pas, vous pouvez ignorer cela et utiliser simplement addUrlRewrite (). Si vous avez activé les chemins de catégorie, la transmission de l'ID de catégorie à la fonction signifie que l'URL du produit qui est rendue est l'URL du produit précédée du chemin de catégorie.
Sarah

@Marius Ouais ça marche pour moi.
Dhara Bhatti

8

Obtenir une URL de produits

Potentiellement déroutant en raison des 3 méthodes que vous pourriez utiliser, qui sont toutes dans Mage_Catalog_Model_Product:

public function getUrlPath($category=null)
public function getUrlInStore($params = array())
public function getProductUrl($useSid = null)

La meilleure façon d'expliquer est de simplement montrer les résultats de plusieurs appels. Étant donné un produit dont la clé URL est mondrian-large-coffee-table-set-multicolour sur le domaine http: //made.local, les résultats sont les suivants:

$product->getUrlPath();
    'mondrian-large-coffee-table-set-multicolour'

$product->getUrlPath($category);
    'tables/mondrian-large-coffee-table-set-multicolour'

// you cannot stop this method adding ___store to the URL, even by setting _store_to_url to false
$product->getUrlInStore();
    'http://made.local/tables/mondrian-large-coffee-table-set-multicolour?___store=default'

// you cannot stop this method adding ___store to the URL, even by setting _store_to_url to false
// note - see the "using _ignore_category" section below for an arguable bug with using this param
$product->getUrlInStore(array('_ignore_category' => true));
    'http://made.local/mondrian-large-coffee-table-set-multicolour?___store=default'

$product->getProductUrl();
    'http://made.local/tables/mondrian-large-coffee-table-set-multicolour'

$product->getProductUrl(true);
    'http://made.local/tables/mondrian-large-coffee-table-set-multicolour'
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.