Chiamare URL Ajax in un Plugin

18 giu 2015, 14:53:48
Visualizzazioni: 18.1K
Voti: 0

File della Classe 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('Ciao Mondo!');

                    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); //leggi 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();//recupera il numero seriale del prodotto
}

Tuttavia, quando incontro ajaxurl non definito, l'ho cambiato con ajaxurl che forma l'URL sottostante

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

Questo non ha aiutato neanche.

Come posso chiamare la funzione get_product_serial_callback per ottenere i valori JSON e impostarli in function(data)?

3
Commenti

Il metodo hook viene chiamato? Inoltre, la callback dovrebbe essere array($this, 'get_product_serial_callback') come menzionato nella risposta.

giraff giraff
18 giu 2015 15:34:00

Come posso verificare se viene chiamato? Ho cambiato la callback come hai indicato. Tuttavia continua a dire ajaxurl is not defined

Slimshadddyyy Slimshadddyyy
18 giu 2015 15:42:59

Hai chiamato la funzione hook nell'init? In caso contrario, per favore chiama quella funzione nell'azione init

Mitul Mitul
18 giu 2015 16:43:53
Tutte le risposte alla domanda 2
6

Inserisci il codice qui sotto nella funzione _construct() e cambia il nome dell'azione in 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 giu 2015 15:09:23
Commenti

Domanda aggiornata. Non chiama nemmeno la funzione e restituisce 0 come risposta

Slimshadddyyy Slimshadddyyy
18 giu 2015 15:20:00

Aggiungi public alla funzione get_product_serial_callback().

Domain Domain
18 giu 2015 15:59:00

Esempio: public function get_product_serial_callback()

Domain Domain
18 giu 2015 15:59:14

WisdmLabs: Come posso ottenere una risposta di dati json dalla funzione product_serial_ajax? L'ajaxurl che vedo nella risposta è http://example.com/wp-admin/admin-ajax.php?action=get_product_serial

Slimshadddyyy Slimshadddyyy
19 giu 2015 08:32:00

Devi semplicemente eseguire add_action con il nome dell'azione come 'wp_ajax_get_product_serial' e chiamare la tua funzione definita come sopra.

Domain Domain
19 giu 2015 13:03:51

E se quell'azione è definita in un file ajax prod-serial.php e non nel file del plugin stesso?

Slimshadddyyy Slimshadddyyy
19 giu 2015 13:22:56
Mostra i restanti 1 commenti
0

File Classe Plugin:

function __construct()
    {
        add_shortcode('user_registration_form', array($this, 'shortcode'));
        wp_register_script('product-serial', plugins_url('bootstrap/js/product-serial.js', __FILE__),array('jquery')); //jquery personalizzato per il seriale del prodotto
        wp_enqueue_script( 'product-serial' ); //jquery personalizzato per il seriale del prodotto

        $this->hook();
    }

    public function hook()
    {
      add_action('wp_ajax_get_product_serial', array( $this,'get_product_serial'));
      add_action('wp_ajax_nopriv_get_product_serial',array( $this,'get_product_serial') );
    }

    public function product_serial_ajax(){ ?>

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

        <?php
    }

   //converte i dati csv in array
    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;
    }

    //ottiene il numero seriale del prodotto
    function get_product_serial(){

        $upload_dir = wp_upload_dir();
        $csvFile = $upload_dir['baseurl'].'/Eragon-Serial.csv';
        $csv = $this->csv_to_array($csvFile); //legge il 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(); //recupera il numero seriale del prodotto
    }

File JS separato

    function load_product(){
         jQuery.ajax({
          type: "GET", 
          url: ajaxurl,
          dataType : "JSON",
          data : {action: "get_product_serial"},
          //cache: false, 
          success: function(data){
            alert('Eureka');
          }
        });
    }

P.S: inserire quanto segue nell'header.php del tema ha funzionato per me

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