【问题标题】:Woocommerce Get the order_id from one of the item_id?Woocommerce 从 item_id 之一获取 order_id?
【发布时间】:2016-07-09 21:30:40
【问题描述】:

我尝试从其中一个订单项 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 )

但我希望有类似的电话,还是我需要进行 DB 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;
}

【问题讨论】:

    标签: woocommerce edit orders items


    【解决方案1】:

    您的方法无效,因为订单商品不是 wp_posts 表中的帖子,因此它们不能有 post_parent

    但是,一切都没有丢失,考虑到我的 SQL 不是那么强大,这比我预期的要容易。查看数据库中的woocommerce_order_item 表可以看到order_idorder_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;
    }
    

    【讨论】:

    • 谢谢!链接是什么?行号指向'line_tax',这似乎与此问题/答案无关。
    • 显然他们在 WC API DOCS 上的行号有问题。因为如果您查看我的 URL 指向第 1239 行,但它显示第 1277 行……第 1239 行与您的代码非常相似,并且与 get_items() 函数有关
    • 感谢您解决这个问题。行号根本不匹配,但你是对的 get_items() 与 OP 描述的相反。
    • @helgatheviking 测试提供的解决方案,它似乎运作良好。
    【解决方案2】:

    使用内置的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 ); 
    

    【讨论】:

    • 这是一个方便的功能!但它是在Jan 2017 中添加的,因此在 2016 年发布此问题时不可用。展望未来,这绝对是更简单的方法。
    猜你喜欢
    • 2021-05-18
    • 1970-01-01
    • 2020-06-12
    • 2019-06-08
    • 2020-06-15
    • 1970-01-01
    • 1970-01-01
    • 2014-01-27
    • 1970-01-01
    相关资源
    最近更新 更多