第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

在 WooCommerce 中下訂單后刪除產(chǎn)品

在 WooCommerce 中下訂單后刪除產(chǎn)品

PHP
GCT1015 2022-11-04 16:47:07
我正在使用最新版本的 WordPress 和 WooCommerce。我知道這在上下文中可能看起來(lái)很奇怪,但我想在我的functions.php 中添加一個(gè)鉤子,在下訂單后按ID 從訂單中刪除某個(gè)產(chǎn)品。到目前為止,這是我正在使用的內(nèi)容: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;}如果該產(chǎn)品是訂單的一部分,我正在嘗試從訂單中刪除 ID 為 10766 的產(chǎn)品。我從這里的另一篇較舊的帖子中獲取了這個(gè),因此代碼本身可能并不完美。它肯定是行不通的。一些實(shí)驗(yàn)后更新:在 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;}這看起來(lái)很有希望,但是按下結(jié)帳按鈕將提交一個(gè)空訂單,同時(shí)還會(huì)拋出一個(gè)空的 WooCommerce 錯(cuò)誤消息,讓用戶留在結(jié)帳頁(yè)面上。在此之后,我有 2 個(gè)想法:1.)更改remove_item為wc_delete_order_item. 我真的不知道有什么區(qū)別,改變它似乎也沒(méi)有什么不同。2.) 更改鉤子,使其在訂單位于后端之后發(fā)生。我嘗試將其從 更改woocommerce_new_order為woocommerce_thankyou. 然而,這打破了感謝頁(yè)面,除了對(duì)訂單沒(méi)有做任何事情。這就是我現(xiàn)在坐的: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;}仍在尋找有效的答案。
查看完整描述

2 回答

?
森欄

TA貢獻(xiàn)1810條經(jīng)驗(yàn) 獲得超5個(gè)贊

您可以使用woocommerce_checkout_order_processed操作掛鉤,然后在其中指定產(chǎn)品 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 );


查看完整回答
反對(duì) 回復(fù) 2022-11-04
?
嗶嗶one

TA貢獻(xiàn)1854條經(jīng)驗(yàn) 獲得超8個(gè)贊

從中瀏覽代碼abstracts/abstract-wc-order.php,remove_item方法所在的位置...我看到項(xiàng)目被添加到一個(gè)名為 的數(shù)組中items_to_delete。該變量再次出現(xiàn)在 中save_items,其中每個(gè)要?jiǎng)h除的項(xiàng)目類(lèi)都delete調(diào)用了它的方法。

<?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();


        // ...

    }


    // ...

}

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


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;

}


查看完整回答
反對(duì) 回復(fù) 2022-11-04
  • 2 回答
  • 0 關(guān)注
  • 156 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)