https://tdestudiodesign.com/wp-content/plugins/whatsapp/style.css

¿Cómo pueden los clientes de WooCommerce editar un pedido que acaban de realizar y pagar? Juro que miré los resultados del motor de búsqueda y otros lugares antes de llegar a la conclusión que necesitaba para codificar esto yo mismo.

Por ejemplo, un usuario puede querer cambiar la fecha de entrega (si lo proporciona en la página de pago). O tal vez necesitan cambiar el tamaño o decidir sobre un producto determinado en el orden.

De cualquier manera, es impactante para mí, esta funcionalidad no está en un complemento, como de costumbre, si está interesado en personalizar este fragmento/complemento para sus necesidades específicas, no dude en ponerse en contacto.

Entonces, ¡veamos cómo se hace!

Mostrando un botón «Editar pedido» solo para pedidos de procesamiento: WooCommerce

Snippet (PHP): permita que los clientes editen pedidos @ WooCommerce mi página de mi cuenta

Lo primero que necesitamos es Mostrar el botón «Editar pedido» solo para pedidos de procesamiento. Aquí, solo estoy aprovechando y reutilizando la funcionalidad «Orden Again» que ofrece WooCommerce: este «orden de nuevo» básicamente duplica el orden dado y llena el carrito con los mismos productos y meta.

Si obtienes mi punto, «editar pedido» es lo mismo que Duplicando el pedido que desea editar, realizar un nuevo pedido y eliminar el anterior. Al menos así es como lo veo y es definitivamente más fácil de esta manera.

Para mostrar el botón «Editar pedido» para los pedidos de procesamiento, necesitamos desbloquear el botón «Orden Again» (el filtro «WooCommerce_Valid_order_Statuses_For_order_Again»). Por defecto, esto solo se muestra para pedidos completos: también necesitamos procesamiento (Parte 1).

Ahora puedo imprimir el botón «Editar pedido» con el filtro «WooCommerce_MY_ACCount_My_orders_Actions». Como puede ver, el «add_Query_arg» debe tener «Order_again» para que hacer clic en el botón desencadena una función de orden de orden, y también agrego un segundo «add_query_arg» igual a «edit_order» para saber que el botón de orden de edición se hizo clic y se hizo clic en no el orden otra vez. El botón «Nombre» cambia a «Editar pedido» (Parte 2).

Genial: ahora el botón se mostrará en mi cuenta> Pedidos para el procesamiento de pedidos, y en el clic esto redirigirá a una URL de carrito que contendrá un parámetro (y el carrito se completará con los mismos productos, gracias al parámetro «Order_agein» ). Ahora puedo simplemente «escuchar» a esto y ver si el botón se hizo clic durante «WooCommerce_Cart_Loaded_From_Session». Puedo usar «$ _get» para ver si la URL contiene parámetros y, en caso afirmativo, agrego el ID de pedido editado a la sesión del carrito (Parte 3).

Ahora me muevo a las partes 4 y 5: Quiero mostrar un aviso de carrito de que el carrito se ha llenado con los mismos productos de pedido anterior, y también que se ha aplicado un «crédito» al carrito actual en forma de descuento. («Add_fee») – Sí, es un descuento que es igual al mismo valor del total de pedidos pagado anteriormente.

Actualización de enero de 2019: tenga en cuenta que add_fee () no funciona bien cuando se usa cantidades negativas y usted tiene impuestos habilitados. En este caso necesitaría encontrar una alternativa.

Y luego nos mudamos a la sección final, Parte 6: si el cliente realiza el pedido, claramente Necesita cancelar el pedido «editado» y para mostrar un aviso en la página de administración de pedidos de ambos pedidos, incluido un enlace al pedido relevante (cancelado o nuevo, respectivamente). Para esto, uso la función «add_order_note».

Bueno, una explicación larga, pero espero que sea útil 🙂

 /**  * @snippet       Edit Order Functionality @ WooCommerce My Account Page  * @how-to        businessbloomer.com/woocommerce-customization  * @sourcecode    https://businessbloomer.com/?p=91893  * @author        Rodolfo Melogli, Business Bloomer  * @compatible    WooCommerce 4.1  * @community     https://businessbloomer.com/club/  */   // ---------------- // 1. Allow Order Again for Processing Status   add_filter( 'woocommerce_valid_order_statuses_for_order_again', 'bbloomer_order_again_statuses' );   function bbloomer_order_again_statuses( $statuses ) {     $statuses[] = 'processing';     return $statuses; }   // ---------------- // 2. Add Order Actions @ My Account   add_filter( 'woocommerce_my_account_my_orders_actions', 'bbloomer_add_edit_order_my_account_orders_actions', 50, 2 );   function bbloomer_add_edit_order_my_account_orders_actions( $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' => __( 'Edit Order', 'woocommerce' )         );     }     return $actions; }   // ---------------- // 3. Detect Edit Order Action and Store in Session   add_action( 'woocommerce_cart_loaded_from_session', 'bbloomer_detect_edit_order' );              function bbloomer_detect_edit_order( $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. Display Cart Notice re: Edited Order   add_action( 'woocommerce_before_cart', 'bbloomer_show_me_session' );   function bbloomer_show_me_session() {     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( 'A credit of ' . wc_price($credit) . ' has been applied to this new order. Feel free to add products to it or change other details such as delivery date.', 'notice' );     } }   // ---------------- // 5. Calculate New Total if Edited Order    add_action( 'woocommerce_cart_calculate_fees', 'bbloomer_use_edit_order_total', 20, 1 );    function bbloomer_use_edit_order_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( 'Credit', $credit );   }     }   // ---------------- // 6. Save Order Action if New Order is Placed   add_action( 'woocommerce_checkout_update_order_meta', 'bbloomer_save_edit_order' );    function bbloomer_save_edit_order( $order_id ) {     $edited = WC()->session->get( 'edit_order' );     if ( ! empty( $edited ) ) {         // update this new order         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( 'Order placed after editing. Old order number: ' . $edited . '' );         // cancel previous order         $oldorder = new WC_Order( $edited );         $neworder_edit = get_edit_post_link( $order_id );         $oldorder->update_status( 'cancelled', 'Order cancelled after editing. New order number: ' . $order_id . ' -' );         WC()->session->set( 'edit_order', null );     } } 

Deja una respuesta

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