ตั้งรหัสไปรษณีย์จากช่องสำหรับแขกและลูกค้าใน WooCommerce

Jan 14 2021

แนวคิดหลักคือการตรวจสอบความถูกต้องของรหัสไปรษณีย์ของแขกและแสดงข้อความที่แตกต่างกันตามนั้น ฉันได้ใช้ชุดข้อความนี้เพื่อตั้งรหัสการจัดส่ง: ตั้งรหัสไปรษณีย์สำหรับการจัดส่งก่อนที่จะหยิบลงตะกร้าใน WooCommerce

ฉันได้สร้างคำขอ AJAX ที่ใช้งานได้ซึ่งรับค่าของอินพุตในหน้า Landing Page

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 ที่ควรจะเพิ่มมูลค่าให้กับเซสชั่นของผู้เข้าพักpostcodecustomer_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 dataไปยังการตอบกลับของ AJAX และฉันได้รับสิ่งนี้:

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

ซึ่งหมายความว่าข้อมูลจะถูกจัดเก็บหลังจากการตอบสนอง AJAX ดูเหมือนว่าปัญหานี้จะไม่ได้รับการจัดเก็บเมื่อฉันโหลดหน้านี้ซ้ำและพยายามรับเซสชันของผู้เยี่ยมชมcustomer dataอีกครั้ง

คำตอบ

2 LoicTheAztec Jan 14 2021 at 20:16

คุณต้องใช้วิธี setter และ getter ที่มีอยู่แทนบนWC_CustomerObject เช่น:

  • 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();
    }
}

โค้ดจะอยู่ในไฟล์ functions.php ของธีมลูกที่ใช้งานอยู่ (หรือธีมที่ใช้งานอยู่) ผ่านการทดสอบและใช้งานได้จริง