Llamada Ajax en el front-end de WordPress

19 ago 2014, 10:48:08
Vistas: 22.9K
Votos: 1

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í
});
4
Comentarios

ajaxurl no está disponible en el front end. Necesitas definirlo explícitamente tú mismo para el frontend. Revisa esto, puedes obtener referencia para implementar ajax en el front end. enlace

Nilambar Sharma Nilambar Sharma
19 ago 2014 11:52:49

@Nilambar: Hola amigo... gracias por tu respuesta.. ya he probado el método "wp_ajax_nopriv_" como se indica en el enlace que compartiste. ¿Podrías guiarme para encontrar el error en la forma en que lo usé para definir explícitamente ajaxurl?

Zammuuz Zammuuz
19 ago 2014 12:13:15

Tienes que localizar el script usando la función wp_localize_script ejemplo

Nilambar Sharma Nilambar Sharma
19 ago 2014 12:16:11

Solo una nota rápida: ... eemail_id=" . $_POST['id']) es vulnerable a inyección SQL.

David Hayes David Hayes
6 jul 2018 16:04:52
Todas las respuestas a la pregunta 2
0

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' ) ) );
19 ago 2014 12:20:32
1

¡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' ] );
6 nov 2016 19:56:17
Comentarios

¿Hay alguna documentación sobre wp.ajax? Gracias

ejntaylor ejntaylor
6 abr 2018 13:50:36