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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.