Modo corretto per utilizzare le funzioni di WordPress con un file PHP AJAX
Ho la seguente funzione jQuery nel mio file custom-js.js
:
$(function() {
$(".product-vote-button-up").click(function(){
var productID = $(this).attr('productID');
var request = $.ajax({
url: "/wordpress/wp-content/themes/my-theme/js/ajax/vote-database-update.php",
type: "POST",
data: {id : productID},
});
request.done(function() {
$("#product-" + productID + " .item-product-footer-vote-container").html('Grazie per il tuo voto!');
});
request.fail(function(jqXHR, textStatus) {
alert( "Richiesta fallita: " + textStatus );
});
});
});
Utilizzando AJAX, voglio aggiornare il conteggio dei voti nel mio database personalizzato di prodotti con comandi SQL. Per farlo, ho bisogno di accedere alle funzioni di WordPress nel file vote-database-update.php
, come $wpdb
. L'unico modo in cui sono riuscito a farlo funzionare finora è stato aggiungere:
require_once( explode( "wp-content" , __FILE__ )[0] . "wp-load.php" );
nel mio file PHP. Tuttavia, penso che questa non sia una soluzione molto pulita e dopo aver letto la documentazione, credo ci sia un altro modo usando admin-ajax.php
. Nella maggior parte della documentazione, viene descritto come aggiungere AJAX in un plugin con admin-ajax.php
. Sono un po' confuso dato che il mio vote-database-update.php
non è propriamente un plugin (o forse non ho la definizione corretta di plugin WordPress). Qual è il modo giusto per includere le funzioni di WordPress nel mio file vote-database-update.php?

Sì, usare admin-ajax.php
è la soluzione giusta in questo caso. Per utilizzarlo, dovresti fare qualcosa come segue:
in vote_database_update.php
// agganciarsi ad admin-ajax
// il testo dopo 'wp_ajax_' e 'wp_ajax_no_priv_' nelle chiamate add_action()
// che seguono è ciò che userai come valore di data.action nella chiamata ajax
// nel tuo JS
// se la chiamata ajax verrà fatta da JS eseguito quando l'utente è loggato in WP,
// allora usa questa versione
add_action ('wp_ajax_call_your_function', 'your_function') ;
// se la chiamata ajax verrà fatta da JS eseguito quando nessun utente è loggato in WP,
// allora usa questa versione
add_action ('wp_ajax_nopriv_call_your_function', 'your_function') ;
function
your_function ()
{
if (!isset ($_REQUEST['id'])) {
// imposta il valore di ritorno desiderato in caso di errore
// il valore di ritorno può essere di QUALSIASI tipo di dato (es. array())
$return_value = 'il tuo messaggio di errore' ;
wp_send_json_error ($return_value) ;
}
$id = intval ($_REQUEST['id']) ;
// esegui l'elaborazione desiderata basata su $id
// imposta il valore di ritorno desiderato in caso di successo
// il valore di ritorno può essere di QUALSIASI tipo di dato (es. array())
$return_value = 'il tuo messaggio/dati di successo' ;
wp_send_json_success ($return_value) ;
}
in custom-js.js
(function ($) {
$('.product-vote-button-up').click (function () {
var productID = $(this).attr ('productID') ;
$.ajax ({
url: '/wp-admin/admin-ajax.php',
type: 'POST',
dataType: 'JSON',
data: {
// il valore di data.action è la parte DOPO 'wp_ajax_' in
// add_action ('wp_ajax_xxx', 'yyy') nel PHP sopra
action: 'call_your_function',
// QUALSIASI altra proprietà di data viene passata a your_function()
// nella variabile globale PHP $_REQUEST (o $_POST in questo caso)
id : productID
},
success: function (resp) {
if (resp.success) {
// se vuoi usare il valore di ritorno impostato
// in your_function(), puoi farlo tramite
// resp.data, ma in questo caso immagino non ti
// serva
$('#product-' + productID + ' .item-product-footer-vote-container').html ('Grazie per il tuo voto!') ;
}
else {
// questo caso "error" significa che la chiamata ajax è riuscita, ma la funzione
// chiamata ha restituito una condizione di errore
alert ('Errore: ' + resp.data) ;
}
},
error: function (xhr, ajaxOptions, thrownError) {
// questo caso error significa che la chiamata ajax stessa è fallita, es. un errore di sintassi
// in your_function()
alert ('Richiesta fallita: ' + thrownError.message) ;
},
}) ;
}) ;
})(jQuery) ;
Spero che questo ti sia d'aiuto.
