Magento 2: dapatkan url produk menulis ulang

15

Saya mencoba untuk mendapatkan rewrite product urldari load productmodul khusus. Saya mendapatkan url dalam http://localhost/m2/catalog/product/view/id/1401/category/23/format.

Tapi aku ingin http://localhost/m2/juno-jacket.html

Ini kodenya

dalam konstruktor

public function __construct(
    \Magento\Catalog\Helper\Product $catalogProductHelper,
) {
    $this->catalogProductHelper = $catalogProductHelper;
}

Fungsi kustom

public function abc(){
    $product_id = '123';
    return  $this->catalogProductHelper->getProductUrl($product_id);
}

abc() method kembalikan url seperti http://localhost/m2/catalog/product/view/id/1401/category/23/

zed Blackbeard
sumber
bangun kembali indeks Anda
Marius
@Marius: saya telah membangun kembali juga. Itu tidak mengembalikan url penulisan ulang produk.
zed Blackbeard
apakah produk Anda terkait dengan situs web apa pun?
Marius
Saya telah menetapkan produk di situs web utama
zed Blackbeard
getProductUrl()seharusnya mengembalikan URL yang ditulis ulang jika entri tersebut ada di url_rewrite. Apakah Anda menghapus catatan dari tabel ini secara manual?
musicliftsme

Jawaban:

4

Berikut adalah metode yang saya gunakan untuk mendapatkan url produk.

Ini jelas tidak optimal karena saya harus memuat seluruh produk untuk mendapatkannya sehingga sangat buruk dalam hal kinerja.

Pertama, Anda perlu menyuntikkan Magento\Catalog\Model\ProductRepositorydi konstruktor Anda:

use Magento\Catalog\Model\ProductRepository;
//...
public function __construct(
    ProductRepository $productRepository
) {
    $this->_productRepository = $productRepository;
}

Kemudian Anda memuat produk berdasarkan id produk:

$product = $this->_productRepository->getById($productId);

Akhirnya Anda bisa mendapatkan model URL untuk mengambil URL yang ditulis ulang:

return $product->getUrlModel()->getUrl($product);
Raphael di Digital Pianism
sumber
Koma ganda pada bagian akhir tidak dimaksudkan, bukan?
Maks
@ Max ya benar, saya menghapusnya
Raphael di Digital Pianism
5
Saya menghadapi hal yang sama dan saya telah mencoba kode Anda tetapi url tetap salah bagi saya. Mohon saran.
Anshu Mishra
Cara lain (dan lebih sedikit perf-killer) mungkin untuk memaksa penambahan penulisan ulang URL pada beban koleksi produk. Lihat jawaban saya.
Hervé Guétin
kesalahan yang sama dapatkah Anda memberi tahu saya di mana saya dapat meletakkan kode ini?
Rahul Katoch
3

Ini mungkin tidak benar-benar menjawab pertanyaan tetapi kemungkinannya adalah, jika Anda melewatkan penulisan ulang URL, Anda mungkin mengeluarkan produk dari koleksi produk. Dan menambahkan info penulisan ulang URL tidak otomatis seperti yang Anda lihat \Magento\Catalog\Model\ResourceModel\Product\Collection::$_addUrlRewrite.

Cara saya berhasil memaksa penambahan penulisan ulang URL adalah dengan membuat plugin pada create()metode \Magento\Catalog\Model\ResourceModel\Product\CollectionFactory. Dan segera setelah kode Anda (atau kode inti Magento) menggunakan pabrik ini untuk menginstalasi koleksi produk (dan itu harus sebagai praktik terbaik), plugin ini memaksa \Magento\Catalog\Model\ResourceModel\Product\Collection::$_addUrlRewriteuntuk true.

Kemudian, penulisan ulang URL produk berhasil ditambahkan ke produk tanpa perlu mengulanginya dan memuatnya kembali. Dengan demikian memperbaiki kekurangan perf yang dibicarakan @Raphael.

Berikut adalah definisi XML plugin (dalam di.xmlfile Anda ):

<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
    <type name="Magento\Catalog\Model\ResourceModel\Product\CollectionFactory">
        <plugin name="your_plugin_unique_nane" type="Your\Plugin\Namespace\Plugin" />
    </type>
</config>

Dan kode plugin:

namespace Your\Plugin\Namespace;

use Magento\Catalog\Model\ResourceModel\Product\Collection;
use Magento\Catalog\Model\ResourceModel\Product\CollectionFactory as CoreCollectionFactory;

class Plugin
{
    /**
     * @param CoreCollectionFactory $subject
     * @param Collection $collection
     * @return Collection
     */
    public function afterCreate(CoreCollectionFactory $subject, Collection $collection)
    {
        $collection->addUrlRewrite();

        return $collection;
    }
}
Hervé Guétin
sumber
Saya mencoba cara ini, tetapi kelas plugin tidak mengeksekusi. Apa kamu tahu kenapa?
Deeps
0

Ekspor produk Anda ke file csv

dari file csv di Excel gunakan rumus ini untuk kolom url_key

= "https://www.yourdomain.com/" & P103 & ".html"

di mana "P103" adalah kolom url_key

CDzWebDev
sumber