获取订单商品自定义索引并将其分配给选项值在Woocommerce

时间:2018-06-13 18:34:30

标签: php arrays wordpress woocommerce orders

我使用Woocommerce最新版本3.4.2。 在这种情况下,我们收集订单数据:产品及其添加剂(我收集元数据)。

如何将变量$skus[] = $product->get_sku();的索引指定为变量$product_mod[] = '';的值?

$product_mod[1] = "0"; //带键1的产品(成分糖)是产品修饰符,键为0.

// Get product details
$skus = $item_quantities = $line_item_totals = $product_mod = array();

// Loop though order items
foreach( $order->get_items() as $item_id => $item){
    $product_id = $item->get_product_id();
    $product = $item->get_product();

    $item_quantities[] = $item->get_quantity();
    $line_item_totals[] = $item->get_total();
    $skus[] = $product->get_sku();
    $product_mod[] = NULL;

    $ai = $item->get_meta('Optionally select');
    if( strpos( $ai, 'Cinnamon' ) !== false ) {
        $skus[] = '10001';
        $item_quantities[] ='1';
        $line_item_totals[] = '50';
        $product_mod[] = '';
    }

    if( strpos( $ai, 'Sugar' ) !== false ) {
        $skus[] = '10002';
        $item_quantities[] ='1';
        $line_item_totals[] = '50';
        $product_mod[] = '';
    }

    if( strpos( $ai, 'Mint' ) !== false ) {
        $skus[] = '10003';
        $item_quantities[] ='1';
        $line_item_totals[] = '50';
        $product_mod[] = '';
    }
}

// Product details
foreach ($skus as $key => $value){
    $data .= "&product_sku[".$key."]=".$value."";
    $data .= "&product_quantity[".$key."]=".$item_quantities[$key]."";
    $data .= "&product_price[".$key."]=".$line_item_totals[$key]."";
    if( isset($product_mod[$key]) ) {
        $data .= "&product_mod[".$key."]=".$key."";
    }
}

print_r( $data );现在显示: //为了方便阅读,我在一个专栏中写道,但这是一个字符串。

&product_sku[0]=10030 
&product_quantity[0]=1
&product_price[0]=499
&product_sku[1]=10002
&product_quantity[1]=1
&product_price[1]=50
&product_mod[1]=1

需要:

&product_sku[0]=10030 // Coffe sku
&product_quantity[0]=1 // Coffe quantity
&product_price[0]=499 // Coffe price
&product_sku[1]=10002 // Sugar sku
&product_quantity[1]=1 // Sugar quantity
&product_price[1]=50 // Sugar price
&product_mod[1]=0 // Ingredient Sugar with number 1, is a product modifier with number 0.

我认为这是正确的方法: Example

2 个答案:

答案 0 :(得分:1)

您已经使事情变得复杂了......您需要在变量中设置主要订单商品索引,以便在所选的其他选项中为您的产品修改器获取它。不需要任何并发症......

我重新访问,简化并压缩了您的代码:

// Array of defined options ( sku => option name )
$options  = array(
    '10001' => 'Cinnamon',
    '10002' => 'Sugar',
    '10003' => 'Mint',
);
$count = 0;

// Loop though order items
foreach( $order->get_items() as $item_id => $item){
    $product_id = $item->get_product_id();
    $product    = $item->get_product();

    $data .= '&product_sku['.$count.']='.$product->get_sku();
    $data .= '&product_quantity['.$count.']='.$item->get_quantity();
    $data .= '&product_price['.$count.']='.$item->get_total();
    $ind   = $count; // Here we set the main order item index in a variable
    $count++; 

    // Get order item selected options
    $options_selected = $item->get_meta('Optionally select');

    // Loop though order items selected options
    foreach( $options as $sku_key => $label_value ){
        if( strpos( $options_selected, $label_value ) !== false ) {
            $data .= '&product_sku['.$count.']='.$sku_key;
            $data .= '&product_quantity['.$count.']=1';
            $data .= '&product_price['.$count.']=50';
            $data .= '&product_mod['.$count.']='.$ind;
            $count++;
        }
    }
}

// Testing output
print_r( $data );

未经测试,但应该按预期工作。

答案 1 :(得分:0)

上课。这就是他们的目标。 通过这种方式,您可以将数据整齐地按照您希望的方式组合在一起,而不必保持订单或多个阵列的混乱。

下面的课程只是你必须自己制作的概念证明,吸气剂和制定者,但如果你这样做,你可以控制数据,它在哪里,什么属于什么,你甚至可以将数据从一个数组移动到另一个数组或复制对象。

您所做的就是制作拥有所需产品数据的自己的对象。 然后在其中添加一个“extras”数组,您可以在其中“添加”产品。 然后你添加一个函数来计算“自己的价格+额外的价格”的总和 以及您需要的其他一些帮助函数。

然后你把它包起来,有一个很好的课程来帮助你。

请注意,它是伪代码,需要一些工作。

class ProductData 
{
   protected $product_id;
   protected $product;
   protected $quantity;
   protected $total;
   protected $sku;
   protected $extras = [];

   public function __construct($product_id, $product, $sku, $total, $quantity) 
   {
      $this->product_id = $product_id;
      $this->product = $product;
      $this->sku = $sku;
      $this->total = $total;
      $this->quantity = $quantity;
   }
   public function addExtra($product) 
   {
      $this->extras[] = $product;
   }
   public function getTotal() 
   {
      $total = $this->total;
      foreach($this->extras as $extra)  {
          $this->total += $extra->getTotal();
      }
      return total;
   }
   public static function fromItem($item) 
   {
       $product = new self(
                          $item->get_product_id(),
                          $item->get_product(),
                          $item->get_sku(),
                          $item->line_item_totals(),
                          $item->get_quantity()
                   );
       return $product;

   }
}

$preregistered_extras = [
     'Cinnamon' => new Product(
                             wc_get_product_id_by_sku('10001'), 
                             wc_get_product(wc_get_product_id_by_sku('10001')), 
                             '10001', 
                             '50', 
                             '1'),
     'Sugar' => new Product(
                             wc_get_product_id_by_sku('10002'), 
                             wc_get_product(wc_get_product_id_by_sku('10002')), 
                             '10002', 
                             '50', 
                             '1'),
     'Mint' => new Product(
                             wc_get_product_id_by_sku('10003'), 
                             wc_get_product(wc_get_product_id_by_sku('10003')), 
                             '10003', 
                             '50', 
                             '1'),
];

$product_list = [];
foreach( $order->get_items() as $item_id => $item){
   $product = Product::fromItem($item);
   $ai = $item->get_meta('Optionally select');

   foreach($preregistered_extras as $name => $extra) {
      if( stripos( $ai, $name ) !== false ) { 
          $product->addExtra($extra);
      }
   }    
}
var_dump($product_list);
$total = 0;
foreach($product_list as $item) {
    $total += $item->getTotal();
}
echo "Total = $total";