簡體   English   中英

在 WooCommerce 中下訂單后刪除產品

[英]Remove product after an order has been placed in WooCommerce

我正在使用最新版本的 WordPress 和 WooCommerce。

我知道這在上下文中可能看起來很奇怪,但我想在我的 functions.php 中添加一個鈎子,以便在下訂單后從訂單中按 ID 刪除某個產品。

到目前為止,這是我正在使用的內容:

add_action('woocommerce_new_order', 'custom_process_order', 10, 1);
function custom_process_order($order_id) {
    $order = new WC_Order( $order_id );
    $items = $order->get_items();
    foreach ($items as $item) {
        if ($item->get_id()==10766) {
          $order->remove_item( $item->get_id() );
        }
    }
    return $order_id;
}

如果該產品是訂單的一部分,我將嘗試從訂單中刪除 ID 為 10766 的產品。 我從一個不同的、較舊的帖​​子中獲取了這個,所以代碼本身可能並不完美。 它肯定行不通。

一些實驗后更新:
在 Cameron Hurd 的幫助下,我嘗試了以下代碼:

add_action('woocommerce_new_order', 'custom_process_order', 10, 1);

function custom_process_order($order_id) {
    $order = new WC_Order( $order_id );
    $items = $order->get_items();
    foreach ($items as $item) {
        if ($item->get_id() === 10766) {
            $order->remove_item( $item->get_id() );
        }
    }

    $order->save_items();

    return $order_id;
}

這看起來很有希望,但按下結賬按鈕將提交一個空訂單,同時還會拋出一個空的 WooCommerce 錯誤消息,將用戶留在結賬頁面上。

在此之后,我有兩個想法:
1.) 將remove_item更改為wc_delete_order_item 我真的不知道有什么區別,改變它似乎也沒有什么區別。
2.) 更改掛鈎,使其在訂單位於后端之后發生。 我嘗試將其從woocommerce_new_order更改為woocommerce_thankyou 然而,除了對訂單沒有做任何事情之外,這打破了感謝頁面。

這就是我現在坐的:

add_action('woocommerce_checkout_create_order', 'custom_process_order', 10, 1);

function custom_process_order($order_id) {
    $order = new WC_Order( $order_id );
    $items = $order->get_items();
    foreach ($items as $item) {
        $current_item_id = $item->get_id();
        if ( $current_item_id === 10766) {
            $order->remove_item($current_item_id);
        }
    }

    $order->save_items();

    return $order_id;
}

仍在尋找有效的答案。

您可以使用woocommerce_checkout_order_processed操作掛鈎,然后在其中指定產品 ID。

所以你得到:

function custom_process_order( $order_id ) {
    if( ! $order_id ) return;

    // get order object
    $order = new WC_Order( $order_id );
    
    // get order items = each product in the order
    $items = $order->get_items();

    foreach ( $items as $item ) {
        $product = wc_get_product( $item['product_id'] );
        
        if ( $product->get_id() == 10766 ) {
            $order->remove_item( $item->get_id() );
        }
    }
    
    // Calculate
    $order->calculate_totals();
    
    // Save
    $order->save();
}
add_action( 'woocommerce_checkout_order_processed', 'custom_process_order', 10, 1 );

瀏覽來自abstracts/abstract-wc-order.php的代碼, remove_item方法所在的位置......我看到項目被添加到一個名為items_to_delete的數組中。 該變量再次出現在save_items ,其中每個要刪除的項目類都會調用其delete方法。

<?php
// abstracts/abstract-wc-order.php

abstract class WC_Abstract_Order extends WC_Abstract_Legacy_Order {

    /**
     * Remove item from the order.
     *
     * @param int $item_id Item ID to delete.
     * @return false|void
     */
    public function remove_item( $item_id ) {
        $item      = $this->get_item( $item_id, false );
        $items_key = $item ? $this->get_items_key( $item ) : false;

        if ( ! $items_key ) {
            return false;
        }

        // Unset and remove later.
        $this->items_to_delete[] = $item;
        unset( $this->items[ $items_key ][ $item->get_id() ] );
    }

    // ...

    /**
     * Save all order items which are part of this order.
     */
    protected function save_items() {
        $items_changed = false;

        foreach ( $this->items_to_delete as $item ) {
            $item->delete();
            $items_changed = true;
        }
        $this->items_to_delete = array();

        // ...
    }

    // ...
}

因此,您可以嘗試在自定義操作中的 foreach 循環之后調用$order->save_items()

add_action('woocommerce_new_order', 'custom_process_order', 10, 1);

function custom_process_order($order_id) {
    $order = new WC_Order( $order_id );
    $items = $order->get_items();
    foreach ($items as $item) {
        if ($item->get_id() === 10766) {
            $order->remove_item( $item->get_id() );
        }
    }

    $order->save_items();

    return $order_id;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM