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/

zed Blackbeard
quelle
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);
Raphael beim digitalen Pianismus
quelle
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;
    }
}
Hervé Guétin
quelle
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

CDzWebDev
quelle