$ _product-> getProductUrl () mit URL-Pfad ohne URL-Schlüssel

15

Ich erhalte eine Produktsammlung einer bestimmten Kategorie auf einer Seite in einigen verschiedenen Magento-Sites. Mein Code zum Abrufen der Sammlung lautet:

        $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;

Mein Problem ist, dass auf einer der Magento-Sites, die wir ausführen, der ProductUrl()Abruf eine URL wie http://www.my site.com/catalog/product/view/id/2309/s/shopcat/category/373/und nicht mehr wie ist http://www.site.com/shopcat/product-url-key.html. Aber auf allen anderen Seiten sieht es so aus, wie wir es wollen.

Weiß jemand, warum das sein könnte? Vielen Dank! Ich habe es auch versucht, getUrlPath()aber das hat nichts zurückgegeben. Ich weiß, dass ich das umgehen kann, indem ich so etwas mache, <?php echo $this->getBaseUrl().$shopProduct->getUrlKey().".html"; ?>aber diese Methode scheint ein bisschen ineffizient zu sein!

EDIT 21/03/14: Ich habe immer noch dieses Problem. Ich habe festgestellt, dass getProductUrl()die gewünschte URL für einige Vorlagendateien der Site abgerufen wird, für andere jedoch nicht. Zum Beispiel lade ich eine Sammlung auf der Homepage und bekomme die gewünschten URLs. getProductUrl()Gibt mir aber nicht die URLs, die ich mit dem gleichen Code in einer Kategorieansicht haben möchte.

Sarah
quelle
Haben Sie versucht, "Index URL rewrites" neu zu indizieren?
oleksii.svarychevskyi
ja Bitte indizieren Sie Ihre Daten neu und entfernen Sie den Cache
Keyul Shah
Ich habe beides ausprobiert. Ich habe mich in der Indexverwaltung neu indiziert und den Cache geleert, der Cache war trotzdem deaktiviert.
Sarah
Geben Sie admin-> catalof-> url rewrite management ein. Gibt es URL-Reriten? Wenn ja, versuchen Sie, das Raster zu filtern: Zielpfad -> [category / some_category_id]
mageUz
Vielen Dank für die verspätete Antwort. Für das betreffende Produkt ist eine URL-Umschreibung eingerichtet. Rufen Sie also site.com/shopcat/product-url-key.html oder site.com/catalog/product/view/id/2309/s/shopcat/ auf. Kategorie / 373 Sie gelangen immer noch zur gleichen Produktseite. Es ist nur so, dass die foreach-Schleife aus irgendeinem Grund die falsche Art von URL durchläuft.
Sarah

Antworten:

18

Versuchen Sie, die Sammlung wie folgt zu erhalten:

$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);

Mit anderen Worten, lassen Sie das Modell wissen, dass es den URL-Schlüssel anstelle der langen hässlichen URL mit angibt $collection->addUrlRewrite();.

Marius
quelle
frage - warum brauchst du die $ category-> getId () in addUrlRewrite? Ich sehe, dass es so oder so funktioniert (zB auch ohne). Vielen Dank!
Ronen Ness
2
Hallo @Ness, es hängt davon ab, ob Sie unter System / Konfiguration / Katalog / Katalog / Suchmaschinenoptimierungen die Option "Kategorienpfade für Produkt-URLs verwenden" aktiviert haben. Wenn Sie dies nicht tun, können Sie dies ignorieren und einfach addUrlRewrite () verwenden. Wenn Sie Kategorienpfade aktiviert haben, bedeutet die Übergabe der Kategorie-ID an die Funktion, dass die gerenderte Produkt-URL die Produkt-URL ist, der der Kategorienpfad vorangestellt ist.
Sarah
@Marius Ja, das funktioniert bei mir.
Dhara Bhatti
8

Abrufen einer Produkt-URL

Potenziell verwirrend aufgrund der 3 Methoden, die Sie verwenden könnten, die sich alle in Mage_Catalog_Model_Product befinden:

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

Die beste Erklärung ist, einfach die Ergebnisse mehrerer Anrufe anzuzeigen. Bei einem Produkt mit dem URL-Schlüssel mondrian-large-coffee-table-set-multicolour auf der Domain http: //made.local sind die Ergebnisse:

$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'
Leitender Entwickler
quelle