WordPress para el Desarrollo de Apps Web: Guardar Datos
() translation by (you can also view the original English article)
Cuando se trata de la web, casi cualquier aplicación que se ejecuta en tu navegador está respaldada por un almacén de datos de algún tipo. Normalmente, estos almacenes de datos tienen forma de bases de datos.
Hasta hace poco, la mayoría de las aplicaciones estaban construidas sobre algún tipo de base de datos SQL, pero con el surgimiento de las bases de datos basadas en documentos como CouchDB, otras aplicaciones han comenzado a usar también otro tipo de respaldos.
No solo eso, con HTML5 y los navegadores implementando servicios para localStorage
, en la actualidad somos capaces de empezar a guardar algunos datos en el lado del cliente. Obviamente, esto no es algo que desearías hacer de forma permanente, pero esto nos garantiza un nivel de flexibilidad y poder que no habíamos tenido recientemente.
De cualquier forma, siguiendo la línea típica de las aplicaciones web, WordPress es una aplicación respaldada por bases de datos que usa concretamente una base de datos MySQL para almacenar su información.
Pero estas series versan sobre la creación de aplicaciones sobre WordPress. Para finalizar, es importante entender no solo como guardar la información, sino también, como recuperarla.
Por supuesto, cuando trabajamos con la serialización de datos, es importante además tener en cuenta que los usuarios podrían intentar introducir datos maliciosos en la base de datos. Con lo cual, es nuestra responsabilidad sanear los datos adecuadamente cuando los introducimos en la base de datos, así como asegurarnos de que estamos extrayendo adecuadamente los datos cuando los recuperamos de la base de datos.
En este artículo, vamos a echar un vistazo a las APIs que WordPress ofrece para la serialización de la información, y las facilidades disponibles para sanear la información. Después acabaremos el artículo echando un vistazo a como extraer de forma segura la información de la base de datos.
Almacenado de Datos
Obviamente, una de las principales diferencias entre los sitios web normales y las aplicaciones web es su habilidad para gestionar datos almacenados en algún tipo de base de datos.
De cualquier forma, de forma directa, WordPress ofrece una variedad de APIs que facilitan el almacenado y la extracción de datos. Y quizá lo mejor sobre guardar datos en una base de datos de WordPress es que una vez entiendas como funciona una API, tendrás normalmente intuición sobre como trabajan el resto de ellas.
Dicho esto, vamos a empezar a ver como guardamos la información en la base de datos de WordPress.
Entender la Base de Datos
Para aquellos de vosotros que no estéis familiarizados todavía, WordPress sólo consiste en un puñado de tablas. A propósito de esta discusión, nos incumbe conocer principalmente las siguientes tablas:
-
wp-options
. La tabla de opciones es responsable de almacenar piezas de información relacionadas con las preferencias, la configuración, y cualquier cosa relacionada con los ajustes aplicables al conjunto del sitio. -
wp_post
. Esta tabla guarda información relativa a las entradas. Aunque no trabajaremos directamente con esta tabla, es importante entender que existe de forma que podamos trabajar con información meta de los posts o entradas. -
wp_postmeta
. Como hemos mencionado previamente, esta tabla es la responsable de contener información meta relacionada con las entradas individuales. Y desde el momento de que las entradas pueden representar tanto páginas, como entradas, o entradas personalizadas, aquí es donde vas a guardar información la relacionada con cada uno de tus tipos de entradas. Es extremadamente flexible en cuanto al tipo de datos que puede guardar, así que puedes tener mucho poder en términos de como vinculas información a las entradas (sin tener en cuenta el tipo en el que estén definidas). -
p_comments
. Esta tabla debería entenderse sin explicaciones, aquí es donde se almacenan todos los comentarios de las entradas, páginas, y tipos de entradas personalizadas. Al igual quewp_posts
, aquí no es donde directamente escribiremos información, pero es importante entender que esta tabla existe y que en ella hay una tabla de meta datos de los comentarios a la que podemos acceder cuando escribamos información en la tabla. -
wp_commentmeta
. Como hemos mencionado, al igual quewp_postmeta
, aquí es donde los meta datos de los comentarios son almacenados. Y aunque seguramente no trabajarás necesariamente con los comentarios en las aplicaciones de modo generalizado, podrías acabar teniendo un componente para un blog en tu aplicación. Y en este caso, ayuda a saber como puedes leer datos desde, y escribir datos en, la tabla.
Obviamente, esto es simplemente un resumen de algunas de las tablas que impulsan WordPress. Si quieres familiarizarte con el resto de la información, aunque solo sea por tu propia satisfacción, entonces asegúrate de revisar la descripción de la base de datos.
De todas formas, esto debería ser suficiente para que seamos capaces de leer y escribir información en la base de datos.
Escribir Información en la Base de Datos
En este punto, tenemos suficiente información sobre la capa de la base de datos como para empezar a hacer un resumen de las APIs que están disponibles en la capa de la aplicación de WordPress que nos permite coger información proporcionada o bien por nosotros mismos y/o por un usuario.
La Tabla Opciones
Ahora, escribir información en cada una de las anteriores tablas es realmente fácil.
- Es cuestión de entender las APIs disponibles.
- Es importante conocer como sanear los datos
Primero, vamos a echar un vistazo a las funciones disponibles para leer, escribir, y actualizar información en la tabla de opciones de WordPress.
Añadir y Actualizar Opciones
WordPress proporciona dos funciones especificas de la API para escribir información en la base de datos. Una relativa a la forma de añadir información, otra sobre la forma de actualizar información.
Para añadir información a la tabla de opciones de WordPress, usarías la siguiente función de la API.
add_option
acepta tres parámetros:
- Una clave - o identificador único para la información
- El valor de los datos a almacenar
Por ejemplo, si quisiéramos almacenar información, como mi nombre, entonces haríamos algo como esto:
1 |
add_option( 'my-name', 'tom mcfarlin' ); |
Si, por otro lado, quisiéramos coger algo procedente de la colección $_POST
, entonces nosotros podríamos hacer algo como esto:
1 |
if ( isset( $_POST['value'] ) && ! empty( $_POST['value'] ) { |
2 |
add_option( 'my-value', $_POST['value'] ); |
3 |
}
|
Actualizar opciones es muy diferente. Sigue el mismo esquema y puede realmente usarse en lugar de add_option
porque si la opción no existe ya, la creará.
Para no insistir más, no ahondaré mucho más en la información sobre esta función en particular. Esencialmente, update_option
hará lo siguiente:
- Añadir la opción si es que no existe ya
- Sobreescribir el valor existente si es que existe
No está mal, ¿no?
Una Palabra Sobre el Mod del Tema
Aquellos de vosotros que hayáis trabajado con temas de WordPress - especialmente cuando se emplea el Personalizador del Tema - seguramente os resultará familiar la función set_theme-mod
.
Esta particular función de la API no es exactamente relevante para crear aplicaciones web con WordPress; aunque, para completar, quería mostrar todas las APIs que son responsables de escribir datos en la base de datos.
Advertencia específica del Codex:
Crea o actualiza un ajuste de modificación para el tema actual. Junto con get_theme_mod() esta función en ocasiones ofrece a los desarrolladores de temas una sencilla alternativa a la API de Ajustes cuando hay una necesidad de manejar ajustes específicos del tema.
Esto está relegado claramente al ámbito del trabajo con temas.
Las Tablas Post Meta y Comment Meta
Honestamente, trabajar con post meta no es muy diferente a trabajar con opciones. De hecho, puedes considerar las funciones de la API para serializar los meta datos de los post y los meta datos de los comentarios de forma casi idéntica a como las opciones son almacenadas en la base de datos wp_options
.
Abreviando, las funciones de la API toman tres piezas de información:
- El elemento ID
- La clave del dato
- El valor del dato
Por tanto en el caso de guardar información sobre un post o entrada, el ID se correspondería con el ID de la entrada; y en el caso de los comentarios, con el ID del comentario.
Y al igual que en el caso de guardar datos en la tabla opciones, es importante advertir que añadir una opción introducirá la opción en la base de datos, y actualizar la opción creará la opción si esta no existe todavía, y después sobreescribirá el valor existente en la base de datos.
Un ejemplo concreto, guardar información en la tabla meta post:
1 |
add_post_meta( get_the_ID(), 'my-post-information', 'This is my favorite post.' ); |
Y, digamos, actualizar información en la tabla comment meta sería como sigue:
1 |
update_post_meta( get_the_ID(), 'my-post-information', 'This is my favorite post.' ); |
Alternativamente, podrías necesitar usar la variable global $post
si el método no está siendo invocado dentro del Loop. Por ejemplo:
1 |
global $post; |
2 |
add_post_meta( $post->ID, 'my-post-information', 'This is my favorite post.' ); |
Y para escribir datos en las tablas meta comment, sigue exactamente el mismo formato, excepto que usas add_comment_meta
y update_comment_meta
.
Pero ahora que hemos visto como guardar información en la tabla opciones, la tabla post meta, y la tabla comment meta, ¿cómo nos aseguramos de que realmente no se haya guardado información peligrosa en la base de datos?
Fácil: Desinfección de Datos
Desinfección de Datos
Cuando llega el momento de guardar datos en la base de datos, una de las cosas más importantes que los desarrolladores deben hacer es desinfectar toda la información que llega desde los usuarios y que entra en la base de datos.
Pero la cuestión de la desinfección de los datos es que depende del tipo de datos que estés guardando. Por ejemplo, hay muy pocas ocasiones en las que realmente vayas a querer guardar lenguaje de marcado, SQL, u otro tipo de fuentes de código en la base de datos.
Para prevenirlo, querrás usar funciones PHP como strip_tags
y stripslahes
para limpiar la información.
Por ejemplo:
1 |
if ( isset( $_POST['value'] ) && ! empty( $_POST['value'] ) { |
2 |
|
3 |
$clean_value = strip_tags( stripslashes( $_POST['value'] ) ); |
4 |
add_option( 'my-value', $clean_value ); |
5 |
}
|
Por supuesto, para que quede absolutamente claro, esto es solo un ejemplo de como desinfectar información. Tu implementación podría variar basándote en el tipo de aplicación que estés construyendo. El punto de compartir esta información es mostrar una de las muchas ideas sobre como limpiar información para guardarla posteriormente en la base de datos de WordPress.
Después, estas no son las únicas formas en las que podemos desinfectar valores. Recuerda seguir las instrucciones que proporciona WordPress directamente:
sanitize_email
sanitize_file_name
sanitize_html_class
sanitize_key
sanitize_meta
sanitize_mime_type
sanitize_option
sanitize_sql_orderby
sanitize_text_field
sanitize_title
sanitize_title_for_query
sanitize_title_with_dashes
sanitize_user
En este punto, no olvides utilidades como las expresiones regulares. Son increíblemente poderosas cotejando solo ciertas cadenas y ciertos patrones de una colección de datos que pueden ser extraídos para salvar los datos.
Esto Es Solo La Mitad
Garantizado, sólo he hablado sobre como salvar información a la base de datos de WordPress.
Y ya hemos llegado al cómo extraer información, dejando de lado el cómo validar la información que proviene de la base de datos.
Así que en el próximo artículo, vamos a echar un vistazo al lado opuesto de este artículo - especialmente, vamos a ver como obtener información de la base de datos, a eludir cualquier carácter potencialmente problemático realizando un renderizado de los mismos en el navegador, y a como manejar todo esto.