Вызов Ajax URL в плагине WordPress

18 июн. 2015 г., 14:53:48
Просмотры: 18.1K
Голосов: 0

Файл класса плагина:

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('Привет, мир!');

                    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('Эврика')';
                                }
                            });
                });
        </script><?php
    }

function csv_to_array($filename='', $delimiter=',')
    {
            //если файл не существует или недоступен для чтения
            //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); //чтение 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();//получение серийного номера продукта
}

Однако при использовании ajaxurl возникает ошибка "не определено", я заменил ajaxurl на URL следующего вида:

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

Это тоже не помогло.

Как правильно вызвать функцию get_product_serial_callback чтобы получить JSON значения и установить их в function(data)?

3
Комментарии

Вызывается ли метод хука? Также, как указано в ответе, колбэк должен быть array($this, 'get_product_serial_callback').

giraff giraff
18 июн. 2015 г. 15:34:00

Как проверить, вызывается ли он? Я изменил колбэк, как вы указали, но всё равно получаю ошибку ajaxurl is not defined.

Slimshadddyyy Slimshadddyyy
18 июн. 2015 г. 15:42:59

Вы вызываете функцию хука в init? Если нет, пожалуйста, вызовите эту функцию в действии init.

Mitul Mitul
18 июн. 2015 г. 16:43:53
Все ответы на вопрос 2
6

Поместите следующий код в функцию _construct() и измените название действия на 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 июн. 2015 г. 15:09:23
Комментарии

Вопрос обновлен. Функция до сих пор не вызывается и возвращает 0 в ответе

Slimshadddyyy Slimshadddyyy
18 июн. 2015 г. 15:20:00

Добавьте public к функции get_product_serial_callback().

Domain Domain
18 июн. 2015 г. 15:59:00

Например: public function get_product_serial_callback()

Domain Domain
18 июн. 2015 г. 15:59:14

WisdmLabs: Как получить ответ с данными в формате json для функции product_serial_ajax? В ответе я вижу ajaxurl http://example.com/wp-admin/admin-ajax.php?action=get_product_serial

Slimshadddyyy Slimshadddyyy
19 июн. 2015 г. 08:32:00

Вам просто нужно выполнить add_action с именем действия 'wp_ajax_get_product_serial' и вызвать вашу функцию, определенную выше.

Domain Domain
19 июн. 2015 г. 13:03:51

Что делать, если это действие определено в каком-то ajax-файле prod-serial.php, а не в самом файле плагина?

Slimshadddyyy Slimshadddyyy
19 июн. 2015 г. 13:22:56
Показать остальные 1 комментариев
0

Файл класса плагина:

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 для серийного номера продукта
        wp_enqueue_script( 'product-serial' ); //пользовательский jquery для серийного номера продукта

        $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
    }

   //преобразование данных csv в массив
    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(){

        $upload_dir = wp_upload_dir();
        $csvFile = $upload_dir['baseurl'].'/Eragon-Serial.csv';
        $csv = $this->csv_to_array($csvFile); //чтение 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(); //получить серийный номер продукта
    }

Отдельный JS файл

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

P.S: добавление следующего кода в header.php моей темы сработало для меня

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