如何在 WooCommerce 中循环遍历订单商品数量

How to loop through order item quantity in WooCommerce

以下问题:我想为任意数量的订单输出 PDF 按钮。对于此 PDF 按钮,应为每个订单提供订单 ID 和项目 ID,以便生成 PDF。

在下面的代码部分,我还可以从前端的图片中看出我的意思:

foreach ( $order->get_items() as $item_id => $item ) {
$order = new WC_Order( $_POST['oid'] );
$cid = get_user_meta( get_current_user_id(), 'company', true );
$result = $wpdb->get_results( 'SELECT * FROM ' . $wpdb->prefix . "center_codes WHERE order_id = '" . $order_id . "'", OBJECT );
        foreach ($result as $key => $value) {
            echo '<button><a style="color: #fff;" href="' . PLUGIN_URL . '..generate-pdf.php?oid=' . $order_id . '&item_id=' . $value->item_id . '" target="_blank">' .  pll_translate_string( 'PDF-Download', pll_current_language() ) . '</a></button><br/><br/>';
        }
}

订单的订单ID保存在Order ID栏中。产品 ID 存储在每个订单的项目 ID 列中

已更新 - 您的代码中有一些错误…

  • 在您的第一个 foreach 循环(遍历订单项)之前获取 WC_Order 对象
  • 对于 项目数量使用 FOR 循环 而不是 FOREACH 循环
  • 您应该在 SQL 查询中直接使用包含在订单项 foreach 循环中作为键的 'item_id'。这比在订单项循环中嵌入另一个 foreach 循环要好得多。
  • 还有一些其他的东西……

所以你的代码可以是(注释):

global $wpdb;

// Be sure that we get an order id from $_POST
if ( isset($_POST['oid']) && $_POST['oid'] > 0 ) {
    $order_id = (int) $_POST['oid'];
    $order    = new WC_Order( $_POST['oid'] ); // <=== Get the order object before your 1st foreach loop
}
// Be sure that we get the WC_Order object (valid order id)
if ( is_a($order, 'WC_Order') ) {

    $cid = get_user_meta( get_current_user_id(), 'company', true );

    if ( ! empty($cid) ) {
        
        // Loop through order items
        foreach( $order->get_items() as $item_id => $item ) {
            
            $result = $wpdb->get_results( $wpdb->prepare( "
                SELECT * 
                FROM {$wpdb->prefix}coupon_codes
                WHERE order_id = %d
                    AND item_id = %d
            ", $order_id, $item_id ) );
            
            // Quantity Loop (where variable $i will be increased one by one depending on quantity)
            for ( $i = 1; $i <= $item->get_quantity(); $i++ ) { // <=== A FOR loop (instead of a foreach)
                
                // You may need to use the variable $i somewhere below

                echo '<button><a style="color: #fff;" href="' . TS_SHOP_PLUGIN_URL . '..generate-pdf.php?oid=' . $order_id . '&item_id=' . $item_id . '" target="_blank">' .  pll_translate_string( 'PDF-Download', pll_current_language() ) . '</a></button><br/><br/>';
            }
        }
    }
}

现在我无法真正测试代码……但这应该可以帮助您解决问题。

最后,如果需要,要从订单中获取用户 ID,请使用 $user_id = $order->get_user_id();。然后可以(可能)使用它:

$user_id = $order->get_user_id(); // <=== Get the user Id from the order
$cid     = get_user_meta( $user_id, 'company', true );