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
用于:
- 订单收到页面(谢谢)
- 我的帐户查看订单页面
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();