我使用插件,WooCommerce Custom Post Type Manager,以及WooCommerce,可以使用自定义帖子类型作为产品。这在大多数情况下运作良好,但我希望能够控制库存,我能够看到问题。在order_item_meta表下的数据库中,product_id = 0.由于product_id为空,因此无法在已完成的购买时更新库存。
我知道如果post_type是'产品',WooCommerce会对其搜索的位置进行一些更改,如果没有,则某些事情会失败。我想知道是否有一个过滤器挂钩或其他方式在结帐时添加自定义功能的产品ID?
这是我试图创建的功能来控制自定义类型的库存,我们正在销售事件“席位”。不,即使是常规的“股票”也不起作用,可能是因为同样的原因。
function update_course_seats( $order_id ){
$order = wc_get_order( $order_id );
$items = $order->get_items();
foreach ( $items as $item ) {
$product_id = $item->get_product_id(); // this returns 0
if($product_id != 0) {
wc_update_order_item_meta( $item, '_seats', 10 ); // example number
}
}
//add_action( 'woocommerce_payment_complete', 'update_course_seats');
首先你应该使用woocommerce_add_cart_item_data
动作钩子来存储自定义帖子类型(CTP)ID添加到购物车...但为此你需要在你的CTP页面上显示添加到购物车形式,CTP的隐藏字段我想要:
<input type="hidden" name="ctpost_id" value="<?php echo get_the_id(); ?>">
现在您可以添加此挂钩功能,它将添加为您的CTP Id的自定义购物车项目数据:
add_filter( 'woocommerce_add_cart_item_data', 'add_custom_cart_item_data', 10, 3 );
function add_custom_cart_item_data( $cart_item_data, $product_id, $variation_id ){
if( isset( $_POST['ctpost_id'] ) ) {
$cart_item_data['ctpost_id'] = wc_clean( $_POST['ctpost_id'] );
}
return $cart_item_data;
}
要使用的第二个钩子是woocommerce_checkout_create_order_line_item
动作钩子,用于添加自定义订单项元数据(或对订单项数据进行更改)。在订单创建期间,在支付网关处理之前触发此挂钩。
您可以使用WC_data
add_meta_data()
方法将您的CTP Id保存为自定义CTP ID,如:
add_action( 'woocommerce_checkout_create_order_line_item', 'save_cpt_id_to_order_item_data', 10, 4 );
function save_cpt_id_to_order_item_data( $item, $cart_item_key, $cart_item, $order ){
if( isset($cart_item['ctpost_id']) && $cart_item['ctpost_id'] > 0 ) {
// Add the custom CTP post ID
$item->add_meta_data('_ctpost_id', $cart_item['ctpost_id'] );
}
// And here for example you add seats as custom cart item data
if( isset($cart_item['quantity']) ) {
$item->add_meta_data( 'Seats', $cart_item['quantity'], true );
}
}
当订单获得付款后,您将能够更新所需的所有内容,因为您将CTP邮政ID作为自定义订单商品数据。
最后,你可以使用woocommerce_payment_complete
如下:
add_action( 'woocommerce_payment_complete', 'action_payment_complete_callback', 10, 1 );
function action_payment_complete_callback( $order_id ){
$order = wc_get_order();
// Loop through order items
foreach ( $order->get_items() as $item_id => $item ) {
$ctp_id = $item->get_meta('_ctpost_id'); // Get the CTP post ID
// Your code goes here
}
}
或者woocommerce_order_status_changed
挂钩像:
add_action( 'woocommerce_order_status_changed', 'action_order_status_changed_callback', 10, 4 );
function action_order_status_changed_callback( $order_id, $status_from, $status_to, $order ){
if( in_array( $status_to, ['processing','completed'] ) ) {
// Loop through order items
foreach ( $order->get_items() as $item_id => $item ) {
$ctp_id = $item->get_meta('_ctpost_id'); // Get the CTP post ID
// Your code goes here
}
}
}
相关:Get Order items and WC_Order_Item_Product in Woocommerce 3。