gpt4 book ai didi

php - WooCommerce 中的自定义帖子类型数据和订单项目数据

转载 作者:可可西里 更新时间:2023-10-31 23:35:54 25 4
gpt4 key购买 nike

我正在使用一个插件,WooCommerce Custom Post Type Manager ,以及支持将自定义帖子类型用作产品的 WooCommerce。这在大多数情况下工作得很好,但我希望能够控制库存并且我能够看到问题。在 order_item_meta 表下的数据库中,product_id = 0。因为 product_id 为空,所以无法在完成购买时更新库存。

我知道如果 post_type 是“产品”,WooCommerce 会对其搜索位置进行一些更改,如果不是,则某些事情会失败。我想知道是否有过滤器 Hook 或其他方式在结账时添加带有自定义功能的产品 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 操作 Hook ,将您的自定义帖子类型 (CTP) Id 存储到添加到购物车中……但为此您需要显示,您的 CTP 页面,在添加到购物车表单中,一个带有 CTP Id 的隐藏字段,例如:

<input type="hidden" name="ctpost_id" value="<?php echo get_the_id(); ?>">

现在您可以添加这个钩子(Hook)函数,它将添加您的 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;
}

要使用的第二个 Hook 是 woocommerce_checkout_create_order_line_item 操作 Hook ,用于添加自定义订单项元数据(或更改订单项数据)。此 Hook 在订单创建期间支付网关处理之前触发。

您可以使用 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 post 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 Hook ,如:

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 .

关于php - WooCommerce 中的自定义帖子类型数据和订单项目数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55601398/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com