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
getProductUrl()должен вернуть переписанный URL, если запись существует в url_rewrite. Вы удалили записи из этой таблицы вручную?
musicliftsme

Ответы:

4

Вот метод, который я использовал, чтобы получить URL продукта.

Это определенно не оптимально, так как я должен загрузить весь продукт, чтобы получить его очень плохо с точки зрения производительности.

Сначала вам нужно добавить Magento\Catalog\Model\ProductRepositoryв ваш конструктор:

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);
Рафаэль в цифровом пианизме
источник
Двойная запятая в конце не предназначена, не так ли?
Макс
@ Макс да, я его полностью удалил
Рафаэль в 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::$_addUrlRewriteto 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

CDzWebDev
источник