WooCommerce fügt Produktfelder basierend auf der Menge hinzu

Lesezeit: 6 Minuten

Schönen Tag.

Gibt es eine Möglichkeit, Eingabefelder dynamisch zu einem Produkt in WooCommerce hinzuzufügen, basierend auf der Anzahl der ausgewählten Produkte?

Ich habe viele Lösungen gefunden, bei denen es statische Felder geben kann, aber keine, bei denen es automatisch aktualisiert wird. Wenn ich zum Beispiel 3 Mengen auf der Produktseite habe, um einen Namen, eine Handynummer und eine E-Mail-Adresse für jedes Produkt hinzuzufügen, ist dies ein Pflichtfeld.

Die Optionen, die ich gesehen habe, sind:

https://wordpress.org/plugins/woo-checkout-field-editor-pro/

https://wordpress.org/plugins/wc-fields-factory/

Angenommen, Sie haben ein Buchungssystem in Ihrem WooCommerce-Shop und möchten die zusätzlichen Informationen an der Kasse erfassen, wenn jemand für mehr als eine Menge bucht. Wenn Sie beispielsweise eine Veranstaltungs-/Workshop-Website haben und Name, E-Mail, Telefon und Adresse aller Personen erfassen möchten, die an Ihrer Veranstaltung/Ihrem Workshop teilgenommen haben, und jemand auf Ihrer Website für 3 Mengen bucht, benötigen Sie zusätzliche dynamische benutzerdefinierte Felder, um die Details zu erfassen von anderen 2 Teilnehmern. Wenn also jemand dem Warenkorb eine Menge von 3 hinzufügt, fügt die Checkout-Seite zusätzliche Felder für die anderen 2 Teilnehmer hinzu, wenn dem Warenkorb eine Menge von 4 hinzugefügt wird, fügt sie Felder für die anderen 3 Teilnehmer hinzu.

In der folgenden Funktion prüfen wir, wie viele Mengen der Benutzer in seinem Warenkorb hat, und fügen die zusätzlichen Felder zur Checkout-Seite hinzu, wenn die Menge größer als 1 ist. Und speichern die Feldwerte, um sie in der Reihenfolge auf der Admin-Seite anzuzeigen.

Gehen Sie zu Ihrer Datei functions.php und fügen Sie den folgenden Code am Ende der Datei hinzu, oder Sie können Ihr eigenes Plugin erstellen, um diese Funktion hinzuzufügen.

//Custom WooCommerce Checkout Fields based on Quantity
add_action( 'woocommerce_before_order_notes', 'person_details' );

function person_details($checkout) {
    global $woocommerce;
$count = $woocommerce->cart->cart_contents_count;
$i = 1;
       for($k=2; $k<= $count; $k++) {
        $i++;
           print ('<h3>Please enter details of attendee '.$i.'</h3>');
        woocommerce_form_field( 'cstm_full_name'.$i, array(
            'type'          => 'text',
            'class'         => array('my-field-class form-row-wide'),
            'label'         => __('Full name'),
            'placeholder'   => __('Enter full name'),
            ),
            $checkout->get_value( 'cstm_full_name'.$i ));
        echo '<div class="clear"></div>';
        woocommerce_form_field( 'cstm_phone'.$i, array(
            'type'          => 'text',
            'class'         => array('my-field-class form-row-first'),
            'label'         => __('Phone'),
            'placeholder'   => __('Enter phone number'),
            ),
            $checkout->get_value( 'cstm_phone'.$i ));
        woocommerce_form_field( 'cstm_email'.$i, array(
            'type'          => 'email',
            'class'         => array('my-field-class form-row-last'),
            'label'         => __('Email address'),
            'placeholder'   => __('Enter email address'),
            ),
            $checkout->get_value( 'cstm_email'.$i ));
        echo '<div class="clear"></div>';
        woocommerce_form_field( 'cstm_address'.$i, array(
            'type'          => 'textarea',
            'class'         => array('my-field-class form-row-wide'),
            'label'         => __('Full address'),
            'placeholder'   => __('Enter full address'),
            ),
            $checkout->get_value( 'cstm_address'.$i ));
}
}

/**
 * Save value of fields
 */

add_action('woocommerce_checkout_update_order_meta', 'customise_checkout_field_update_order_meta');

function customise_checkout_field_update_order_meta($order_id)
{
    global $woocommerce;
$count = $woocommerce->cart->cart_contents_count;
$i = 1;
       for($k=2; $k<= $count; $k++) {
        $i++;
    if (!empty($_POST['cstm_full_name'.$i])) {
        update_post_meta($order_id, 'Name of Attendee'.$i, sanitize_text_field($_POST['cstm_full_name'.$i]));
    }
    if (!empty($_POST['cstm_phone'.$i])) {
        update_post_meta($order_id, 'Phone of Attendee'.$i, sanitize_text_field($_POST['cstm_phone'.$i]));
    }
    if (!empty($_POST['cstm_email'.$i])) {
        update_post_meta($order_id, 'Email of Attendee'.$i, sanitize_text_field($_POST['cstm_email'.$i]));
    }
    if (!empty($_POST['cstm_address'.$i])) {
        update_post_meta($order_id, 'Address of Attendee'.$i, sanitize_text_field($_POST['cstm_address'.$i]));
    }
}
}

Dynamische benutzerdefinierte Felder auf der Checkout-Seite
Geben Sie hier die Bildbeschreibung ein

Wert für benutzerdefinierte Felder auf der Bestellseite im Adminbereich
Geben Sie hier die Bildbeschreibung ein

Bezug

Basierend auf der Antwort von @HMagby verwaltet meine Version mehrere Felder für jeden Artikel im Warenkorb und für jede Menge. Feldwerte werden gespeichert als order item meta nachdem die Bestellung aufgegeben wurde. Ideal für den Ticketing-E-Commerce.

<?php
class MRL_Utils
{
    private $products_ids = false;
    private $personal_data = false;
    
    public function __construct()
    {    
        // Campi
        $this->personal_data = array(
            "nome" => array("label" => "Nome", "type" => "text", "class" => "my-field-class form-row-first", "required" => true, "placeholder" => "Inserisci il nome del partecipante"),
            'tel' => array("label" => "Cellulare", "type" => "tel", "class" => "my-field-class form-row-last", "required" => false, "placeholder" => "Inserisci il numero di cellulare"),
            'note' => array("label" => "Intolleranze e/o allergie", "type" => "textarea", "class" => "my-field-class form-row-wide", "required" => false, "placeholder" => "Specifica eventuali intolleranze e/o allergie"),
        );
        $this->products_ids = array(32, 33, 34, 35);

        // Form nella pagina del Checkout
        add_action('woocommerce_before_order_notes', array($this, 'mrl_display_personal_data_field'), 10, 1);
        add_action('woocommerce_checkout_update_order_meta', array($this, 'mrl_save_personal_data_field'), 10, 1);        

    }

    public function mrl_save_personal_data_field($order_id)
    {
        $order = wc_get_order($order_id);
        foreach($order->get_items() as $item_id => $item)
        {
            $product_id = $item->get_product_id();
            $quantity = $item->get_quantity();

            // Procedo solo se il prodotto è tra quelli abilitati
            if(in_array($product_id, $this->products_ids))
            {
                // Salvo i dati inseriti come dei meta per ogni item dell'ordine
                // Ricordiamoci che c'è un solo ITEM anche se la quantità è > 1
                for($i = 0; $i < $quantity; $i++)
                {
                    // So che i dati sono salvati in questo modo: mrl_NAME_ID_#
                    // Dove NAME è la key di $_POST, ID è l'ID del prodotto a catalogo e # è progressivo da 0 a quantità
                    $valori = array();

                    // Per ogni dato personale
                    foreach($this->personal_data as $key => $value)
                    {
                        $label = $value['label'];
                        $selettore = "mrl_".$key."_".$product_id."_".$i;

                        if(isset($_POST[$selettore]))
                        {
                            $valori[$label] = $_POST[$selettore];
                        }
                    }               

                    // Salvo i meta dell'item
                    $valori = implode(', ', array_map(
                        function ($v, $k) { return sprintf("%s: %s", $k, $v); },
                        $valori,
                        array_keys($valori)
                    ));
                    wc_add_order_item_meta($item_id, "#".($i+1), $valori, true);
                    wc_update_order_item_meta($item_id, "#".($i+1), $valori);
                }   
            }         
        }
    }


    public function mrl_display_personal_data_field($checkout)
    {
        global $woocommerce;
        $items = $woocommerce->cart->get_cart();

        foreach($items as $item => $values)
        {
            // Ogni item avrà una sua quantità
            $qty = $values['quantity'];
            $_id = $values['data']->get_id();
            $_product =  wc_get_product($_id);
            $title = $_product->get_title();

            // Procedo solo se il prodotto è tra quelli abilitati
            if(in_array($_id, $this->products_ids))
            {
                echo "<h3>$title ($qty)</h3>";
                for($i = 0; $i < $qty; $i++)
                {
                    echo "<div style="border:5px solid var(--ast-global-color-2);padding:10px;margin-top:10px;margin-bottom:10px;background-color:#fafafa"><h4>#".($i+1)."</h4>";

                    // Per ogni dato personale
                    foreach($this->personal_data as $key => $value)
                    {
                        $type = $value['type'];
                        $label = $value['label'];
                        $class = $value['class'];
                        $required = $value['required'];
                        $placeholder = $value['placeholder'];

                        $selettore = "mrl_".$key."_".$_id."_".$i;
                        woocommerce_form_field($selettore, array(
                                'type'          => $type,
                                'class'         => array($class),
                                'label'         => $label." #".($i+1),
                                'placeholder'   => $placeholder,
                                'required' => $required,
                            ),
                            $checkout->get_value($selettore),
                        );
                    }

                    echo "</div>";
                }
            }
        }
    }
}
add_action('plugins_loaded', function(){
    new MRL_Utils();
});
?>

1426840cookie-checkWooCommerce fügt Produktfelder basierend auf der Menge hinzu

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

Privacy policy