{"id":3704,"date":"2024-10-24T15:56:01","date_gmt":"2024-10-24T21:56:01","guid":{"rendered":"http:\/\/racmanuel.dev\/?p=3704"},"modified":"2024-10-24T16:00:08","modified_gmt":"2024-10-24T22:00:08","slug":"como-hacer-un-crud-en-wordpress-sin-plugins-guia-paso-a-paso","status":"publish","type":"post","link":"https:\/\/racmanuel.dev\/en\/como-hacer-un-crud-en-wordpress-sin-plugins-guia-paso-a-paso\/","title":{"rendered":"How to create a CRUD application in WordPress without plugins: A step-by-step guide"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">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\u00f3mo hacerlo utilizando PHP y las funciones nativas de WordPress. Veremos c\u00f3mo crear, leer, actualizar y eliminar datos (CRUD) en WordPress, sin la necesidad de instalar plugins, gracias a un ejemplo de c\u00f3digo pr\u00e1ctico que puedes usar y adaptar.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"que-es-un-crud\">\u00bfQu\u00e9 es un CRUD?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Un CRUD es un sistema que permite realizar cuatro operaciones b\u00e1sicas con datos: <strong>Crear, Leer, Actualizar y Eliminar<\/strong> (Create, Read, Update, Delete). Estas operaciones son fundamentales en cualquier aplicaci\u00f3n que necesite interactuar con una base de datos, permitiendo gestionar informaci\u00f3n de manera din\u00e1mica.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"beneficios-de-no-usar-plugins\">Beneficios de no usar plugins<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Si bien WordPress cuenta con miles de plugins que facilitan la creaci\u00f3n de un CRUD, construir uno desde cero tiene muchas ventajas, como:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Mayor personalizaci\u00f3n<\/strong>, adaptando el CRUD a tus necesidades exactas.<\/li>\n\n\n\n<li><strong>Control total sobre el c\u00f3digo y el rendimiento.<\/strong><\/li>\n\n\n\n<li><strong>Menor carga en el sitio<\/strong>, ya que evitar\u00e1s depender de complementos externos que pueden sobrecargar tu instalaci\u00f3n.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"descripcion-del-crud-en-wordpress-sin-plugins\">Descripci\u00f3n del CRUD en WordPress sin plugins<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">En este art\u00edculo, vamos a construir un CRUD simple en WordPress que permite manejar una tabla personalizada en la base de datos. Nuestro ejemplo trabajar\u00e1 con una tabla que almacena nombres y descripciones, y podr\u00e1s insertar, visualizar, actualizar y eliminar registros a trav\u00e9s de un formulario en el frontend.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A continuaci\u00f3n, te mostramos c\u00f3mo implementar este sistema utilizando un c\u00f3digo PHP que puedes copiar y pegar en tu tema de WordPress, o incluso convertirlo en un peque\u00f1o plugin, como veremos en este tutorial.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"codigo-del-crud-explicado\">C\u00f3digo del CRUD explicado<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">El c\u00f3digo proporcionado utiliza algunas de las funciones principales de WordPress para interactuar con la base de datos a trav\u00e9s del objeto global <code>$wpdb<\/code>. Vamos a desglosar el c\u00f3digo para entender c\u00f3mo funciona cada secci\u00f3n.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-wide\"\/>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"creacion-de-la-tabla-en-la-base-de-datos\">Creaci\u00f3n de la tabla en la base de datos<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Cuando activas el plugin o a\u00f1ades este c\u00f3digo a tu archivo <code>functions.php<\/code>, la primera tarea es crear una tabla personalizada en la base de datos donde se almacenar\u00e1n los registros. Para ello, utilizamos la funci\u00f3n <code>dbDelta()<\/code> de WordPress, que permite crear o actualizar tablas de manera segura.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"php\" class=\"language-php\">function mi_crud_plugin_activate() {\n    global $wpdb;\n    $table_name = $wpdb-&gt;prefix . 'mi_crud_table';\n    $charset_collate = $wpdb-&gt;get_charset_collate();\n\n    $sql = \"CREATE TABLE $table_name (\n        id mediumint(9) NOT NULL AUTO_INCREMENT,\n        nombre varchar(255) NOT NULL,\n        descripcion text NOT NULL,\n        PRIMARY KEY (id)\n    ) $charset_collate;\";\n    \n    require_once(ABSPATH . 'wp-admin\/includes\/upgrade.php');\n    dbDelta($sql);\n}\n<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>$wpdb-&gt;prefix<\/strong> asegura que la tabla respete el prefijo que usa WordPress para sus tablas.<\/li>\n\n\n\n<li>La funci\u00f3n <code>dbDelta()<\/code> maneja la creaci\u00f3n de la tabla.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Este paso se ejecuta autom\u00e1ticamente cuando activas el plugin, y la tabla se crear\u00e1 si no existe.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-wide\"\/>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"crear-registros-create\">Crear registros (Create)<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Para crear un nuevo registro en nuestra tabla, usamos el siguiente bloque de c\u00f3digo, que captura los datos del formulario y los inserta en la tabla de la base de datos:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"php\" class=\"language-php\">if (isset($_POST['crear']) &amp;&amp; check_admin_referer('mi_crud_nonce_action')) {\n    $nombre = sanitize_text_field($_POST['nombre']);\n    $descripcion = sanitize_textarea_field($_POST['descripcion']);\n    \n    $wpdb-&gt;insert(\n        $table_name,\n        [\n            'nombre' =&gt; $nombre,\n            'descripcion' =&gt; $descripcion\n        ]\n    );\n    echo \"&lt;p&gt;Registro creado correctamente.&lt;\/p&gt;\";\n}<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>sanitize_text_field()<\/strong> y <strong>sanitize_textarea_field()<\/strong> se utilizan para limpiar los datos ingresados por el usuario, protegiendo tu sitio de posibles ataques de inyecci\u00f3n de c\u00f3digo.<\/li>\n\n\n\n<li><strong>$wpdb-&gt;insert()<\/strong> es la funci\u00f3n que inserta los datos en la tabla de la base de datos.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Este c\u00f3digo permite que los usuarios ingresen datos a trav\u00e9s del formulario y los guarden en la base de datos.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-wide\"\/>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"leer-registros-read\">Leer registros (Read)<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Una vez que tienes registros en la tabla, necesitas poder visualizarlos. El siguiente bloque de c\u00f3digo recupera todos los registros de la base de datos y los muestra en una tabla HTML:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"php\" class=\"language-php\">$registros = $wpdb-&gt;get_results(\"SELECT * FROM $table_name\");\n\nforeach ($registros as $registro) {\n    echo \"&lt;tr&gt;\";\n    echo \"&lt;td&gt;\" . esc_html($registro-&gt;id) . \"&lt;\/td&gt;\";\n    echo \"&lt;td&gt;\" . esc_html($registro-&gt;nombre) . \"&lt;\/td&gt;\";\n    echo \"&lt;td&gt;\" . esc_html($registro-&gt;descripcion) . \"&lt;\/td&gt;\";\n    echo \"&lt;\/tr&gt;\";\n}<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>$wpdb-&gt;get_results()<\/strong> se utiliza para realizar una consulta y obtener los datos almacenados en la tabla.<\/li>\n\n\n\n<li><strong>esc_html()<\/strong> asegura que los datos se impriman de manera segura en el HTML.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-wide\"\/>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"4-actualizar-registros-update\">4. Actualizar registros (Update)<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Para actualizar un registro existente, el c\u00f3digo captura los nuevos valores ingresados por el usuario y los guarda en la base de datos usando <code>$wpdb-&gt;update()<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"php\" class=\"language-php\">if (isset($_POST['actualizar']) &amp;&amp; check_admin_referer('mi_crud_nonce_action')) {\n    $nombre = sanitize_text_field($_POST['nombre']);\n    $descripcion = sanitize_textarea_field($_POST['descripcion']);\n    $id = intval($_POST['id']);\n    \n    $wpdb-&gt;update(\n        $table_name,\n        [\n            'nombre' =&gt; $nombre,\n            'descripcion' =&gt; $descripcion\n        ],\n        ['id' =&gt; $id]\n    );\n    echo \"&lt;p&gt;Registro actualizado correctamente.&lt;\/p&gt;\";\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Aqu\u00ed, el registro se actualiza basado en el <code>id<\/code> proporcionado, y los nuevos valores reemplazan los antiguos en la tabla.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-wide\"\/>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"5-eliminar-registros-delete\">5. Eliminar registros (Delete)<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">El siguiente c\u00f3digo permite eliminar un registro de la base de datos usando <code>$wpdb-&gt;delete()<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"php\" class=\"language-php\">if (isset($_GET['eliminar']) &amp;&amp; check_admin_referer('mi_crud_nonce_action')) {\n    $wpdb-&gt;delete($table_name, ['id' =&gt; intval($_GET['eliminar'])]);\n    echo \"&lt;p&gt;Registro eliminado correctamente.&lt;\/p&gt;\";\n}<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Este c\u00f3digo captura el <code>id<\/code> del registro a eliminar y lo borra de la tabla.<\/li>\n\n\n\n<li><strong>intval()<\/strong> asegura que el <code>id<\/code> sea tratado como un n\u00famero entero.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-wide\"\/>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"6-implementacion-del-shortcode\">6. Implementaci\u00f3n del shortcode<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Finalmente, el siguiente c\u00f3digo permite insertar el formulario y la tabla de registros en cualquier p\u00e1gina o entrada mediante el uso de un <strong>shortcode<\/strong>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"php\" class=\"language-php\">add_shortcode('mi_crud', 'mi_crud_shortcode');\n\nfunction mi_crud_shortcode() {\n    ob_start(); \n    mi_crud_form();\n    return ob_get_clean(); \n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Este shortcode se puede usar como <code>[mi_crud]<\/code> en el editor de WordPress, mostrando el formulario y la tabla donde lo insertes.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-wide\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"codigo-completo\">C\u00f3digo Completo<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"php\" class=\"language-php\">&lt;?php\n\/*\nPlugin Name: Mi CRUD Plugin\nDescription: Un ejemplo de c\u00f3mo implementar un CRUD en WordPress sin usar plugins adicionales.\nVersion: 1.1\nAuthor: Tu Nombre\n*\/\n\nif (!defined('ABSPATH')) {\n    exit; \/\/ Evitar acceso directo a este archivo.\n}\n\n\/\/ Hook para ejecutar c\u00f3digo en la activaci\u00f3n del plugin\nregister_activation_hook(__FILE__, 'mi_crud_plugin_activate');\n\n\/\/ Funci\u00f3n que se ejecuta cuando el plugin se activa\nfunction mi_crud_plugin_activate() {\n    global $wpdb;\n\n    \/\/ Definir el nombre de la tabla personalizada\n    $table_name = $wpdb->prefix . 'mi_crud_table';\n\n    \/\/ Definir el conjunto de caracteres de la base de datos (charset) para la tabla\n    $charset_collate = $wpdb->get_charset_collate();\n\n    \/\/ SQL para crear la tabla\n    $sql = \"CREATE TABLE $table_name (\n        id mediumint(9) NOT NULL AUTO_INCREMENT,\n        nombre varchar(255) NOT NULL,\n        descripcion text NOT NULL,\n        PRIMARY KEY (id)\n    ) $charset_collate;\";\n\n    \/\/ Incluir el archivo necesario para usar dbDelta\n    require_once(ABSPATH . 'wp-admin\/includes\/upgrade.php');\n\n    \/\/ Crear la tabla de forma segura\n    dbDelta($sql);\n}\n\n\/\/ Registrar el shortcode para mostrar el formulario CRUD\nfunction mi_crud_shortcode() {\n    ob_start(); \/\/ Iniciar la captura de la salida.\n    mi_crud_form(); \/\/ Llamar a la funci\u00f3n que muestra el formulario y la tabla.\n    return ob_get_clean(); \/\/ Devolver el contenido capturado.\n}\nadd_shortcode('mi_crud', 'mi_crud_shortcode'); \/\/ Asociar el shortcode [mi_crud] a la funci\u00f3n mi_crud_shortcode.\n\n\/\/ Funci\u00f3n que contiene todo el formulario y las operaciones CRUD\nfunction mi_crud_form() {\n    global $wpdb; \/\/ Obtener acceso al objeto de la base de datos global de WordPress.\n\n    \/\/ Definir el nombre de la tabla personalizada\n    $table_name = $wpdb->prefix . 'mi_crud_table';\n\n    \/\/ PROCESO DE CREACI\u00d3N (Create)\n    if (isset($_POST['crear']) &amp;&amp; check_admin_referer('mi_crud_nonce_action')) {\n        \/\/ Validar y sanitizar los datos antes de insertarlos en la base de datos\n        $nombre = sanitize_text_field($_POST['nombre']);\n        $descripcion = sanitize_textarea_field($_POST['descripcion']);\n\n        \/\/ Insertar el nuevo registro en la base de datos\n        $wpdb->insert(\n            $table_name,\n            [\n                'nombre' => $nombre,\n                'descripcion' => $descripcion\n            ]\n        );\n        echo \"&lt;p>Registro creado correctamente.&lt;\/p>\"; \/\/ Mensaje de \u00e9xito\n    }\n\n    \/\/ PROCESO DE ELIMINACI\u00d3N (Delete)\n    if (isset($_GET['eliminar']) &amp;&amp; check_admin_referer('mi_crud_nonce_action')) {\n        \/\/ Eliminar el registro basado en el ID recibido\n        $wpdb->delete($table_name, ['id' => intval($_GET['eliminar'])]);\n        echo \"&lt;p>Registro eliminado correctamente.&lt;\/p>\"; \/\/ Mensaje de \u00e9xito\n    }\n\n    \/\/ PROCESO DE ACTUALIZACI\u00d3N (Update)\n    if (isset($_POST['actualizar']) &amp;&amp; check_admin_referer('mi_crud_nonce_action')) {\n        \/\/ Validar los campos antes de actualizar\n        $nombre = sanitize_text_field($_POST['nombre']);\n        $descripcion = sanitize_textarea_field($_POST['descripcion']);\n        $id = intval($_POST['id']); \/\/ Asegurarse de que el ID es un entero\n\n        \/\/ Actualizar el registro en la base de datos\n        $wpdb->update(\n            $table_name,\n            [\n                'nombre' => $nombre,\n                'descripcion' => $descripcion\n            ],\n            ['id' => $id]\n        );\n        echo \"&lt;p>Registro actualizado correctamente.&lt;\/p>\"; \/\/ Mensaje de \u00e9xito\n    }\n\n    \/\/ PROCESO DE LECTURA (Read)\n    \/\/ Obtener todos los registros de la tabla\n    $registros = $wpdb->get_results(\"SELECT * FROM $table_name\");\n\n    ?>\n    &lt;!-- FORMULARIO PARA CREAR NUEVOS REGISTROS -->\n    &lt;form method=\"post\">\n        &lt;?php wp_nonce_field('mi_crud_nonce_action'); \/\/ Campo de seguridad para proteger el formulario ?>\n        &lt;label for=\"nombre\">Nombre:&lt;\/label>\n        &lt;input type=\"text\" name=\"nombre\" id=\"nombre\" required>\n        &lt;br>&lt;br>\n        &lt;label for=\"descripcion\">Descripci\u00f3n:&lt;\/label>\n        &lt;textarea name=\"descripcion\" id=\"descripcion\" required>&lt;\/textarea>\n        &lt;br>&lt;br>\n        &lt;input type=\"submit\" name=\"crear\" value=\"Crear\">\n    &lt;\/form>\n\n    &lt;!-- MOSTRAR TODOS LOS REGISTROS EXISTENTES -->\n    &lt;h2>Registros existentes&lt;\/h2>\n    &lt;table border=\"1\" cellpadding=\"5\" cellspacing=\"0\">\n        &lt;thead>\n            &lt;tr>\n                &lt;th>ID&lt;\/th>\n                &lt;th>Nombre&lt;\/th>\n                &lt;th>Descripci\u00f3n&lt;\/th>\n                &lt;th>Acciones&lt;\/th>\n            &lt;\/tr>\n        &lt;\/thead>\n        &lt;tbody>\n            &lt;?php foreach ($registros as $registro): ?>\n                &lt;tr>\n                    &lt;td>&lt;?php echo esc_html($registro->id); ?>&lt;\/td> &lt;!-- Mostrar el ID -->\n                    &lt;td>&lt;?php echo esc_html($registro->nombre); ?>&lt;\/td> &lt;!-- Mostrar el nombre escapado -->\n                    &lt;td>&lt;?php echo esc_html($registro->descripcion); ?>&lt;\/td> &lt;!-- Mostrar la descripci\u00f3n escapada -->\n                    &lt;td>\n                        &lt;!-- Enlace para eliminar (con confirmaci\u00f3n de usuario y nonce de seguridad) -->\n                        &lt;a href=\"&lt;?php echo esc_url(add_query_arg('eliminar', $registro->id)); ?>&amp;amp;_wpnonce=&lt;?php echo wp_create_nonce('mi_crud_nonce_action'); ?>\" onclick=\"return confirm('\u00bfEst\u00e1s seguro de eliminar este registro?');\">Eliminar&lt;\/a>\n\n                        &lt;!-- Enlace para editar (abre el formulario de edici\u00f3n) -->\n                        &lt;a href=\"#editar_&lt;?php echo esc_attr($registro->id); ?>\" onclick=\"document.getElementById('form_editar_&lt;?php echo esc_attr($registro->id); ?>').style.display='block'; return false;\">Editar&lt;\/a>\n                    &lt;\/td>\n                &lt;\/tr>\n\n                &lt;!-- FORMULARIO PARA EDITAR UN REGISTRO EXISTENTE -->\n                &lt;tr id=\"form_editar_&lt;?php echo esc_attr($registro->id); ?>\" style=\"display: none;\">\n                    &lt;td colspan=\"4\">\n                        &lt;form method=\"post\">\n                            &lt;?php wp_nonce_field('mi_crud_nonce_action'); \/\/ Protecci\u00f3n de nonce para la actualizaci\u00f3n ?>\n                            &lt;input type=\"hidden\" name=\"id\" value=\"&lt;?php echo esc_attr($registro->id); ?>\">\n                            &lt;label for=\"nombre\">Nombre:&lt;\/label>\n                            &lt;input type=\"text\" name=\"nombre\" value=\"&lt;?php echo esc_attr($registro->nombre); ?>\" required>\n                            &lt;br>&lt;br>\n                            &lt;label for=\"descripcion\">Descripci\u00f3n:&lt;\/label>\n                            &lt;textarea name=\"descripcion\" required>&lt;?php echo esc_textarea($registro->descripcion); ?>&lt;\/textarea>\n                            &lt;br>&lt;br>\n                            &lt;input type=\"submit\" name=\"actualizar\" value=\"Actualizar\">\n                        &lt;\/form>\n                    &lt;\/td>\n                &lt;\/tr>\n            &lt;?php endforeach; ?>\n        &lt;\/tbody>\n    &lt;\/table>\n    &lt;?php\n}<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"faqs\">FAQs<\/h3>\n\n\n<div id=\"rank-math-faq\" class=\"rank-math-block\">\n<div class=\"rank-math-list \">\n<div id=\"faq-question-1729805593808\" class=\"rank-math-list-item\">\n<h3 class=\"rank-math-question \"><strong>\u00bfEs necesario tener conocimientos avanzados de PHP para implementar esto?<\/strong><br><\/h3>\n<div class=\"rank-math-answer \">\n\n<p>No necesitas ser un experto, pero tener una comprensi\u00f3n b\u00e1sica de PHP y las funciones de WordPress te ayudar\u00e1 a personalizar este c\u00f3digo seg\u00fan tus necesidades.<\/p>\n\n<\/div>\n<\/div>\n<div id=\"faq-question-1729805610865\" class=\"rank-math-list-item\">\n<h3 class=\"rank-math-question \"><strong>\u00bfEste c\u00f3digo es seguro?<\/strong><\/h3>\n<div class=\"rank-math-answer \">\n\n<p>S\u00ed, siempre y cuando utilices las funciones de saneamiento de datos como <code>sanitize_text_field()<\/code>, <code>sanitize_textarea_field()<\/code> y <code>check_admin_referer()<\/code>.<\/p>\n\n<\/div>\n<\/div>\n<div id=\"faq-question-1729805630501\" class=\"rank-math-list-item\">\n<h3 class=\"rank-math-question \"><strong>\u00bfPuedo a\u00f1adir m\u00e1s campos al CRUD?<\/strong><\/h3>\n<div class=\"rank-math-answer \">\n\n<p>S\u00ed, puedes agregar m\u00e1s campos a la tabla y formularios ajustando el c\u00f3digo de la tabla y las funciones de creaci\u00f3n y actualizaci\u00f3n.<\/p>\n\n<\/div>\n<\/div>\n<div id=\"faq-question-1729805642039\" class=\"rank-math-list-item\">\n<h3 class=\"rank-math-question \"><strong>\u00bfEste CRUD funcionar\u00e1 en cualquier tema de WordPress?<\/strong><\/h3>\n<div class=\"rank-math-answer \">\n\n<p>S\u00ed, el c\u00f3digo es independiente del tema y funcionar\u00e1 siempre que se utilicen las funciones nativas de WordPress.<\/p>\n\n<\/div>\n<\/div>\n<div id=\"faq-question-1729805657325\" class=\"rank-math-list-item\">\n<h3 class=\"rank-math-question \"><strong>\u00bfEs recomendable usar un plugin para el CRUD o este m\u00e9todo es mejor?<\/strong><\/h3>\n<div class=\"rank-math-answer \">\n\n<p>Si necesitas personalizaci\u00f3n y control total, este m\u00e9todo es mejor. Sin embargo, para una soluci\u00f3n r\u00e1pida y sin complicaciones, podr\u00edas optar por un plugin.<\/p>\n\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-wide\"\/>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"conclusion\">Conclusi\u00f3n<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Crear un CRUD en WordPress sin depender de plugins es una excelente manera de aprender m\u00e1s sobre el funcionamiento interno de WordPress y tener mayor control sobre los datos en tu sitio. El c\u00f3digo proporcionado es un punto de partida que puedes personalizar seg\u00fan tus necesidades.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Este enfoque no solo mejora el rendimiento de tu sitio al reducir la cantidad de plugins, sino que tambi\u00e9n te da la flexibilidad para adaptar el sistema a cualquier tipo de dato que desees gestionar.<\/p>\n\n\n<style><\/style><style><\/style>\n<div class=\"wp-block-group is-layout-constrained wp-block-group-is-layout-constrained\">\n<div class=\"wp-block-group is-layout-constrained wp-block-group-is-layout-constrained\">\n<h4 class=\"wp-block-heading has-large-font-size\" id=\"necesitas-ayuda-con-un-proyecto-web\">\u00bfNecesitas ayuda con un proyecto web?<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Si \u00bfNecesitas ayuda con alg\u00fan 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\u00e1s\u2026 Si \u00bfEst\u00e1s listo? \u00a1Env\u00edame un mensaje y hablemos de tu proyecto web!<\/p>\n\n\n<div class=\"wp-block-groundhogg-forms\">\n\t<div class=\"gh-form-wrapper\"><form method=\"post\" class=\"gh-form gh-form-v2\" target=\"_parent\" enctype=\"multipart\/form-data\" name=\"Formulario de Contacto\" id=\"gh-form-24\" data-id=\"24\"><div class=\"gh-form-fields\"><div class=\"gh-form-column col-1-of-2\"><label for=\"first_name\">Nombre <span class=\"required\">*<\/span><\/label><div class=\"gh-form-input-field\"><input type=\"text\" name=\"first_name\" id=\"first_name\" class=\"gh-input gh-first-name\" value=\"\" required\/><\/div><\/div><div class=\"gh-form-column col-1-of-2\"><label for=\"last_name\">Apellido(s) <span class=\"required\">*<\/span><\/label><div class=\"gh-form-input-field\"><input type=\"text\" name=\"last_name\" id=\"last_name\" class=\"gh-input gh-last-name\" value=\"\" required\/><\/div><\/div><div class=\"gh-form-column col-1-of-1\"><label for=\"email\">Correo electr\u00f3nico <span class=\"required\">*<\/span><\/label><div class=\"gh-form-input-field\"><input type=\"email\" name=\"email\" id=\"email\" class=\"gh-input gh-email\" value=\"\" required\/><\/div><\/div><div class=\"gh-form-column col-1-of-1\"><label for=\"primary_phone\">Tel\u00e9fono o WhatsApp <span class=\"required\">*<\/span><\/label><div class=\"gh-form-input-field\"><input type=\"tel\" name=\"primary_phone\" id=\"primary_phone\" class=\"gh-input\" value=\"\" required\/><\/div><\/div><div class=\"gh-form-column col-1-of-1\"><label for=\"nombre_de_tu_negocio_o_empresa\">Nombre de tu Negocio o Empresa<\/label><div class=\"gh-form-input-field\"><input type=\"text\" name=\"nombre_de_tu_negocio_o_empresa\" id=\"nombre_de_tu_negocio_o_empresa\" class=\"gh-input\" value=\"\"\/><\/div><\/div><div class=\"gh-form-column col-1-of-1\"><label for=\"link_de_tu_pagina_web\">Link de tu pagina web<\/label><div class=\"gh-form-input-field\"><input type=\"url\" name=\"link_de_tu_pagina_web\" id=\"link_de_tu_pagina_web\" class=\"gh-input\" value=\"\" placeholder=\"Si tu negocio o empresa tiene p\u00e1gina web ingresa aqu\u00ed el link.\"\/><\/div><\/div><div class=\"gh-form-column col-1-of-1\"><label for=\"question_type\">\u00bfQu\u00e9 tipo de pregunta tienes? <span class=\"required\">*<\/span><\/label><div class=\"gh-form-input-field\"><select name=\"question_type\" id=\"question_type\" class=\"gh-input\" required><option value=\"Cotizaci\u00f3n\">Cotizaci\u00f3n<\/option><option value=\"General\">General<\/option><option value=\"Soporte\">Soporte<\/option><\/select><\/div><\/div><div class=\"gh-form-column col-1-of-1\"><label for=\"message\">Pregunta <span class=\"required\">*<\/span><\/label><div class=\"gh-form-input-field\"><textarea name=\"message\" id=\"message\" class=\"gh-input\" rows=\"7\" placeholder=\"Tu pregunta o duda...\" type=\"text\" required><\/textarea><\/div><\/div><div class=\"gh-form-column col-1-of-1\"><div class=\"consent gh-gdpr\" id=\"gdpr_consent\"><div ><label class=\"gh-checkbox-label\"><input type=\"checkbox\" name=\"data_processing_consent\" id=\"data-processing-consent\" class=\"\" value=\"yes\" required\/><span class=\"checkbox-label\">I agree to racmanuel.dev&#8217;s storage and processing of my personal data. <span class=\"required\">*<\/span><\/span><\/label><\/div><div ><label class=\"gh-checkbox-label\"><input type=\"checkbox\" name=\"marketing_consent\" id=\"marketing-consent\" class=\"\" value=\"yes\"\/><span class=\"checkbox-label\">I agree to receive marketing offers and updates from racmanuel.dev.<\/span><\/label><\/div><\/div><\/div><div class=\"gh-form-column col-1-of-3\"><button type=\"submit\" class=\"gh-submit gh-button primary\" value=\"\">\u00a1P\u00f3ngase en contacto!<\/button><\/div><\/div><\/form><\/div><\/div>\n<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Aprende c\u00f3mo implementar un CRUD en WordPress sin plugins utilizando PHP nativo. Este tutorial paso a paso incluye c\u00f3digo de ejemplo que puedes usar para crear, leer, actualizar y eliminar datos.<\/p>","protected":false},"author":1,"featured_media":3712,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_gspb_post_css":"","_glsr_average":0,"_glsr_ranking":0,"_glsr_reviews":0,"footnotes":""},"categories":[48],"tags":[42],"niveles":[38],"class_list":["post-3704","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-tutoriales","tag-wordpress","niveles-intermedio"],"blocksy_meta":[],"acf":[],"_links":{"self":[{"href":"https:\/\/racmanuel.dev\/en\/wp-json\/wp\/v2\/posts\/3704","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/racmanuel.dev\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/racmanuel.dev\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/racmanuel.dev\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/racmanuel.dev\/en\/wp-json\/wp\/v2\/comments?post=3704"}],"version-history":[{"count":9,"href":"https:\/\/racmanuel.dev\/en\/wp-json\/wp\/v2\/posts\/3704\/revisions"}],"predecessor-version":[{"id":3714,"href":"https:\/\/racmanuel.dev\/en\/wp-json\/wp\/v2\/posts\/3704\/revisions\/3714"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/racmanuel.dev\/en\/wp-json\/wp\/v2\/media\/3712"}],"wp:attachment":[{"href":"https:\/\/racmanuel.dev\/en\/wp-json\/wp\/v2\/media?parent=3704"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/racmanuel.dev\/en\/wp-json\/wp\/v2\/categories?post=3704"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/racmanuel.dev\/en\/wp-json\/wp\/v2\/tags?post=3704"},{"taxonomy":"niveles","embeddable":true,"href":"https:\/\/racmanuel.dev\/en\/wp-json\/wp\/v2\/niveles?post=3704"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}