php वूकोमर्स चेकआउट में रेडियो बटन के आधार पर गतिशील रूप से अपडेट शुल्क



jquery ajax (1)

जुलाई 2018 को अपडेट किया गया कोड: अब गैर लॉग इन उपयोगकर्ताओं के लिए भी काम करता है

यह अजाक्स की जरूरत है और इसके बिना नहीं किया जा सकता है ... यहां अजाक्स रास्ता है। इस कोड में आपको सब कुछ मिला है, इसलिए इसे आज़माने से पहले अपने संबंधित अनुकूलन को हटा दें (मतलब अपने रेडियो बटन को टेम्पलेट और सभी संबंधित कोड से हटा दें) ...

पूरा कोड (और कुछ नहीं चाहिए) :

// Customizing Woocommerce radio form field
add_action( 'woocommerce_form_field_radio', 'custom_form_field_radio', 20, 4 );
function custom_form_field_radio( $field, $key, $args, $value ) {
    if ( ! empty( $args['options'] ) && is_checkout() ) {
        $field = str_replace( '</label><input ', '</label><br><input ', $field );
        $field = str_replace( '<label ', '<label style="display:inline;margin-left:8px;" ', $field );
    }
    return $field;
}

// Add a custom dynamic packaging fee
add_action( 'woocommerce_cart_calculate_fees', 'add_packaging_fee', 20, 1 );
function add_packaging_fee( $cart ) {
    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return;

    $packing_fee = WC()->session->get( 'chosen_packing' ); // Dynamic packing fee
    $fee = $packing_fee === 'box' ? 9.00 : 3.00;
    $cart->add_fee( __( 'Packaging fee', 'woocommerce' ), $fee );
}

// Add a custom radio fields for packaging selection
add_action( 'woocommerce_review_order_after_shipping', 'checkout_shipping_form_packing_addition', 20 );
function checkout_shipping_form_packing_addition( )
{
    $domain       = 'wocommerce';

    echo '<tr class="packing-select"><th>' . __('Packing options', $domain) . '</th><td>';

    $chosen   = WC()->session->get('chosen_packing');
    $chosen   = empty($chosen) ? WC()->checkout->get_value('radio_packing') : $chosen;
    $chosen   = empty($chosen) ? 'bag' : $chosen;

    // Add a custom checkbox field
    woocommerce_form_field( 'radio_packing', array(
        'type' => 'radio',
        'class' => array( 'form-row-wide packing' ),
        'options' => array(
            'bag' => __('In a bag '.wc_price(3.00), $domain),
            'box' => __('In a gift box '.wc_price(9.00), $domain),
        ),
        'default' => $chosen,
    ), $chosen );

    echo '</td></tr>';
}

// jQuery - Ajax script
add_action( 'wp_footer', 'checkout_shipping_packing_script' );
function checkout_shipping_packing_script() {
    if ( ! is_checkout() )
        return; // Only checkout page
    ?>
    <script type="text/javascript">
    jQuery( function($){
        $('form.checkout').on('change', 'input[name=radio_packing]', function(e){
            e.preventDefault();
            var p = $(this).val();
            $.ajax({
                type: 'POST',
                url: wc_checkout_params.ajax_url,
                data: {
                    'action': 'woo_get_ajax_data',
                    'packing': p,
                },
                success: function (result) {
                    $('body').trigger('update_checkout');
                    console.log('response: '+result); // just for testing | TO BE REMOVED
                },
                error: function(error){
                    console.log(error); // just for testing | TO BE REMOVED
                }
            });
        });
    });
    </script>
    <?php

}

// Php Ajax (Receiving request and saving to WC session)
add_action( 'wp_ajax_woo_get_ajax_data', 'woo_get_ajax_data' );
add_action( 'wp_ajax_nopriv_woo_get_ajax_data', 'woo_get_ajax_data' );
function woo_get_ajax_data() {
    if ( isset($_POST['packing']) ){
        $packing = sanitize_key( $_POST['packing'] );
        WC()->session->set('chosen_packing', $packing );
        echo json_encode( $packing );
    }
    die(); // Alway at the end (to avoid server error 500)
}

कोड आपके सक्रिय चाइल्ड थीम (या सक्रिय थीम) की function.php फाइल में जाता है। परीक्षण किया और काम करता है

इसलिए मैं woocommerce के लिए एक प्लगइन विकसित कर रहा हूं, और मैंने पैकिंग के लिए एक चयन जोड़ा है, या तो एक प्लास्टिक की थैली में या कार्टून बॉक्स में एक अलग लागत के साथ।

उपयोगकर्ता को उन विकल्पों में से एक का चयन करना चाहिए जो मुझे कीमतों को ताज़ा करने और उपयोग करके सही शुल्क में जोड़कर लागत को अद्यतन करने के लिए वर्डप्रेस की आवश्यकता है:

WC_Cart $cart->add_fee( 'Emballagegebyr', intval($fees));

WC_Cart शुल्क को जोड़ने और मूल्य को अपडेट करने का सबसे अच्छा तरीका क्या है? और कोड कैसा दिखना चाहिए?

और मूल्यों को प्राप्त करने के लिए $ _GET और $ _POST का उपयोग करना ठीक है या बेहतर है कि पेज को ताज़ा किए बिना मूल्य को अपडेट करने के लिए AJAX का उपयोग करने का एक तरीका है?

वर्तमान में, मैं निम्न कोड द्वारा ब्राउज़र से डेटा प्राप्त करने के लिए $ _GET का उपयोग कर रहा हूं

function at87_add_custom_fees( WC_Cart $cart ){
    $fees = 3; // fee amount
    $fees = isset($_GET['test']) ? $_GET['test'] : 3;

    $cart->add_fee( 'Emballagegebyr', intval($fees));
}

और मेरी योजना संभवत: नीचे दिए गए जावास्क्रिप्ट कोड को जोड़ने की है, फिर पृष्ठ को ताज़ा करने और चयनित विकल्प को पारित करने के लिए रेडियो बटन का उपयोग करें।

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');
    //    });

        $("#pakpose1 input:radio").change(function(){
    // Do something interesting here
            alert("test");
        });
    });
    </script>
    <?php
    }
}

मुझे यकीन नहीं है कि अगर यह ऐसा करने का सबसे चतुर तरीका है, और अगर कोई दूसरा तरीका है, तो यह बेहतर हो सकता है, और यह किस सुरक्षा को प्रभावित करता है, हो सकता है कि कुछ हुक हैं जो एक ही काम कर सकते हैं।

BTW: चेक-पृष्ठ में रेडियो बटन प्राप्त करने के लिए मैंने प्लगइन को इस तरह बनाया है कि यह woocommerce review-order.php ओवरराइड करता है। review-order.php और निम्न रूप में उस टेम्पलेट में रेडियो बटन जोड़े:

<tr class="packing-selections">
      <th>Pakning</th>
      <td>
                <input type="radio" id="pakpose1" name="pakpose" value="pakpose" checked="checked">Pak i pose <?php echo get_woocommerce_currency_symbol() ?>3.00<br>
                <input type="radio" id="pakpose2" name="pakpose" value="pakkasse">Pak i papkasse <?php echo get_woocommerce_currency_symbol() ?>9.00
     </td>
</tr>




woocommerce