我们正在建立一个商店,其中每个商品都有三种变体(小,中,大)。每种产品的每种变化都有限量库存--100小,35中,15大。由于产品是限量版,我们希望能够存储客户的订单号 - 即original quantity - new quantity
。例如,如果某人是第一个购买产品A的小变体的人,则他们的号码将为1
。购买产品A的小变体的下一个人将是2
,依此类推,一直到100
,之后Small变种将不再出售。
这是我迄今为止所拥有的内容,并附在woocommerce_checkout_update_order_meta
:
// Generate order number
$order = wc_get_order( $order_id );
// Getting the items in the order
$order_items = $order->get_items();
// Iterating through each item in the order
foreach ($order_items as $item_id => $item_data) {
$product = wc_get_product($item_data['product_id']);
$total = get_post_meta($product->id, 'total_sales', true);
$quantity = $product->get_stock_quantity();
$max = $total + $quantity;
$number = $max - $quantity;
$name = $item_data['name'];
update_post_meta( $order_id, $name.' - Print Number', $number);
}
但是,这不能正常工作,因为total_sales
字段无法跟踪变化;相反,它指的是给定产品的任何变化的总销售额。
所以我需要做的是想出一种方法来跟踪每个变化的原始库存,然后在订单完成时从原始库存中减去当前的变化数量。有没有人有任何关于实现这个的建议?我希望自动计算出来,因此我们不必花费额外的时间为每个订单手动执行此操作。
答案 0 :(得分:2)
您可以为每个产品变体添加两个自定义字段: 1.原始产品数量:您将减去的数量 2.总销售额:当前销售数量
这些将允许您跟踪每个变化数量和销售。
将数字添加到订单或订单商品元素:
1.例如,您可以通过在元字段前添加产品ID作为整体,将数量添加到订单中。使用woocommerce_checkout_update_order_meta
:
add_action( 'woocommerce_checkout_update_order_meta', 'prefix_add_order_meta', 10, 2 );
function prefix_add_order_meta( $order_id, $data ) {
// Generate order number
$order = wc_get_order( $order_id );
// Getting the items in the order
$order_items = $order->get_items();
/**
* @var WC_Order_Item_Product $item_data
*/
foreach ( $order_items as $item_id => $item_data ) {
$product = $item_data->get_product();
$total_sales = (int) get_post_meta( $product->get_id(), 'custom_total_sales', true );
$item_number = $total_sales + 1;
// Add to order meta
$order->add_meta_data( $product->get_id() . '_print_number', wc_clean( $item_number ), true );
$order->save();
// Add to order item meta. You can set this here or use the 'woocommerce_checkout_create_order_line_item'
$item_data->add_meta_data( 'print_number', wc_clean( $item_number ), true );
$item_data->save();
// Save total to product
$product->add_meta_data( 'custom_total_sales', wc_clean( $item_number ), true );
$product->save();
}
}
'woocommerce_checkout_create_order_line_item'
将元数据添加到订单商品中。不需要前缀,因为项目本身就是产品以下是一个例子:
add_action( 'woocommerce_checkout_create_order_line_item', 'prefix_add_order_item_meta', 10, 4 );
function prefix_add_order_item_meta( $item, $cart_item_key, $values, $order ) {
$product = $item->get_product();
$total_sales = (int) get_post_meta( $product->get_id(), 'custom_total_sales', true );
$item_number = $total_sales + 1;
// Add to order item meta. No need to save here
$item->add_meta_data( 'print_number', wc_clean( $item_number ), true );
}
答案 1 :(得分:0)
VanboDevelops'答案非常有帮助,所以我继续把它标记为已接受的答案。但是,我最终如何做到这一点有点不同。我希望能够轻松编辑限量版编号,不仅用于测试,而且如果订单被取消,我们需要回滚打印编号。所以对我来说,解决方案是为所有变体创建一个自定义字段,可以在价格,尺寸等方面轻松编辑。以下是我添加到functions.php
的内容:
add_action( 'woocommerce_product_after_variable_attributes', 'variation_settings_fields', 10, 3 );
function variation_settings_fields( $loop, $variation_data, $variation ) {
woocommerce_wp_text_input(
array(
'id' => '_print_number[' . $variation->ID . ']',
'label' => __( 'Print number (most recently sold)', 'woocommerce' ),
'desc_tip' => 'true',
'description' => __( 'The most recently-sold Print Number for this size and print. WARNING: This value plus 1 is used to show the user which print number they will be purchasing. Only update this value manually in specific situations, such as if an order is canceled and the print number needs to be offset.', 'woocommerce' ),
'value' => get_post_meta( $variation->ID, '_print_number', true ),
'custom_attributes' => array(
'step' => '1',
'min' => '1'
)
)
);
}
add_action( 'woocommerce_save_product_variation', 'save_variation_settings_fields', 10, 2 );
function save_variation_settings_fields( $post_id ) {
$number_field = $_POST['_print_number'][ $post_id ];
if( !empty( $number_field ) || $number_field == 0 ) {
update_post_meta( $post_id, '_print_number', esc_attr( $number_field ) );
}
}
add_filter( 'woocommerce_available_variation', 'load_variation_settings_fields' );
function load_variation_settings_fields( $variations ) {
$variations['print_number'] = get_post_meta( $variations[ 'variation_id' ], '_print_number', true );
return $variations;
}
add_action( 'woocommerce_checkout_update_order_meta', 'prefix_add_order_meta', 10, 2 );
function prefix_add_order_meta( $order_id, $data ) {
// Generate order number
$order = wc_get_order( $order_id );
// Getting the items in the order
$order_items = $order->get_items();
foreach ( $order_items as $item_id => $item_data ) {
$product = $item_data->get_product();
$product_id = $product->get_id();
// Update print number
$print_number = (int) get_post_meta( $product_id, '_print_number', true );
$print_number += wc_clean( $item_data['qty'] );
update_post_meta( $product_id, '_print_number', wc_clean( $print_number ) );
// Add to order meta
$order->add_meta_data( $product_id . '_print_number', wc_clean( $print_number ), true );
$order->save();
}
}
此解决方案还会考虑订单中是否包含多个选定的版本 - 例如,如果有人选择同一张照片的2张小版画,则该版本的打印编号将相应增加2。在这种情况下,订单元信息将仅显示最新的打印编号,但通过查看数量和最终打印编号,我们可以推断出哪些数字。理想情况下,更强大的解决方案会在订单元数据中列出所有打印数字,但这符合我们的需求。