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

Php 允许客户在WooCommerce中更改订单状态,php,wordpress,woocommerce,Php,Wordpress,Woocommerce,在WooCommerce中,当订单处于处理状态时,我希望在“我的帐户”页面上显示一个操作按钮,允许客户通过将订单状态更改为“完成”来确认订单已到达 我见过相关的问题代码(没有答案),这对实现我的目标没有帮助 客户是否可以通过将订单状态更改为“已完成”来确认订单是否已送达?您可以使用woocommerce\u my\u account\u my\u orders\u actions将自定义操作按钮添加到“my account”orders部分,以查看处于“处理”状态的订单(以及查看订单) 然后使用

在WooCommerce中,当订单处于处理状态时,我希望在“我的帐户”页面上显示一个操作按钮,允许客户通过将订单状态更改为“完成”来确认订单已到达

我见过相关的问题代码(没有答案),这对实现我的目标没有帮助


客户是否可以通过将订单状态更改为“已完成”来确认订单是否已送达?

您可以使用
woocommerce\u my\u account\u my\u orders\u actions
将自定义操作按钮添加到“my account”orders部分,以查看处于“处理”状态的订单(以及查看订单)

然后使用
template\u redirect
hook,客户可以更改其一个处理订单的状态,并显示成功通知

守则:

// 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();
        }
    }
}
//按钮Url和标签
函数customer\u order\u confirm\u args($order\u id){
返回数组(
'url'=>wp\u nonce\u url(添加查询参数('complete\u order',$order\u id),'wc\u complete\u order'),
'name'=>\('Approve order','woocommerce')
);
}
//添加自定义操作按钮以处理订单(我的帐户>订单)
添加过滤器(“woocommerce\u my\u account\u my\u orders\u actions”、“complete\u action\u button\u my\u accout\u orders”,50,2);
功能完成\操作\按钮\我的\账户\订单($actions,$order){
如果($order->has_status('processing')){
$actions['order\u confirm']=customer\u order\u confirm\u args($order->get\u id());
}
返回$actions;
}
//添加自定义按钮以处理订单(我的帐户>查看订单)
添加操作('WOOMerce\u order\u details\u在\u order\u表之后,'complete\u action\u按钮\u my\u acout\u order\u view');
功能完成\操作\按钮\我的\账户\订单\视图($order){
//避免在电子邮件通知上显示按钮
如果(是_wc_endpoint_url('view order')){
$data=customer\u order\u confirm\u args($order->get\u id());
回声'
';
}
}
//更改订单状态并显示消息
添加操作('template_redirect'、'action_complete_order_status');
功能操作\u完成\u订单\u状态($query){
如果((是_wc_endpoint_url('orders'))
||is_wc_endpoint_url('view order'))
&&isset($\u GET['complete\u order']))
&&$\u获得['complete\u order']>1
&&isset($获取[''当前])
&&wp\u验证时间($\u获取[''wpnce'],'wc\u完成订单'))
{
$order=wc_get_order(absint($u get['complete_order']);
如果(是($order,'WC\u order')){
//将订单状态更改为“已完成”
$order->update_status(‘已完成’、‘已被客户批准’、‘woocommerce’);
//添加通知(可选)
wc_添加_通知(sprintf(uuuuu('Order#%s已被批准,'woocommerce'),$Order->get_id());
//删除查询参数
wp_重定向(esc_url(删除查询参数(数组('complete_order','wpnoce')));
退出();
}
}
}
代码进入活动子主题(或活动主题)的functions.php文件。测试和工作


相关(旧答案):

非常感谢这非常有帮助,但现在我想在更改状态时给客户添加一条注释,谢谢您的帮助advance@JulioEnsutiasStackOverFlow中的规则是一次只问一个问题,所以如果你有其他问题,请问一个新问题……这非常有用。我正在试图弄清楚如何使用这个剪报将订单从三种自定义订单状态(“保留”、“提醒已发送”)之一移动到第三种自定义订单状态(“付款已发送”)。任何帮助都将不胜感激。(我认为这个评论在这里更有用,因为它与OP有关。)