Đặt mã bưu điện từ một trường cho khách và khách hàng trong WooCommerce

Jan 14 2021

Ý tưởng chính là xác thực mã bưu điện của khách và hiển thị các thông điệp khác nhau theo mã đó. Tôi đã sử dụng chuỗi này để đặt mã giao hàng: Đặt mã bưu điện giao hàng sớm trước khi thêm vào giỏ hàng trong WooCommerce

Tôi đã tạo một yêu cầu AJAX đang hoạt động có giá trị của một đầu vào trong trang đích.

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");
      }
    });
  })
});

Giá trị sau đó được chuyển đến một hàm PHP được cho là để thêm postcodegiá trị vào phiên khách 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();

}

Tôi cũng đã xây dựng một hàm shortcode để hiển thị phiên của khách 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' );

Vấn đề là hàm PHP nhận được phản hồi AJAX dường như không đặt thành postcodephiên của khách customer_data. Tôi đã thử đặt postcodetrực tiếp trong shortcode (với cùng một phương pháp) và nó hoạt động.

Bạn có thể giúp tôi tìm ra vấn đề nằm ở đâu không? Tôi cũng gặp khó khăn khi gỡ lỗi - làm cách nào để biết rằng phiên customer_datađã bị thay đổi?

Cảm ơn bạn.

CHỈNH SỬA: Tôi đã gửi phiên của khách customer datađến phản hồi AJAX và tôi nhận được điều này:

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

Điều này có nghĩa là dữ liệu được lưu trữ ngay sau phản hồi AJAX. Có vẻ như vấn đề là dữ liệu này không được lưu trữ khi tôi tải lại trang và cố gắng lấy customer datalại phiên của khách .

Trả lời

2 LoicTheAztec Jan 14 2021 at 20:16

Thay vào đó, bạn cần sử dụng các phương thức setter và getter có sẵn trên WC_CustomerĐối tượng như:

  • WC()->customer->get_billing_postcode() hoặc là WC()->customer->get_shipping_postcode()
  • WC()->customer->set_billing_postcode() hoặc là WC()->customer->set_shipping_postcode()

Bây giờ có một số sai lầm trong mã của bạn. Tôi đã xem lại tất cả mã của bạn như sau:

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

Mã nằm trong tệp functions.php của chủ đề con đang hoạt động (hoặc chủ đề hoạt động). Đã thử nghiệm và hoạt động.