Admin Ajax restituisce 0
Sono relativamente nuovo con jQuery e in particolare con AJAX. Ho un piccolo problema con il valore restituito che è sempre 0, anche se penso che questo sia in realtà il messaggio di successo e non stia restituendo nulla.
Ho esplorato l'universo di Google e ho la funzione die() nella callback PHP e credo che gli add_actions siano corretti.
Sto lavorando in localhost, anche se dubito che questo influisca, e tutto questo è nell'admin, non nel frontend. Ho anche verificato che il js sia accodato e localizzato.
Ottengo un messaggio 200 OK nell'area developer di Chrome.
Ho anche testato l'AJAX base da http://codex.wordpress.org/AJAX_in_Plugins e anche questo ha restituito 0, il che mi fa pensare che sia qualcosa di diverso dal codice illustrato di seguito.
Al momento sto solo cercando di far inviare qualcosa indietro a jQuery. Qualsiasi aiuto sarebbe apprezzato.
Il jQuery
jQuery(document).ready(function(){
jQuery('.cl_link_buttons').val('id').click(function() {
var currentid = jQuery(this).attr('id');
//avviso(currentid);
console.log(currentid);
jQuery.ajax ( data = {
action: 'cleanlinks_ajax_get_post_data',
url: ajaxurl,
type: 'POST',
dataType: 'text',
"currentid" : currentid
});
jQuery.post(ajaxurl, data, function(response) {
var dataz = response;
alert( dataz );
console.log (dataz); //mostra json nella console
});
return false;
}); //fine evento click
}); //fine doc ready
Il PHP
add_action("wp_ajax_cleanlinks_ajax_get_post_data", "cleanlinks_ajax_get_post_data");
add_action("wp_ajax_nopriv_cleanlinks_ajax_get_post_data", "cleanlinks_ajax_get_post_data");
function cleanlinks_ajax_get_post_data() {
$from_ajax = $_POST['currentid'];
echo "fai" . $from_ajax . "qualcosa";
die();
}
Sì, questa è la risposta corretta. Aggiungere die() alla fine serve solo a terminare lo script. Quella risposta è tecnicamente corretta se vedi uno 0 aggiunto alla FINE dell'output, tuttavia se ottieni solo '0', significa che non è stato restituito nulla e hai un errore come descritto in questa risposta.

Quello che devi fare è aggiungere die();
alla fine della tua funzione.
Vedi il motivo e altro qui: http://codex.wordpress.org/AJAX_in_Plugins
Note:
- Dovresti usare
echo
per stampare qualcosa prima di eseguiredie
. Questo previene errori del server e aiuta durante il debug.

In realtà, se aggiungi semplicemente die()
senza stampare qualcosa, otterrai comunque un Errore 500 Internal Server e restituirà 0
per wp-admin/admin-ajax.php
. Dovresti sempre stampare qualcosa, anche se stai solo impostando valori e non è necessario restituire nulla. Altrimenti, se non stampi nulla e usi die()
, devi usare .always()
per catturarlo, perché non sarà in .done()
, ma in .fail()
poiché termina senza alcun output = Errore 500.

hai qualche link o codice funzionante, così possiamo dare un'occhiata? @SolomonClosson

Tutte le mie risposte sono state testate in ambienti live. È molto semplice testare questo, basta fare un die();
nella funzione ajax nel file functions.php
senza fare echo di niente prima, e chiamare l'action via ajax, ad esempio: var testing = $.ajax( ... ); testing.fail(function(response) { console.log('Failed ' + response); }); testing.done(function(response) { console.log('Success ' + response); }); testing.always(function(response) { console.log('Ajax Request complete: ' + response); });

Noterai che apparirà Failed, la risposta sarà un errore 500 Internal Server Error.

Poi aggiungi un echo alla funzione PHP appena prima del die();
, la risposta sarà quindi il risultato dell'echo.

Ho testato questo con dataType
impostato su HTML
, non sono sicuro se altri tipi di dati restituiscano qualcosa di diverso, o cosa succede quando non è impostato, poiché proverà a fare una supposizione ragionevole sul tipo di dati. IMO, è meglio restituire sempre qualcosa, anche se è una stringa che dice 'successo' o 'fallimento'.

Un'altra risposta è qui: http://wordpress.stackexchange.com/a/131397 @Jeremy

Ho avuto lo stesso problema. E l'ho risolto. Devi inviare la variabile "action" come nell'esempio:
var dataString = {lat: '55.56', lng: '25.35', action:'report_callback'};
$.ajax({
url: "http://domain.net/wp-admin/admin-ajax.php",
type: "POST",
//a volte puoi provare questo metodo per inviare la variabile action
//action : 'report_callback',
data:dataString,
success: function(data){
console.log(data);
},
error: function() {
console.log("Error");
}
});
Perché in wp-admin/admin-ajax.php c'è un gestore per la variabile action:
if ( empty( $_REQUEST['action'] ) ) {...}
Linea 26

Beh, sta mostrando un sacco di cose che non capisco del tutto. Quello che capisco: ReadyState 4, status 200, responseText "0".
E poi restituisce la risposta 0.
C'è qualcosa in particolare che dovrei cercare qui?
Se ci sono problemi con il codice, per favore indicameli e posso esaminarli, sto ancora imparando jQuery.

Difficile da dire. Potresti provare a eseguire console.info(ajaxurl); e vedere cosa restituisce?

/wp-admin/admin-ajax.php è la risposta
modifica --
/wp-admin/admin-ajax.php undefined

prova a sostituire ajaxurl con 'http://localhost/wp-admin/admin-ajax.php' e vedi cosa restituisce

jQuery(document).ready(function(){
jQuery('.cl_link_buttons').val('id').click(function() {
$.ajax({
type:'POST',
url: ajaxurl,
data: {
action : 'ajax_filter',
currentid : 'currentid'
},
success: function (result) {
console.log(result);
$result = $(result);
$result.fadeIn('7000');
$("#showresults").html(result);
},
error: function (xhr, status) {
alert("Spiacenti, si è verificato un problema!");
},
complete: function (xhr, status) {
$('#showresults').slideDown('slow')
}
});
});
});
//funzione PHP
<?php
add_action( 'wp_ajax_nopriv_ajax_filter', 'ajax_filter' );
add_action( 'wp_ajax_ajax_filter', 'ajax_filter' );
function ajax_filter(){
$date = isset($_POST['date']) ? $_POST['date'] : 0;
echo $date;
die();
}
?>

Solo per riferimento, per chi viene dallo sviluppo di shortcode, se stai ricevendo una risposta corretta tramite una richiesta Ajax di WordPress ma viene aggiunto uno 0, è solo perché stai usando 'echo' invece di 'return'. Gli shortcode non sono mai pensati per fare 'echo' o output diretto. Solo un altro scenario da tenere a mente.

Ho avuto lo stesso problema, per risolverlo ho usato wp_die()
alla fine della mia funzione subito dopo un echo
. Non dimenticare di passare la tua azione nello script.
Per essere sicuro, verifica se la tua funzione deve usare wp_ajax_nopriv
come wp_ajax
.

Solo per riferimento, per chiunque arrivi qui cercando su Google "la richiesta ajax restituisce 0":
Ricorda che quando aggiungi un'azione ajax al metodo di un oggetto, assicurati che il modificatore di accesso del metodo sia public
.
add_action( 'wp_ajax_my_action', [$object, 'my_method']);
add_action
semplicemente non restituisce alcun errore se non riesce a chiamare il tuo metodo al di fuori di $object
.

Se non utilizzi la funzione wp_localize_script() per impostare l'URL ajax, admin ajax restituisce 0. Penso sia un bug di WordPress. Ecco un esempio:
wp_enqueue_script( 'search_js', get_template_directory_uri() . '/js/search.js', array( 'jquery' ), null, true );
wp_localize_script( 'search_js', 'ajaxurl', admin_url( 'admin-ajax.php' ) );
Il file javascript (search.js):
$('#search_input').autocomplete({
source: function(request, response) {
$.ajax({
type: 'POST',
dataType: 'json',
url: ajaxurl,
data: 'action=my_custom_action_search&search_criteria=' + request.term,
success: function(data) {
response(data);
},
error: function(errorThrown){
console.log(errorThrown);
}
});
},
minLength: 3
});

Se stai utilizzando localhost e il tuo codice PHP lato server si trova in un file di plugin, accedi prima alla dashboard di amministrazione e aggiorna la pagina dei plugin. In secondo luogo, verifica se il plugin è attivato. Quindi vai sul frontend, aggiorna la pagina e prova a inviare nuovamente.

add_action('init', 'ly_form_ajax_init');
function ly_form_ajax_init() {
wp_register_script('ly-form-ajax-script', plugins_url().'/ly-form/js/ly-script.js' , array('jquery'));
wp_enqueue_script('ly-form-ajax-script');
wp_localize_script('ly-form-ajax-script', 'ly_form_ajax_object', array(
'ajaxurl' => admin_url('admin-ajax.php'),
'redirecturl' => home_url(),
'loadingmessage' => __('')
));
}
// L'azione è: contact_ajax
add_action( 'wp_ajax_contact_ajax', 'my_function' );
add_action( 'wp_ajax_nopriv_contact_ajax', 'my_function' );
function my_function(){
ob_clean();
echo "http://sanvatvungcao.com";
wp_die();
}
/**
* Shortcode nella pagina come questo: [ly-form]
* @param type $atts
* @param type $content
* @return string
*/
function ly_form_shortcode($atts, $content = "") {
echo html_form_code();
}
add_shortcode('ly-form', 'ly_form_shortcode');
//HTML Form verrà mostrato,
function html_form_code() {
$html = "";
$html.= '';
$html.= '';
$html.= ' <p>Cognome * </p>';
$html.= ' <p>Nome * </p>';
$html.= ' <p>Indirizzo * </p>';
$html.= ' <p>Email * </p>';
$html.= ' <p>Contenuto * </p>';
$html.= ' ';
$html.= '';
$html.= '';
$html.= '';
return $html;
}
E QUI il js (ly-script.js):
( function( $ ) {
$(document).ready(function () {
// Esegui l'invio del form via AJAX
$('form.ly-form-ex').on('submit', function(e){
e.preventDefault();
$('#loading').html('caricamento...');
var dataString = {action:'contact_ajax'};
$.ajax({
type: "POST",
url: ly_form_ajax_object.ajaxurl,
data: dataString,
success: function (data) {
$('#loading').html(data);
},
error: function (errorThrown) {
alert(errorThrown);
}
});
});
}); // fine ready
} )( jQuery );
Spero sia utile per te, I migliori saluti
