Magento 2:カスタム製品割引を適用した後、レイヤードナビゲーション価格フィルターが機能しない


13

製品割引モジュールに取り組んでいます。私はプラグインとオブザーバーでそれをしました。製品ページとリストページで正常に機能しています。ただし、更新された製品価格に応じて価格フィルターは機能しません。

価格をカスタマイズするために使用しているコードは次のとおりです。

VendorName / ModuleName / etc / 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\Pricing\Price\FinalPrice">
        <plugin name="custom_discount_catalog_pricing_price_finalprice" type="VendorName\ModuleName\Plugin\FinalPrice" />
    </type>
</config>

VendorName / ModuleName / etc / events.xml

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
    <event name='catalog_product_get_final_price'>
        <observer name='customdiscount_finalprice' instance='VendorName\ModuleName\Observer\ProcessFinalPrice'/>
    </event>
</config>

VendorName / ModuleName / Observer / ProcessFinalPrice.php

<?php

namespace VendorName\ModuleName\Observer;

use Magento\Framework\Event\ObserverInterface;

class ProcessFinalPrice implements ObserverInterface
{
    public function execute(\Magento\Framework\Event\Observer $observer)
    {
        $product = $observer->getEvent()->getProduct();
        $old = $product->getData('final_price');
        $discountedPrice = $old - ($old * 0.20);
        $product->setData('final_price',$discountedPrice);
    }
}

VendorName / ModuleName / Plugin / FinalPrice.php

<?php

namespace VendorName\ModuleName\Plugin;

class FinalPrice
{
    public function afterGetValue(\Magento\Catalog\Pricing\Price\FinalPrice $subject, $result)
    {
        $discountedPrice = $result - ($result * 0.20);
        return $discountedPrice;
    }
}

20%割引適用

割引価格で価格フィルターが機能しない

注:割引価格は顧客レベルです


こんにちはあなたが割引をしたい場合。私はあなたが使う「価格ルールをカタログ」を示唆していますので、
ラヴィ曽爾

@ravi Soniカスタムモジュールを作成しました。そのためにカタログ価格ルールを使用することはできません。
Dhairyaシャー

@Rohan同じバージョンを使用しており、動作していません。
Priyank

解決策がないままほぼ4年前から解決策を探しています。主な問題は、階層化されたナビゲーションの価格がテーブルから直接来ていることであり、その場で価格を変更しています
WISAM HAKIM

@WISAMHAKIMいいえ、適切な解決策はありません。一部のMagentoコアチームの人がこれを調べて解決策を提案できることを願っています:)
Priyank

回答:


5

これは解決策ではありませんが、価格フィルターがどのように機能するかの説明かもしれません。これは、ソリューションの特定に役立つ場合があります。

製品リストに表示される価格は、catalog_product_index_price表からのものです。
製品リストを取得するselectを見ると、次のようなものが表示されます。

SELECT 
  `e`.*, 
  `cat_index`.`position` AS `cat_index_position`, 
  `price_index`.`price`, 
  `price_index`.`tax_class_id`, 
  `price_index`.`final_price`, 
  IF(price_index.tier_price IS NOT NULL, LEAST(price_index.min_price, price_index.tier_price), price_index.min_price) AS `minimal_price`, 
  `price_index`.`min_price`, 
  `price_index`.`max_price`, 
  `price_index`.`tier_price` 
FROM `catalog_product_entity` AS `e` 
INNER JOIN `catalog_category_product_index_store1` AS `cat_index` ON cat_index.product_id=e.entity_id AND ....
INNER JOIN `catalog_product_index_price` AS `price_index` ON price_index.entity_id = e.entity_id AND ...

あなたの場合、製品が表示されたときにその場で製品の最終価格を変更しているため、機能しません。ただし、価格インデックステーブルには元の価格が残っています。

実際のインデックス作成は(少なくとも単純な製品の場合)で行われMagento\Catalog\Model\ResourceModel\Product\Indexer\Price\DefaultPrice::reindexます。
私はそこで何が起こるかを完全に説明することはできませんが、あなたはフックする何かを持っています。

prepareFinalPriceDataForType同じクラスのメソッドは、インデックス作成プロセスの開始時に呼び出されます。
このメソッドは、$this->modifyPriceIndex($finalPriceTable);
これで終わります。これは、価格調整クラスを作成して価格調整リストに追加する購入にフックすることができるものです。
次のような価格変更子を作成できます。

<?php
namespace Vendor\Module\Indexer\Price;

use Magento\Catalog\Model\ResourceModel\Product\Indexer\Price\PriceModifierInterface;
use Magento\Catalog\Model\ResourceModel\Product\Indexer\Price\IndexTableStructure;

class CustomPriceModifier implements PriceModifierInterface
{
     public function modifyPrice(IndexTableStructure $priceTable, array $entityIds = []) : void
     {
         //code here that modifies your price.
     }
}

価格変更子の例はにありMagento\CatalogInventory\Model\Indexer\ProductPriceIndexFilterます。これにより、在庫切れの製品を非表示に設定した場合、在庫切れの製品が価格指標から削除されます。

価格修飾子を作成しました。次に、既存の価格修飾子のリストに添付する必要があります。

あなたはあなたのdi.xmlファイルからそれを行うことができます

<type name="Magento\Catalog\Model\ResourceModel\Product\Indexer\Price\PriceInterface">
    <arguments>
        <argument name="priceModifiers" xsi:type="array">
            <item name="customPriceModifier" xsi:type="object">Vendor\Module\Indexer\Price\CustomPriceModifier</item>
        </argument>
    </arguments>
</type>

これmodifyPriceで、上記のクラスにメソッドを実装することにより、インデックステーブルの価格を適切に変更できるようになります。

それだけです。


素晴らしい説明。しかし、顧客レベルでの割引価格のため、私にとってはうまくいきません。
Dhairyaシャー

1
ええ magentoは顧客レベルの価格ではうまく機能しません。一方、顧客グループを使用できます。これは、インデックス作成を遅くする多くのグループを取得することを意味する場合があります。残念ながら、別のクリーンなソリューションはありません。またはそれについての汚いもの。
マリウス

私が探していた解決策がありません。しかし、あなたがフローのいくつかの説明で最初に答えたので、あなたに報奨金のポイントを与えたいです。
-Priyank

2

Magento 2のフロー構造を理解しているので、カタログ価格ルールを作成し、そのルールを保存して適用すると。その後、更新価格のためにデータのインデックスを再作成する必要があります。その時点で、適切な製品の価格が更新され、catalog_product_index_priceテーブルに保存されます。

しかし、このモジュールフロー構造を理解しているように、階層化されたナビゲーションフィルター用にレンダリングされた製品コレクションは変更されません。ここでvendor/magento/module-catalog/Model/Layer.php getProductCollection()関数を確認できます。したがって、プラグインロジックに従って、フロントエンド側に表示される値を更新するだけです。ただし、その製品コレクション(getProductCollection()関数データ)のfinal_priceおよびmin_priceフィールド値は更新しませんでした。

また、カスタムディスカウントの価格表示を確認することもできます。しかし、この製品は割引価格でカートに追加しませんでした。だから、それは完全な解決策ではないと思います。

そのため、カタログ価格ルールが更新するように、コレクションオブジェクトのfinal_pricemin_priceを更新する必要があります。

それがあなたにとって役立つことを願っています。

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