Magento2:如何从购物车价格规则中的序列化条件中获取 SKU

Magento2: how to get the SKUs from the serialized condition in cart price rules

我需要从购物车价格规则中获取 SKU 以向它们分配特定属性,但条件保存在序列化的数据库中,我想进行 foreach 循环以从序列化条件中提取所有 SKU:

?php

use Magento\Framework\App\Bootstrap;

require __DIR__ . '/../app/bootstrap.php';

$params = $_SERVER;

$bootstrap = Bootstrap::create(BP, $params);

$obj = $bootstrap->getObjectManager();

$state = $obj->get('Magento\Framework\App\State');
$state->setAreaCode('frontend');

$objrules = $obj->create('Magento\SalesRule\Model\RuleFactory')->create();
$rules = $objrules->getCollection()->addFieldToFilter("is_active", "1");

 foreach ($rules as $rule) {
     echo $rule->getConditionsSerialized() . "\n";

     }

序列化条件的结果为:

{"type":"Magento\SalesRule\Model\Rule\Condition\Combine","attribute":null,"operator":null,"value":1,"is_value_processed":null,"aggregator":"all","conditions":[{"type":"Magento\SalesRule\Model\Rule\Condition\Product\Subselect","attribute":"qty","operator":">=","value":"1","is_value_processed":null,"aggregator":"any","conditions":[{"type":"Magento\SalesRule\Model\Rule\Condition\Product","attribute":"sku","operator":"==","value":"100817069","is_value_processed":false,"attribute_scope":null},{"type":"Magento\SalesRule\Model\Rule\Condition\Product","attribute":"sku","operator":"==","value":"100817051","is_value_processed":false,"attribute_scope":null},{"type":"Magento\SalesRule\Model\Rule\Condition\Product","attribute":"sku","operator":"==","value":"100817561","is_value_processed":false,"attribute_scope":null},{"type":"Magento\SalesRule\Model\Rule\Condition\Product","attribute":"sku","operator":"==","value":"100817579","is_value_processed":false,"attribute_scope":null}]}]}

那么,我们如何从这个条件中提取所有 SKU。

提前致谢。

尝试这样的事情:

<?php
ini_set('display_errors', '1');
ini_set('error_reporting', E_ALL);
use Magento\Framework\App\Bootstrap;

require __DIR__ . '/../app/bootstrap.php';

$params = $_SERVER;

$bootstrap = Bootstrap::create(BP, $params);

$obj = $bootstrap->getObjectManager();

$state = $obj->get('Magento\Framework\App\State');
$state->setAreaCode('frontend');

$objrules = $obj->create('Magento\SalesRule\Model\RuleFactory')->create();
$rules = $objrules->getCollection()->addFieldToFilter("is_active", "1");
$skus = [];

if ($rules) {
    foreach ($rules as $rule) {
        $ruleData = $rule->getConditionsSerialized();
        if ($ruleData) {
            $ruleDataArray = json_decode($ruleData, true);
            if (isset($ruleDataArray['conditions'])) {
                $conditions = $ruleDataArray['conditions'];
                foreach ($conditions as $condition) {
                    if (isset($condition['conditions'])) {
                        $productConditions = $condition['conditions'];
                        foreach ($productConditions as $productCondition) {
                            if (isset($productCondition['value'])) {
                                $skuValues = $productCondition['value'];
                                $skuValues = explode(",",$skuValues);
                                foreach ($skuValues as $skuValue) {
                                    $skus[] = $skuValue;
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}

$uniqSkus = array_unique($skus);
print_r($uniqSkus);
exit;