Modul corect de utilizare a funcțiilor WordPress cu un fișier PHP AJAX

26 feb. 2017, 05:45:11
Vizualizări: 14.3K
Voturi: 1

Am următoarea funcție jQuery în fișierul meu 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('Mulțumim pentru votul tău!');
            });

            request.fail(function(jqXHR, textStatus) {
              alert( "Cererea a eșuat: " + textStatus );
            });
        });

    }); 

Folosind AJAX, vreau să actualizez numărul de voturi din baza mea de date personalizată de produse folosind comenzi SQL. Pentru asta, am nevoie să accesez funcțiile WordPress în vote-database-update.php, cum ar fi $wpdb. Singura metodă care a funcționat până acum a fost adăugarea:

require_once( explode( "wp-content" , __FILE__ )[0] . "wp-load.php" );

în fișierul meu PHP. Totuși, cred că aceasta nu este cea mai bună soluție și după ce am citit documentația, cred că există o altă metodă folosind admin-ajax.php. În majoritatea documentațiilor, este descris cum să adaugi AJAX într-un plugin cu admin-ajax.php. Sunt puțin confuz deoarece fișierul meu vote-database-update.php nu este exact un plugin (sau poate nu am definiția corectă a unui plugin WordPress). Care ar fi metoda corectă de a include funcțiile WordPress în fișierul meu vote-database-update.php?

1
Comentarii

în general, încercarea de a accesa direct orice fișier php din tema ta (sau din plugin) va eșua din diverse motive. Presupunerea ta de bază care ar putea să nu funcționeze este că 1. poți rula scripturi în acel director 2. locația directorului wp-content. Pot exista și alte capcane care îmi scapă acum din minte

Mark Kaplun Mark Kaplun
5 mar. 2017 18:20:42
Toate răspunsurile la întrebare 1
1

Da, folosirea admin-ajax.php este soluția potrivită aici. Pentru a o utiliza, ai putea face ceva de genul următor:

în vote_database_update.php

// conectare la admin-ajax
// textul de după 'wp_ajax_' și 'wp_ajax_no_priv_' în apelurile add_action()
// care urmează este ceea ce vei folosi ca valoare a data.action în apelul
// ajax din JS

// dacă apelul ajax va fi făcut din JS executat când utilizatorul este autentificat în WP,
// atunci folosește această versiune
add_action ('wp_ajax_call_your_function', 'your_function') ;
// dacă apelul ajax va fi făcut din JS executat când niciun utilizator nu este autentificat în WP,
// atunci folosește această versiune
add_action ('wp_ajax_nopriv_call_your_function', 'your_function') ;

function
your_function ()
{
    if (!isset ($_REQUEST['id'])) {
        // setează valoarea de return pe care o dorești în caz de eroare
        // valoarea returnată poate fi de ORICE tip de date (de ex., array())
        $return_value = 'mesajul tău de eroare' ;

        wp_send_json_error ($return_value) ;
        }

    $id = intval ($_REQUEST['id']) ;
    // efectuează procesarea dorită pe baza $id

    // setează valoarea de return pe care o dorești în caz de succes
    // valoarea returnată poate fi de ORICE tip de date (de ex., array())
    $return_value = 'mesajul/datel tale de succes' ;

    wp_send_json_success ($return_value) ;
}

în 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: {
                // valoarea lui data.action este partea de DUPĂ 'wp_ajax_' în
                // add_action ('wp_ajax_xxx', 'yyy') din PHP-ul de mai sus
                action: 'call_your_function',
                // ORICE alte proprietăți ale lui data sunt transmise către your_function()
                // în variabila globală $_REQUEST (sau $_POST în acest caz) din PHP
                id : productID
                },
            success: function (resp) {
                if (resp.success) {
                    // dacă dorești să folosești valoarea returnată pe care ai setat-o
                    // în your_function(), o poți face prin
                    // resp.data, dar în acest caz presupun că nu
                    // ai nevoie de ea
                    $('#product-' + productID + ' .item-product-footer-vote-container').html ('Mulțumim pentru votul tău!') ;
                    }
                else {
                    // acest caz "error" înseamnă că apelul ajax în sine a reușit, dar funcția
                    // apelată a returnat o condiție de eroare
                    alert ('Eroare: ' + resp.data) ;
                    }
                },
            error: function (xhr, ajaxOptions, thrownError) {
                // acest caz de eroare înseamnă că apelul ajax în sine a eșuat, de ex., o eroare de sintaxă
                // în your_function()
                alert ('Cererea a eșuat: ' + thrownError.message) ;
                },
            }) ;
        }) ;
    })(jQuery) ;

Sper că acest lucru te ajută.

5 mar. 2017 17:24:48
Comentarii

Bună Paul, încerc să aplic sugestiile din răspunsul tău, dar primesc o eroare "500". Poți să-mi sugerezi ce ar trebui să fac?

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