Forma correcta de usar funciones de WordPress con archivo PHP AJAX

26 feb 2017, 05:45:11
Vistas: 14.3K
Votos: 1

Tengo la siguiente función jQuery en mi archivo 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('¡Gracias por tu voto!');
            });

            request.fail(function(jqXHR, textStatus) {
              alert( "Error en la solicitud: " + textStatus );
            });
        });

    }); 

Usando AJAX, quiero actualizar el conteo de votos en mi base de datos personalizada de productos con comandos SQL. Para ello, necesito acceder a funciones de WordPress en vote-database-update.php como $wpdb. Hasta ahora, la única forma en que logré que funcione fue agregando:

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

en mi archivo PHP. Sin embargo, creo que esto no es muy limpio y después de leer la documentación, creo que hay otra forma usando admin-ajax.php. En la mayoría de la documentación, se describe cómo agregar AJAX en un plugin con admin-ajax.php. Estoy un poco confundido ya que mi archivo vote-database-update.php no es exactamente un plugin (o quizás no tengo la definición correcta de un plugin de WordPress). ¿Cuál sería la forma correcta de incluir las funciones de WordPress en mi archivo vote-database-update.php?

1
Comentarios

en general, intentar acceder directamente a cualquier archivo php en tu tema (o plugin) va a fallar por varias razones. Tus suposiciones principales que podrían fallar son que 1. puedes ejecutar scripts en ese directorio 2. la ubicación del directorio wp-content. Puede haber otros obstáculos que se me escapen en este momento

Mark Kaplun Mark Kaplun
5 mar 2017 18:20:42
Todas las respuestas a la pregunta 1
1

Sí, usar admin-ajax.php es el camino a seguir aquí. Para usarlo, harías algo como lo siguiente:

en vote_database_update.php

// conectar a admin-ajax
// el texto después de 'wp_ajax_' y 'wp_ajax_no_priv_' en las llamadas add_action()
// que siguen es lo que usarás como el valor de data.action en la llamada
// ajax en tu JS

// si la llamada ajax se hará desde JS ejecutado cuando el usuario está logueado en WP,
// entonces usa esta versión
add_action ('wp_ajax_call_your_function', 'your_function') ;
// si la llamada ajax se hará desde JS ejecutado cuando no hay usuario logueado en WP,
// entonces usa esta versión
add_action ('wp_ajax_nopriv_call_your_function', 'your_function') ;

function
your_function ()
{
    if (!isset ($_REQUEST['id'])) {
        // establece el valor de retorno que quieres en caso de error
        // el valor de retorno puede ser CUALQUIER tipo de dato (ej. array())
        $return_value = 'tu mensaje de error' ;

        wp_send_json_error ($return_value) ;
        }

    $id = intval ($_REQUEST['id']) ;
    // haz el procesamiento que necesites basado en $id

    // establece el valor de retorno que quieres en caso de éxito  
    // el valor de retorno puede ser CUALQUIER tipo de dato (ej. array())
    $return_value = 'tu mensaje/datos de éxito' ;

    wp_send_json_success ($return_value) ;
}

en 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: {
                // el valor de data.action es la parte DESPUÉS de 'wp_ajax_' 
                // en el add_action ('wp_ajax_xxx', 'yyy') en el PHP de arriba
                action: 'call_your_function',
                // CUALQUIER otra propiedad de data se pasa a your_function()  
                // en el global $_REQUEST de PHP (o $_POST en este caso)
                id : productID
                },
            success: function (resp) {
                if (resp.success) {
                    // si quisieras usar el valor de retorno que estableciste
                    // en your_function(), lo harías mediante
                    // resp.data, pero en este caso supongo que no
                    // lo necesitas
                    $('#product-' + productID + ' .item-product-footer-vote-container').html ('¡Gracias por tu voto!') ;
                    }
                else {
                    // este caso de "error" significa que la llamada ajax en sí tuvo éxito, pero la función
                    // llamada retornó una condición de error  
                    alert ('Error: ' + resp.data) ;
                    }
                },
            error: function (xhr, ajaxOptions, thrownError) {
                // este caso de error significa que la llamada ajax en sí falló, ej. un error de sintaxis
                // en your_function()
                alert ('La solicitud falló: ' + thrownError.message) ;
                },
            }) ;
        }) ;
    })(jQuery) ;

Espero que esto ayude.

5 mar 2017 17:24:48
Comentarios

Hola Paul, estoy intentando lo que sugeriste en tu respuesta pero me da un error "500", ¿puedes sugerirme qué debo hacer?

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