WOOT - WooCommerce Active Products Tables

WooCommerce Produkttabelle und Nachbestellung: Warenkorb-Button und Mengenlimits

Nachbestellungen in einer WooCommerce Produkttabelle folgen strengeren Regeln als auf der Produktseite. Ein Produkt mit verwaltetem Lagerbestand von 0, das Nachbestellungen erlaubt, zeigt keinen Button In den Warenkorb (Add to cart), das Mengenfeld endet bei der Anzahl der vorrätigen Artikel, und die Spalte Lagerstatus (Stock status) zeigt für Auf Nachbestellung (On backorder) dasselbe Häkchen wie für Auf Lager (In stock). Das ist keine Einstellung, die Sie übersehen haben: Die Tabelle baut Button und Mengenfeld aus dem Lagerbestand auf. Unten steht genau, wie sie entscheidet und wie Sie Produkte mit Nachbestellung aus der Tabelle heraus verkaufen, ohne Plugin-Dateien zu bearbeiten.

Wie die Tabelle entscheidet, ob In den Warenkorb angezeigt wird

Für jede Zeile prüft die Tabelle das Produkt und baut dann im Browser ein Mengenfeld und einen Button auf. Für einfache Produkte und für die Variationszeilen des Variationen-Popups gelten diese Regeln:

ProduktButtonGrößte Menge
Nicht kaufbar (kein Preis) oder Nicht auf Lager (Out of stock)Nein-
Lagerbestand nicht verwaltet, Status Auf Lager (In stock) oder Auf Nachbestellung (On backorder)Ja9999
Lagerbestand verwaltet, Menge über 0JaDer Lagerbestand, auch wenn Nachbestellungen erlaubt sind
Lagerbestand verwaltet, Menge 0, Nachbestellungen erlaubtNein-
Lagerbestand verwaltet, Menge unter 0 (nachdem Nachbestellungen aufgegeben wurden)Ja, aber das Hinzufügen schlägt fehlDie negative Menge

Die letzte Zeile erklärt eine verwirrende Meldung. Das Mengenfeld erhält den Lagerbestand als Maximum, und wenn ein Kunde mehr verlangt, lehnt die Tabelle dies ab, bevor sie den Server kontaktiert, mit der Meldung Max count of products is: gefolgt von dieser Zahl, zum Beispiel -3. Variable und gruppierte Produkte zeigen einen Button, der ihr Popup öffnet; er wird ausgeblendet, wenn das übergeordnete Produkt seinen eigenen Lagerbestand verwaltet und dieser 0 beträgt. Externe Produkte zeigen ihren Button immer.

Die Tabelle ist also darauf ausgelegt, vorrätige Ware zu verkaufen. Gehören Nachbestellungen zu Ihrem Geschäft, ändern Sie das auf einem der folgenden Wege.

Ohne Code: Lagerverwaltung für Produkte mit Nachbestellung abschalten

Wenn WooCommerce den Lagerbestand eines Produkts nicht zählen muss, öffnen Sie das Produkt, gehen Sie zu Lagerbestand (Inventory), schalten Sie die Lagerverwaltung aus (in aktuellen WooCommerce-Versionen Lagerbestand für dieses Produkt verwalten (Track stock quantity for this product)) und setzen Sie den Lagerstatus auf Auf Nachbestellung (On backorder). Die Tabelle zeigt dann den Button und erlaubt bis zu 9999 pro Klick. Der Preis dafür: WooCommerce zählt den Lagerbestand dieses Produkts nicht mehr und kennzeichnet dessen Bestellpositionen nicht als nachbestellt. Brauchen Sie beides, Lagerzählung und Nachbestellungen, verwenden Sie das Snippet im nächsten Abschnitt.

In den Warenkorb für Produkte mit erlaubten Nachbestellungen anzeigen

Das Snippet ersetzt den Inhalt der Spalte Warenkorb (Cart) über den Filter woot_profile_extend, und zwar nur für Produkte und Variationen, die den Lagerbestand verwalten und Nachbestellungen erlauben (Erlauben (Allow) oder Erlauben, aber Kunden benachrichtigen (Allow, but notify customer)). Für sie gibt es denselben Platzhalter aus, den die Tabelle für jedes einfache Produkt ausgibt, mit leerer Menge, sodass das eigene Skript der Tabelle sein gewohntes Mengenfeld, Kontrollkästchen und den Button ohne Lagerobergrenze aufbaut. Alle anderen Produkte behalten den normalen Button.

/*
 * Products tables: Add to cart for products that track stock and allow
 * backorders, also at 0 or negative stock, without a quantity cap.
 * Child theme functions.php or a code snippets plugin.
 */
add_filter('woot_profile_extend', function ($fields, $action, $shortcode_args) {
    if (!isset($fields['add_to_cart']['action'])) {
        return $fields;
    }

    $original = $fields['add_to_cart']['action'];

    $fields['add_to_cart']['action'] = function ($post_id) use ($original) {
        $product = wc_get_product($post_id);

        if ($product
                && $product->is_type(['simple', 'variation'])
                && $product->is_purchasable()
                && $product->managing_stock()
                && $product->backorders_allowed()) {

            // As the table option "After to cart adding":
            // 0 stay on the page, 1 redirect to the cart, 2 redirect to the checkout
            $redirect = 0;

            // The table's own button placeholder; an empty quantity means no cap
            return sprintf(
                '<span class="woot-button-buy-pack" data-instant-redirect="%d" data-sold-individually="%d" data-about="simple,%d,,%s"></span>',
                $redirect,
                (int) $product->is_sold_individually(),
                $product->get_id(),
                esc_attr($product->get_sku())
            );
        }

        return $original($post_id);
    };

    return $fields;
}, 33, 3);

Hinweise zu diesem Snippet:

  • Setzen Sie $redirect auf den Wert, den Ihre Tabelle unter Optionen (Options) → Nach dem Hinzufügen zum Warenkorb (After to cart adding) verwendet; das Snippet kann diese Option nicht für Sie auslesen.
  • WooCommerce prüft weiterhin jeden Hinzufügevorgang. Die Produkte werden über die eigene Warenkorb-Anfrage von WooCommerce hinzugefügt und nur akzeptiert, weil das Produkt Nachbestellungen erlaubt. Bei Erlauben, aber Kunden benachrichtigen (Allow, but notify customer) kennzeichnen Warenkorb und Bestellung sie als nachbestellt, wie auf der Produktseite.
  • Ein variables Produkt, dessen Lagerbestand beim übergeordneten Produkt mit 0 verwaltet wird, blendet seinen Popup-Button weiterhin aus. Verwalten Sie den Lagerbestand stattdessen bei den Variationen.
  • Das Snippet verwendet das Button-Markup der Tabelle wieder. Testen Sie es nach größeren Plugin-Updates, wie jede Anpassung.

Erzielen Sie dasselbe Ergebnis nicht durch Bearbeiten von profiles/woocommerce/views/add_to_cart.php oder woocommerce-cart.js im Plugin-Ordner. Es funktioniert bis zum nächsten Update, das die Originaldateien stillschweigend wiederherstellt.

„Auf Nachbestellung“ in der Spalte Lagerstatus anzeigen

Die Spalte Lagerstatus (Stock status) zeigt ein Häkchen sowohl für Auf Lager (In stock) als auch für Auf Nachbestellung (On backorder) und ein Kreuz für Nicht auf Lager (Out of stock). Damit Kunden sehen, dass ein Produkt später geliefert wird, überschreiben Sie die Ausgabe der Spalte mit demselben Filter. Der Text stammt von WooCommerce und ist daher bereits in die Sprache Ihres Shops übersetzt:

/*
 * Products tables: show "On backorder" instead of the check mark
 * in the Stock status column. Child theme functions.php or a code snippets plugin.
 */
add_filter('woot_profile_extend', function ($fields, $action, $shortcode_args) {
    if (isset($fields['stock_status']['action'])) {
        $fields['stock_status']['action'] = function ($post_id) {
            $product = wc_get_product($post_id);
            $status = $product ? $product->get_stock_status() : 'outofstock';

            if ('onbackorder' === $status) {
                $labels = wc_get_product_stock_status_options();
                return '<span class="woot-stock-backorder">' . esc_html($labels['onbackorder']) . '</span>';
            }

            if ('instock' === $status) {
                return '<span class="woot-html-check"><i class="woot-icon">&#xe804;</i></span>';
            }

            return '<span class="woot-html-cross"><i class="woot-icon">&#xe805;</i></span>';
        };
    }
    return $fields;
}, 33, 3);

Gestalten Sie das Label mit der Klasse woot-stock-backorder im Tab Benutzerdefiniertes CSS (Custom CSS) der Tabelle oder in Ihrem Theme, zum Beispiel in Orange.

Produkte mit Nachbestellung fehlen in der Tabelle

Wenn Produkte mit Nachbestellung überhaupt nicht erscheinen, prüfen Sie den Tab Vordefinition (Predefinition). Sein Schalter Nur auf Lager (In stock only) behält nur Produkte, deren Lagerstatus genau Auf Lager (In stock) ist, und blendet damit Produkte mit Nachbestellung zusammen mit ausverkauften aus (siehe nur Produkte auf Lager anzeigen). Der Schalter Lagerstatus (Stock status) des Frontend-Filters funktioniert anders: Er blendet nur Produkte mit Nicht auf Lager (Out of stock) aus. Um in einer Tabelle ohne Filter nur ausverkaufte Produkte auszublenden, schalten Sie Nur auf Lager (In stock only) aus und fügen Sie dies hinzu:

/*
 * Products tables: hide out-of-stock products, keep products on backorder.
 * Child theme functions.php or a code snippets plugin.
 */
add_filter('woot_wp_query_args', function ($args, $table_id) {
    if (in_array((int) $table_id, [5, 8], true)) { // IDs of your tables
        $args['meta_query'][] = [
            'key'     => '_stock_status',
            'value'   => 'outofstock',
            'compare' => '!=',
        ];
    }
    return $args;
}, 10, 2);

Mengenlimits: Lagerbestand, eigenes Maximum und Min/Max/Schritt-Plugins

Das Mengenfeld der Tabelle beginnt immer bei 1 und springt in Schritten von 1. Sein Maximum ist bei Produkten mit verwaltetem Lagerbestand der Lagerbestand, sonst 9999; bei einzeln verkauften Produkten ist das Feld auf 1 festgelegt. Wird mehr als das Maximum verlangt, erscheint Max count of products is:, ohne dass etwas hinzugefügt wird. Das Maximum über den Lagerbestand anzuheben ist nur bei Produkten sinnvoll, die Nachbestellungen erlauben, was das Snippet oben bereits tut, denn WooCommerce selbst lehnt bei allen anderen Mengen über dem Lagerbestand ab.

Um ein niedrigeres Maximum pro Klick festzulegen, zum Beispiel 10, ändern Sie die Felder, nachdem die Tabelle ihre Zeilen gezeichnet hat:

/*
 * Products tables: at most 10 items per click (or the stock, if lower).
 * Site footer: a JavaScript snippet in a code snippets plugin,
 * or the footer scripts field of your theme.
 */
document.addEventListener('table23-after-build-rows', function (e) {
    var table = e.detail.otable.table;

    // wait until the table has created its quantity boxes
    setTimeout(function () {
        table.querySelectorAll('.woot-add-to-cart-input').forEach(function (input) {
            var max = parseInt(input.getAttribute('max'), 10) || 10;
            input.setAttribute('max', Math.min(max, 10));
        });
    }, 0);
});

Das begrenzt einen Klick, nicht die Bestellung: Ein Kunde kann erneut klicken. Ein echtes Limit pro Bestellung gehört in WooCommerce, meist über ein Plugin für Mengenregeln.

Solche Plugins legen Minimum, Maximum und Schrittweite für die eigenen Mengenfelder von WooCommerce fest. Das Feld der Tabelle liest diese Werte nicht. Prüft das Plugin die Mengen auch beim Hinzufügen zum Warenkorb über die Validierung von WooCommerce, wird eine falsche Menge aus der Tabelle abgelehnt, und die Tabelle zeigt ihre Meldung, dass das Produkt nicht hinzugefügt werden kann; das Feld selbst beginnt weiterhin bei 1 und springt in Schritten von 1. Wenn Sie die Eingabe des Plugins in der Tabelle benötigen, zeigen Sie das eigene Warenkorb-Formular des Produkts in einer benutzerdefinierten Spalte an, wie in so fügen Sie den Tabellen eine benutzerdefinierte Spalte hinzu beschrieben.

Checkliste

  • Produkte mit Nachbestellung und Lagerbestand 0 oder darunter: Das Snippet woot_profile_extend für die Spalte Warenkorb (Cart) ist aktiv, oder die Lagerverwaltung ist für sie abgeschaltet.
  • $redirect im Snippet entspricht Nach dem Hinzufügen zum Warenkorb (After to cart adding) Ihrer Tabelle.
  • Nur auf Lager (In stock only) in Vordefinition (Predefinition) ist aus, wenn Produkte mit Nachbestellung gelistet werden sollen.
  • Die Spalte Lagerstatus (Stock status) zeigt Auf Nachbestellung (On backorder), wo es zutrifft.
  • Abgemeldet getestet, nach dem Leeren des Seiten-Caches: Der Button erscheint, mehr als der Lagerbestand lässt sich hinzufügen, und bei Erlauben, aber Kunden benachrichtigen (Allow, but notify customer) kennzeichnet der Warenkorb die Artikel als nachbestellt.

Lässt sich ein Produkt mit Nachbestellung weiterhin nicht aus der Tabelle hinzufügen, fragen Sie im WOOT-Support-Forum nach, mit den Lagereinstellungen des Produkts und der Meldung, die die Tabelle zeigt.