$ _product-> getProductUrl () memberikan jalur url tanpa kunci URL

15

Saya mendapatkan koleksi produk dari kategori tertentu pada halaman di beberapa situs Magento yang berbeda. Kode saya untuk mendapatkan koleksi adalah:

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

Masalah saya adalah bahwa di salah satu situs Magento kami menjalankan ProductUrl()yang diambil adalah URL sepertihttp://www.my site.com/catalog/product/view/id/2309/s/shopcat/category/373/ dan bukan lebih suka http://www.site.com/shopcat/product-url-key.html. Tetapi di semua situs lain itu muncul seperti yang kita inginkan.

Adakah yang tahu mengapa ini terjadi? Terima kasih! Saya mencoba menggunakangetUrlPath() juga tetapi ini tidak mengembalikan apa pun. Saya tahu saya bisa menyelesaikan ini dengan melakukan sesuatu seperti <?php echo $this->getBaseUrl().$shopProduct->getUrlKey().".html"; ?>tetapi metode itu tampaknya sedikit tidak efisien!

EDIT 21/03/14: Saya masih mengalami masalah ini. Saya menyadari getProductUrl()mengambil URL yang diinginkan pada beberapa file templat situs tetapi tidak pada yang lain. Misalnya, saya memuat satu koleksi di beranda dan memberi saya URL yang saya inginkan. Tetapi getProductUrl()tidak memberi saya URL yang saya inginkan dengan kode yang sama pada tampilan kategori.

Sarah
sumber
Apakah Anda mencoba memasukkan kembali "Indeks URL penulisan ulang"?
oleksii.svarychevskyi
ya Tolong Reindex data Anda dan hapus cache
Keyul Shah
Saya sudah mencoba keduanya. Saya telah mengindeks ulang dalam Manajemen Indeks dan saya telah mem-cache, cache tetap dinonaktifkan.
Sarah
Masukkan admin-> catalof-> manajemen penulisan ulang url. Apakah ada url rerites? Jika ya, coba filter grid: Target path -> [category / some_category_id]
mageUz
Maaf atas keterlambatan balasan. Ada penulisan ulang URL yang diatur untuk produk yang dimaksud, jadi jika Anda pergi ke site.com/shopcat/product-url-key.html atau site.com/catalog/product/view/id/2309/s/shopcat/ kategori / 373 Anda masih mendapatkan ke halaman produk yang sama, hanya saja foreach loop menarik melalui jenis URL yang salah karena suatu alasan.
Sarah

Jawaban:

18

Coba dapatkan koleksinya seperti ini:

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

Dengan kata lain, beri tahu model untuk memberikan kunci url alih-alih dengan url panjang yang jelek $collection->addUrlRewrite();.

Marius
sumber
pertanyaan - mengapa Anda memerlukan $ category-> getId () di addUrlRewrite? Saya melihat bahwa itu berfungsi baik (misalnya bahkan tanpa itu). Terima kasih!
Ronen Ness
2
Hai @Ness, itu tergantung apakah Anda telah mengaktifkan "Gunakan lintasan Kategori untuk URL Produk" di Sistem / Konfigurasi / Katalog / Katalog / Optimasi Mesin Pencari. Jika tidak, Anda dapat mengabaikan ini dan cukup gunakan addUrlRewrite (). Jika Anda mengaktifkan jalur kategori, meneruskan ID kategori ke dalam fungsi berarti URL produk yang dirender adalah URL produk yang diawali dengan jalur kategori.
Sarah
@Marius Ya itu bekerja untuk saya.
Dhara Bhatti
8

Mendapatkan URL Produk

Berpotensi membingungkan karena 3 metode yang dapat Anda gunakan, semuanya ada di Mage_Catalog_Model_Product:

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

Cara terbaik untuk menjelaskan adalah dengan hanya menunjukkan hasil dari beberapa panggilan. Diberikan produk yang kunci URL-nya mondrian-large-coffee-set-multicolour pada domain http: //made.local hasilnya adalah:

$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'
Pengembang Pimpinan
sumber