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

Digitale Medien

Container Queries – Der Game-Changer fürs moderne CSS

Reading Time: 8:11 min

Container Queries – Der Game-Changer fürs moderne CSS Die Revolution des responsiven Designs ist da – und sie heißt Container Queries Stell dir vor, deine CSS-Komponenten könnten endlich intelligent auf…

Zum Beitrag
keyless-auth

Wie viele Plugins sind zu viele? Nur noch eines mehr – Warum wir Keyless Auth entwickelt haben

Reading Time: 5:1 min

Jeder WordPress-Entwickler kennt dieses Gefühl. Du erstellst eine Kundenwebsite, alles funktioniert perfekt, und dann benötigst du nur noch eine weitere Funktion. Vielleicht passwortfreie Authentifizierung. Du durchsuchst das Plugin-Repository, findest etwas,…

Zum Beitrag
keyless-auth

How Many Plugins Are Too Many? Just One More – Why We Built Keyless Auth

Reading Time: 4:39 min

Every WordPress developer knows the feeling. You’re building a client site, everything is working perfectly, and then you need just one more feature. Maybe it’s passwordless authentication. You search the…

Zum Beitrag

Hinterlasse einen Kommentar