Llamada Ajax en el front-end de WordPress
En mi plugin estoy usando dos llamadas ajax en el back-end que funcionan bien. Pero para proporcionar la misma funcionalidad en el front-end cargué una copia de estas dos funciones con otros nombres y mi código es:
En mi archivo principal del plugin:
function my_action_callback(){
global $wpdb;
if (@$_POST['id']) {
$daty = $wpdb->get_results("select eemail_id,eemail_content,eemail_subject from " . WP_eemail_TABLE . " where 1=1 and eemail_status='YES' and eemail_id=" . $_POST['id']);
//consulta para seleccionar datos del email de la tabla
if (!empty($daty)) {
foreach ($dat as $datt) {
echo $datt->eemail_content . "_" . $datt->eemail_subject;
die();
}
}
}
}
add_action('wp_ajax_nopriv_my_action', 'my_action_callback');
Y en mi settings.js
function showEntryfront(id)
{
jQuery(document).ready(function($) {
var data = {
action: 'my_action',
id: id
};
jQuery.post(ajaxurl, data, function(response) {
//Obtener respuesta del servidor
var n=response.split("_");
jQuery('textarea#mail_contents').text(n[0]);
$('#mail_subject').val(n[1]);
});
});
}
Y la página del plugin que ejecuta showEntryfront() es:
<select name="eemail_subject_drop" id="eemail_subject_drop" onchange="showEntryfront(this.value)">
<option value="">Seleccionar asunto del email</option>
<?php echo $eemail_subject_drop_val; ?>
</select>
<input type="hidden" name="send" value="" id="send" /> </td>
<tr height="60px;"> <td>
<textarea name="mail_contents" id="mail_contents" rows="4" cols="40" ></textarea>
</td></tr>
La segunda función hace lo mismo, solo que la tabla de base de datos es diferente.
Mi consola de Firebug muestra:
ReferenceError: ajaxurl is not defined
jQuery.post(ajaxurl, data, function(response) {
Y el textarea no se está llenando con los datos de la tabla WP_eemail_Table. Ten en cuenta que esta funcionalidad funcionaba en el backend de wp-admin. Sé que la llamada ajax en admin se cargará automáticamente por admin-ajax.php, pero ¿cómo puedo implementar lo mismo en el front-end? ¿Hay algún error en mi código?
Para solucionar esto, necesitas definir ajaxurl en el front-end. Agrega esto en el archivo principal de tu plugin:
function add_ajax_script() {
wp_localize_script('jquery', 'my_ajax_object', array('ajax_url' => admin_url('admin-ajax.php')));
}
add_action('wp_enqueue_scripts', 'add_ajax_script');
Y modifica tu JavaScript para usar my_ajax_object.ajax_url en lugar de ajaxurl:
jQuery.post(my_ajax_object.ajax_url, data, function(response) {
// tu código aquí
});
Debes localizar el script usando la función wp_localize_script
. En el área de administración ajaxurl
ya está disponible. Pero en el front-end debes localizar el script para definir ajaxurl
.
Ejemplo:
wp_enqueue_script( 'custom-ajax-request', '/path/to/settings.js', array( 'jquery' ) );
wp_localize_script( 'custom-ajax-request', 'MyAjax', array( 'ajaxurl' => admin_url( 'admin-ajax.php' ) ) );

¡Existe realmente una solución integrada en el núcleo de WordPress para usar Ajax en el front-end!
WordPress tiene una biblioteca de javascript poco conocida pero muy útil a la que se puede acceder a través del objeto JS window.wp
, así:
// En JS:
var action = 'my_action';
var data = {id: 123};
var promise = window.wp.ajax.post( action, data );
promise.always(function(response) {
console.log('Ajax listo:', response);
});
// el objeto promise también tiene otros métodos:
// `done()` / `fail()` / `progress()` / `state()` / `abort()`
La ventaja es que este objeto es mantenido y utilizado por el núcleo de WordPress. Así que puedes confiar en que está actualizado, funciona y es la forma más robusta de manejar tu Ajax. También ten en cuenta que no necesitas manejar el código jQuery...
Si no tienes el objeto javascript window.wp
en el front-end, entonces necesitas asegurarte de agregar wp-util
como dependencia de tus scripts JS, así:
wp_register_script( 'your-handle', 'https://your-domain.com/path/to/file.js', [ 'wp-util' ] );
