Woocommerce 从 item_id 之一获取 order_id?
Woocommerce Get the order_id from one of the item_id?
我尝试从其中一个订单项 ID 获取相关订单(订单 ID)。
案例举例:
编辑订单并删除订单项(由 Ajax 完成)时,Woocommerce 仅提供挂钩 "woocommerce_before_delete_order_item"
并仅传递 $item_id
。 (woo 函数执行 sql 而不是 WP 环境)。我需要 "belonging" 订单 ID 才能执行某些操作!
我目前的解决方案是遍历所有订单并比较 Items ID,并在匹配发生时中断和 return 订单 ID。
当在当前商店中保持 10000 个或更多订单时,这是减慢或 "bulky clumsy" 的方式。
这不起作用:
wp_get_post_parent_id ( $item_id )
但我希望有类似的电话,还是我需要进行数据库 SQL
搜索?任何涉及mySQL
的答案,请设为"copy and paste ready"。我很擅长 PHP 但不处理或从不写我自己的 SQL.
感谢您的帮助!以下是我目前的解决方案:
$order_id = my_wc_get_order_from_item_id($item_id);
function my_wc_get_order_from_item_id($id) {
$orders = get_posts('post_type=shop_order&numberposts=-1&post_status=publish');
foreach($orders as $obj) {
$order = new WC_Order($obj->ID);
if ( count( $order->get_items('line_item') ) > 0 ) {
foreach($order->get_items('line_item') as $item_id => $item ) {
if($item_id == $id) $return_value = $obj->ID;
if(isset($return_value)) break;
}
}
unset($order);
if(isset($return_value)) break;
}
if(isset($return_value)) return $return_value;
else return 0;
}
您的方法没有用,因为订单商品不是 wp_posts
table 中的帖子,所以它们不能有 post_parent
。
然而,一切并没有丢失,考虑到我的 SQL 不是那么强,这比我预期的要容易。查看数据库中的 woocommerce_order_item
table 可以看到 order_id
和 order_item_id
都在那里:
所以我从 WooCommerce 借用了一点 SQL 语句并修改它以找到给定特定 order_item_id
行的 order_id
。让我知道它是如何工作的。
function so_38286531_get_order_item_order_id( $item_id ) {
global $wpdb;
$order_id = $wpdb->get_var( $wpdb->prepare(
"SELECT order_id FROM {$wpdb->prefix}woocommerce_order_items
WHERE order_item_id = %d",
$item_id
) );
return $order_id;
}
使用内置的 woocommerce 功能wc_get_order_id_by_order_item_id($item_get_id)
获取订单 ID
// define the woocommerce_before_delete_order_item callback
function my_func_before_delete_order_item( $item_get_id ) {
$order_id = wc_get_order_id_by_order_item_id($item_get_id);
// do what you need...
};
// add the action
add_action( 'woocommerce_before_delete_order_item', 'my_func_before_delete_order_item', 10, 1 );
我尝试从其中一个订单项 ID 获取相关订单(订单 ID)。
案例举例:
编辑订单并删除订单项(由 Ajax 完成)时,Woocommerce 仅提供挂钩 "woocommerce_before_delete_order_item"
并仅传递 $item_id
。 (woo 函数执行 sql 而不是 WP 环境)。我需要 "belonging" 订单 ID 才能执行某些操作!
我目前的解决方案是遍历所有订单并比较 Items ID,并在匹配发生时中断和 return 订单 ID。
当在当前商店中保持 10000 个或更多订单时,这是减慢或 "bulky clumsy" 的方式。
这不起作用:
wp_get_post_parent_id ( $item_id )
但我希望有类似的电话,还是我需要进行数据库 SQL
搜索?任何涉及mySQL
的答案,请设为"copy and paste ready"。我很擅长 PHP 但不处理或从不写我自己的 SQL.
感谢您的帮助!以下是我目前的解决方案:
$order_id = my_wc_get_order_from_item_id($item_id);
function my_wc_get_order_from_item_id($id) {
$orders = get_posts('post_type=shop_order&numberposts=-1&post_status=publish');
foreach($orders as $obj) {
$order = new WC_Order($obj->ID);
if ( count( $order->get_items('line_item') ) > 0 ) {
foreach($order->get_items('line_item') as $item_id => $item ) {
if($item_id == $id) $return_value = $obj->ID;
if(isset($return_value)) break;
}
}
unset($order);
if(isset($return_value)) break;
}
if(isset($return_value)) return $return_value;
else return 0;
}
您的方法没有用,因为订单商品不是 wp_posts
table 中的帖子,所以它们不能有 post_parent
。
然而,一切并没有丢失,考虑到我的 SQL 不是那么强,这比我预期的要容易。查看数据库中的 woocommerce_order_item
table 可以看到 order_id
和 order_item_id
都在那里:
所以我从 WooCommerce 借用了一点 SQL 语句并修改它以找到给定特定 order_item_id
行的 order_id
。让我知道它是如何工作的。
function so_38286531_get_order_item_order_id( $item_id ) {
global $wpdb;
$order_id = $wpdb->get_var( $wpdb->prepare(
"SELECT order_id FROM {$wpdb->prefix}woocommerce_order_items
WHERE order_item_id = %d",
$item_id
) );
return $order_id;
}
使用内置的 woocommerce 功能wc_get_order_id_by_order_item_id($item_get_id)
获取订单 ID
// define the woocommerce_before_delete_order_item callback
function my_func_before_delete_order_item( $item_get_id ) {
$order_id = wc_get_order_id_by_order_item_id($item_get_id);
// do what you need...
};
// add the action
add_action( 'woocommerce_before_delete_order_item', 'my_func_before_delete_order_item', 10, 1 );