Cómo administrar llamadas ajax y JSON en wordpress

13

Tengo un tipo de publicación personalizado al que quiero acceder a través de jQuery, preferiblemente usando JSON.

Entonces lo primero es lo primero. crear una función que devuelva / echos json es bastante fácil, pero ¿cómo accedería a él a través de jquery?

Como Mike escribe en esta pregunta , él, por lo que yo entiendo, lo coloca en la raíz de WordPress. lo que lo haría accesible usando el nombre del archivo php, pero ¿es esto recomendable? Prefiero ponerlo dentro de una carpeta de complementos.

He intentado leer el códice de WordPress, pero la forma en que se manejan las llamadas ajax me confunde, ya que está publicando cada llamada ajax a admin-ajax.php, a pesar de que no es una página de administración.

¿Alguien puede enderezar los problemas que estoy teniendo?

/Tormenta

editar

El problema que tuve fue entender cómo se hacían las llamadas ajax en wordpress, así como dónde colocar su código php y js para hacer / manejar las llamadas.

En la otra pregunta a la que me vinculé, creaste una función colocando el archivo en la raíz de wp; no quiero hacer eso. Pero ahora he aprendido a usar wp_ajax_ (nopriv _) [acción] y puedo acceder efectivamente a la json que creo. El problema restante es dónde debo colocar el JS para hacer la llamada. Quiero colocarlo en el archivo js de complementos, pero como se presentará en una página, no en el sitio de administración, ajaxurl no está definido, por lo que tengo que hacer eco con php.

echo admin_url('admin-ajax.php');

Entonces, la pregunta es cómo debo combinar este php con el javascript, y cómo debo ponerlo en cola, ya que no es un archivo o un script.

Tormenta
fuente
Me gustaría editar el título de su pregunta para darle un título más descriptivo, pero después de leer aún no estoy 100% seguro de cuál es su pregunta. ¿Simplemente está preguntando cómo acceder a un feed JSON, sin relación con los tipos de publicaciones personalizadas (no es que el CPT realmente no importa a su pregunta?) ¿Y es importante que no esté en la raíz? ¿Es por la funcionalidad de administrador? ¿Tal vez sería útil explicar lo que realmente está tratando de lograr desde la perspectiva del usuario final además del enfoque técnico con el que está luchando?
MikeSchinkel el
Sí, puedo decir que el título no es el más descriptivo de la historia. Acabo de poner algo allí porque publiqué uno peor al principio. Publicación editada con más información.
Tormenta el
El tipo de publicación personalizada que acabo de agregar, porque el complemento json-api que parece popular en realidad no cubre los tipos de publicación personalizados.
Tormenta el

Respuestas:

17

Ajax Handler

De hecho, es un poco confuso que el controlador Ajax esté en el wp-admin/directorio, pero sí, también puede y debe usarlo para solicitudes que no sean de administrador. Luego registra un controlador para el wp_ajax_nopriv_[action]gancho, en lugar de lo normal wp_ajax_[action]. En este caso, solo tiene que seguir las primeras líneas deadmin-ajax.php , ya que una solicitud realizada por un usuario que no ha iniciado sesión ya abandonará la página alrededor de la línea 50.

Por lo tanto, registre una función para el gancho wp_ajax_nopriv_get_custom_post_data, y se llamará si lo solicita admin-ajax.phpcon el actionparámetro establecido en get_custom_post_data. Asegúrese de llamar die()al final de su controlador usted mismo, de lo contrario die(-1)se devolverá el valor predeterminado . Y también registre la versión de inicio de sesión wp_ajax_get_custom_post_data(a la misma función de controlador, no hay problema), ya que si ha iniciado sesión en su sitio, no se dará por noprivvencido.

Configuración del lado del servidor a Javascript

El truco para enviar datos de configuración del lado del servidor (como la admin-ajax.phpurl) es wp_localize_script(). Le pasa una serie de claves y valores que se incluirán en la parte superior de la página. Probablemente, esto se creó originalmente solo para cadenas localizables, pero también puede usarlo para pasar datos de configuración.

wp_localize_script('storm_json_config', 'storm_config', array(
    'ajaxurl' => admin_url('admin-ajax.php'),
));

storm_json_configes el nombre del identificador (si desea eliminarlo posteriormente), storm_configes el nombre del objeto Javascript que contendrá sus datos. Por lo tanto, su archivo Javascript estático puede contener una línea como jQuery.post(storm_config.ajaxurl, ...).

Ver también la respuesta de bueltge a una pregunta similar .

Javascript estático desde el directorio de complementos

Para cargar un archivo Javascript estático desde su propio directorio de complementos, utilice wp_enqueue_script(). Eso se vería así:

wp_enqueue_script('storm_json', plugin_dir_url(__FILE__) . 'js/json.js', array('jquery'), '20101105');

Donde storm_jsonnuevamente hay un nombre de identificador, luego le da el enlace al archivo, luego las dependencias (pueden ser null) y luego un número de versión que se agregará después de la solicitud para superar las memorias caché del navegador en las actualizaciones.

Jan Fabry
fuente
gran respuesta. Esto era lo que me preguntaba, y parece que lo hice funcionar. Ahora puedo acceder a /wp-admin/admin-ajax.php?action=[action] y obtener un resultado json. Mi problema ahora es dónde poner el js para hacer la llamada ajax. Como necesito poner echo admin_url ('admin-ajax.php'); como la url, no puedo ponerlo en mi archivo js de complementos. Entonces, ¿cómo haría para ponerlo en cola? No solo quiero imprimir el guión en el medio de una página.
Tormenta el
@Storm: amplié mi respuesta con wp_localize_script(), que puede usar para enviar datos de configuración desde el lado del servidor al navegador. (Pequeño consejo: si agrega @un nombre de usuario, esa persona recibirá una notificación de su respuesta. Así @Mike: I updated the titleque asegúrese de ver su comentario)
Jan Fabry
Muchas gracias Jan. Ahora creo que entiendo todo el paquete. Tendré que jugar un poco con todo para entenderlo completamente, ¡pero ha sido de gran ayuda! Respuesta aceptada =) por cierto, gracias por la @ nota. Pero como estoy comentando tu respuesta ahora, aún recibirás una alerta, ¿verdad?
Tormenta el
@Storm: Sí, la alerta va al autor de la pregunta o la respuesta que está comentando y, además, puede ir a otro participante que mencione en un @ -comentario. Así que recibí tu notificación "gratis", pero no recibirías una por este mensaje si no te incluyera. Hay una explicación completa en el meta sitio general de la red de Stack Exchange.
Jan Fabry