Magento 2:製品のURLを書き換える


15

カスタムモジュールrewrite product urlから取得しようとしていload productます。http://localhost/m2/catalog/product/view/id/1401/category/23/形式でurlを取得しています。

でも私はしたい 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/


インデックスの再構築
マリウス

@マリウス:私も再構築しています。製品の書き換えURLを返していません。
ZED黒ひげ

あなたの製品はウェブサイトに関連付けられていますか?
マリウス

私は、メインのウェブサイトで製品を割り当てた
黒ひげZED

getProductUrl()にエントリが存在する場合、書き換えられたURLを返すことになっていますurl_rewrite。このテーブルからレコードを手動で削除しましたか?
-musicliftsme

回答:


4

以下は、製品のURLを取得するために使用したメソッドです。

パフォーマンスの点で非常に悪くなるために製品全体をロードする必要があるため、これは間違いなく最適ではありません。

まずMagento\Catalog\Model\ProductRepository、コンストラクタにを挿入する必要があります。

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完全に削除しました
Digital PianismのRaphael、

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::$_addUrlRewritetrueます。

次に、製品の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列です

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.