Magento 2: ottieni la riscrittura dell'URL del prodotto


15

Sto cercando di ottenere rewrite product urldal load productmodulo personalizzato. Ricevo l'URL in http://localhost/m2/catalog/product/view/id/1401/category/23/formato.

Ma io voglio http://localhost/m2/juno-jacket.html

Ecco il codice

nel costruttore

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

Funzione personalizzata

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

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


ricostruisci i tuoi indici
Marius

@ Mario: anche io ho ricostruito. Non restituisce l'URL di riscrittura del prodotto.
zed Barbanera

il tuo prodotto è associato a qualche sito web?
Marius

Ho assegnato il prodotto al sito Web principale
zed Barbanera

getProductUrl()dovrebbe restituire l'URL riscritto se la voce esiste in url_rewrite. Hai eliminato manualmente i record da questa tabella?
musicliftsme,

Risposte:


4

Ecco il metodo che ho usato per ottenere l'URL del prodotto.

Non è sicuramente ottimale in quanto devo caricare l'intero prodotto per renderlo così pessimo in termini di prestazioni.

Per prima cosa devi iniettare a Magento\Catalog\Model\ProductRepositorynel tuo costruttore:

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

Quindi si carica il prodotto in base all'ID prodotto:

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

Finalmente puoi ottenere il modello URL per recuperare l'URL riscritto:

return $product->getUrlModel()->getUrl($product);

La doppia virgola alla fine non è prevista, vero?
Max

@Max sì, l'ho rimosso
Raphael al Digital Pianism,

5
Sto affrontando lo stesso e ho provato il tuo codice, ma gli URL non sono corretti per me. Si prega di avvisare.
Anshu Mishra il

Un altro modo (e meno perf-killer) potrebbe essere quello di forzare l'aggiunta di riscritture URL al caricamento della raccolta prodotti. Vedi la mia risposta
Hervé Guétin,

stesso errore puoi dirmi dove posso inserire questo codice?
Rahul Katoch,

3

Questo potrebbe non rispondere davvero alla domanda, ma è probabile che, se ti manca la riscrittura dell'URL, potresti far uscire il tuo prodotto da una collezione di prodotti. E l'aggiunta delle informazioni di riscrittura degli URL non è automatica come puoi vedere in\Magento\Catalog\Model\ResourceModel\Product\Collection::$_addUrlRewrite .

Il modo in cui sono riuscito a forzare l'aggiunta di riscritture URL è creando un plug-in sul create()metodo di \Magento\Catalog\Model\ResourceModel\Product\CollectionFactory. E non appena il tuo codice (o il codice principale di Magento) utilizza questa factory per istanziare una raccolta di prodotti (e dovrebbe essere delle migliori pratiche), questo plugin impone \Magento\Catalog\Model\ResourceModel\Product\Collection::$_addUrlRewriteatrue .

Quindi, la riscrittura degli URL dei prodotti viene aggiunta correttamente ai prodotti senza la necessità di eseguirne il ciclo e ricaricarli. Risolve così il lato negativo perfetto di cui parlava @Raphael.

Ecco la definizione XML del plugin (nel tuo di.xmlfile):

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

E il codice del 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;
    }
}

Ho provato in questo modo, ma la classe del plug-in non è in esecuzione. Sai perché?
Piange

0

Esporta i tuoi prodotti in un file CSV

dal file CSV in Excel utilizzare questa formula per la colonna url_key

= "Https://www.yourdomain.com/" & P103 e ".html"

dove "P103" è la colonna url_key

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.