Woocommerce从item_id之一获取order_id?

时间:2016-07-09 21:30:40

标签: woocommerce edit orders items

我尝试从其中一个订单项ID获取相关订单(订单ID)。

例如: 在编辑订单和删除订单项(由Ajax完成)时,Woocommerce仅提供挂钩"woocommerce_before_delete_order_item"并仅传递$item_id。 (woo函数执行sql而不是WP环境)。我需要"属于"命令id做出一些动作!

到目前为止,我的解决方案是遍历所有订单并比较商品ID,并在匹配发生时中断并返回订单ID。

当在当前商店保持10000个订单以及更多活着时,这是缓慢或笨拙的笨拙的方式。

这不起作用:

  

wp_get_post_parent_id ( $item_id )

但我希望有类似的电话,或者我是否需要进行数据库SQL搜索?任何涉及mySQL的答案,请准备好"复制并粘贴准备好"。我非常擅长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;
}

1 个答案:

答案 0 :(得分:1)

您的方法不起作用,因为订单商品不是wp_posts表格中的帖子,因此他们不能拥有post_parent

然而,考虑到我的SQL并不那么强大,所有这些都不会丢失,这比我想象的要容易。查看数据库中的woocommerce_order_item表,您可以看到order_idorder_item_id都在那里:woocommerce_order_item table

所以我从WooCommerce借了一个小的SQL语句并修改它以找到给定特定order_id行的order_item_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;
}