web-dev-qa-db-fra.com

Comment envoyer une demande ajax et obtenir une réponse d'une fonction?

J'ai construit une fonction dans un plugin. Je voudrais l'appeler avec une fonction ajax jQuery.

La fonction est définie comme suit:

add_action( 'wp_ajax_my_test_ajax', 'my_test_ajax' );
add_action( 'wp_ajax_nopriv_my_test_ajax', 'my_test_ajax' );

function  my_test_ajax() {    

    $resp = array('title' => 'here is the title', 'content' => ' here is the content') ;        
    wp_send_json($resp) ;

}

J'essaie ensuite d'appeler la fonction avec du javascript:

var target = 'http://'  +  window.location.hostname  + '/wp-admin/admin-ajax.php' ;
var data = {
    action: ' my_test_ajax'
} ;
var req = jQuery.post( target , data,  function(resp) { 
    console.log(resp.responseText);
}) ;    
}

Le site répond de admin-ajax.php. La réponse porte un en-tête '200 OK'. Le corps de la réponse est '0'.

Le codex me dit que je peux m'attendre à cette réponse si la valeur de 'action' dans le corps du message ne correspond pas au nom d'une fonction liée aux hooks wordpress ajax. Mais autant que je sache, je suis bien là-bas.

Je suis certain que la fonction est incluse dans mon fichier de plugin.

Quels sont les autres éléments essentiels dont j'ai besoin pour que cela fonctionne?

(Je ne veux pas m'inquiéter des nonces ou de la localisation de js à ce stade. Je veux juste obtenir une réponse de la fonction avant de continuer à construire)

2
dave dave

$.ajax est très simple et vous pouvez facilement ajouter plus de paramètres dans la ligne data: {action:'my_test_ajax'}. Essayez ceci:

var target = 'http://'  +  window.location.hostname  + '/wp-admin/admin-ajax.php';
$.ajax({
    url: ajax,
    data: {action:'my_test_ajax'},
    type: 'post',
    success: function(data){
        console.log(data, data.title, data.content)
    }
});

Assurez-vous que la target pointe exactement sur admin-ajax.php ou définissez une variable globale (ou utilisez un script localize) pour ajouter une variable dans laquelle vous stockez le chemin d'accès à admin-ajax.php qui est admin_url('admin-ajax.php') en cas de confusion.

$.ajax analyse les données JSON par défaut. Si vous utilisez d'autres méthodes qui renvoient la réponse telles quelles (chaîne), utilisez simplement la méthode JSON.parse(response). JSON, c'est parce que vous utilisez wp_send_json($resp) qui renvoie une réponse à un objet JSON dans le noeud final.

Voici un exemple d’ajout de données supplémentaires à la demande:

En utilisant la méthode append avec la variable de données ou en la gardant courte et simple comme data: {action:'my_test_ajax', name: 'dave', network: 'wpse'} et à partir de la fonction my_test_ajax, vous pouvez obtenir ces données par $_REQUEST[tag] et par exemple $_REQUEST['name'].

$.get ($_GET) méthode:

Celui-ci est encore plus simple et prend moins de code:

$.get( target = '/wp-admin/admin-ajax.php?action=my_test_ajax', function( data ) {
    console.log( data )
});

N'oubliez pas d'utiliser $_REQUEST dans votre script PHP car il fusionne tous les ensembles de données $_GET, $_POST et $_COOKIE. À moins que vous ne soyez sûr de la méthode avec laquelle vous travaillez.

J'espère que cela pourra aider.

2
Samuel Elh

1) vous avez un espace supplémentaire dans le code, et c’est pourquoi il ne fonctionne pas:

action: ' my_test_ajax'
         ^

2) aussi, vous devez inclure check_admin_referrer() !!!!!!!!!

function  my_test_ajax() {  
   check_admin_referrer();
    .........
    .........
}
2
T.Todua