web-dev-qa-db-fra.com

Admin-ajax.php ajout d'un code de statut à la réponse ajax

J'écris un plugin qui utilise Ajax (jQuery avec formulaire) via une soumission de formulaire et la fonction php renvoie une réponse JSON.

add_action( 'wp_ajax_bubbly-upload', 'bubbly_upload_submit' );

function bubbly_upload_submit() {
    // generate the response
    $response = json_encode( array( 'success' => true ) );

    // response output
    header( "Content-Type: application/json" );
    echo $response;
}

Dans Firefox, aucun des gestionnaires de réponse jQuery ne se déclenchait et la boîte de dialogue de sauvegarde du fichier s'ouvrait avec la réponse JSON. Je n'aurais pas le problème si je retournais HTML. Cependant, dans les deux cas, un "0" a été ajouté à la fin de ma réponse. Après quelques recherches, il semble que jQuery ne déclenchera pas de gestionnaire si la réponse JSON est invalide. Ce '0' ajouté à la fin rend le JSON invalide.

Si je regarde dans le code admin-ajax.php, je vois ceci:

default :
    do_action( 'wp_ajax_' . $_POST['action'] );
    die('0');
    break;
endswitch;

Les documents php pour die indiquent que si le paramètre transmis est une chaîne, il sera imprimé juste avant de quitter. S'il s'agit d'un entier, il ne pas être imprimé.

Sans pirater le coeur, est-il possible d'éviter ce problème tout en utilisant JSON? Aussi, est-ce un bug, parce que je ne vois pas comment ajouter un zéro à la fin de chaque réponse AJAX ...

2
jjeaton

Mettez la die(); dans votre fonction:

add_action( 'wp_ajax_bubbly-upload', 'bubbly_upload_submit' );

function bubbly_upload_submit() {
    // generate the response
    $response = json_encode( array( 'success' => true ) );

    // response output
    header( "Content-Type: application/json" );
    echo $response;
    die();
}

Référence: WordPress Codex, AJAX in Plugins

4
sorich87