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/


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

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

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

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.