Repetir un pedido en WooCommerce

Repetir un pedido en WooCommerce

Crea un botón que permite añadir de nuevo al carrito todos los productos de un pedido anterior para repetirlo.

/* Botón de modificar pedido */
// 1. Permitimos el estado de pedir otra vez para pedidos en proceso
add_filter('woocommerce_valid_order_statuses_for_order_again', 'nwp_estado_pedir_otra_vez');

function nwp_estado_pedir_otra_vez($statuses) {
    $statuses[] = 'processing';
    return $statuses;
}
// 2. Agregamos las acciones del pedido a la cuenta
add_filter('woocommerce_my_account_my_orders_actions', 'nwp_acciones_pedido_cuenta', 50, 2);

function nwp_acciones_pedido_cuenta($actions, $order) {
    if ($order - > has_status('processing')) {
        $actions['edit-order'] = array(
            'url' => wp_nonce_url(add_query_arg(array('order_again' => $order - > get_id(), 'edit_order' => $order - > get_id())), 'woocommerce-order_again'),
            'name' => __('Modificar pedido', 'woocommerce')
        );
    }
    return $actions;
}
// 3. Detectar la accion del pedido modificado
add_action('woocommerce_cart_loaded_from_session', 'nwp_detectar_pedido_modificado');

function nwp_detectar_pedido_modificado($cart) {
    if (isset($_GET['edit_order'], $_GET['_wpnonce']) && is_user_logged_in() && wp_verify_nonce(wp_unslash($_GET['_wpnonce']), 'woocommerce-order_again')) WC() - > session - > set('edit_order', absint($_GET['edit_order']));
}
// 4. Mostrar aviso en el carrito de que es un pedido modificado
add_action('woocommerce_before_cart', 'nwp_mostrar_que_es_pedido_modificado');

function nwp_mostrar_que_es_pedido_modificado() {
    if (!is_cart()) return;
    $edited = WC() - > session - > get('edit_order');
    if (!empty($edited)) {
        $order = new WC_Order($edited);
        $credit = $order - > get_total();
        wc_print_notice('Tienes un crédito de '.wc_price($credit).
            ' aplicado al pedido. Añade productos o cambia los detalles que quieras, como fecha de entrega y finaliza el pedido.', 'notice');
    }
}
// 5. Calcular nuevo total del pedido modificado
add_action('woocommerce_cart_calculate_fees', 'nwp_calcular_nuevo_total', 20, 1);

function nwp_calcular_nuevo_total($cart) {
    if (is_admin() && !defined('DOING_AJAX')) return;
    $edited = WC() - > session - > get('edit_order');
    if (!empty($edited)) {
        $order = new WC_Order($edited);
        $credit = -1 * $order - > get_total();
        $cart - > add_fee('Crédito', $credit);
    }
}
// 6. Guardar pedido si se ha modificado
add_action('woocommerce_checkout_update_order_meta', 'nwp_guardar_pedido_modificado');

function nwp_guardar_pedido_modificado($order_id) {
    $edited = WC() - > session - > get('edit_order');
    if (!empty($edited)) {
        // Actualizamos este nuevo pedido
        update_post_meta($order_id, '_edit_order', $edited);
        $neworder = new WC_Order($order_id);
        $oldorder_edit = get_edit_post_link($edited);
        $neworder - > add_order_note('Pedido realizado a partir de una modificación. Número del pedido anterior: <a href="'.$oldorder_edit.
            '">'.$edited.
            '</a>');
        // cancel previous order
        $oldorder = new WC_Order($edited);
        $neworder_edit = get_edit_post_link($order_id);
        $oldorder - > update_status('cancelled', 'Pedido cancelado al haber una modificación del mismo. Número del nuevo pedido: <a href="'.$neworder_edit.
            '">'.$order_id.
            '</a> -');
        WC() - > session - > set('edit_order', null);
    }
}

¿Te ha gustado este código? Coméntalo con códigosWP:

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Scroll al inicio