Magento 2: Produkt-URL umschreiben lassen


15

Ich versuche, rewrite product urlvom load productin kundenspezifischen Modul zu erhalten. Ich erhalte eine URL im http://localhost/m2/catalog/product/view/id/1401/category/23/Format.

Aber ich möchte http://localhost/m2/juno-jacket.html

Hier ist der Code

im Konstruktor

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

Benutzerdefinierte funktion

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

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


Erstellen Sie Ihre Indizes neu
Marius

@ Marius: Ich habe auch wieder aufgebaut. Es wird keine Produktumschreibungs-URL zurückgegeben.
Zed Blackbeard

Ist Ihr Produkt mit einer Website verknüpft?
Marius

Ich habe ein Produkt
zed Blackbeard

getProductUrl()soll die umgeschriebene URL zurückgeben, wenn der Eintrag in existiert url_rewrite. Haben Sie manuell Datensätze aus dieser Tabelle gelöscht?
musicliftsme

Antworten:


4

Hier ist die Methode, mit der ich die Produkt-URL abgerufen habe.

Es ist definitiv nicht optimal, da ich das gesamte Produkt laden muss, um es in Bezug auf die Leistung so schlecht zu machen.

Zuerst müssen Sie Magento\Catalog\Model\ProductRepositoryin Ihren Konstruktor Folgendes einfügen:

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

Dann laden Sie das Produkt basierend auf der Produkt-ID:

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

Schließlich können Sie das URL-Modell abrufen, um die umgeschriebene URL abzurufen:

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

Das Doppelkomma am Ende ist nicht vorgesehen, oder?
Max

@ Max yeah total, ich habe es entfernt
Raphael beim Digital Pianism

5
Ich stehe vor dem selben und habe Ihren Code ausprobiert, aber die URLs sind für mich immer noch falsch. Bitte beraten.
Anshu Mishra

Eine andere Möglichkeit (und weniger leistungsschädigend) besteht darin, das Hinzufügen von URL-Neuschreibvorgängen beim Laden der Produktsammlung zu erzwingen. Siehe meine Antwort.
Hervé Guétin

gleichen Fehler können Sie mir bitte sagen, wo ich diesen Code setzen kann?
Rahul Katoch

3

Dies mag die Frage nicht wirklich beantworten, aber es besteht die Möglichkeit, dass Sie Ihr Produkt aus einer Produktkollektion entfernen, wenn Sie die URL-Umschreibung verpassen. Und das Hinzufügen von Informationen zum Umschreiben von URLs erfolgt nicht automatisch, wie Sie in sehen können \Magento\Catalog\Model\ResourceModel\Product\Collection::$_addUrlRewrite.

Ich habe es geschafft, das Hinzufügen von URL-Umschreibungen zu erzwingen, indem ich ein Plug-in für die create()Methode von erstellt habe \Magento\Catalog\Model\ResourceModel\Product\CollectionFactory. Und sobald Ihr Code (oder Magentos Kerncode) diese Factory zum Einleiten einer Produktkollektion verwendet (und dies sollte nach den besten Praktiken der Fall sein), erzwingt dieses Plugin das \Magento\Catalog\Model\ResourceModel\Product\Collection::$_addUrlRewriteAn true.

Anschließend werden die Produkte erfolgreich umgeschrieben, ohne dass eine Schleife erstellt und neu geladen werden muss. Auf diese Weise wird der Nachteil behoben, von dem @Raphael gesprochen hat.

Hier ist die XML-Definition des Plugins (in Ihrer di.xmlDatei):

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

Und der Plugin-Code:

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

Ich habe es auf diese Weise versucht, aber die Plugin-Klasse wird nicht ausgeführt. Weißt du, warum?
Tief

0

Exportieren Sie Ihre Produkte in eine CSV-Datei

Verwenden Sie aus der CSV-Datei in Excel diese Formel für die Spalte url_key

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

Dabei ist "P103" die url_key-Spalte

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.