WooCommerce – Ignoriere nicht ausgewählte Variationen beim Hinzufügen zum Warenkorb

Lesezeit: 9 Minuten

Zielsetzung: Produkt trotz nicht ausgewählter Variationen in den Warenkorb legen, dh den obligatorischen Charakter von Variationsfeldern entfernen/deaktivieren.

Ausgabe: Die absolute Anforderung von WooCommerce, dass alle Varianten ausgewählt werden müssen, bevor sie in den Warenkorb gelegt werden.

Versucht: Herausfiltern/Entfernen/Deaktivieren nicht ausgewählter Variationen vor dem Hinzufügen zum Warenkorb mithilfe verschiedener Hooks; woocommerce_before_calculate_totals, woocommerce_add_to_cart, woocommerce_add_cart_item, woocommerce_add_to_cart_validation

Ich verstehe, dass WooCommerce so funktioniert und warum es so funktioniert – trotzdem benötige ich noch eine Problemumgehung.

Wie kann ich die Anforderung „Alle Varianten ausgewählt“ von WooCommerce umgehen, sodass ich trotzdem ein Produkt in den Warenkorb legen kann, auch wenn nicht alle Varianten ausgewählt sind?

  • Wenn Sie mich fragen, wäre der schnellste Weg (mit Sicherheit nicht der sauberste) die Erstellung eines anderen Produkts, bei dem es sich um ein einfaches Produkt handelt, mit denselben Spezifikationen (Preis, Titel, Beschreibung usw.) wie das Produkt ohne ausgewählte Variation (weil nach alles, was Sie noch brauchen, um dieser Wahl einen Preis zu geben, damit die Dinge funktionieren). Dann müssten Sie sich nur in den add_to_cart einklinken, um den Fehler zu ignorieren und einfach das einfache Produkt hinzuzufügen. Das heißt, das sieht eher nach einem Designproblem aus, vielleicht sollten Sie versuchen, dies zu überdenken, um nicht gegen die Natur von Woocommerce zu verstoßen

    – Diego

    12. April 2021 um 9:25 Uhr

  • Ihr Produkt ist also ein variables Produkt, das Variationen hat, die Preise haben. Eine Variation besteht aus einer Kombination von Attributen. Sie möchten eine Variante in den Warenkorb legen können, auch wenn nicht alle Attribute ausgewählt wurden und somit keine eindeutige Variante identifiziert werden kann? Wo soll der Preis herkommen? Was ist mit den nicht ausgewählten Attributen, und wenn sie nicht wichtig sind, warum sind sie dann überhaupt hier? Optionale Attribute?

    – Mtxz

    12. April 2021 um 18:24 Uhr


  • @Mtxz Sowohl der Preis als auch die Variation werden durch die Auswahl eines Attributs durch ein benutzerdefiniertes Plugin bestimmt. Optionale Attribute sind im Wesentlichen das, was ich brauche, damit die Validierungsprüfung für obligatorische Attributfelder nicht fehlschlägt. Mit einem Haken, wie woocommerce_add_to_cart_validationoder ähnliches, um nicht ausgefüllte Attribute vor der Validierung herauszufiltern, war mein erster Gedanke.

    – UncaughtTypeError

    12. April 2021 um 19:07 Uhr

  • @Diego Sie haben Recht, dies ist im Grunde ein Designfehler einer vorhandenen Codebasis. Arbeiten mit WooCommerce Version 3.6.3, aber nicht Version 5.1.0.

    – UncaughtTypeError

    12. April 2021 um 19:13 Uhr

  • @UncaughtTypeError welches Plugin verwendest du? Die Variation und das Attribut werden nicht von woocommerce gehandhabt? (Wenn ich mich recht erinnere, sind Attribute Taxonomiebegriffe). Ich möchte genug haben, um das Produkt auf meiner Seite zu reproduzieren, um Tests zu machen (Anzahl der erforderlichen Attribute, Anzahl der nicht erforderlichen Attribute). Was mich betrifft, benötigen Sie eine vollständige Kombination von Attributen, um Variationen und damit einen Preis zu haben.

    – Mtxz

    12. April 2021 um 20:18 Uhr


Du kannst es versuchen

add_filter('woocommerce_dropdown_variation_attribute_options_args', 'setSelectDefaultVariableOption', 10, 1);
function setSelectDefaultVariableOption($args)
{
    $default = $args['product']->get_default_attributes();
    if (count($args['options']) > 0 && empty($default)) {
        $args['selected'] = $args['options'][0];
    }
    return $args;
}

  • Können Sie uns erklären, was hier vor sich geht, damit es klar ist? Vielen Dank.

    – UncaughtTypeError

    18. April 2021 um 17:38 Uhr

  • Welchen Teil musst du mir erklären?

    – Binh Nguyen

    19. April 2021 um 2:36 Uhr

  • Alle wesentlichen Teile. Die Antwort selbst könnte mit einer Aufschlüsselung dessen, was vor sich geht, für die Community als Ganzes verbessert werden.

    – UncaughtTypeError

    19. April 2021 um 13:25 Uhr

  • Beim Testen habe ich diesen Code getestet. Ich kann get_default_attributes() nicht wie erwartet zum Laufen bringen, wie es scheint. Was ich sagen kann, ist, dass Sie mit dem Filter „woocommerce_dropdown_variation_attribute_options_args“ die Konfiguration bearbeiten können, die verwendet wird, um die HTML-Auswahl und Optionen für die Produktattribute im Frontend zu generieren. Das Ziel scheint also, das Attribut “ausgewählt” zu einer der Optionen hinzuzufügen. Aber wie ich in meiner Antwort getestet habe, handhabt Woocommerce dies bereits nativ (Standardattributwerte für Produktvariationen).

    – Mtxz

    19. April 2021 um 23:45 Uhr

Benutzer-Avatar
Mtxz

1 – Sie könnten verwenden „Variation“-Attributeund „Nicht-Variation“-Attribute. NACH TESTS AKTUALISIERT

Für das Attribut, das Ihren Produktpreis handhabt:

  • Erstellen Sie ein variables Produkt

  • Erstellen Sie echte Woocommerce-Produktattribute (echte Taxonomie und Begriffe) (es funktioniert nicht mit den Attributen „auf Produktseite erstellt“, da es keine echte Taxonomie und Begriffe erstellt).

  • Hier habe ich 3 Attribute mit einigen Begriffen erstellt
    Geben Sie hier die Bildbeschreibung ein

  • Bei Ihrem variablen Produkt wähle ich alle meine 3 Attribute aus. Aber angegeben, dass nur Farbe und Größe für Variationen verwendet werden (also wird Farbe und Variationen meine Preisvariationen handhaben), nicht das Attribut “optional” (das wird eine optionale Option sein)
    Geben Sie hier die Bildbeschreibung ein

  • Generieren Sie dann Ihre Variationen. Sie können hier sehen, dass ich nur Variationen für eine Kombination aus Farbe und Größe habe, noch nichts über das Attribut “Optional”.

  • Wählen Sie außerdem die “Standardwerte” für Ihre Variationsattribute aus. Auf dem Frontend hat das Attribut select HTML input also eine vorausgewählte Option (Benutzer kann direkt zum Warenkorb hinzufügen)
    Geben Sie hier die Bildbeschreibung ein

  • Jetzt haben wir unsere Variationsattribute mit vorselektierten Werten im Frontend

  • Aber wir vermissen immer noch unsere “optionalen” Attribute

  • Fügen Sie den folgenden Code zu Ihrer hinzu function.php oder verwandt (inspiriert, aktualisiert/aufgefrischt und angepasst von Dies) (Entschuldigung für die Formatierung, Snippet auch als Kern)

  • Dadurch wird die Auswahl der Eingabe für das optionale Attribut ausgegeben und im Warenkorb und zur Bestellung gespeichert. Sie können es anpassen, um es erforderlich zu machen oder nicht, mit einem Standardwert oder nicht, HTML und Platzierung mit verschiedenen Hooks bearbeiten.

/**
 * List available attributes on the product page in a drop-down selection
 */
function list_attributes_on_product_page() {
    global $product;
    $attributes = $product->get_attributes();

    if ( ! $attributes ) {
        return;
    }

    //from original script, but here we want to use it for variable products
    /*if ($product->is_type( 'variable' )) {
        return;
    }*/

    echo '<div style="padding-bottom:15px;">';

    foreach ( $attributes as $attribute ) {

        //If product is variable, and attribute is used for variation: woocommerce already handle this input - so it can also be used with attributes of simple products (not variables)
    if($product->is_type( 'variable' ) && $attribute['variation']) {
        continue;
    }

        //get taxonomy for the attribute - eg: Size
        $taxonomy = get_taxonomy($attribute['name']);

        //get terms - eg: small
        $options = wc_get_product_terms( $product->get_id(), $attribute['name'], array( 'fields' => 'all' ) );
        $label = str_replace('Product ', '', $taxonomy->label);
        //display select input
        ?>
        <div style="padding-bottom:8px;">
            <label for="attribute[<?php echo $attribute['id']; ?>]"><?php echo $label; ?></label>
            <br />
            <!-- add required attribute or not, handle default with "selected" attribute depending your needs -->
            <select name="attribute[<?php echo $attribute['id']; ?>]" id="attribute[<?php echo $attribute['id']; ?>]">
                <option value disabled selected>Choose an option</option>
                <?php foreach ( $options as $pa ): ?>
                    <option value="<?php echo $pa->name; ?>"><?php echo $pa->name; ?></option>
                <?php endforeach; ?>
            </select>
        </div>
        <?php
    }

    echo '</div>';
}
add_action('woocommerce_before_add_to_cart_button', 'list_attributes_on_product_page');

/**
 * Add selected attributes to cart items
 */
add_filter('woocommerce_add_cart_item_data', 'add_attributes_to_cart_item', 10, 3 );
function add_attributes_to_cart_item( $cart_item_data, $product_id, $variation_id ) {
    $attributes = $_POST['attribute'] ?? null;

    if (empty( $attributes ) ) {
        return $cart_item_data;
    }

    $cart_item_data['attributes'] = serialize($attributes);

    return $cart_item_data;
}

/**
 * Display attributes in cart
 */
add_filter( 'woocommerce_get_item_data', 'display_attributes_in_cart', 10, 2 );
function display_attributes_in_cart( $item_data, $cart_item ) {
    if ( empty( $cart_item['attributes'] ) ) {
        return $item_data;
    }

    foreach (unserialize($cart_item['attributes']) as $attributeID => $value) {
        $attribute = wc_get_attribute($attributeID);
        $item_data[] = array(
            'key'     => $attribute->name,
            'value'   => $value,
            'display' => '',
        );
    }

    return $item_data;
}

/**
 * Add attribute data to order items
 */
add_action( 'woocommerce_checkout_create_order_line_item', 'add_attributes_to_order_items', 10, 4 );
function add_attributes_to_order_items( $item, $cart_item_key, $values, $order ) {
    if ( empty( $values['attributes'] ) ) {
        return;
    }

    foreach (unserialize($values['attributes']) as $attributeID => $value) {
        $attribute = wc_get_attribute($attributeID);
        $item->add_meta_data( $attribute->name, $value );
    }
}

Ergebnisse:
Geben Sie hier die Bildbeschreibung ein

2 – Plugins

Sie können auch mit Plugins wie überprüfen Produkt-Add-Ons oder Zusätzliche Produktoptionen (Produkt-Add-Ons) für WooCommerce. Zusätzlich zu echten Woocommerce-Produktvariationen mit Ihren Attributhandhabungspreisen können Sie mit diesen Plugins optionale Felder auf Produktebene hinzufügen, wenn Sie sie zum Warenkorb hinzufügen. Es kann ausreichen, wenn Sie für diese “optionalen” Attribute keine echten Produktvariationen benötigen, sondern nur “optionale Felder, die im Bestellpositionsprodukt gespeichert werden”.

3 – mit Haken (Änderungen)

Nun, wenn Sie wirklich Hooks verwenden müssen, um dieses Problem zu behandeln, und Sie bereits Variationen für erforderliche und optionale Attribute haben. Sie haben also alle Produktvariationen für alle Attribute generiert. Aber am Ende hat nur 1 Attribut einen Einfluss auf den Preis, also haben viele Variationen den gleichen Preis).

Sie könnten zuerst versuchen, es mit “Standard” -Attributwerten zu handhaben. Indem also nur das Attribut „erforderliche preisbeeinflussende“ geändert wird, hat der Benutzer immer eine vorhandene Produktvariation aus der Kombination von Attributen. So kann es in den Warenkorb gelegt werden.

Wenn Sie aus irgendeinem Grund den Standard nicht selbst vorwählen können: Erstellen Sie trotzdem den Standard-Attributbegriff und haken Sie ihn ab, bevor Sie ihn in den Warenkorb legen. Dort könnten Sie anhand der POST-Variablen Folgendes tun:

  • Finden Sie den erforderlichen Attributwert und finden Sie so in Ihrer Datenbank die entsprechende Produktvariante
  • Fügen Sie programmgesteuert die Variante mit dem korrekten Attribut „erforderlich“ und dem standardmäßigen Attribut „nicht erforderlich“ dem Einkaufswagen hinzu.

Die Sache mit den variablen Produkten ist: Attribute sind nichts für den Checkout-Prozess. Wenn der Benutzer Optionen (Attribute) im Frontend auswählt, wählt er eine Kombination von Attributen aus, die eine entsprechende Produktvariation haben oder nicht (erstellt vom Administrator oder mit Woocommerce-Helfer). Woocommerce benötigt eine vorhandene Produktvariation (Kombination von Attributen), die Sie auf der Produktseite sehen können, um etwas in den Warenkorb zu legen. Diese Variationen sind in DB ein benutzerdefinierter Post_Type “product_variation”, der dem Warenkorb und einer Bestellung als Einzelposten hinzugefügt werden kann. Wenn die Kombination von Attributen keine passende Produktvariante hat: Es gibt nichts in den Warenkorb zu legen.

  • Nach Tests bearbeitet

    – Mtxz

    19. April 2021 um 23:31 Uhr

1380810cookie-checkWooCommerce – Ignoriere nicht ausgewählte Variationen beim Hinzufügen zum Warenkorb

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy