如何在 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 );
以下问题:我想为任意数量的订单输出 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 );