Come chiamare una funzione PHP con Ajax quando l'utente clicca un pulsante
Sto sviluppando un sito WordPress utilizzando template/temi personalizzati, ma sto avendo delle difficoltà. Voglio usare Ajax per chiamare una funzione quando un utente clicca un pulsante. In una pagina, ho un pulsante così fatto:
<p class='form-submit'>
<input name='message_read' type='submit' class='submit button mark-as-read' value= 'Segna come letto' />
</p>
E ho una funzione jQuery/Ajax come questa:
jQuery(document).ready(function() {
jQuery(".mark-as-read").click(function () {
console.log('La funzione è collegata');
jQuery.ajax({
type: "POST",
url: "/wp-admin/admin-ajax.php",
data: {
action: 'mark_message_as_read',
},
success: function (output) {
console.log(output);
}
});
});
});
La funzione sopra si trova in wp-content/themes/my-theme/js/wp_ajax_calls.js
. Ho aggiunto lo script al sito in questo modo:
1) Ho aggiunto questo al mio file functions.php:
wp_enqueue_script( 'ajax calls', get_template_directory_uri() .'/js/wp_ajax_calls.js', array('jquery'), '1.0', true);
2) Ho incluso lo script nell'header.
<script type="text/javascript" src="https://mysite//wp-content/themes/twentyfifteen/js/wp_ajax_calls.js"></script>
Quando clicco il pulsante, il console.log appare. Per quanto ne capisco, voglio che la mia funzione ajax chiami una funzione php che mi permetterà di usare $wpdb. Ho questo in functions.php:
function mark_message_as_read() {
global $wpdb;
// esegui operazioni
}
Qui è dove mi sto confondendo. Ho due domande principali:
1) Penso di dover avere alcuni add_action() da qualche parte, ma non so dove metterli e non so quale hook dovrei usare.
2) Inoltre, voglio poter passare dati (l'id del messaggio) alla funzione php per la mia query al database. Come posso passare un argomento a quella funzione?
Non voglio usare qualcosa come if( isset($_POST['message_whatever']) ) twentyfifteen_message_whatever();
per via del modo in cui ho impostato i messaggi.
Sono disponibile a fornire maggiori informazioni se necessario. Grazie in anticipo per il vostro aiuto!!
Crea un child theme per evitare di modificare il codice di un tema esistente, poiché al prossimo aggiornamento del tema potresti perdere tutte le modifiche apportate (vedi Child Themes)
Ecco come passare valori alla tua richiesta ajax:
jQuery(document).ready(function() { jQuery(".mark-as-read").click(function () { console.log('La funzione è collegata'); jQuery.ajax({ type: "POST", url: "/wp-admin/admin-ajax.php", data: { action: 'mark_message_as_read', // aggiungi i tuoi parametri qui message_id: $('.your-selector').val() }, success: function (output) { console.log(output); } }); }); });
Potresti anche fare qualche ricerca sui Nonces, per aggiungere un livello di sicurezza alla tua applicazione: https://codex.wordpress.org/WordPress_Nonces
Infine, il codice PHP per gestire la richiesta (anche qui dovresti gestire il nonce in un codice reale):
// registra l'azione ajax per utenti autenticati add_action('wp_ajax_mark_message_as_read', 'mark_message_as_read'); // registra l'azione ajax per utenti non autenticati add_action('wp_ajax_nopriv_mark_message_as_read', 'mark_message_as_read'); // gestisci la richiesta ajax function mark_message_as_read() { $message_id = $_REQUEST['message_id']; // aggiungi la tua logica qui... // alla fine, restituisci dati json di successo wp_send_json_success([/* alcuni dati qui */]); // oppure, in caso di errore, restituisci dati json di errore wp_send_json_error([/* alcuni dati qui */]); }
