2015-08-20 15 views
7

Ich versuche, eine benutzerdefinierte Gebühr auf die Bestellung insgesamt beim Auschecken anzuzeigen. Ich habe eine Checkbox innerhalb WooCommerce hinzugefügtWoocommerce benutzerdefinierte Checkout-Feld, um Gebühr zu bestellen Ajax

add_action('woocommerce_after_checkout_billing_form', 'add_box_option_to_checkout'); 
function add_box_option_to_checkout($checkout) { 
    echo '<div id="message_fields">'; 
    woocommerce_form_field('add_gift_box', array(
     'type'   => 'checkbox', 
     'class'   => array('add_gift_box form-row-wide'), 

     'label'   => __('Ilość pudełek ozdobnych - 25 PLN/szt'), 
     'placeholder' => __(''), 
     ), $checkout->get_value('add_gift_box')); 
} 

eine benutzerdefinierte js-Datei enthalten, die das Ereignis

jQuery(document).ready(function($) { 

    $('#add_gift_box').click(function(){ 
     var data = { 
      action: 'woocommerce_add_gift_box', 
      state: '200', 
     }; 
     jQuery.ajax({ 
      type: 'POST', 
      url: wc_checkout_params.ajax_url, 
      data: data, 
      success: function (code) { 
       console.log(code); 
       jQuery('body').trigger('update_checkout'); 
      }, 
      dataType: 'html' 
     }); 

    }); 
}); 

Und ein PHP-Gebühr Handhabung Funktion

function woo_add_cart_fee($data){ 
    if (is_admin() && ! defined('DOING_AJAX') || ! $_POST) return; 

    $extracost = 0; 
    if (isset($_POST['state'])) { 
    $extracost = intval($_POST['state']); 
    } 
    WC()->cart->add_fee('Ozdobne pudełka:', $extracost); 

} 
add_action('woocommerce_cart_calculate_fees', 'woo_add_cart_fee'); 


add_action('wp_ajax_woocommerce_add_gift_box', 'woo_add_cart_fee', 10); 
add_action('wp_ajax_nopriv_woocommerce_add_gift_box', 'woo_add_cart_fee', 10); 

das Aus irgendwelchen Gründen behandeln schould Wert von $ _POST ['state'] wird nicht hinzugefügt, die Funktion funktioniert, wenn ich einen hart codierten Wert gebe, habe ich viele Optionen ausprobiert, aber kann nicht funktionieren.

Ich habe ähnliche Beiträge gesehen, aber keiner von ihnen hatte die Antwort.

+0

Haben Sie das jemals herausgefunden? – David

+0

Noch nicht - Ich werde ein Update posten, wenn ich die Antwort finde, jetzt habe ich das Checkout Adons Plugin verwendet, um dies zu erreichen – adam

Antwort

11

Die Postdaten werden von den AJAX-Funktionen in 'post_data', serialisiert, gesendet. Um den Wert Ihrer Checkbox zu erhalten, brauchen Sie nur parse_str() dies!

parse_str($_POST['post_data'], $post_data); 

dann können Sie Ihr 'add_gift_box' Option von $post_data['add_gift_box'] zu bekommen. Beachten Sie, dass das Element 'post_data' nach Abschluss der Bestellung nicht mehr verfügbar ist und sich alles in $_POST befindet.

Komplettes Beispiel, basierend auf Ihrem Code:


1) das Hinzufügen des Kontrollkästchen zur Kasse

add_action('woocommerce_after_checkout_billing_form', 'add_box_option_to_checkout'); 
function add_box_option_to_checkout($checkout) { 
    echo '<div id="message_fields">'; 
    woocommerce_form_field('add_gift_box', array(
     'type'   => 'checkbox', 
     'class'   => array('add_gift_box form-row-wide'), 

     'label'   => __('Ilość pudełek ozdobnych - 25 PLN/szt'), 
     'placeholder' => __(''), 
     ), $checkout->get_value('add_gift_box')); 
     echo '</div>'; 
} 

2) Skript Warenkorb zu aktualisieren, wenn Checkbox (keine Notwendigkeit für zusätzliche AJAX-Anfragen angeklickt

!) Aktion
add_action('wp_footer', 'woocommerce_add_gift_box'); 
function woocommerce_add_gift_box() { 
    if (is_checkout()) { 
    ?> 
    <script type="text/javascript"> 
    jQuery(document).ready(function($) { 
     $('#add_gift_box').click(function(){ 
      jQuery('body').trigger('update_checkout'); 
     }); 
    }); 
    </script> 
    <?php 
    } 
} 

3) die Gebühr hinzuzufügen

add_action('woocommerce_cart_calculate_fees', 'woo_add_cart_fee'); 
function woo_add_cart_fee($cart){ 
     if (! $_POST || (is_admin() && ! is_ajax())) { 
     return; 
    } 

    if (isset($_POST['post_data'])) { 
     parse_str($_POST['post_data'], $post_data); 
    } else { 
     $post_data = $_POST; // fallback for final checkout (non-ajax) 
    } 

    if (isset($post_data['add_gift_box'])) { 
     $extracost = 25; // not sure why you used intval($_POST['state']) ? 
     WC()->cart->add_fee('Ozdobne pudełka:', $extracost); 
    } 

} 
+0

Vielen Dank. Ich werde das überprüfen. – adam

+1

danke !! Das funktioniert wie Charme – titan

+0

Das hat super funktioniert! Aber aus Neugier, wie hat der Jquery-Trigger ('update_checkout') die Funktion woo_add_cart_fee ausgelöst? – Buster

3

Das ist genial !! Danke vielmals. Ich habe es ein wenig geändert, um stattdessen einen Prozentsatz hinzuzufügen. Ich weiß, das ist keine bessere Antwort, aber ich habe keinen guten Ruf, um deine Antwort zu verbessern. Für wen auch immer steckte wie ich ..

add_action('woocommerce_cart_calculate_fees', 'woo_add_cart_fee'); function woo_add_cart_fee($cart){ 
    global $woocommerce; 

    if (! $_POST || (is_admin() && ! is_ajax())) { 
    return; 
} 

if (isset($_POST['post_data'])) { 
    parse_str($_POST['post_data'], $post_data); 
} else { 
    $post_data = $_POST; // fallback for final checkout (non-ajax) 
} 

if (isset($post_data['add_gift_box'])) { 

$percentage = 0.01; 
$surcharge = ($woocommerce->cart->cart_contents_total + $woocommerce->cart->shipping_total) * $percentage;  
$woocommerce->cart->add_fee('Surcharge', $surcharge, true, ''); 
} 

} 
Verwandte Themen