Woocommerce - Produktkäufer im Produkt anzeigen

Woocommerce – Produktkäufer im Produkt anzeigen

In diesem Tutorial zeige ich dir eine Möglichkeit, wie du direkt im Produkt-„Bearbeitungsmodus“ siehst, wer das Produkt bereits gekauft hat.

Diese Funktion eignet sich natürlich nur für Produkte, die du nicht hunderte Male verkaufst. Wir nutzen das Ganze bspw. für unser Yogastudio, da wir Kurse, Veranstaltungen und Weiterbildungen via Woocommerce verkaufen und so haben wir ganz komfortabel eine Liste der Teilnehmenden.

Videoanleitung

Code zum Einbinden

Die maximale Anzahl der Einträge ist auf 200 begrenzt (Anzahl kann angepasst werden). Es sind bereits Spalten vorgegeben, die angezeigt werden. Solltest du Anpassungen vornehmen wollen und die fehlenden die Kenntnisse, dann gib den Code in ChatGPT (o.ä.) ein und bitte um Anpassung nach deinen Wünschen.

Um den folgenden PHP-Code komfortabel und sicher in dein WordPress einzufügen, empfehle ich dir ein Plugin (bspw. Code-Snippets) – Details dazu findest du im Video.

Um den Code und eigene Änderungen zu testen, empfehle ich dir die Nutzung einer Staging-Plattform. Solltest du keine haben, mache vorher ein Backup deiner Website 😉

				
					/**
 * WooCommerce: Käuferliste im Produkt-Backend (mit Menge & Preis, ohne Varianten)
 * Zeigt: Bestellnr., Name, E-Mail, Datum, Status, Menge, Einzelpreis (brutto), Positionssumme (brutto)
 */
add_action('add_meta_boxes', function () {
    add_meta_box(
        'product_buyers_box',
        __('Käufer dieses Produkts', 'woocommerce'),
        'snippet_show_product_buyers_box_prices',
        'product',
        'normal',
        'default'
    );
});

function snippet_show_product_buyers_box_prices($post) {
    if (!function_exists('wc_get_orders') || !function_exists('wc_get_order') || !function_exists('wc_price')) {
        echo '<p>WooCommerce ist nicht geladen.</p>';
        return;
    }

    $product_id = (int) $post->ID;

    // Bestellungen ermitteln, die dieses Produkt enthalten (HPOS-sicher)
    try {
        $order_ids = wc_get_orders([
            'limit'      => 200,
            'status'     => array_keys(wc_get_order_statuses()),
            'type'       => 'shop_order',
            'product_id' => $product_id,
            'return'     => 'ids',
            'orderby'    => 'date',
            'order'      => 'DESC',
        ]);
    } catch (Throwable $e) {
        echo '<p>Fehler beim Laden der Bestellungen: ' . esc_html($e->getMessage()) . '</p>';
        return;
    }

    if (empty($order_ids)) {
        echo '<p>Noch keine Käufer.</p>';
        return;
    }

    echo '<div style="max-height:420px; overflow:auto; border:1px solid #e5e5e5; border-radius:6px;">';
    echo '<table style="width:100%; border-collapse: collapse; font-size:13px;">';
    echo '<thead><tr style="background:#f5f5f5;">
            <th style="text-align:left; border-bottom:1px solid #ddd; padding:6px 8px;">Bestellnr.</th>
            <th style="text-align:left; border-bottom:1px solid #ddd; padding:6px 8px;">Name</th>
            <th style="text-align:left; border-bottom:1px solid #ddd; padding:6px 8px;">E-Mail</th>
            <th style="text-align:left; border-bottom:1px solid #ddd; padding:6px 8px;">Datum</th>
            <th style="text-align:left; border-bottom:1px solid #ddd; padding:6px 8px;">Status</th>
            <th style="text-align:left; border-bottom:1px solid #ddd; padding:6px 8px;">Menge</th>
            <th style="text-align:left; border-bottom:1px solid #ddd; padding:6px 8px;">Preis (brutto/Stk.)</th>
            <th style="text-align:left; border-bottom:1px solid #ddd; padding:6px 8px;">Summe (brutto)</th>
          </tr></thead><tbody>';

    foreach ($order_ids as $order_id) {
        $order = wc_get_order($order_id);
        if (!$order) { continue; }

        $currency = $order->get_currency();

        // Nur Line-Items (keine Versand-/Gebührenpositionen)
        foreach ($order->get_items('line_item') as $item) {
            // Prüfen, ob dieses Produkt (oder eine Variante davon) gemeint ist – ohne die Variante auszulesen
            $parent_id    = (int) $item->get_product_id();
            $variation_id = (int) $item->get_variation_id();
            if ($parent_id !== $product_id && $variation_id !== $product_id) {
                continue;
            }

            // Käuferdaten
            $user  = $order->get_user();
            $name  = $user ? (string) $user->display_name : trim((string)$order->get_billing_first_name() . ' ' . (string)$order->get_billing_last_name());
            if ($name === '') { $name = __('(ohne Namen)', 'woocommerce'); }

            $email = $user ? (string)$user->user_email : (string)$order->get_billing_email();
            $email_html = $email ? '<a href="mailto:' . esc_attr($email) . '">' . esc_html($email) . '</a>' : '—';

            // Datum & Status
            $date_obj = $order->get_date_created();
            $date     = $date_obj ? esc_html($date_obj->date_i18n('d.m.Y H:i')) : '—';
            $status   = esc_html(wc_get_order_status_name($order->get_status()));

            // Menge
            $qty = (float) $item->get_quantity();
            $qty_display = $qty > 0 ? esc_html(wc_format_decimal($qty, 0)) : '—';

            // Preise (brutto): Line-Total + Line-Tax
            $line_total_net = (float) $item->get_total();      // exkl. Steuer nach Rabatt
            $line_tax       = (float) $item->get_total_tax();  // Steuer zur Position
            $line_total_gross = $line_total_net + $line_tax;

            // Einzelpreis brutto (sicher teilen)
            $unit_gross = $qty > 0 ? $line_total_gross / $qty : $line_total_gross;

            $unit_gross_html = wc_price($unit_gross, ['currency' => $currency]);
            $line_gross_html = wc_price($line_total_gross, ['currency' => $currency]);

            // Bestell-Link
            $order_link   = admin_url('post.php?post=' . intval($order_id) . '&action=edit');
            $order_number = '#' . esc_html($order->get_order_number());

            echo '<tr>
                    <td style="padding:6px 8px;"><a href="' . esc_url($order_link) . '">' . $order_number . '</a></td>
                    <td style="padding:6px 8px;">' . esc_html($name) . '</td>
                    <td style="padding:6px 8px;">' . $email_html . '</td>
                    <td style="padding:6px 8px;">' . $date . '</td>
                    <td style="padding:6px 8px;">' . $status . '</td>
                    <td style="padding:6px 8px;">' . $qty_display . '</td>
                    <td style="padding:6px 8px;">' . $unit_gross_html . '</td>
                    <td style="padding:6px 8px;">' . $line_gross_html . '</td>
                  </tr>';
        }
    }

    echo '</tbody></table></div>';
}

				
			

Kommentar schreiben

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Weitere Artikel

In dieser Anleitung geht es um die Grundfunktion von Learnpress: das Anlegen von Online-Kursen und deren Lektionen.  Zusätzlich zu den...
Modern Events Calendar Seit kurzem ist mein neues (zusätzliches) Projekt online: modern-events-calendar.de Wie der Name der Domain schon verrät, widme...
Google Fonts lokal einbinden ohne Elementor Pro Ein sehr praktisches Feature von Elementor Pro ist die einfache Möglichkeit, Google Fonts...

Weitere Tutorials

Tools für Online-Kurse / Online-Produkte Mit dem folgenden Video startet eine neue Videoreihe über kostenlose WordPress-Plugins, die sich zum Veröffentlichen...
In Learnpress gibt es wenige Möglichkeiten, um auf die Darstellung Einfluss zu nehmen. Mithilfe von sogn. CSS-Code kannst du aber...
Wenn du einen Online-Kurs über Learnpress verkaufst, möchtest du ggf. das Widerrufsrecht ausschließen. Dasmit das entsprechend an deine Kunden kommuniziert...
Newsletter abonnieren

Erhalte regelmäßig Informationen zu neuen Tipps und Tutorials.