WooCommerce में मेहमानों और ग्राहकों के लिए एक क्षेत्र से पोस्टकोड सेट करें
मुख्य विचार एक अतिथि के पोस्टकोड को मान्य करना और उसके अनुसार अलग-अलग संदेश दिखाना है। मैंने शिपिंग कोड सेट करने के लिए इस धागे का उपयोग किया है: 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
<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 data
AJAX प्रतिक्रिया के लिए अतिथि सत्र भेजा है और मुझे यह मिला है:
array(26) { ["id"]=> string(1) "0" ... ["postcode"]=> int(44500) ... }
इसका मतलब यह है कि डेटा AJAX प्रतिक्रिया के ठीक बाद संग्रहीत किया जाता है। समस्या यह है कि यह डेटा संग्रहीत नहीं किया जाता है जब मैं पृष्ठ को फिर से लोड करता हूं और अतिथि के सत्र को customer data
फिर से प्राप्त करने का प्रयास करता हूं ।
जवाब
आपको 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") . '
<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 फ़ाइल में जाता है। परीक्षण किया और काम करता है।