URL Ajax de WordPress para función en functions.php

11 oct 2016, 14:00:41
Vistas: 80.8K
Votos: 6

Tengo una aplicación de escritorio y uso $.getJSON para obtener datos de mi sitio WordPress usando el plugin WP REST API. Esto funciona bien y supongo que también puedo hacer una llamada Ajax a una función en functions.php. ¿Cómo hago esto? Ninguno de los ejemplos que he visto proporciona la ajaxURL. ¿Cómo puedo averiguar cuál es?

Tengo el siguiente código:

Functions.php (en el sitio WordPress en el servidor)

//Llamado por Ajax desde la App - lista el contenido de la carpeta para que puedan ser descargados y almacenados localmente
function folder_contents() {

    $folderPath = $_POST['path'] ;
    $files = array_diff(scandir($path), array('.', '..'));
    print_r($files);
    return $files;

    die(); 
}

add_action('wp_ajax_my_action', 'folder_contents');

app.js (ejecutado usando node webkit localmente desde la máquina)

//llamada ajax 
var data = {
    action: 'path',
    path: datafolder;
};
var ajaxurl = baseurl + '';  //¿QUÉ ES ESTO?!?!
jQuery.post(ajaxurl, data, function(response) {
    alert('Obtuve esto del servidor: ' + response);
    console.log(response);
});

-------------------EDICIÓN----------------------

Después de la respuesta de abajo, he intentado el siguiente código basado en el consejo pero obtengo

"index.html:324 Uncaught ReferenceError: ajax_params is not defined"

Functions.php

//agregar código para usar ajax
function add_ajax_script() {

    wp_localize_script( 'ajax-js', 'ajax_params', array( 'ajax_url' => admin_url( 'admin-ajax.php' ) ) );

}

//Llamado por Ajax desde la App - lista el contenido de la carpeta para que puedan ser descargados y almacenados localmente

function folder_contents() {

    $folderPath = $_POST['path'] ;
    $files = array_diff(scandir($path), array('.', '..'));
    wp_send_json($files);

    die(); 
}

add_action('wp_ajax_folder_contents', 'folder_contents');
add_action('wp_ajax_nopriv_folder_contents', 'folder_contents');


add_action( 'wp_enqueue_scripts', 'add_ajax_script' );

App.js

//llamada ajax 
        var data = {action: 'powerpoint_folder_contents',path: datafolder};
        var ajaxurl =  ajax_params.ajax_url;
        console.log(ajaxurl);
        jQuery.post(ajaxurl, data, function(response) {
            alert('Obtuve esto del servidor: ' + response);
            console.log(response);
        });

Si elimino la función add_ajax_script() y simplemente uso lo siguiente, devuelve 0.

var ajaxurl = baseurl + 'wp-admin/admin-ajax.php';

Por favor ayuda...

0
Todas las respuestas a la pregunta 3
10
//llamada ajax
var data = {
    action: 'folder_contents',
    path: datafolder
};
var ajaxurl = baseurl + '';  //¿QUÉ ES ESTO?!?!
jQuery.post(ajaxurl, data, function(response) {
    alert('Recibido del servidor: ' + response);
    console.log(response);
});

Y tu código PHP en functions.php

//Llamado por Ajax desde la App - lista los contenidos de la carpeta para que puedan ser descargados y almacenados localmente
function folder_contents() {

$folderPath = $_POST['path'] ;
$files = array_diff(scandir($path), array('.', '..'));
print_r($files);
return $files;

die(); 
}

add_action('wp_ajax_folder_contents', 'folder_contents');
add_action('wp_ajax_nopriv_folder_contents', 'folder_contents');

Lo anterior añade tu función como una acción ajax. Luego llamas al nombre de la función en tu AJAX.

Ver https://codex.wordpress.org/Plugin_API/Action_Reference/wp_ajax_(action)

11 oct 2016 14:09:20
Comentarios

Lo siento, en tu código JS también necesitas agregar el ajaxurl para tu sitio. La forma en que lo hago es definiéndolo y localizando el script para su acceso. Mira: https://codex.wordpress.org/Function_Reference/wp_localize_script

Tex0gen Tex0gen
11 oct 2016 14:12:21

También puedes ver aquí un ejemplo del ajaxurl y cómo localizarlo. https://www.creare.co.uk/blog/wp/wp-localize-script-wordpress

Tex0gen Tex0gen
11 oct 2016 14:14:18

OK, estoy teniendo problemas para hacer que esto funcione. He editado mi consulta original arriba para mostrar lo que he intentado basado en tu respuesta

LeeTee LeeTee
11 oct 2016 17:36:07

En lugar de "return $files", haz "echo $files".

Tex0gen Tex0gen
11 oct 2016 17:52:16

O, haz wp_send_json($files); https://codex.wordpress.org/Function_Reference/wp_send_json

Tex0gen Tex0gen
11 oct 2016 17:53:35

Ok, he cambiado a wp_send_json($files); y todavía obtengo 0 desafortunadamente

LeeTee LeeTee
11 oct 2016 17:58:35

Prueba: `function folder_contents() {

echo 'hello';

die(); }`

¿Ves la palabra hello aparecer en el console.log?

Tex0gen Tex0gen
11 oct 2016 18:03:25

Lo intenté y obtengo 0, intenté eliminar todo de esa función y aún obtengo 0. Si voy directamente al archivo con http://myweb.co.uk/wp-admin/admin-ajax.php?action=folder_contents todavía obtengo 0.

LeeTee LeeTee
11 oct 2016 18:11:20

Gracias por tu ayuda, por cierto, es muy apreciada :)

LeeTee LeeTee
11 oct 2016 18:11:35

Continuemos esta discusión en el chat.

Tex0gen Tex0gen
11 oct 2016 18:13:12
Mostrar los 5 comentarios restantes
1

En tu código veo que localizas el script 'ajax-js', pero ¿está el script mismo encolado? Hace unas semanas tuve que usar wp_localize_scripts y tuve que encolar mi script JS dentro de la función que llamaba a wp_localize_script. Por ejemplo:

add_action( 'wp_enqueue_scripts', 'google_js_script' );

function google_js_script()
{
  // Encolar el script js     
  wp_enqueue_script('google-js', GOOGLE_PLG_URL . 'assets/js/google-places.js', array('jquery'), true);

  // Localizar el script JS encolado
  wp_localize_script( 'google-js', 'ajax_object',
    array( 'ajax_url' => admin_url( 'admin-ajax.php' ), 'place' => '' ) );
}

Espero que esto ayude a depurar el problema.

11 oct 2016 23:43:00
Comentarios

El JS no se utiliza en el sitio web en sí. Está utilizando el JS dentro de una aplicación de escritorio.

Tex0gen Tex0gen
12 oct 2016 14:26:58
1

El WP Codex establece que puedes usar la variable global ajaxurl sin declararla primero. En otras palabras, comenta esta línea:

var ajaxurl = ajax_params.ajax_url;

...y comprueba si funciona.

11 oct 2016 23:20:17
Comentarios

Si lees ese aviso en su totalidad también verás esto: "Esto solo es cierto en el lado de la administración. Si estás usando AJAX en el front-end, necesitas hacer que tu JavaScript sea consciente de la URL de admin-ajax.php. Una mejor práctica está documentada en el cuarto ejemplo a continuación, usando wp_localize_script()."

brett brett
26 ago 2022 20:41:14