Php WooCommerce中的自定义邮政类型数据和订单项目数据
我正在使用一个插件,以及WooCommerce,它支持将自定义帖子类型用作产品。这在大多数情况下都很有效,但我希望能够控制库存,并且我能够看到问题所在。在order_item_元表下的数据库中,product_id=0。由于产品id为空,因此无法更新已完成采购的库存 我知道WooCommerce对搜索位置做了一些更改,如果post_类型是“产品”,如果不是,则某些内容失败。我想知道是否有一个过滤器挂钩或其他方式添加产品id与一个自定义功能在结帐 这是我试图创建的功能,用于控制自定义类型的库存,我们正在销售活动“座位”。不,即使是普通的“股票”也不起作用,可能是因为同样的原因Php WooCommerce中的自定义邮政类型数据和订单项目数据,php,wordpress,woocommerce,cart,orders,Php,Wordpress,Woocommerce,Cart,Orders,我正在使用一个插件,以及WooCommerce,它支持将自定义帖子类型用作产品。这在大多数情况下都很有效,但我希望能够控制库存,并且我能够看到问题所在。在order_item_元表下的数据库中,product_id=0。由于产品id为空,因此无法更新已完成采购的库存 我知道WooCommerce对搜索位置做了一些更改,如果post_类型是“产品”,如果不是,则某些内容失败。我想知道是否有一个过滤器挂钩或其他方式添加产品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\u add\u cart\u item\u data
action hook,在add to cart上存储您的自定义帖子类型(CTP)Id,但为此,您需要在CTP页面的add to cart表单中显示一个隐藏字段,其中包含CTP Id,如:
<input type="hidden" name="ctpost_id" value="<?php echo get_the_id(); ?>">
第二个钩子是
woocommerce\u checkout\u create\u order\u line\u item
action钩子,用于添加自定义订单项元数据(或更改订单项数据)。在订单创建过程中,此挂钩在付款网关处理之前触发
您可以使用WC\u data
add\u meta\u 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 post ID作为自定义订单项目数据
最后,您可以使用
woocmerce\u payment\u 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\u order\u status\u changed
hooks,如:
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
}
}
}
相关:。这看起来很有希望!我马上就去试试。至于产品id,在哪里有$value['custom_id'],我使用什么方法从post id中获取它?我假设$value将包含该信息?
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
}
}
}