WooCommerce Bestellungen nachträglich anpassen: So geht’s!

Custom Code - Woo Bestellung ändern

Übersicht

WooCommerce ist eine der beliebtesten E-Commerce-Plattformen, doch wenn es um nachträgliche Änderungen an Bestellungen geht, kommt man schnell an Grenzen.

Warum ist das ein Problem?

Häufige Probleme:

  • Eine Bestellung ist abgeschlossen, aber der Kunde möchte nachträglich eine Anpassung (z. B. fehlerhafte Produktbeschreibung, falscher Preis).
  • Fehlerhafte Preise oder Produktbeschreibungen müssen korrigiert werden.
  • Bestellungen können im Standard-WooCommerce-Backend nicht direkt bearbeitet werden.

Rechtlich kann das problematisch sein: In vielen Ländern dürfen Bestellungen nachträglich nicht einfach geändert werden, da sie als abgeschlossener Vertrag gelten. Deshalb ist es wichtig, dass du Änderungen transparent dokumentierst.


Die Lösung: Bestellung anpassen mit unserem Plugin

Mit dem „WooCommerce Bestellung Anpassen“ Plugin kannst du bestehende Bestellungen bearbeiten.

Funktionen: 

✅ Manuelles Ändern von Produktbeschreibungen und Preisen innerhalb einer Bestellung.

✅ Funktioniert auch für abgeschlossene Bestellungen.

✅ Anpassung direkt in WooCommerce ohne komplizierte Workarounds.

✅ Steuerberechnung bleibt korrekt!


So funktioniert es:

  1. Plugin installieren
    • Lade das Plugin in den WordPress-Plugin-Ordner (/wp-content/plugins/).
    • Aktiviere es in WordPress unter Plugins.
  2. Bestellung öffnen
    • Gehe zu WooCommerce → Bestellung anpassen.
    • Gib die Bestellnummer ein und lade die Bestellung.
  3. Bearbeiten & Speichern
    • Ändere den Produkttext oder den Preis.
    • Speichern und WooCommerce aktualisiert automatisch die Steuer!

Der Code

Hier findest du den Code direkt zum Kopieren – oder du lädst ihn dir auf GitHub herunter (siehe unten).

<?php
/**
 * Plugin Name: WooCommerce Bestellung Anpassen
 * Description: Ermöglicht das Bearbeiten von Artikelbeschreibungen und Preisen in bestehenden WooCommerce-Bestellungen.
 * Version: 1.0.1
 * Plugin URI: https://chris-martens.com/blog/woo-bestellung-aendern
 * Author: Chris Martens
 * Author URI: https://chris-martens.com
 */

if (!defined('ABSPATH')) {
    exit; // Sicherheit
}

// Admin-Menü hinzufügen
function chrmrtns_custom_order_editor_menu() {
    add_submenu_page(
        'woocommerce',
        'Bestellung anpassen',
        'Bestellung anpassen',
        'manage_woocommerce',
        'custom-order-editor',
        'chrmrtns_custom_order_editor_page'
    );
}
add_action('admin_menu', 'chrmrtns_custom_order_editor_menu');

// Funktionsseite rendern
function chrmrtns_custom_order_editor_page() {
    if (isset($_POST['order_id']) && isset($_POST['update_order'])) {
        chrmrtns_custom_update_order_items($_POST['order_id'], $_POST['items']);
    }
    ?>
    <div class="wrap">
        <h2>WooCommerce Bestellung Anpassen</h2>
        <form method="post">
            <h3><strong>Bestellung anpassen</strong></h3>
            <p><strong>Um die Bestellung anzupassen, gib die Bestellnummer ein, und lade die Bestellung.</strong></p>
            <p><strong>Danach kannst du den Preis und den Bestelltext ändern.</strong></p>
            <label for="order_id">Bestell-ID:</label>
            <input type="number" name="order_id" required>
            <input type="submit" name="load_order" value="Bestellung Laden">
        </form>
        
        <?php
        if (isset($_POST['order_id']) && isset($_POST['load_order'])) {
            echo '<div style="margin-top: 20px;"></div>';
            $order_id = intval($_POST['order_id']);
            $order = wc_get_order($order_id);
            if ($order) {
                echo '<form method="post">';
                echo '<input type="hidden" name="order_id" value="' . esc_attr($order_id) . '">';
                echo '<table><tr><th>Produkt</th><th>Preis</th><th>Neue Beschreibung</th></tr>';
                foreach ($order->get_items() as $item_id => $item) {
                    $product = $item->get_product();
                    echo '<tr>';
                    echo '<td>' . ($product ? esc_html($product->get_name()) : '<em>Produkt nicht gefunden</em>') . '</td>';
                    echo '<td><input type="text" name="items[' . esc_attr($item_id) . '][price]" value="' . esc_attr($item->get_total()) . '" style="width: 100px;"></td>';
                    echo '<td><input type="text" name="items[' . esc_attr($item_id) . '][name]" value="' . ($product ? esc_attr($product->get_name()) : '') . '" style="width: 300px; margin-right: 10px;"></td>
                    <td><input type="submit" name="update_order" value="Speichern" style="padding: 5px 15px; font-weight: bold;"></td>';
                    echo '</tr>';
                }
                echo '</table>';
                echo '</form>';
            } else {
                echo '<p>Bestellung nicht gefunden.</p>';
            }
        }
        ?>
    </div>
    <?php
}

// Bestellung aktualisieren
function chrmrtns_custom_update_order_items($order_id, $items) {
    $order = wc_get_order($order_id);
    if (!$order) return;

    foreach ($items as $item_id => $data) {
        if (!empty($data['price'])) {
            $new_price = floatval($data['price']);
            $product_id = wc_get_order_item_meta($item_id, '_product_id', true);
            $product = wc_get_product($product_id);
            
            if ($product) {
                $tax_class = $product->get_tax_class();
                $tax_rates = WC_Tax::get_rates($tax_class);
                $taxes = WC_Tax::calc_tax($new_price, $tax_rates, true);
                $tax_amount = array_sum($taxes);
                $net_price = $new_price - $tax_amount;
            } else {
                $net_price = $new_price;
                $tax_amount = 0;
            }

            wc_update_order_item_meta($item_id, '_line_total', $net_price); // Netto-Preis
            wc_update_order_item_meta($item_id, '_line_tax', $tax_amount); // Steuerbetrag
            wc_update_order_item_meta($item_id, '_line_subtotal', $net_price + $tax_amount); // Brutto-Preis
        }
        if (!empty($data['name'])) {
            wc_update_order_item_meta($item_id, '_product_id', sanitize_text_field($data['name']));
        }
    }
    $order->calculate_totals();
    echo '<p>Bestellung aktualisiert (inkl. Steuerberechnung)!</p>';
}

Gibt es Einschränkungen?

Ja, dieses Plugin ändert nur die Bestellung, nicht das Produkt im Shop. Das bedeutet, dass die geänderte Beschreibung oder der Preis nur für diese spezifische Bestellung gilt.

Falls du das Produkt global ändern willst, musst du das direkt in WooCommerce unter Produkte bearbeiten.


Fazit

Wenn du nachträglich Bestellungen in WooCommerce anpassen musst, ist unser Plugin die perfekte Lösung.

🔗 Hier herunterladen: WooCommerce Bestellung Anpassen Plugin

Hast du Fragen? Schreibe sie in die Kommentare! 🚀

Foto von Luca Bravo auf Unsplash

Weitere Beiträge

Emailzustellung

Saubere E-Mail-Zustellung: Postfix Sender Canonical richtig konfigurieren

Reading Time: 2:30 min

Hast du schon einmal System-E-Mails von deinem Server verschickt? Dann kennst du das Problem: Die Mails landen im Spam oder werden gar nicht erst zugestellt. Der Grund liegt oft in…

Zum Beitrag
https secure

SSL-Zertifikatsfehler bei Mail-Servern beheben: Ein Praxisfall mit Sectigo-Zertifikaten

Reading Time: 4:29 min

Kürzlich bin ich auf ein klassisches, aber tückisches Problem gestoßen: Ein Mail-Server mit scheinbar gültigem SSL-Zertifikat warf dennoch Verifikationsfehler. In diesem Beitrag teile ich die Lösung für das Problem der…

Zum Beitrag
HTML-Link-Attribute: rel, title und aria-label erklärt

HTML-Link-Attribute: rel, title und aria-label erklärt

Reading Time: 1:27 min

Links sind das Herzstück des Internets, aber nicht alle Links sind gleich. Mit den richtigen HTML-Attributen kannst du Links sicherer, zugänglicher und informativer gestalten. Drei wichtige Attribute sind rel, title und aria-label. 1. Das rel-Attribut:…

Zum Beitrag

Hinterlasse einen Kommentar