Magento 2: pobierz adres URL produktu

15

Próbuję uzyskać rewrite product urlz load productniestandardowego modułu. Otrzymuję adres URL w http://localhost/m2/catalog/product/view/id/1401/category/23/formacie.

Ale ja chcę http://localhost/m2/juno-jacket.html

Oto kod

w konstruktorze

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

Funkcja niestandardowa

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

abc() method zwróć adres URL jak http://localhost/m2/catalog/product/view/id/1401/category/23/

zed Czarnobrody
źródło
odbuduj swoje indeksy
Marius
@Marius: Ja też przebudowałem. To nie jest zwrot adresu URL przepisania produktu.
Zed Blackbeard
czy twój produkt jest powiązany z jakąkolwiek witryną?
Marius
Przypisałem produkt na głównej stronie
zed Blackbeard
getProductUrl()ma zwrócić przepisany adres URL, jeśli wpis istnieje w url_rewrite. Czy ręcznie usunąłeś rekordy z tej tabeli?
musicliftsme

Odpowiedzi:

4

Oto metoda, której użyłem, aby uzyskać adres URL produktu.

To zdecydowanie nie jest optymalne, ponieważ muszę załadować cały produkt, aby uzyskać tak bardzo zły pod względem wydajności.

Najpierw musisz wstrzyknąć a Magento\Catalog\Model\ProductRepositorydo swojego konstruktora:

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

Następnie ładujesz produkt na podstawie identyfikatora produktu:

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

Wreszcie możesz pobrać model adresu URL w celu odzyskania przepisanego adresu URL:

return $product->getUrlModel()->getUrl($product);
Raphael at Digital Pianism
źródło
Podwójny przecinek na końcu nie jest zamierzony, prawda?
Maks.
@ Max tak, całkowicie, usunąłem go
Raphael z Digital Pianism
5
Mam do czynienia z tym samym i wypróbowałem twój kod, ale wciąż adresy URL są dla mnie niepoprawne. Proszę doradź.
Anshu Mishra
Innym sposobem (i mniej perf-killerem) może być wymuszenie dodawania przepisywania adresów URL podczas ładowania kolekcji produktów. Zobacz moją odpowiedź.
Hervé Guétin
ten sam błąd, czy możesz mi powiedzieć, gdzie mogę umieścić ten kod?
Rahul Katoch
3

To może tak naprawdę nie odpowiedzieć na pytanie, ale są szanse, że jeśli brakuje przepisania adresu URL, możesz wyciągnąć swój produkt z kolekcji produktów. Dodanie informacji o przepisywaniu adresu URL nie jest automatyczne, jak widać w \Magento\Catalog\Model\ResourceModel\Product\Collection::$_addUrlRewrite.

Sposób, w jaki udało mi się wymusić dodanie przepisywania adresów URL, polega na utworzeniu wtyczki w create()metodzie \Magento\Catalog\Model\ResourceModel\Product\CollectionFactory. I gdy tylko Twój kod (lub główny kod Magento) użyje tej fabryki do zainicjowania kolekcji produktów (i powinno to być zgodne z najlepszymi praktykami), wtyczka ta wymusza \Magento\Catalog\Model\ResourceModel\Product\Collection::$_addUrlRewriteto true.

Następnie przepisywanie adresów URL produktów jest z powodzeniem dodawane do produktów bez potrzeby zapętlania ich i ponownego ładowania. To naprawia w ten sposób wadę perf, o której mówił @Raphael.

Oto definicja XML wtyczki (w twoim di.xmlpliku):

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

I kod wtyczki:

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
źródło
Próbowałem w ten sposób, ale klasa wtyczek nie działa. Wiesz dlaczego?
Deeps
0

Wyeksportuj swoje produkty do pliku csv

z pliku csv w programie Excel użyj tej formuły dla kolumny url_key

= „https://www.twojadomena.com/” i P103 i „.html”

gdzie „P103” to kolumna url_key

CDzWebDev
źródło