Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 用于从订单中删除商品的按钮_Php_Wordpress_Woocommerce_Hook Woocommerce_Orders - Fatal编程技术网

Php 用于从订单中删除商品的按钮

Php 用于从订单中删除商品的按钮,php,wordpress,woocommerce,hook-woocommerce,orders,Php,Wordpress,Woocommerce,Hook Woocommerce,Orders,我正在寻找一种方法,在每个项目旁边添加一个按钮,将其从订单中删除 模板是:woocmerce/order/order details item.php

 我找到了一个要使用的函数:wc\u delete\u order\u item() 如果我将其添加到循环中,它将删除所有项 但是,如何在单击按钮时运行该函数?我尝试过使用ajax,但是在外部文件中使用wc\u delete\u order\u item()会产生“未定义函数”。

 请帮忙 首先(只是为了解决问题)模板order detail

我正在寻找一种方法,在每个项目旁边添加一个按钮,将其从订单中删除

模板是:
woocmerce/order/order details item.php




我找到了一个要使用的函数:
wc\u delete\u order\u item()

如果我将其添加到循环中,它将删除所有项

但是,如何在单击按钮时运行该函数?我尝试过使用ajax,但是在外部文件中使用
wc\u delete\u order\u item()
会产生“未定义函数”。



请帮忙

首先(只是为了解决问题)模板
order details item.php


 用于:

  • 订单收到页面(谢谢)
  • 我的帐户查看订单页面
现在要使用,需要将项ID作为参数

您可以使用挂接在
woocommerce\u order\u item\u meta\u end
操作钩子中的自定义函数来显示用于删除订单项的功能按钮,而不是覆盖模板,但它将删除订单项,并且需要再次刷新

视觉上你会得到:

以下是部分代码:

add_action( 'woocommerce_order_item_meta_end', 'display_remove_order_item_button', 10, 3 );
function display_remove_order_item_button( $item_id, $item, $order ){
    // Avoiding displaying buttons on email notification
    if( ! ( is_wc_endpoint_url( 'view-order' ) || is_wc_endpoint_url( 'order-received' ) ) ) return;

    if( isset($_POST["remove_item_$item_id"]) && $_POST["remove_item_$item_id"] == 'Remove this item' ){
        wc_delete_order_item( $item_id );
    }

    echo '<form class="cart" method="post" enctype="multipart/form-data" style= "margin-top:12px;">
    <input type="submit" class="button" name="remove_item_'.$item_id.'" value="Remove this item" />
    </form>';
}
但是最好的、功能完整的方法应该是使用Ajax,Ajax要复杂得多,而且是真正的开发

要在这里正确使用Ajax,您需要添加一个带有项目ID的隐藏字段,使用Ajax获取该字段并将其提供给PHP函数(缺少的参数,以使
wc\u delete\u order\u Item()
工作正常而无任何错误),以及订单ID


下一次,如果您尝试Ajax方式,您应该提出一个新问题,在其中添加您自己的代码,解释什么有效,什么无效…

非常感谢您的帮助。你发布的内容非常好。我不需要使用Ajax解决方案。我也不需要重新计算总数,因为我的产品都是免费的。移除物品后,我如何刷新购物车?@Adrian要刷新购物车,你需要一些jQuery/javascript…你应该用你现在使用的代码问一个新问题,因为当代码和解释对其他人很有用时,在注释中回答不是一种方式……一旦完成,请在此处通知我。表单似乎会刷新页面(因为这是默认行为),但在您再次手动刷新之前,不会删除该项。但是,如果我在表单上执行“preventDefault”,则不会删除该项,因为preventDefault会停止函数的运行。另外,如果您应用延迟并在JQuery中刷新页面(单击按钮),那么它将不起作用,因为页面首先会被重新加载(通过提交表单),因此您的延迟永远不会实际执行。你知道解决办法是什么吗?谢谢lot@Adrian我知道,我的答案中提到了这一点,这就是为什么你应该像我在这个答案的结尾告诉你的那样用Ajax来做…所以你最好得到你的初始Ajax代码,在我的钩子函数中,你应该添加两个隐藏字段,一个用于项目ID,一个用于订单ID…使用javascript,您可以通过wordpress Ajax将这些ID发送到php函数…然后使
wc_delete_Order_item($item_ID)
$Order->calculate_totals()正确工作。谢谢。您能帮我介绍一下ajax解决方案吗?我是否将函数保留在functions.php中?如何在ajax调用中引用它?谢谢你是的,我会尽力帮忙的,当然…@LoicTheAztec谢谢你。真的很感激
$order->calculate_totals();