web-dev-qa-db-fra.com

Ajout d'un produit au panier avec des informations et un prix personnalisés

J'ai installé woocommerce pour gérer la saisie de produits et le processus de commande d'une boutique wordpress.

La page boutique est construite sur mesure, ce qui permet à l'utilisateur de choisir un produit dans une liste et de le personnaliser, ce qui génère un prix en javascript basé sur les informations stockées dans la base de données.

Les produits stockés dans la base de données sont évalués à 0,00 car ce sont des prix différents selon les variables choisies.

Les données de sortie que je suis prêt à transmettre à woocommerce sont les suivantes:

  • ID produit WC (correspond à un produit dans la base de données)
  • Prix ​​personnalisé
  • Image personnalisée
  • Description personnalisée (par exemple 100 mm x 100 mm)
  • Construire des données (à stocker par rapport à l'article mais non visibles lors du paiement)

J'essaie de trouver un moyen d'ajouter un produit au panier en utilisant l'ID de produit (pour le rendre valide), puis en remplaçant le prix par le prix personnalisé et en joignant des métadonnées qui seront le plus visibles à la caisse et une sera masquée jusqu'à ce qu'il soit vu dans le wordpress admin.

L'ajout du produit au panier s'effectue en utilisant:

$woocommerce->cart->add_to_cart($_POST['custom_product_id']);

Après quoi, je trouve impossible de remplacer le prix et d'ajouter des informations supplémentaires.

16
Kevin S

Tout ce code va dans functions.php

  1. Cela capture des informations supplémentaires publiées (toutes envoyées dans un même tableau)

    add_filter('woocommerce_add_cart_item_data','wdm_add_item_data',1,10);
    function wdm_add_item_data($cart_item_data, $product_id) {
    
        global $woocommerce;
        $new_value = array();
        $new_value['_custom_options'] = $_POST['custom_options'];
    
        if(empty($cart_item_data)) {
            return $new_value;
        } else {
            return array_merge($cart_item_data, $new_value);
        }
    }
    
  2. Cela capture les informations de la fonction précédente et les joint à l'élément.

    add_filter('woocommerce_get_cart_item_from_session', 'wdm_get_cart_items_from_session', 1, 3 );
    function wdm_get_cart_items_from_session($item,$values,$key) {
    
        if (array_key_exists( '_custom_options', $values ) ) {
            $item['_custom_options'] = $values['_custom_options'];
        }
    
        return $item;
    }
    
  3. Cela affiche des informations supplémentaires sur le panier et la caisse à partir des informations ajoutées qui ont été attachées à l'article.

    add_filter('woocommerce_cart_item_name','add_usr_custom_session',1,3);
    function add_usr_custom_session($product_name, $values, $cart_item_key ) {
    
        $return_string = $product_name . "<br />" . $values['_custom_options']['description'];// . "<br />" . print_r($values['_custom_options']);
        return $return_string;
    
    }
    
  4. Cela ajoute les informations en tant que métadonnées afin qu'elles puissent être vues comme faisant partie de la commande (pour masquer les métadonnées du client, il suffit de les démarrer avec un trait de soulignement)

    add_action('woocommerce_add_order_item_meta','wdm_add_values_to_order_item_meta',1,2);
    function wdm_add_values_to_order_item_meta($item_id, $values) {
        global $woocommerce,$wpdb;
    
        wc_add_order_item_meta($item_id,'item_details',$values['_custom_options']['description']);
        wc_add_order_item_meta($item_id,'customer_image',$values['_custom_options']['another_example_field']);
        wc_add_order_item_meta($item_id,'_hidden_field',$values['_custom_options']['hidden_info']);
    
    }
    
  5. Si vous souhaitez remplacer le prix, vous pouvez utiliser les informations enregistrées sur le produit pour le faire.

    add_action( 'woocommerce_before_calculate_totals', 'update_custom_price', 1, 1 );
    function update_custom_price( $cart_object ) {
        foreach ( $cart_object->cart_contents as $cart_item_key => $value ) {       
            // Version 2.x
            //$value['data']->price = $value['_custom_options']['custom_price'];
            // Version 3.x / 4.x
            $value['data']->set_price($value['_custom_options']['custom_price']);
        }
    }
    

Toutes vos informations personnalisées apparaîtront dans l'e-mail du client et passeront commande à partir de wordpress à condition que vous les ayez ajoutées en tant que métadonnées (4.)

24
Kevin S

Étape 1: - Vous devez créer des champs masqués personnalisés pour envoyer des données personnalisées qui s'afficheront sur une seule page de produit. par exemple: -

add_action('woocommerce_before_add_to_cart_button', 'custom_data_hidden_fields');
function custom_data_hidden_fields() {
    echo '<div class="imput_fields custom-imput-fields">
        <label class="price_prod">price: <br><input type="text" id="price_prod" name="price_prod" value="" /></label>
        <label class="quantity_prod">quantity: <br>
            <select name="quantity_prod" id="quantity_prod">
                <option value="1" selected="selected">1</option>
                <option value="2">2</option>
                <option value="3">3</option>
                <option value="4">4</option>
                <option value="5">5</option>
            </select>
        </label>
    </div><br>';
}

Étape 2: - Maintenant que vous avez terminé, vous devez écrire la logique principale des champs personnalisés Enregistrer tous les produits dans les données de votre panier, suivez les codes ci-dessous.

// Logic to Save products custom fields values into the cart item data
add_action( 'woocommerce_add_cart_item_data', 'save_custom_data_hidden_fields', 10, 2 );
function save_custom_data_hidden_fields( $cart_item_data, $product_id ) {

    $data = array();

    if( isset( $_REQUEST['price_prod'] ) ) {
        $cart_item_data['custom_data']['price_pro'] = $_REQUEST['price_prod'];
        $data['price_pro'] = $_REQUEST['price_prod'];
    }

    if( isset( $_REQUEST['quantity_prod'] ) ) {
        $cart_item_data['custom_data']['quantity'] = $_REQUEST['quantity_prod'];
        $data['quantity'] = $_REQUEST['quantity_prod'];
    }

    // below statement make sure every add to cart action as unique line item
    $cart_item_data['custom_data']['unique_key'] = md5( microtime().Rand() );
    WC()->session->set( 'price_calculation', $data );

    return $cart_item_data;
}

Étape 3: vous devez remplacer le prix de l'article avec votre calcul personnalisé. Il fonctionnera avec chacun de vos scénarios de vos sessions de produit unique.

add_action( 'woocommerce_before_calculate_totals', 'add_custom_item_price', 10 );
function add_custom_item_price( $cart_object ) {

    foreach ( $cart_object->get_cart() as $item_values ) {

        ##  Get cart item data
        $item_id = $item_values['data']->id; // Product ID
        $original_price = $item_values['data']->price; // Product original price

        ## Get your custom fields values
        $price1 = $item_values['custom_data']['price1'];
        $quantity = $item_values['custom_data']['quantity'];

        // CALCULATION FOR EACH ITEM:
        ## Make HERE your own calculation 
        $new_price = $price1 ;

        ## Set the new item price in cart
        $item_values['data']->set_price($new_price);
    }
}

Tout se fera à l'intérieur du functions.php

Site de référence

5
Krishna Gupta