$ _product-> getProductUrl () podając ścieżkę do adresu URL bez klucza URL


15

Otrzymuję kolekcję produktów określonej kategorii na stronie w kilku różnych witrynach Magento. Mój kod do pobrania kolekcji to:

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

Mój problem polega na tym, że na jednej z witryn Magento, z której korzystamy ProductUrl(), pobierany jest adres URL podobny do podobnego, http://www.my site.com/catalog/product/view/id/2309/s/shopcat/category/373/a nie podobny http://www.site.com/shopcat/product-url-key.html. Ale na wszystkich innych stronach pojawia się tak, jak tego chcemy.

Czy ktoś wie, dlaczego tak może być? Dzięki! Próbowałem getUrlPath()też użyć, ale to nic nie zwróciło. Wiem, że mogę to obejść, robiąc coś takiego, <?php echo $this->getBaseUrl().$shopProduct->getUrlKey().".html"; ?>ale ta metoda wydaje się nieco nieefektywna!

EDYCJA 21.03.14: Nadal mam ten problem. Uświadomiłem sobie, że getProductUrl()pobiera pożądany adres URL w niektórych plikach szablonów witryny, ale nie w innych. Na przykład ładuję jedną kolekcję na stronie głównej i zawiera ona adresy URL, które chcę. Ale getProductUrl()nie daje mi adresów URL, które chcę z tym samym kodem w widoku kategorii.


Czy próbowałeś ponownieindeksować „Przepisywanie adresów URL indeksu”?
oleksii.svarychevskyi

tak Proszę ponownie indeksować dane i usunąć pamięć podręczną
Keyul Shah

Próbowałem obu. Ponownie zindeksowałem w Zarządzaniu indeksem i opróżniłem pamięć podręczną, pamięć podręczna i tak została wyłączona.
Sarah

Wejdź w admin-> catalof-> url przepisywanie. Czy są rerites URL? Jeśli tak, spróbuj przefiltrować siatkę: Ścieżka docelowa -> [category / some_category_id]
magUz

Bardzo przepraszam za opóźnienie w odpowiedzi. Dla danego produktu skonfigurowano przepisywanie adresów URL, więc jeśli przejdziesz na stronę.com / shopcat / product-url- key.html lub site.com/catalog/product/view/id/2309/s/shopcat/ kategoria / 373 nadal przechodzisz do tej samej strony produktu, po prostu pętla foreach z jakiegoś powodu przeciąga niewłaściwy typ adresu URL.
Sarah

Odpowiedzi:


18

Postaraj się uzyskać taką kolekcję:

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

Innymi słowy, poinformuj model, aby podał klucz adresu URL zamiast długiego, brzydkiego adresu URL $collection->addUrlRewrite();.


pytanie - dlaczego potrzebujesz $ category-> getId () w addUrlRewrite? Widzę, że działa to w obie strony (np. Nawet bez niego). dzięki!
Ronen Ness,

2
Cześć @Ness, to zależy, czy masz włączone „Użyj ścieżek kategorii dla adresów URL produktów” w System / Configuration / Catalog / Catalog / Search Engine Optimization. Jeśli nie, możesz to zignorować i po prostu użyć addUrlRewrite (). Jeśli masz włączone ścieżki kategorii, przekazanie identyfikatora kategorii do funkcji oznacza, że ​​renderowany adres URL produktu to adres URL produktu poprzedzony ścieżką kategorii.
Sarah

@Marius Tak, to działa dla mnie.
Dhara Bhatti

8

Uzyskiwanie adresu URL produktów

Potencjalnie mylące ze względu na 3 metody, których można użyć, z których wszystkie znajdują się w Mage_Catalog_Model_Product:

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

Najlepszym sposobem na wyjaśnienie jest po prostu pokazanie wyników kilku połączeń. Biorąc pod uwagę produkt, którego kluczem URL jest mondrian-large-coffee-table-set-multicolour w domenie http: //made.local, wyniki są następujące:

$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'
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.