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.