Magento 2:获取重写的产品网址


15

我试图rewrite product urlload 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 像这样返回网址 http://localhost/m2/catalog/product/view/id/1401/category/23/


重建索引
Marius

@Marius:我也有重建。它不返回产品重写URL。
zed Blackbeard

您的产品与任何网站相关联吗?
马吕斯

我已经在主要网站上分配了产品
zed Blackbeard

getProductUrl()如果该条目存在于中,则应该返回重写的URL url_rewrite。您是否手动从该表中删除了记录?
musicliftsme

Answers:


4

这是我用来获取产品网址的方法。

绝对不是最佳选择,因为我必须加载整个产品才能使其在性能方面非常糟糕。

首先,您需要Magento\Catalog\Model\ProductRepository在构造函数中注入a :

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

然后,您根据产品ID加载产品:

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

最后,您可以获取URL模型以检索重写的URL:

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

最后不是双逗号,不是吗?
最高

@Max是的,我完全删除了
Raphael在Digital Pianism

5
我也面临同样的问题,并且尝试了您的代码,但网址对我来说仍然不正确。请指教。
Anshu Mishra'2

另一种方法(并且减少杀手)可能是在产品收集负载上强制添加URL重写。看我的答案。
埃尔维·格丁(HervéGuétin)'17年

同样的错误,您能告诉我在哪里放置此代码吗?
拉胡尔·卡托奇

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

在Excel中的csv文件中使用此公式作为url_key列

=“ https://www.yourdomain.com/”&P103&“ .html”

其中“ P103”是url_key列

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.