WooCommerce में मेहमानों और ग्राहकों के लिए एक क्षेत्र से पोस्टकोड सेट करें

Jan 14 2021

मुख्य विचार एक अतिथि के पोस्टकोड को मान्य करना और उसके अनुसार अलग-अलग संदेश दिखाना है। मैंने शिपिंग कोड सेट करने के लिए इस धागे का उपयोग किया है: WooCommerce में कार्ट में जोड़ने से पहले शिपिंग पोस्टकोड सेट करें

मैंने एक कामकाजी AJAX अनुरोध बनाया है जो लैंडिंग पृष्ठ में एक इनपुट का मूल्य लेता है।

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

  let postcodeField = jQuery("#postcode-field");
  let postcodeVal;

  postcodeField.on("change", function () {
    postcodeVal = postcodeField.val();
  });

  jQuery("#ph_btn").on("click", function () {

    var data = {
      action: 'postcode_handler',
      postcode: postcodeVal
    };

    // since 2.8 ajaxurl is always defined in the admin header and points to admin-ajax.php
    // If you need it on a public facing page, uncomment the following line:
    var ajaxurl = ph_script.ajax_url;

    jQuery.ajax({
      type: 'POST',
      url: ajaxurl,
      data: data,
      success: function (result) {
        // console.log(result);
      },
      error: function () {
        console.log("error");
      }
    });
  })
});

मान तब एक PHP फ़ंक्शन को पास किया जाता है जिसे postcodeमान को अतिथि सत्र में जोड़ना है customer_data

function my_AJAX_processing_function(){

    // Getting the postcode value
    $postcode = intval($_POST['postcode'] ); //Check if the input was a valid integer if ( $postcode == 0 ) {
        echo "Invalid Input";
            wp_die();
    }
    
    //Important: Early enable customer WC_Session 
    add_action( 'init', 'wc_session_enabler' );
    function wc_session_enabler() {
        if ( ! is_admin() && ! WC()->session->has_session() ) {
            WC()->session->set_customer_session_cookie( true );
        }
    }

    // Get an array of the current customer data stored in WC session
    $customer_data = (array) WC()->session->get('customer'); // Change the billing postcode $customer_data['postcode'] = $postcode; // Change the shipping postcode $customer_data['shipping_postcode'] = $postcode; // Save the array of customer WC session data WC()->session->set('customer', $customer_data);

    // Sending a response to the AJAX request
    echo($postcode);
    
    wp_die();

}

मैंने अतिथि का सत्र दिखाने के लिए एक शोर्ट फ़ंक्शन भी बनाया है customer_data

function shortcode_postcode_field(){

  // Getting the customer data from the session
  $customer_data = (array) WC()->session->get('customer');

  // Get the billing postcode
  // if ( isset( $customer_data['postcode'] ) ) $postcode = $customer_data['postcode']; // Showing the customer data for debug reasons var_dump($customer_data);

  return '
  <p class="form-row postcode-field on" id="postcode-field_field" data-priority="">
    <label for="postcode-field" class="">Code postal&nbsp;
      <span class="optional">(facultatif)</span>
    </label>
    <span class="woocommerce-input-wrapper">
      <input type="number" class="input-text" name="postcode" id="postcode-field" placeholder="85000" value="">
    </span>
    <button id="ph_btn" style="color: black">Vérifier son code postal</button>
    <p>Votre code postal est '.$postcode.'</p>
  </p>
  ';
}
add_shortcode( 'postcode-field', 'shortcode_postcode_field' );

मुद्दा यह है कि PHP फ़ंक्शन जो AJAX प्रतिक्रिया प्राप्त करता postcodeहै, वह अतिथि के सत्र में सेट नहीं लगता है customer_data। मैंने postcodeसीधे शोर्ट में (उसी विधि के साथ) सेटिंग की कोशिश की है और यह काम करता है।

क्या आप मेरी मदद कर सकते हैं कि समस्या कहाँ है? मुझे डिबग करने में भी मुश्किलें आईं - मैं कैसे बता सकता हूं कि सत्र customer_dataको बदल दिया गया है?

धन्यवाद।

संपादित करें: मैंने customer dataAJAX प्रतिक्रिया के लिए अतिथि सत्र भेजा है और मुझे यह मिला है:

array(26) { ["id"]=> string(1) "0" ... ["postcode"]=> int(44500) ... }

इसका मतलब यह है कि डेटा AJAX प्रतिक्रिया के ठीक बाद संग्रहीत किया जाता है। समस्या यह है कि यह डेटा संग्रहीत नहीं किया जाता है जब मैं पृष्ठ को फिर से लोड करता हूं और अतिथि के सत्र को customer dataफिर से प्राप्त करने का प्रयास करता हूं ।

जवाब

2 LoicTheAztec Jan 14 2021 at 20:16

आपको WC_Customerऑब्जेक्ट पर उपलब्ध सेटर और गेट्टर विधियों के बजाय उपयोग करने की आवश्यकता है :

  • WC()->customer->get_billing_postcode() या WC()->customer->get_shipping_postcode()
  • WC()->customer->set_billing_postcode() या WC()->customer->set_shipping_postcode()

अब आपके कोड में कुछ गलतियाँ हैं। मैंने आपके सभी कोड इस प्रकार हैं:

// Early enable customer WC_Session
add_action( 'init', 'wc_session_enabler' );
function wc_session_enabler() {
    if ( ! is_admin() && ! WC()->session->has_session() ) {
        WC()->session->set_customer_session_cookie( true );
    }
}

// Shortcode
add_shortcode( 'postcode-field', 'shortcode_postcode_field' );
function shortcode_postcode_field(){
    return '<p class="form-row postcode-field on" id="postcode-field_field" data-priority="">
        <label for="postcode-field" class="">' . __("Postcode", "woocommerce") . '&nbsp;
            <span class="optional">(optional)</span>
        </label>
        <span class="woocommerce-input-wrapper">
            <input type="number" class="input-text" name="postcode-input" id="postcode-input" placeholder="85000" value="">
        </span>
        <button id="postcode-submit" name="postcode-submit" class="button alt">' . __("Check your postcode", "woocommerce") . '</button>
        <br><div class="postcode-message" style="display:none"></div>
    </p>';
}

// Jquery (Ajax sender)
add_action( 'wp_footer', 'postcode_field_js_script' );
function postcode_field_js_script() {
    ?>
    <script type="text/javascript">
    jQuery( function($) { var postcode = ''; $('#postcode-input').on("input change", function () {
            postcode = $(this).val(); }); $("#postcode-submit").on('click', function () {
            $.ajax({ type: 'POST', url: '<?php echo admin_url('/admin-ajax.php'); ?>', data: { 'action': 'postcode_receiver', 'postcode': postcode }, success: function (response) { $('.postcode-message').html(response).show(300);
                    // console.log(response);
                },
                error: function (error) {
                    $('.postcode-message').html(error).show(300); // console.log(error); } }); }); }); </script> <?php } // Php (Ajax receiver) - Check and set the postcode - return message (notice) add_action('wp_ajax_postcode_receiver', 'postcode_receiver'); add_action('wp_ajax_nopriv_postcode_receiver', 'postcode_receiver' ); function postcode_receiver(){ if( isset($_POST['postcode']) ) {
        $postcode = sanitize_text_field($_POST['postcode']);

        if ( $postcode > 0 ) { WC()->customer->set_shipping_postcode($postcode);
            WC()->customer->set_billing_postcode($postcode); $saved_postcode = WC()->customer->get_shipping_postcode();

            echo sprintf( '<span style="color:green;">' . __("Your postcode %s has been registered successfully.", "woocommerce") . '</span>', '"' . $saved_postcode . '"' );
        } else {
            echo '<span style="color:red;">' . __("Check your postcode input please.", "woocommerce") . '</span>';
        }
        wp_die();
    } else {
        echo '<span style="color:red;">' . __("A problem has occurred, try later.", "woocommerce") . '</span>';
        wp_die();
    }
}

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