从愿望清单中删除禁用的产品

Remove disabled product from wishlist

我需要从心愿单中删除所有禁用的产品,为此我在 Magento_Wishlist/templates/item/list.phtml 中写了一个产品状态检查,如下所示:

if($product->getStatus() == \Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED):
------------
endif;

我还在 header 部分添加了一个插件来更新心愿单数量,如下所示:

/etc/di.xml:

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
    <type name="Magento\Wishlist\CustomerData\Wishlist">
        <plugin name="vendor-customer-wishlist"
                type="Vendor\Customer\Plugin\WishlistPlugin" sortOrder="1" />
    </type>
</config>

Vendor/Customer/Plugin/WishlistPlugin

<?php
namespace Vendor\Customer\Plugin;

use Magento\Catalog\Model\Product\Attribute\Source\Status;

/**
 * Class WishlistPlugin
 * @package Vendor\Customer\Plugin
 */
class WishlistPlugin
{
    /**
     * @var \Magento\Wishlist\Helper\Data
     */
    protected $wishlistHelper;

    /**
     * @param \Magento\Wishlist\Helper\Data $wishlistHelper
     */
    public function __construct(
        \Magento\Wishlist\Helper\Data $wishlistHelper
    ) {
        $this->wishlistHelper = $wishlistHelper;
    }

    /**
     * Plugin function after get section data
     *
     * @param \Magento\Wishlist\CustomerData\Wishlist $subject
     * @param $result
     * @return mixed
     */
    public function afterGetSectionData(\Magento\Wishlist\CustomerData\Wishlist $subject, $result)
    {
        $disabledProductsCount = 0;

        foreach ($this->wishlistHelper->getWishlistItemCollection() as $item) {
            if($item->getProduct()->getStatus() == Status::STATUS_DISABLED) $disabledProductsCount++;
        }

        $counterNumber = $this->wishlistHelper->getItemCount();

        if($disabledProductsCount) {
            $counterNumber -= $disabledProductsCount;
        }

        $result['counter'] = $counterNumber;

        return $result;
    }


}

但是当我在心愿单中添加三项并禁用其中的一项产品时,心愿单计数器无法正确更新,它仍然是三个。我该如何解决?

这取决于您将其添加到何处,可能最好的调用位置是在页脚(它将触发该客户的愿望清单计数在每一页上更新)。

没有简单的方法可以使您的插件(后端)中的数据无效,所以对于您正在做的事情,因为您永远不知道您何时在前端禁用产品,所以我们可以假设刷新愿望清单数据每个页面加载都是最好的选择...

例如(在页脚中添加,更改为您的要求):

require([
   ....
   'Magento_Customer/js/customer-data'
], function (...,customerData) {
   "use strict";
   ...
   var sections = ['wishlist'];
   customerData.invalidate(sections);
   customerData.reload(sections, true);
   ...
});