Ajax call ส่งคืนค่า 0 เสมอ


18

ฉันมีปัญหากับ AJAX ที่ส่งคืนค่า 0 เสมอ!

ฉันทำทุกอย่างตามหนังสือแล้วไม่สามารถเข้าใจได้ว่าเกิดอะไรขึ้น กรุณาช่วย!!

นี่คือการโทร Ajax ของฉัน:

//Pass data through AJAX
var amountToConvert = price;

jQuery.ajax({
      type:"POST",
      url: "../../wp-admin/admin-ajax.php", // our PHP handler file
      action: "ajaxConversion",
      data: {
          amount: amountToConvert
      },
      success:function(data){
      alert(data);
      },
      error: function(errorThrown){
          alert(errorThrown);
      } 

  });
return false;

และฟังก์ชั่นใน functions.php คือ:

function ajaxConversion(){

$amount = mysql_real_escape_string($_POST['amount']);

echo $amount;

die();
};

add_action('wp_ajax_nopriv_ajaxConversion', 'ajaxConversion');
add_action('wp_ajax_ajaxConversion', 'ajaxConversion');

คุณพยายามที่จะแก้ปัญหารหัสของคุณ? ใช้admin_url( 'admin-ajax.php' )เพื่อรับ AJAX URL ด้วยไม่ใช่ URL ที่ประกอบขึ้นมาบ้าง
fuxia

คำตอบ:


15

คุณสามารถทำการกระทำ (ajaxConversion) ในข้อมูลของคุณและตรวจสอบได้หรือไม่?

jQuery.ajax({
  type:"POST",
  url: ajaxurl,
  data: {
      action: "ajaxConversion",
      amount: amountToConvert
  },
  success:function(data){
  alert(data);
  },
  error: function(errorThrown){
      alert(errorThrown);
  } 

});

นี่ยังคงเป็นการต่อท้าย 0 กับเนื้อหาของฉันอย่างใด
Ben Racicot

1
@BenRacicot: คุณสามารถตรวจสอบว่าคุณมีคำสั่งใด ๆ ที่ส่งออกเช่น echo, die () ฯลฯ ในรหัส PHP ของคุณ?
Jayawi Perera

2
เฮ้เจ, ปรากฎว่าเพิ่มตาย (); เพื่อ ajax func ของฉันแก้ไขมันได้!
Ben Racicot

20

การใช้wp_die();ที่ส่วนท้ายของฟังก์ชั่น AJAX แก้ไขปัญหาสำหรับฉัน

เช่น

add_action( 'wp_ajax_my_ajax_function', 'my_ajax_function' );

function my_ajax_function(){      
    echo json_encode($myvar);
    wp_die(); 
}

ขอบคุณ ... ไม่ทราบว่าทำไม แต่ใช้เพียงตาย () ไม่ทำงาน
Sagive SEO

10

สำหรับฉันเคล็ดลับคือการเพิ่มwp_ajax_noprivการกระทำ ฉันทดสอบสคริปต์ในเบราว์เซอร์เดียวเมื่อฉันเข้าสู่ระบบในผู้ดูแลระบบ WP จากนั้นฉันลองใช้สคริปต์เดียวกันใน Chrome และรู้ว่าสคริปต์นั้นไม่ทำงาน หลังจากที่ฉันใส่wp_ajax_noprivทุกอย่างเริ่มทำงาน :)

add_action( 'wp_ajax_nopriv_erase_uploaded_images', 'erase_uploaded_images' );
add_action( 'wp_ajax_erase_uploaded_images', 'erase_uploaded_images' );

function erase_uploaded_images() {
    $attach_id = filter_input( INPUT_POST, 'attach_id' );
    wp_delete_attachment( $attach_id );
    if ( isset( $_SESSION['uploaded_images'] ) ) {
        $array_attachments = $_SESSION['uploaded_images'];
        if ( ( $key = array_search( $attach_id, $array_attachments ) ) !== false ) {
            unset( $array_attachments[$key] );
        }
        $_SESSION['uploaded_images'] = $array_attachments;
    }
    wp_die();
}

เพื่อนของฉันคนนี้ได้ช่วยฉันให้รอดพ้นจากการถูกทำลาย 2 ชั่วโมง บทเรียนอื่นที่ต้องเรียนรู้เมื่อปรับใช้แอปพลิเคชันของคุณกับสภาพแวดล้อมอื่น T_T
Tree Nguyen

นี่เป็นเรื่องจริงมาก ... ถ้าคุณลงชื่อเข้าใช้ในการดูแลระบบจะไม่มีการเรียกใช้ฟังก์ชัน _nopriv
Michal Holub

2

ฉันอยากจะแนะนำให้ใช้wp_send_json_success ()และwp_send_json_error ()ทางฝั่งเซิร์ฟเวอร์ คุณไม่จำเป็นต้องกังวลเกี่ยวกับ die () ฯลฯ และตัวแปร "สถานะ" จะถูกส่งโดยอัตโนมัติ ตัวอย่างเช่น

function ajaxConversion(){
    // ...
    wp_send_json_success(array(
      'amount' => $amount
    ));
}

จะส่งผลดังนี้:

{
 "success":true,
 "data":{"amount":125}
}

ดังนั้นคุณสามารถแยกค่าในการโทร ajax ของคุณได้อย่างง่ายดาย:

jQuery.ajax({
    type       : 'post',
    data       : {
                  action: 'ajaxConversion', 
                  //nonce : ajax.nonce                              
                 },
    dataType   : 'json',
    url        : ajax.ajaxurl,
    success    : function(data){
         if(data.success) {
            alert(data.amount);                         
         } else {
            alert(data.data.message);
         }

    }
}); 

อีกสิ่งที่ฉันพบบ่อยคือความผิดพลาดในชื่อการกระทำ ควรเป็นwp_ajax_nopriv_ {action}หรือ wp_ajax_ {action}เมื่อลงชื่อเข้าใช้ตัวอย่างเช่น wp-ajax_nopriv เป็นสิ่งที่ฉันเคยทำมาหลายครั้งแล้ว


0

สำหรับฉันมันเป็นความจริงที่ว่าฉันใช้returnแทนechoฟังก์ชั่น PHP ของฉัน เปลี่ยนเป็นechoแก้ไข

function doAjax() {
    $result = getPosts();
    echo json_encode($result, true);
    die();
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.