如何在 WooCommerce 中提交表单后更改订单状态

问题描述 投票:0回答:1

我正在使用“Forminator”表单插件来处理 WooCommerce 订单的退款请求 带有以下片段:

add_filter( 'woocommerce_my_account_my_orders_actions', 'sww_add_account_refund_order_action', 9999, 2 ); 
function sww_add_account_refund_order_action( $actions, $order ) {

   if ( $order->has_status ( 'delivered' ) ) {
    $actions['refund_request'] = array(
        'url'  => sww_get_order_refund_request_url( $order ),
        'name' => __( 'Request Refund', 'woocommerce' ),
    );
}

return $actions;
}
function sww_get_order_refund_request_url( $order ) {

// enter the ID for your page that contains the refund request form
$page_id = 1737;

// now we'll build the right refund URL from it
$refund_url = trailingslashit( get_page_link( $page_id ) ) . '?order=' . $order->get_order_number();
$products   = array();

foreach ( $order->get_items() as $item_id => $item ) {
    if ( $product = wc_get_product( $item['product_id'] ) ) {
        $products[] = $product->get_title();
    }
}

if ( ! empty( $products ) ) {
    $refund_url .= '&products=' . urlencode( implode( ', ', $products ) );
}

return $refund_url;
}

表单从 URL 中获取订单号和商品并将其填充到字段中。 我希望在提交表单后更改订单状态,从“已交付”更改为“退款请求”(我已经在单独的代码片段中注册)。 我发现 Forminator 的钩子会在表单提交后触发,但我不知道如何以及在哪里使用它们。

do_action( 'forminator_custom_form_after_handle_submit', $form_id, $response );
do_action( 'forminator_custom_form_after_save_entry', $form_id, $response, 'submit' );

第一个将在提交行为>页面重新加载方法时触发 如果提交行为是 > Ajax 方法(设置为活动状态),则第二个将触发。

如果不可能,请告诉我另一种处理退款请求的方法。 谢谢你。

php woocommerce hook-woocommerce
1个回答
0
投票

要使用 Forminator 的钩子在表单提交后修改订单状态,您需要添加一个自定义函数来监听这些钩子,具体取决于表单的提交行为。由于您的表单设置为使用 AJAX 提交,因此您将使用

forminator_custom_form_after_save_entry
挂钩。以下是有关如何执行此操作的分步指南:

  1. 创建Hook监听函数:该函数会在表单提交后触发。它应该从表单提交中检索订单号,加载 WooCommerce 订单,然后将其状态更新为“退款请求”。

  2. 检索订单号:您需要从表单提交数据中提取订单号。假设您的表单有一个字段,用户或系统在其中输入订单号,您将从响应中检索该订单号。

  3. 加载并更新订单:使用订单号加载 WooCommerce 订单并将其状态更改为“退款请求”。

以下是如何实现这一点的示例:

add_action( 'forminator_custom_form_after_save_entry', 'update_order_status_on_form_submit', 10, 3 );

function update_order_status_on_form_submit( $form_id, $response, $submission_type ) {
    // Replace with your actual Forminator form ID
    $target_form_id = 1234; 

    if ( $form_id == $target_form_id && $submission_type == 'submit' ) {
        // Assuming 'order_number' is the field's slug in your form that captures the order number
        $order_number_field_slug = 'order_number'; 
        $entry_fields = $response['data']['fields'];

        $order_number = null;
        foreach ( $entry_fields as $field ) {
            if ( $field['slug'] === $order_number_field_slug ) {
                $order_number = $field['value'];
                break;
            }
        }

        if ( $order_number ) {
            $order = wc_get_order( $order_number );
            if ( $order && $order->has_status( 'delivered' ) ) {
                // Change 'refund-request' to your actual registered status slug for 'Refund request'
                $order->update_status( 'refund-request', 'Refund requested by customer.', true ); 
            }
        }
    }
}

在此片段中:

  • $target_form_id
    替换为 Forminator 表单的 ID。
  • 'order_number'
    替换为表单中包含订单号的字段的代号。
  • 'refund-request'
    替换为您在 WooCommerce 中用于“退款请求”状态的别名。

此代码假设订单号已通过表单正确提交,并且可以在响应中访问。您需要调整字段段 (

'order_number'
) 以匹配表单中的实际字段。

请先在临时环境中进行测试,然后再将其部署到您的实时网站,因为直接修改可能会影响您网站的功能。

© www.soinside.com 2019 - 2024. All rights reserved.