Wywołanie Ajax zawsze zwraca 0


18

Mam problem z tym, że AJAX zawsze zwraca 0!

Zrobiłem wszystko według książki i nie mogę zrozumieć, co jest nie tak? Proszę pomóż!!

Oto moja rozmowa z Ajaxem:

//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;

A funkcja w functions.php to:

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');

Czy próbowałeś debugować swój kod? Użyj również, admin_url( 'admin-ajax.php' )aby uzyskać adres URL AJAX, a nie jakiś skompilowany adres URL.
fuxia

Odpowiedzi:


15

Czy możesz umieścić akcję (ajaxConversion) w swoich danych i sprawdzić?

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

});

To ciągle dodaje 0 do moich treści.
Ben Racicot

1
@BenRacicot: Czy możesz sprawdzić, czy masz w kodzie PHP jakieś instrukcje, które generują wyniki takie jak echo, die () itp.?
Jayawi Perera

2
Hej Jay, Okazuje się, że dodaje die (); na mój ajax func to naprawił!
Ben Racicot

20

użycie wp_die();na końcu funkcji AJAX naprawiło problem.

na przykład

add_action( 'wp_ajax_my_ajax_function', 'my_ajax_function' );

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

dzięki ... nie wiem dlaczego, ale użycie po prostu die () nie działało.
Sagive SEO,

10

Dla mnie sztuczką było dodanie wp_ajax_noprivakcji. Testowałem skrypt w jednej przeglądarce, kiedy byłem zalogowany w WP admin, a następnie wypróbowałem ten sam skrypt w Chrome i zdałem sobie sprawę, że skrypt nie działa. Po założeniu wp_ajax_noprivwszystko zaczęło działać. :)

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

To, mój przyjacielu, zaoszczędziło mi 2 godziny frustracji. Kolejna lekcja do nauczenia się podczas wdrażania aplikacji w innym środowisku T_T
Tree Nguyen

Jest to bardzo prawdziwe ... jeśli jesteś zalogowany do administratora, funkcja _nopriv nie jest wywoływana
Michal Holub,

2

Poleciłbym użycie wp_send_json_success () i wp_send_json_error () po stronie serwera. Nie musisz się martwić o die () itp., A zmienna „status” jest wysyłana automatycznie, dzięki temu jest znacznie czystsza. Na przykład

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

Spowoduje to coś takiego:

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

Więc możesz łatwo wyodrębnić wartości w wywołaniu 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);
         }

    }
}); 

Inną częstą rzeczą, na którą się natknąłem, są literówki w nazwie akcji. Powinny to być wp_ajax_nopriv_ {akcja} lub wp_ajax_ {akcja} po zalogowaniu. Na przykład wp-ajax_nopriv, zrobiłem kilka razy w przeszłości.


0

Dla mnie był to fakt, że używałem returnzamiast echow mojej funkcji PHP. Zmieniając to, aby echoto naprawić.

function doAjax() {
    $result = getPosts();
    echo json_encode($result, true);
    die();
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.