AJAX y WordPress, de la manera correcta

Hay múltiples formas de implementar interacciones en AJAX con WordPress… muchas son malas, otras son horribles, algunas profundamente aberrantes y unas pocas son correctas.

En el grupo de las malas, horribles y aberrantes, encontramos todos aquellos métodos que tienen que ver con intentar hacer las cosas de algún modo ingenioso, y no aprovechando las funcionalidades propias de WordPress, por ejemplo: enviando una petición a un archivo en la carpeta de un plugin o tema o capturando parámetros al descubierto.

Los métodos correctos, por otra parte, se integran armoniosamente con WordPress y permiten utilizar sus características propias para facilitar el desarrollo y el funcionamiento de estas interacciones. En este sentido, probablemente la mejor forma de implementar peticiones AJAX es a través de /wp-admin/admin-ajax.php, ya que esto presenta varias ventajas:

  • Podemos utilizar todas las funciones de WordPress, sin necesidad de tener que incluir manualmente archivos
  • Es posible trabajar tanto con peticiones autenticadas como de libre disponibilidad
  • Por convención, se ha adoptado como la forma más recomendada de hacer consultas en AJAX, por lo que puedes estar más seguro de que seguirá funcionando en cualquier actualización de WordPress
  • Por lo mismo, cuando un plugin intenta detectar si se está realizando alguna acción con AJAX, se define con este método en particular

Esto se puede ilustrar con un ejemplo muy básico, por ejemplo, cargar un listado de posts dinámicamente al clickear en un botón.

En primer lugar, debemos generar la petición en AJAX con javascript, lo que puede ser algo como:

https://gist.github.com/felipelavinz/9382151

Aquí lo importante es que el parámetro action debe coincidir con el nombre de la acción en la que luego vamos a engancharnos en WordPress (el uso de este parámetro es una práctica recomendad en WordPress). La petición puede enviada por $_GET o $_POST

Luego, en un plugin o como parte del tema, toca detectar esa petición y devolver los datos que corresponde:

https://gist.github.com/felipelavinz/9381598

En esta parte debemos tener en cuenta que:

  • El nombre de la acción va a ser wp_ajax_{$parámetro_action} si el usuario debe estar logueado o wp_ajax_nopriv_{$parametro_action} en caso que no lo esté. Si es una acción pública, es necesario definir las dos acciones; en caso que sea una acción que sólo debe realizar un usuario autenticado, debes utilizar solamente la primera opción.
  • Recuerda que si vas a capturar parámetros de la petición, debe coincidir con el método en que son enviados o bien puedes utilizar $_REQUEST para capturar parámetros $_GET o $_POST indistintamente.
  • Finalmente, recuerda también que al tratarse de una función que vamos a invocar por AJAX, es necesario agregar un exit(); para finalizar la ejecución de PHP.

Más información en: