WooCommerce: Benutzern erlauben, Verarbeitungsaufträge zu bearbeiten

Veröffentlicht: 2018-12-18

Wie können WooCommerce-Kunden eine Bestellung bearbeiten, die sie gerade aufgegeben und bezahlt haben? Ich schwöre, ich habe mir die Ergebnisse von Suchmaschinen und anderen Orten angesehen, bevor ich zu dem Schluss kam, dass ich das selbst codieren musste.

Beispielsweise möchte ein Benutzer möglicherweise das Lieferdatum ändern (wenn Sie dies auf der Checkout-Seite angeben). Oder vielleicht müssen sie die Größe ändern oder sich für ein bestimmtes Produkt in der Bestellung entscheiden.

Wie auch immer, es ist schockierend für mich, dass diese Funktionalität nicht in einem Plugin enthalten ist – wie üblich, wenn Sie daran interessiert sind, dieses Snippet/Plugin für Ihre speziellen Bedürfnisse anzupassen, können Sie sich gerne an uns wenden.

Mal sehen, wie es gemacht wird!

Anzeigen einer Schaltfläche „Bestellung bearbeiten“ nur für die Bearbeitung von Bestellungen – WooCommerce

Snippet (PHP): Kunden erlauben, Bestellungen auf der Seite „Mein Konto“ von WooCommerce zu bearbeiten

Als Erstes müssen wir die Schaltfläche „Bestellung bearbeiten“ nur für die Bearbeitung von Bestellungen anzeigen . Hier nutze ich nur die Vorteile und Wiederverwendung der „Erneut bestellen“-Funktion, die WooCommerce bietet – dieses „Erneut bestellen“ dupliziert im Grunde die gegebene Bestellung und füllt den Warenkorb mit denselben Produkten und Metadaten.

Wenn Sie meinen Punkt verstehen, ist „Bestellung bearbeiten“ dasselbe wie das Duplizieren der Bestellung, die Sie bearbeiten möchten, das Aufgeben einer neuen Bestellung und das Löschen der vorherigen . Zumindest sehe ich das so und es geht auf jeden Fall einfacher auf diese Weise.

Um die Schaltfläche „Bestellung bearbeiten“ für die Bearbeitung von Bestellungen anzuzeigen, müssen wir die Schaltfläche „Erneut bestellen“ entsperren (Filter „woocommerce_valid_order_statuses_for_order_again“). Standardmäßig wird dies nur für abgeschlossene Bestellungen angezeigt – wir benötigen auch eine Verarbeitung (Teil 1).

Jetzt kann ich die Schaltfläche „Bestellung bearbeiten“ mit dem Filter „woocommerce_my_account_my_orders_actions“ drucken. Wie Sie sehen können, muss „add_query_arg“ „order_again“ haben, damit das Klicken auf die Schaltfläche eine erneute Bestellung auslöst, und ich füge außerdem ein zweites „add_query_arg“ gleich „edit_order“ hinzu, damit ich weiß, dass auf die Schaltfläche „Bestellung bearbeiten“ geklickt wurde und nicht die Order Again. Die Schaltfläche „Name“ ändert sich in „Bestellung bearbeiten“ (Teil 2).

Großartig – jetzt wird die Schaltfläche unter „Mein Konto“ > „Bestellungen“ zur Bearbeitung von Bestellungen angezeigt, und wenn Sie darauf klicken, wird dies zu einer Warenkorb-URL weitergeleitet, die einen Parameter enthält (und der Warenkorb wird dank des Parameters „order_again“ mit denselben Produkten gefüllt ). Das kann ich mir jetzt einfach „anhören“ und sehen, ob bei „woocommerce_cart_loaded_from_session“ auf den Button geklickt wurde. Ich kann mit „$_GET“ sehen, ob die URL Parameter enthält – und wenn ja, füge ich die bearbeitete Bestell-ID der Warenkorbsitzung hinzu (Teil 3).

Jetzt gehe ich zu Teil 4 und 5 über: Ich möchte eine Warenkorb-Benachrichtigung anzeigen, dass der Warenkorb mit den gleichen Produkten der vorherigen Bestellung gefüllt wurde, und auch, dass eine „Gutschrift“ in Form eines Rabatts auf den aktuellen Warenkorb angewendet wurde („ add_fee“) – ja, es ist ein Rabatt, der dem gleichen Wert der zuvor bezahlten Bestellsumme entspricht.

Update Januar 2019: Bitte beachten Sie, dass add_fee() nicht gut funktioniert, wenn Sie negative Beträge verwenden UND Sie Steuern aktiviert haben. In diesem Fall müssen Sie eine Alternative finden.

Und dann gehen wir zum letzten Abschnitt, Teil 6: Wenn der Kunde die Bestellung aufgibt, müssen wir die „bearbeitete“ Bestellung eindeutig stornieren und einen Hinweis auf der Bestellverwaltungsseite beider Bestellungen anzeigen, einschließlich eines Links zur entsprechenden Bestellung ( storniert bzw. neu). Dazu verwende ich die Funktion „add_order_note“.

Nun, eine lange Erklärung, aber hoffentlich ist dies hilfreich

/**
 * @snippet       Edit Order Functionality @ WooCommerce My Account Page
 * @how-to        Get CustomizeWoo.com FREE
 * @sourcecode    https://businessbloomer.com/?p=91893
 * @author        Rodolfo Melogli
 * @compatible    WooCommerce 4.1
 * @donate $9     https://businessbloomer.com/bloomer-armada/
 */
 
// ----------------
// 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: <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', 'Order cancelled after editing. New order number: <a href="' . $neworder_edit . '">' . $order_id . '</a> -' );
        WC()->session->set( 'edit_order', null );
    }
}