ajaxurl no definido en el extremo frontal

25

Estoy tratando de crear una ajaxform en la parte frontal. Estoy usando el codigo

    jQuery.ajax(
        {
            type: "post",
            dataType: "json",
            url: ajaxurl,
            data: formData,
            success: function(msg){
                console.log(msg);
            }
        });

para lo cual recibo un error

Uncaught ReferenceError: ajaxurl is not definedworklorAjaxBookForm @ 
?page_id=2:291onclick @ ?page_id=2:202

Mientras usa un código similar en el backend de administrador funciona ¿Qué url debo usar para procesar la solicitud ajax?

dread_cat_pirate
fuente
Mira este tutorial. Te puede ayudar. 1stwebdesigner.com/implement-ajax-wordpress-themes
Nilambar Sharma

Respuestas:

48

En el backend hay una ajaxurlvariable global definida por el propio WordPress.

WP no crea esta variable en la interfaz. Significa que si desea utilizar llamadas AJAX en la interfaz de usuario, debe definir dicha variable usted mismo.

Una buena forma de hacerlo es usarlo wp_localize_script.

Supongamos que sus llamadas AJAX están en el my-ajax-script.jsarchivo, luego agregue wp_localize_script para este archivo JS de esta manera:

function my_enqueue() {

    wp_enqueue_script( 'ajax-script', get_template_directory_uri() . '/js/my-ajax-script.js', array('jquery') );

    wp_localize_script( 'ajax-script', 'my_ajax_object',
            array( 'ajax_url' => admin_url( 'admin-ajax.php' ) ) );
}
add_action( 'wp_enqueue_scripts', 'my_enqueue' );

Después de localizar su archivo JS, puede usar el my_ajax_objectobjeto en su archivo JS:

jQuery.ajax(
    {
        type: "post",
        dataType: "json",
        url: my_ajax_object.ajax_url,
        data: formData,
        success: function(msg){
            console.log(msg);
        }
    });
Krzysiek Dróżdż
fuente
2
¿Puedo usar wp_localize_scriptsin tener que usar wp_enqueue_scritp?
dread_cat_pirate
1
Utiliza el identificador de script en wp_localize_script, por lo que debe usar wp_enqueue_script para al menos uno de sus scripts. Pero ... No usar wp_enqueue_script no es una buena idea (corre el riesgo de tener conflictos y problemas de dependencias).
Krzysiek Dróżdż
no tengo ningún script externo para cargar, solo quiero usar ajaxurl para hacer una llamada ajax. ¿eso no es posible?
RT
¿Y dónde pondrás esta llamada AJAX? Como script en línea? Es una muy mala idea ...
Krzysiek Dróżdż
Tengo un formulario separado, en el que estoy administrando la validación y al enviar, una llamada ajax para enviar el formulario, por supuesto, con WordPress agregando gancho. de todos modos, he descubierto la forma de usar ajaxurl.
RT
33

para usar ajaxurl directamente, en su archivo de complemento agregue esto:

add_action('wp_head', 'myplugin_ajaxurl');

function myplugin_ajaxurl() {

   echo '<script type="text/javascript">
           var ajaxurl = "' . admin_url('admin-ajax.php') . '";
         </script>';
}

A continuación, puede utilizar la ajaxurlsolicitud de ajax.

RT
fuente
1
Esta respuesta es ajaxurlsimilar al uso predeterminado. Lo cual es mucho mejor que la respuesta aceptada.
Abel Melquiades Callejo
cierto, pero es inútil si lo está utilizando en un archivo .js.
Julio
1
@Jules ajaxurltodavía está disponible en un *.jsarchivo. Para hacerlo, es posible que deba declarar la ajaxurlvariable al principio de la carga de la página. Otra cosa a considerar es la llamada del *.jsarchivo externo tuyo. El archivo externo debe ser llamado después la ajaxurlha creado una instancia y se le dará el valor URL derecha.
Abel Melquiades Callejo