Php WooCommerce中的自定义邮政类型数据和订单项目数据

Php WooCommerce中的自定义邮政类型数据和订单项目数据,php,wordpress,woocommerce,cart,orders,Php,Wordpress,Woocommerce,Cart,Orders,我正在使用一个插件,以及WooCommerce,它支持将自定义帖子类型用作产品。这在大多数情况下都很有效,但我希望能够控制库存,并且我能够看到问题所在。在order_item_元表下的数据库中,product_id=0。由于产品id为空,因此无法更新已完成采购的库存 我知道WooCommerce对搜索位置做了一些更改,如果post_类型是“产品”,如果不是,则某些内容失败。我想知道是否有一个过滤器挂钩或其他方式添加产品id与一个自定义功能在结帐 这是我试图创建的功能,用于控制自定义类型的库存,我

我正在使用一个插件,以及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
        }
    }
}