Llamar a URL Ajax en un Plugin de WordPress
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)
?
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' ));

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

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

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.

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>
