Llamar a URL Ajax en un Plugin de WordPress

18 jun 2015, 14:53:48
Vistas: 18.1K
Votos: 0

Archivo de Clase del Plugin:

function __construct()
    {
        add_shortcode('user_registration_form', array($this, 'shortcode'));
    }

public function hook(){
        add_action( 'wp_ajax_get_product_serial_callback', 'get_product_serial_callback' );
        add_action( 'wp_ajax_nopriv_get_product_serial_callback', 'get_product_serial_callback' );
    }

public function product_serial_ajax() { ?>
        <script type="text/javascript">
                jQuery(document).ready(function(){
                    alert('¡Hola Mundo!');

                    jQuery.ajax({
                                type: 'GET', 
                                url: "<?php echo admin_url('admin-ajax.php'); ?>",
                                //url: ajaxurl,
                                dataType : "JSON",
                                data : {action: "get_product_serial_callback"},
                                //cache: false, 
                                success: function(data){
                                alert('¡Eureka!')';
                                }
                            });
                });
        </script><?php
    }

function csv_to_array($filename='', $delimiter=',')
    {
            //if(!file_exists($filename) || !is_readable($filename))
            //return FALSE;

            $header = NULL;
            $data = array();
            if (($handle = fopen($filename, 'r')) !== FALSE)
            {
                    while (($row = fgetcsv($handle, 1024, $delimiter)) !== FALSE)
                    {
                            if(!$header)
                                    $header = $row;
                            else
                                    $data[] = array_combine($header, $row);
                    }
                    fclose($handle);
            }
            return $data;
    }

function get_product_serial_callback(){

        $upload_dir = wp_upload_dir();
        $csvFile = $upload_dir['baseurl'].'/Eragon-Serial.csv';
        $csv = $this->csv_to_array($csvFile); //leer csv

        foreach ($csv as $serialnum){
                $serial_num_array[]  = $serialnum['product_serial'];
        }

        $json_array = json_encode($serial_num_array);
        echo $json_array;
        die();
    }

function shortcode()
{
    $this->product_serial_ajax();//obtener número de serie del producto
}

Sin embargo, cuando me encontré con que ajaxurl no está definido, lo cambié por ajaxurl que forma la siguiente URL:

http://example.com/wp-admin/admin-ajax.php?action=get_product_serial_callback

Esto tampoco ayudó.

¿Cómo puedo llamar a la función get_product_serial_callback para obtener los valores JSON y establecer esos valores en function(data)?

3
Comentarios

¿Se llama al método hook? Además, la devolución de llamada debería ser array($this, 'get_product_serial_callback') como se menciona en la respuesta.

giraff giraff
18 jun 2015 15:34:00

¿Cómo verifico si se está llamando? y cambié la devolución de llamada como mencionaste. Aún así, dice ajaxurl is not defined (ajaxurl no está definido)

Slimshadddyyy Slimshadddyyy
18 jun 2015 15:42:59

¿Has llamado a la función hook en init? Si no es así, por favor llama a esa función en la acción init

Mitul Mitul
18 jun 2015 16:43:53
Todas las respuestas a la pregunta 2
6

Coloca el siguiente código en la función _construct() y cambia el nombre de la acción a get_product_serial_callback :-

add_action( 'wp_ajax_get_product_serial_callback', array($this,'get_product_serial_callback') );
add_action( 'wp_ajax_nopriv_get_product_serial_callback', array($this,'get_product_serial_callback' ));
18 jun 2015 15:09:23
Comentarios

Pregunta actualizada. Todavía ni siquiera llama a la función y devuelve 0 como respuesta

Slimshadddyyy Slimshadddyyy
18 jun 2015 15:20:00

Añade public a la función get_product_serial_callback().

Domain Domain
18 jun 2015 15:59:00

Ejemplo: public function get_product_serial_callback()

Domain Domain
18 jun 2015 15:59:14

WisdmLabs: ¿Cómo obtengo una respuesta de datos json en la función product_serial_ajax? La ajaxurl que veo en la respuesta es http://example.com/wp-admin/admin-ajax.php?action=get_product_serial

Slimshadddyyy Slimshadddyyy
19 jun 2015 08:32:00

Solo necesitas ejecutar add_action con el nombre de acción como 'wp_ajax_get_product_serial' y llamar a tu función definida como se mencionó anteriormente.

Domain Domain
19 jun 2015 13:03:51

¿Qué pasa si esa acción está definida en algún archivo ajax prod-serial.php y no en el archivo del plugin en sí?

Slimshadddyyy Slimshadddyyy
19 jun 2015 13:22:56
Mostrar los 1 comentarios restantes
0

Archivo de Clase del Plugin:

function __construct()
    {
        add_shortcode('formulario_registro_usuario', array($this, 'shortcode'));
        wp_register_script('producto-serial', plugins_url('bootstrap/js/product-serial.js', __FILE__),array('jquery')); //jquery personalizado para número de serie del producto
        wp_enqueue_script( 'producto-serial' ); //jquery personalizado para número de serie del producto

        $this->hook();
    }

    public function hook()
    {
      add_action('wp_ajax_obtener_numero_serie_producto', array( $this,'obtener_numero_serie_producto'));
      add_action('wp_ajax_nopriv_obtener_numero_serie_producto',array( $this,'obtener_numero_serie_producto') );
    }

    public function ajax_numero_serie_producto(){ ?>

        <script type="text/javascript">cargar_producto();</script>

        <?php
    }

   //convertir datos csv en array
    function csv_a_array($filename='', $delimitador=',')
    {
            if(!file_exists($filename) || !is_readable($filename))
            return FALSE;

            $encabezado = NULL;
            $datos = array();
            if (($handle = fopen($filename, 'r')) !== FALSE)
            {
                    while (($fila = fgetcsv($handle, 1024, $delimitador)) !== FALSE)
                    {
                            if(!$encabezado)
                                    $encabezado = $fila;
                            else
                                    $datos[] = array_combine($encabezado, $fila);
                    }
                    fclose($handle);
            }
            return $datos;
    }

    //obtener número de serie del producto
    function obtener_numero_serie_producto(){

        $directorio_subida = wp_upload_dir();
        $archivoCsv = $directorio_subida['baseurl'].'/Eragon-Serial.csv';
        $csv = $this->csv_a_array($archivoCsv); //leer csv

        foreach ($csv as $numeroSerie){
                $array_numeros_serie[]  = $numeroSerie['product_serial'];
        }

        $array_json = json_encode($array_numeros_serie);
        echo $array_json;
        die();
    }

    function shortcode()
    {
      $this->ajax_numero_serie_producto(); //obtener número de serie del producto
    }

Archivo JS Separado

    function cargar_producto(){
         jQuery.ajax({
          type: "GET", 
          url: ajaxurl,
          dataType : "JSON",
          data : {action: "obtener_numero_serie_producto"},
          success: function(data){
            alert('¡Eureka!');
          }
        });
    }

P.D: Colocar lo siguiente en el header.php de mi tema funcionó para mí

<script type="text/javascript">
    var ajaxurl = "<?php echo admin_url('admin-ajax.php'); ?>";
</script>
18 jun 2015 16:24:25