Modo corretto per utilizzare le funzioni di WordPress con un file PHP AJAX

26 feb 2017, 05:45:11
Visualizzazioni: 14.3K
Voti: 1

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?

1
Commenti

in generale, tentare di accedere direttamente a qualsiasi file php nel tuo tema (o plugin) fallirà per varie ragioni. Le tue ipotesi di base che potrebbero fallire sono che 1. puoi eseguire script in quella directory 2. la posizione della directory wp-content. Potrebbero esserci altri problemi che al momento mi sfuggono

Mark Kaplun Mark Kaplun
5 mar 2017 18:20:42
Tutte le risposte alla domanda 1
1

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.

5 mar 2017 17:24:48
Commenti

Ciao Paul, sto provando quello che hai suggerito nella tua risposta ma mi dà un errore "500", puoi suggerirmi cosa dovrei fare?

sumit chauhan sumit chauhan
15 feb 2018 13:08:07