it-swarm.com.de

Admin-ajax.php fügt einen Statuscode an die Ajax-Antwort an

Ich schreibe ein Plugin, das Ajax (jQuery mit Formular-Plugin) über eine Formularübermittlung verwendet und die PHP-Funktion gibt eine JSON-Antwort zurück.

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

In Firefox wurde keiner der jQuery-Antworthandler ausgelöst, und das Dialogfeld "Datei speichern" wurde mit der JSON-Antwort geöffnet. Ich hätte das Problem nicht, wenn ich HTML zurückgegeben hätte. In beiden Fällen wurde jedoch eine 0 an das Ende meiner Antwort angehängt. Nach einigem Graben scheint jQuery keinen Handler auszulösen, wenn die JSON-Antwort ungültig ist. Diese '0', die am Ende hinzugefügt wird, führt dazu, dass der JSON ungültig wird.

Wenn ich in den Code admin-ajax.php schaue, sehe ich Folgendes:

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

Die PHP-Dokumente für die besagen, dass wenn der übergebene Parameter ein String ist, er direkt vor dem Beenden gedruckt wird, wenn er eine Ganzzahl ist, wird er gedruckt nicht gedruckt werden.

Kann ich dieses Problem umgehen und trotzdem JSON verwenden, ohne den Core zu hacken? Ist dies auch ein Fehler, da ich nicht sehe, wie das Hinzufügen einer Null am Ende jeder Antwort von AJAX gewünscht wäre ...

2
jjeaton

Fügen Sie die die(); in Ihre Funktion ein:

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

Referenz: WordPress Codex, AJAX in Plugins

4
sorich87