Magento 2: отримати переписати URL-адресу продукту


15

Я намагаюся отримати rewrite product urlз load productкористувальницького модуля. Я отримую URL у http://localhost/m2/catalog/product/view/id/1401/category/23/форматі.

Але я хочу http://localhost/m2/juno-jacket.html

Ось код

в конструкторі

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

Спеціальна функція

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

abc() method URL-адреса повернення, як http://localhost/m2/catalog/product/view/id/1401/category/23/


відновіть свої індекси
Маріус

@Marius: У мене теж відбудова. Це не повертається URL перезапису продукту.
zed Blackbeard

ваш продукт пов’язаний з будь-яким веб-сайтом?
Маріус

Я призначив продукт на головному веб-сайті
zed Blackbeard

getProductUrl()повинен повернути переписану URL-адресу, якщо запис існує в url_rewrite. Ви видалили записи з цієї таблиці вручну?
musicliftsme

Відповіді:


4

Ось метод, який я використовував для отримання URL-адреси продукту.

Це, безумовно, не оптимально, оскільки мені доводиться завантажувати весь продукт, щоб отримати його дуже погано з точки зору продуктивності.

Спочатку потрібно ввести Magento\Catalog\Model\ProductRepositoryконструктор a :

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

Потім ви завантажуєте продукт на основі ідентифікатора продукту:

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

Нарешті, ви можете отримати модель URL для отримання переписаної URL-адреси:

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

Подвійний кома в кінці не призначений, чи не так?
Макс

@Max так, я повністю його зняв
Рафаель у Digital Pianism

5
Я зіткнувся з тим же, і я спробував ваш код, але все ж URL-адреси для мене неправильні. Порадьте, будь ласка.
Аншу Мішра

Іншим способом (і менш перф-убивцею) може бути примушення додавання перезаписів URL-адрес для завантаження продукту. Дивіться мою відповідь.
Герве Ґетін

та сама помилка, будь ласка, скажіть мені, де я можу поставити цей код?
Рахул Каточ

3

Це може насправді не відповісти на питання, але є ймовірність того, що якщо у вас відсутнє перезапис URL-адрес, ви можете вивести продукт із колекції продуктів. І додавання інформації про перезапис URL-адрес не є автоматичним, як ви бачите в \Magento\Catalog\Model\ResourceModel\Product\Collection::$_addUrlRewrite.

Те, як мені вдалося змусити додавати URL-адреси переписується, створивши плагін за create()методом \Magento\Catalog\Model\ResourceModel\Product\CollectionFactory. І як тільки ваш код (або основний код Magento) використовує цю фабрику для примірника колекції продуктів (і це повинно бути як найкраща практика), цей плагін змушує це \Magento\Catalog\Model\ResourceModel\Product\Collection::$_addUrlRewriteзробити true.

Потім продукти перезапису URL-адреси продуктів успішно додаються до продуктів, не потребуючи циклу на них та перезавантаження. Таким чином, це виправляє недоліки, про які говорив @Raphael.

Ось визначення плагіна XML (у вашому di.xmlфайлі):

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

І код плагіна:

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

Я намагався таким чином, але клас плагінів не виконується. Ти знаєш чому?
Глибоко

0

Експортуйте свої продукти у файл CSV

з CSV-файлу в Excel використовуйте цю формулу для стовпця url_key

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

де "P103" - це стовпець url_key

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.