
El desarrollo de un CRUD en WordPress sin depender de plugins adicionales te ofrece flexibilidad y control sobre los datos que manipulas en tu sitio. En este tutorial, te mostraremos cómo hacerlo utilizando PHP y las funciones nativas de WordPress. Veremos cómo crear, leer, actualizar y eliminar datos (CRUD) en WordPress, sin la necesidad de instalar plugins, gracias a un ejemplo de código práctico que puedes usar y adaptar.
¿Qué es un CRUD?
Un CRUD es un sistema que permite realizar cuatro operaciones básicas con datos: Crear, Leer, Actualizar y Eliminar (Create, Read, Update, Delete). Estas operaciones son fundamentales en cualquier aplicación que necesite interactuar con una base de datos, permitiendo gestionar información de manera dinámica.
Beneficios de no usar plugins
Si bien WordPress cuenta con miles de plugins que facilitan la creación de un CRUD, construir uno desde cero tiene muchas ventajas, como:
- Mayor personalización, adaptando el CRUD a tus necesidades exactas.
- Control total sobre el código y el rendimiento.
- Menor carga en el sitio, ya que evitarás depender de complementos externos que pueden sobrecargar tu instalación.
Descripción del CRUD en WordPress sin plugins
En este artículo, vamos a construir un CRUD simple en WordPress que permite manejar una tabla personalizada en la base de datos. Nuestro ejemplo trabajará con una tabla que almacena nombres y descripciones, y podrás insertar, visualizar, actualizar y eliminar registros a través de un formulario en el frontend.
A continuación, te mostramos cómo implementar este sistema utilizando un código PHP que puedes copiar y pegar en tu tema de WordPress, o incluso convertirlo en un pequeño plugin, como veremos en este tutorial.
Código del CRUD explicado
El código proporcionado utiliza algunas de las funciones principales de WordPress para interactuar con la base de datos a través del objeto global $wpdb
. Vamos a desglosar el código para entender cómo funciona cada sección.
Creación de la tabla en la base de datos
Cuando activas el plugin o añades este código a tu archivo functions.php
, la primera tarea es crear una tabla personalizada en la base de datos donde se almacenarán los registros. Para ello, utilizamos la función dbDelta()
de WordPress, que permite crear o actualizar tablas de manera segura.
function mi_crud_plugin_activate() {
global $wpdb;
$table_name = $wpdb->prefix . 'mi_crud_table';
$charset_collate = $wpdb->get_charset_collate();
$sql = "CREATE TABLE $table_name (
id mediumint(9) NOT NULL AUTO_INCREMENT,
nombre varchar(255) NOT NULL,
descripcion text NOT NULL,
PRIMARY KEY (id)
) $charset_collate;";
require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
dbDelta($sql);
}
- $wpdb->prefix asegura que la tabla respete el prefijo que usa WordPress para sus tablas.
- La función
dbDelta()
maneja la creación de la tabla.
Este paso se ejecuta automáticamente cuando activas el plugin, y la tabla se creará si no existe.
Crear registros (Create)
Para crear un nuevo registro en nuestra tabla, usamos el siguiente bloque de código, que captura los datos del formulario y los inserta en la tabla de la base de datos:
if (isset($_POST['crear']) && check_admin_referer('mi_crud_nonce_action')) {
$nombre = sanitize_text_field($_POST['nombre']);
$descripcion = sanitize_textarea_field($_POST['descripcion']);
$wpdb->insert(
$table_name,
[
'nombre' => $nombre,
'descripcion' => $descripcion
]
);
echo "<p>Registro creado correctamente.</p>";
}
- sanitize_text_field() y sanitize_textarea_field() se utilizan para limpiar los datos ingresados por el usuario, protegiendo tu sitio de posibles ataques de inyección de código.
- $wpdb->insert() es la función que inserta los datos en la tabla de la base de datos.
Este código permite que los usuarios ingresen datos a través del formulario y los guarden en la base de datos.
Leer registros (Read)
Una vez que tienes registros en la tabla, necesitas poder visualizarlos. El siguiente bloque de código recupera todos los registros de la base de datos y los muestra en una tabla HTML:
$registros = $wpdb->get_results("SELECT * FROM $table_name");
foreach ($registros as $registro) {
echo "<tr>";
echo "<td>" . esc_html($registro->id) . "</td>";
echo "<td>" . esc_html($registro->nombre) . "</td>";
echo "<td>" . esc_html($registro->descripcion) . "</td>";
echo "</tr>";
}
- $wpdb->get_results() se utiliza para realizar una consulta y obtener los datos almacenados en la tabla.
- esc_html() asegura que los datos se impriman de manera segura en el HTML.
4. Actualizar registros (Update)
Para actualizar un registro existente, el código captura los nuevos valores ingresados por el usuario y los guarda en la base de datos usando $wpdb->update()
:
if (isset($_POST['actualizar']) && check_admin_referer('mi_crud_nonce_action')) {
$nombre = sanitize_text_field($_POST['nombre']);
$descripcion = sanitize_textarea_field($_POST['descripcion']);
$id = intval($_POST['id']);
$wpdb->update(
$table_name,
[
'nombre' => $nombre,
'descripcion' => $descripcion
],
['id' => $id]
);
echo "<p>Registro actualizado correctamente.</p>";
}
Aquí, el registro se actualiza basado en el id
proporcionado, y los nuevos valores reemplazan los antiguos en la tabla.
5. Eliminar registros (Delete)
El siguiente código permite eliminar un registro de la base de datos usando $wpdb->delete()
:
if (isset($_GET['eliminar']) && check_admin_referer('mi_crud_nonce_action')) {
$wpdb->delete($table_name, ['id' => intval($_GET['eliminar'])]);
echo "<p>Registro eliminado correctamente.</p>";
}
- Este código captura el
id
del registro a eliminar y lo borra de la tabla. - intval() asegura que el
id
sea tratado como un número entero.
6. Implementación del shortcode
Finalmente, el siguiente código permite insertar el formulario y la tabla de registros en cualquier página o entrada mediante el uso de un shortcode:
add_shortcode('mi_crud', 'mi_crud_shortcode');
function mi_crud_shortcode() {
ob_start();
mi_crud_form();
return ob_get_clean();
}
Este shortcode se puede usar como [mi_crud]
en el editor de WordPress, mostrando el formulario y la tabla donde lo insertes.
Código Completo
<?php
/*
Plugin Name: Mi CRUD Plugin
Description: Un ejemplo de cómo implementar un CRUD en WordPress sin usar plugins adicionales.
Version: 1.1
Author: Tu Nombre
*/
if (!defined('ABSPATH')) {
exit; // Evitar acceso directo a este archivo.
}
// Hook para ejecutar código en la activación del plugin
register_activation_hook(__FILE__, 'mi_crud_plugin_activate');
// Función que se ejecuta cuando el plugin se activa
function mi_crud_plugin_activate() {
global $wpdb;
// Definir el nombre de la tabla personalizada
$table_name = $wpdb->prefix . 'mi_crud_table';
// Definir el conjunto de caracteres de la base de datos (charset) para la tabla
$charset_collate = $wpdb->get_charset_collate();
// SQL para crear la tabla
$sql = "CREATE TABLE $table_name (
id mediumint(9) NOT NULL AUTO_INCREMENT,
nombre varchar(255) NOT NULL,
descripcion text NOT NULL,
PRIMARY KEY (id)
) $charset_collate;";
// Incluir el archivo necesario para usar dbDelta
require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
// Crear la tabla de forma segura
dbDelta($sql);
}
// Registrar el shortcode para mostrar el formulario CRUD
function mi_crud_shortcode() {
ob_start(); // Iniciar la captura de la salida.
mi_crud_form(); // Llamar a la función que muestra el formulario y la tabla.
return ob_get_clean(); // Devolver el contenido capturado.
}
add_shortcode('mi_crud', 'mi_crud_shortcode'); // Asociar el shortcode [mi_crud] a la función mi_crud_shortcode.
// Función que contiene todo el formulario y las operaciones CRUD
function mi_crud_form() {
global $wpdb; // Obtener acceso al objeto de la base de datos global de WordPress.
// Definir el nombre de la tabla personalizada
$table_name = $wpdb->prefix . 'mi_crud_table';
// PROCESO DE CREACIÓN (Create)
if (isset($_POST['crear']) && check_admin_referer('mi_crud_nonce_action')) {
// Validar y sanitizar los datos antes de insertarlos en la base de datos
$nombre = sanitize_text_field($_POST['nombre']);
$descripcion = sanitize_textarea_field($_POST['descripcion']);
// Insertar el nuevo registro en la base de datos
$wpdb->insert(
$table_name,
[
'nombre' => $nombre,
'descripcion' => $descripcion
]
);
echo "<p>Registro creado correctamente.</p>"; // Mensaje de éxito
}
// PROCESO DE ELIMINACIÓN (Delete)
if (isset($_GET['eliminar']) && check_admin_referer('mi_crud_nonce_action')) {
// Eliminar el registro basado en el ID recibido
$wpdb->delete($table_name, ['id' => intval($_GET['eliminar'])]);
echo "<p>Registro eliminado correctamente.</p>"; // Mensaje de éxito
}
// PROCESO DE ACTUALIZACIÓN (Update)
if (isset($_POST['actualizar']) && check_admin_referer('mi_crud_nonce_action')) {
// Validar los campos antes de actualizar
$nombre = sanitize_text_field($_POST['nombre']);
$descripcion = sanitize_textarea_field($_POST['descripcion']);
$id = intval($_POST['id']); // Asegurarse de que el ID es un entero
// Actualizar el registro en la base de datos
$wpdb->update(
$table_name,
[
'nombre' => $nombre,
'descripcion' => $descripcion
],
['id' => $id]
);
echo "<p>Registro actualizado correctamente.</p>"; // Mensaje de éxito
}
// PROCESO DE LECTURA (Read)
// Obtener todos los registros de la tabla
$registros = $wpdb->get_results("SELECT * FROM $table_name");
?>
<!-- FORMULARIO PARA CREAR NUEVOS REGISTROS -->
<form method="post">
<?php wp_nonce_field('mi_crud_nonce_action'); // Campo de seguridad para proteger el formulario ?>
<label for="nombre">Nombre:</label>
<input type="text" name="nombre" id="nombre" required>
<br><br>
<label for="descripcion">Descripción:</label>
<textarea name="descripcion" id="descripcion" required></textarea>
<br><br>
<input type="submit" name="crear" value="Crear">
</form>
<!-- MOSTRAR TODOS LOS REGISTROS EXISTENTES -->
<h2>Registros existentes</h2>
<table border="1" cellpadding="5" cellspacing="0">
<thead>
<tr>
<th>ID</th>
<th>Nombre</th>
<th>Descripción</th>
<th>Acciones</th>
</tr>
</thead>
<tbody>
<?php foreach ($registros as $registro): ?>
<tr>
<td><?php echo esc_html($registro->id); ?></td> <!-- Mostrar el ID -->
<td><?php echo esc_html($registro->nombre); ?></td> <!-- Mostrar el nombre escapado -->
<td><?php echo esc_html($registro->descripcion); ?></td> <!-- Mostrar la descripción escapada -->
<td>
<!-- Enlace para eliminar (con confirmación de usuario y nonce de seguridad) -->
<a href="<?php echo esc_url(add_query_arg('eliminar', $registro->id)); ?>&_wpnonce=<?php echo wp_create_nonce('mi_crud_nonce_action'); ?>" onclick="return confirm('¿Estás seguro de eliminar este registro?');">Eliminar</a>
<!-- Enlace para editar (abre el formulario de edición) -->
<a href="#editar_<?php echo esc_attr($registro->id); ?>" onclick="document.getElementById('form_editar_<?php echo esc_attr($registro->id); ?>').style.display='block'; return false;">Editar</a>
</td>
</tr>
<!-- FORMULARIO PARA EDITAR UN REGISTRO EXISTENTE -->
<tr id="form_editar_<?php echo esc_attr($registro->id); ?>" style="display: none;">
<td colspan="4">
<form method="post">
<?php wp_nonce_field('mi_crud_nonce_action'); // Protección de nonce para la actualización ?>
<input type="hidden" name="id" value="<?php echo esc_attr($registro->id); ?>">
<label for="nombre">Nombre:</label>
<input type="text" name="nombre" value="<?php echo esc_attr($registro->nombre); ?>" required>
<br><br>
<label for="descripcion">Descripción:</label>
<textarea name="descripcion" required><?php echo esc_textarea($registro->descripcion); ?></textarea>
<br><br>
<input type="submit" name="actualizar" value="Actualizar">
</form>
</td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
<?php
}
FAQs
¿Es necesario tener conocimientos avanzados de PHP para implementar esto?
No necesitas ser un experto, pero tener una comprensión básica de PHP y las funciones de WordPress te ayudará a personalizar este código según tus necesidades.
¿Este código es seguro?
Sí, siempre y cuando utilices las funciones de saneamiento de datos como sanitize_text_field()
, sanitize_textarea_field()
y check_admin_referer()
.
¿Puedo añadir más campos al CRUD?
Sí, puedes agregar más campos a la tabla y formularios ajustando el código de la tabla y las funciones de creación y actualización.
¿Este CRUD funcionará en cualquier tema de WordPress?
Sí, el código es independiente del tema y funcionará siempre que se utilicen las funciones nativas de WordPress.
¿Es recomendable usar un plugin para el CRUD o este método es mejor?
Si necesitas personalización y control total, este método es mejor. Sin embargo, para una solución rápida y sin complicaciones, podrías optar por un plugin.
Conclusión
Crear un CRUD en WordPress sin depender de plugins es una excelente manera de aprender más sobre el funcionamiento interno de WordPress y tener mayor control sobre los datos en tu sitio. El código proporcionado es un punto de partida que puedes personalizar según tus necesidades.
Este enfoque no solo mejora el rendimiento de tu sitio al reducir la cantidad de plugins, sino que también te da la flexibilidad para adaptar el sistema a cualquier tipo de dato que desees gestionar.
¿Necesitas ayuda con un proyecto web?
Si ¿Necesitas ayuda con algún proyecto web? No dudes en contactarme desarrollo soluciones completas y personalizadas con WordPress y PHP, con herramientas y procesos modernos, utilizando HTML, CSS, SCSS, PHP, JavaScript, Bootstrap y más… Si ¿Estás listo? ¡Envíame un mensaje y hablemos de tu proyecto web!