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

Sarah
źródło
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();.

Marius
źródło
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'
Główny programista
źródło