为了账号安全,请及时绑定邮箱和手机立即绑定

允许客户在 WooCommerce 中更改订单状态

允许客户在 WooCommerce 中更改订单状态

PHP
回首忆惘然 2023-08-19 17:52:53
在 WooCommerce 中,当订单处于处理状态时,我希望在“我的帐户”页面上显示一个操作按钮,允许客户通过更改订单状态来确认订单已到达以完成。我已经看到允许客户通过电子邮件相关问题代码更改订单状态(没有答案),这并不能真正帮助实现我的目标。客户是否可以通过将订单状态更改为“已完成”来确认订单是否已到达?
查看完整描述

1 回答

?
qq_笑_17

TA贡献1818条经验 获得超7个赞

您可以将woocommerce_my_account_my_orders_actions自定义操作按钮添加到“我的帐户”订单部分,用于状态为“正在处理”的订单(也可以查看订单)。


然后使用template_redirect钩子,客户可以更改其处理订单之一的状态,并显示成功通知。


代码:


// The button Url and the label

function customer_order_confirm_args( $order_id ) {

    return array(

        'url'  => wp_nonce_url( add_query_arg( 'complete_order', $order_id ) , 'wc_complete_order' ),

        'name' => __( 'Approve order', 'woocommerce' )

    );

}


// Add a custom action button to processing orders (My account > Orders)

add_filter( 'woocommerce_my_account_my_orders_actions', 'complete_action_button_my_accout_orders', 50, 2 );

function complete_action_button_my_accout_orders( $actions, $order ) {

    if ( $order->has_status( 'processing' ) ) {

        $actions['order_confirmed'] = customer_order_confirm_args( $order->get_id() );

    }

    return $actions;

}


// Add a custom button to processing orders (My account > View order)

add_action( 'woocommerce_order_details_after_order_table', 'complete_action_button_my_accout_order_view' );

function complete_action_button_my_accout_order_view( $order ){

    // Avoiding displaying buttons on email notification

    if( is_wc_endpoint_url( 'view-order' ) ) {

        $data = customer_order_confirm_args( $order->get_id() );


        echo '<div style="margin:16px 0 24px;">

            <a class="button" href="'.$data['url'].'">'.$data['name'].'</a>

        </div>';

    }

}


// Change order status and display a message

add_action( 'template_redirect', 'action_complete_order_status' );

function action_complete_order_status( $query ) {

    if ( ( is_wc_endpoint_url( 'orders' )

        || is_wc_endpoint_url( 'view-order' ) )

        && isset( $_GET['complete_order'] )

        && $_GET['complete_order'] > 1

        && isset($_GET['_wpnonce'])

        && wp_verify_nonce($_GET['_wpnonce'], 'wc_complete_order') )

    {

        $order = wc_get_order( absint($_GET['complete_order']) );


        if ( is_a($order, 'WC_Order') ) {

            // Change order status to "completed"

            $order->update_status( 'completed', __('Approved by the customer', 'woocommerce') ) ;


            // Add a notice (optional)

            wc_add_notice( sprintf( __( 'Order #%s has been approved', 'woocommerce' ), $order->get_id() ) );


            // Remove query args

            wp_redirect( esc_url( remove_query_arg( array( 'complete_order', '_wpnonce' ) ) ) );

            exit();

        }

    }

}

代码位于活动子主题(或活动主题)的functions.php 文件中。经过测试并有效。



查看完整回答
反对 回复 2023-08-19
  • 1 回答
  • 0 关注
  • 115 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信