{"id":2255,"date":"2023-06-07T10:00:00","date_gmt":"2023-06-07T15:00:00","guid":{"rendered":"http:\/\/racmanuel.dev\/?p=2255"},"modified":"2023-06-04T16:43:42","modified_gmt":"2023-06-04T21:43:42","slug":"como-crear-un-plugin-para-la-api-rest-de-wordpress-con-operaciones-crud-en-una-tabla-personalizada","status":"publish","type":"post","link":"https:\/\/racmanuel.dev\/en\/como-crear-un-plugin-para-la-api-rest-de-wordpress-con-operaciones-crud-en-una-tabla-personalizada\/","title":{"rendered":"How to create a WordPress REST API plugin with CRUD operations on a custom table"},"content":{"rendered":"\n<figure class=\"wp-block-image aligncenter size-large\"><img fetchpriority=\"high\" decoding=\"async\" width=\"1024\" height=\"684\" src=\"http:\/\/racmanuel.dev\/wp-content\/uploads\/pexels-photo-1181675-1-1024x684.jpeg\" alt=\"close up photo of person typing on laptop\" class=\"wp-image-2257\" title=\"\" srcset=\"https:\/\/racmanuel.dev\/wp-content\/uploads\/pexels-photo-1181675-1-1024x684.jpeg 1024w, https:\/\/racmanuel.dev\/wp-content\/uploads\/pexels-photo-1181675-1-600x401.jpeg 600w, https:\/\/racmanuel.dev\/wp-content\/uploads\/pexels-photo-1181675-1-300x200.jpeg 300w, https:\/\/racmanuel.dev\/wp-content\/uploads\/pexels-photo-1181675-1-768x513.jpeg 768w, https:\/\/racmanuel.dev\/wp-content\/uploads\/pexels-photo-1181675-1-1536x1025.jpeg 1536w, https:\/\/racmanuel.dev\/wp-content\/uploads\/pexels-photo-1181675-1.jpeg 1880w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Photo by Christina Morillo on <a href=\"https:\/\/www.pexels.com\/photo\/close-up-photo-of-person-typing-on-laptop-1181675\/\" rel=\"nofollow noopener\" target=\"_blank\">Pexels.com<\/a><\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Te has puesto a pensar como hay plugins como Jetpack CRM, Yoast SEO, Gravity Forms o otros muchos plugins pueden a\u00f1adir a la REST API de WordPress sus Endpoints a la API nativa de WordPress bueno pues en este en este tutorial revisaremos como crear un plugin para la API REST de WordPress con operaciones CRUD en una tabla personalizada, Aqu\u00ed hay algunos beneficios de crear un plugin en WordPress que agregue un endpoint a la API REST y permita realizar operaciones CRUD en una tabla personalizada:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><span style=\"color: var(--theme-palette-color-2, #25ff00);\" class=\"stk-highlight\">Flexibilidad y personalizaci\u00f3n:<\/span> Al crear un plugin personalizado, tienes el control total sobre las operaciones CRUD en tu tabla personalizada. Puedes definir las rutas, los m\u00e9todos y los par\u00e1metros seg\u00fan tus necesidades espec\u00edficas.<\/li>\n\n\n\n<li><span style=\"color: var(--theme-palette-color-2, #25ff00);\" class=\"stk-highlight\">Integraci\u00f3n con otros sistemas:<\/span> Al utilizar la API REST de WordPress, puedes integrar tu tabla personalizada con otros sistemas y aplicaciones. Esto te permite compartir datos de forma f\u00e1cil y segura con otras plataformas, como aplicaciones m\u00f3viles, sistemas de gesti\u00f3n de contenidos externos, sistemas de comercio electr\u00f3nico y m\u00e1s.<\/li>\n\n\n\n<li><span style=\"color: var(--theme-palette-color-2, #25ff00);\" class=\"stk-highlight\">Automatizaci\u00f3n de tareas:<\/span> Al proporcionar un endpoint de la API REST para tu tabla personalizada, puedes automatizar la creaci\u00f3n, lectura, actualizaci\u00f3n y eliminaci\u00f3n de datos. Esto puede ahorrarte tiempo y esfuerzo al eliminar la necesidad de realizar estas tareas manualmente.<\/li>\n\n\n\n<li><span style=\"color: var(--theme-palette-color-2, #25ff00);\" class=\"stk-highlight\">Acceso a los datos desde cualquier lugar:<\/span> La API REST te permite acceder a tus datos desde cualquier lugar a trav\u00e9s de solicitudes HTTP. Esto significa que puedes realizar operaciones CRUD en tu tabla personalizada desde aplicaciones, servicios web o incluso desde otros sitios web.<\/li>\n\n\n\n<li><span style=\"color: var(--theme-palette-color-2, #25ff00);\" class=\"stk-highlight\">Escalabilidad y modularidad:<\/span> Al utilizar la API REST, tu tabla personalizada se convierte en un recurso independiente que puede ser escalado y utilizado en diferentes contextos. Puedes agregar m\u00e1s endpoints y funcionalidades seg\u00fan sea necesario, lo que te brinda una mayor flexibilidad para adaptarte a futuros cambios y requerimientos.<\/li>\n\n\n\n<li><span style=\"color: var(--theme-palette-color-2, #25ff00);\" class=\"stk-highlight\">Mejora del rendimiento:<\/span> Al utilizar la API REST en lugar de acceder directamente a la base de datos, puedes aprovechar la cach\u00e9 y las optimizaciones de rendimiento integradas en WordPress. Esto puede resultar en una mejor respuesta y tiempos de carga m\u00e1s r\u00e1pidos para tus operaciones CRUD.<\/li>\n\n\n\n<li><span style=\"color: var(--theme-palette-color-2, #25ff00);\" class=\"stk-highlight\">Seguridad y control de acceso:<\/span> Puedes aplicar autenticaci\u00f3n y control de permisos en tus endpoints de la API REST para garantizar que solo los usuarios autorizados puedan acceder y manipular los datos en tu tabla personalizada. Esto te brinda un mayor control sobre la seguridad de tus datos.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">En resumen, al crear un plugin que agregue un endpoint a la API REST de WordPress para manipular datos en una tabla personalizada, obtienes flexibilidad, integraci\u00f3n con otros sistemas, automatizaci\u00f3n de tareas, acceso desde cualquier lugar, escalabilidad, mejor rendimiento, seguridad y control de acceso. Estos beneficios pueden mejorar significativamente la funcionalidad y la eficiencia de tu sitio web o aplicaci\u00f3n basada en WordPress.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"paso-1-preparacion-del-entorno\">Paso 1: Preparaci\u00f3n del entorno<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Crea una carpeta en la ubicaci\u00f3n <code>wp-content\/plugins<\/code> de tu instalaci\u00f3n de WordPress. Puedes darle el nombre que desees, por ejemplo, &#8220;rest-api-clientes&#8221;.<\/li>\n\n\n\n<li>Dentro de la carpeta reci\u00e9n creada, crea un archivo llamado <code>rest-api-clientes.php<\/code>. Este ser\u00e1 el archivo principal de nuestro plugin.<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"paso-2-creacion-de-la-tabla-en-la-base-de-datos\">Paso 2: Creaci\u00f3n de la tabla en la base de datos<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Abre el archivo <code>rest-api-clientes.php<\/code> en tu editor de c\u00f3digo y agrega el siguiente c\u00f3digo al principio del archivo:<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"php\" class=\"language-php\">&lt;?php\r\n\/*\r\nPlugin Name: REST API Clientes\r\nDescription: Este plugin agrega un endpoint a la API REST de WordPress para manipular datos de la tabla de clientes.\r\nVersion: 1.0\r\nAuthor: Tu Nombre\r\n*\/\r\n\r\n\/\/ Funci\u00f3n para crear la tabla de clientes al activar el plugin\r\nfunction crear_tabla_clientes() {\r\n    global $wpdb;\r\n    $tabla_clientes = $wpdb->prefix . 'clientes';\r\n\r\n    \/\/ Definir la estructura de la tabla\r\n    $sql = \"CREATE TABLE $tabla_clientes (\r\n        id INT NOT NULL AUTO_INCREMENT,\r\n        nombre VARCHAR(255),\r\n        correo_electronico VARCHAR(255),\r\n        telefono VARCHAR(20),\r\n        PRIMARY KEY (id)\r\n    )\";\r\n\r\n    \/\/ Incluir el archivo necesario para ejecutar dbDelta()\r\n    require_once( ABSPATH . 'wp-admin\/includes\/upgrade.php' );\r\n\r\n    \/\/ Crear o modificar la tabla en la base de datos\r\n    dbDelta( $sql );\r\n}\r\n\r\n\/\/ Agregar la acci\u00f3n para crear la tabla de clientes al activar el plugin\r\nregister_activation_hook( __FILE__, 'crear_tabla_clientes' );\r<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Este c\u00f3digo crea la estructura de la tabla <code>clientes<\/code> en la base de datos utilizando la funci\u00f3n <code>dbDelta()<\/code>. La tabla tendr\u00e1 cuatro columnas: <code>id<\/code> (clave primaria autoincremental), <code>nombre<\/code>, <code>correo_electronico<\/code> y <code>telefono<\/code>. La funci\u00f3n <code>crear_tabla_clientes()<\/code> se ejecutar\u00e1 cuando se active el plugin y crear\u00e1 la tabla.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"paso-3-registro-del-endpoint-de-la-api-rest\">Paso 3: Registro del endpoint de la API REST<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li>A continuaci\u00f3n, agregaremos el c\u00f3digo para registrar el endpoint de la API REST y definir las operaciones CRUD. Agrega el siguiente c\u00f3digo despu\u00e9s del bloque de c\u00f3digo anterior:<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"php\" class=\"language-php\">\/\/ Funci\u00f3n para obtener un cliente por ID\r\nfunction obtener_cliente( $request ) {\r\n    global $wpdb;\r\n    $tabla_clientes = $wpdb->prefix . 'clientes';\r\n    $id = $request['id'];\r\n\r\n    \/\/ Obtener el cliente de la base de datos\r\n    $cliente = $wpdb->get_row( \"SELECT * FROM $tabla_clientes WHERE id = $id\" );\r\n\r\n    return $cliente;\r\n}\r\n\r\n\/\/ Funci\u00f3n para crear un cliente\r\nfunction crear_cliente( $request ) {\r\n    global $wpdb;\r\n    $tabla_clientes = $wpdb->prefix . 'clientes';\r\n    $cliente = array(\r\n        'nombre' => $request->get_param( 'nombre' ),\r\n        'correo_electronico' => $request->get_param( 'correo_electronico' ),\r\n        'telefono' => $request->get_param( 'telefono' ),\r\n    );\r\n\r\n    \/\/ Insertar el cliente en la base de datos\r\n    $wpdb->insert( $tabla_clientes, $cliente );\r\n\r\n    \/\/ Devolver el ID del nuevo cliente\r\n    return $wpdb->insert_id;\r\n}\r\n\r\n\/\/ Funci\u00f3n para actualizar un cliente por ID\r\nfunction actualizar_cliente( $request ) {\r\n    global $wpdb;\r\n    $tabla_clientes = $wpdb->prefix . 'clientes';\r\n    $id = $request['id'];\r\n    $cliente = array(\r\n        'nombre' => $request->get_param( 'nombre' ),\r\n        'correo_electronico' => $request->get_param( 'correo_electronico' ),\r\n        'telefono' => $request->get_param( 'telefono' ),\r\n    );\r\n\r\n    \/\/ Actualizar el cliente en la base de datos\r\n    $wpdb->update( $tabla_clientes, $cliente, array( 'id' => $id ) );\r\n\r\n    \/\/ Devolver la cantidad de filas afectadas\r\n    return $wpdb->rows_affected;\r\n}\r\n\r\n\/\/ Funci\u00f3n para eliminar un cliente por ID\r\nfunction eliminar_cliente( $request ) {\r\n    global $wpdb;\r\n    $tabla_clientes = $wpdb->prefix . 'clientes';\r\n    $id = $request['id'];\r\n\r\n    \/\/ Eliminar el cliente de la base de datos\r\n    $wpdb->delete( $tabla_clientes, array( 'id' => $id ) );\r\n\r\n    \/\/ Devolver la cantidad de filas afectadas\r\n    return $wpdb->rows_affected;\r\n}\r\n\r\n\/\/ Funci\u00f3n para registrar el endpoint de la API REST\r\nfunction registrar_endpoint_rest_clientes() {\r\n    register_rest_route( 'clientes\/v1', '\/(?P&lt;id>\\d+)', array(\r\n        'methods' => WP_REST_Server::READABLE,\r\n        'callback' => 'obtener_cliente',\r\n        'args' => array(\r\n            'id' => array(\r\n                'validate_callback' => function( $param, $request, $key ) {\r\n                    return is_numeric( $param );\r\n                }\r\n            ),\r\n        ),\r\n    ) );\r\n\r\n    register_rest_route( 'clientes\/v1', '\/', array(\r\n        'methods' => WP_REST_Server::CREATABLE,\r\n        'callback' => 'crear_cliente',\r\n    ) );\r\n\r\n    register_rest_route( 'clientes\/v1', '\/(?P&lt;id>\\d+)', array(\r\n        'methods' => WP_REST_Server::EDITABLE,\r\n        'callback' => 'actualizar_cliente',\r\n        'args' => array(\r\n            'id' => array(\r\n                'validate_callback' => function( $param, $request, $key ) {\r\n                    return is_numeric( $param );\r\n                }\r\n            ),\r\n        ),\r\n    ) );\r\n\r\n    register_rest_route( 'clientes\/v1', '\/(?P&lt;id>\\d+)', array(\r\n        'methods' => WP_REST_Server::DELETABLE,\r\n        'callback' => 'eliminar_cliente',\r\n        'args' => array(\r\n            'id' => array(\r\n                'validate_callback' => function( $param, $request, $key ) {\r\n                    return is_numeric( $param );\r\n                }\r\n            ),\r\n        ),\r\n    ) );\r\n}\r\nadd_action( 'rest_api_init', 'registrar_endpoint_rest_clientes' );<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Este c\u00f3digo define las funciones <code>obtener_cliente()<\/code>, <code>crear_cliente()<\/code>, <code>actualizar_cliente()<\/code> y <code>eliminar_cliente()<\/code>, que corresponden a las operaciones de lectura, creaci\u00f3n, actualizaci\u00f3n y eliminaci\u00f3n respectivamente. Estas funciones utilizan la instancia de la clase <code>wpdb<\/code> para interactuar con la tabla <code>clientes<\/code> en la base de datos.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Luego, la funci\u00f3n <code>registrar_endpoint_rest_clientes()<\/code> se encarga de registrar el endpoint de la API REST utilizando <code>register_rest_route()<\/code>. Se definen las rutas y los m\u00e9todos para cada operaci\u00f3n.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"paso-4-prueba-de-la-api-rest\">Paso 4: Prueba de la API REST<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Ahora que hemos registrado el endpoint de la API REST, podemos probarlo. Aseg\u00farate de que el plugin est\u00e9 activo en tu instalaci\u00f3n de WordPress.<\/li>\n\n\n\n<li><span style=\"color: var(--theme-palette-color-2, #25ff00);\" class=\"stk-highlight\">Para obtener un cliente por ID<\/span>, puedes hacer una solicitud GET a la siguiente URL en tu navegador: http:\/\/tusitio.com\/wp-json\/clientes\/v1\/1\n<ul class=\"wp-block-list\">\n<li>Reemplaza &#8220;tusitio.com&#8221; con la URL de tu sitio web y &#8220;1&#8221; con el ID del cliente que deseas obtener. Deber\u00edas recibir los datos del cliente en formato JSON.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><span style=\"color: var(--theme-palette-color-2, #25ff00);\" class=\"stk-highlight\">Para crear un cliente<\/span>, puedes hacer una solicitud POST a la siguiente URL utilizando una herramienta como Postman: http:\/\/tusitio.com\/wp-json\/clientes\/v1\/\n<ul class=\"wp-block-list\">\n<li>Aseg\u00farate de enviar los par\u00e1metros requeridos (<code>nombre<\/code>, <code>correo_electronico<\/code> y <code>telefono<\/code>) en el cuerpo de la solicitud en formato JSON.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><span style=\"color: var(--theme-palette-color-2, #25ff00);\" class=\"stk-highlight\">Para actualizar un cliente por ID<\/span>, puedes hacer una solicitud PUT a la siguiente URL utilizando una herramienta como Postman: http:\/\/tusitio.com\/wp-json\/clientes\/v1\/1\n<ul class=\"wp-block-list\">\n<li>Reemplaza &#8220;tusitio.com&#8221; con la URL de tu sitio web y &#8220;1&#8221; con el ID del cliente que deseas actualizar. Aseg\u00farate de enviar los par\u00e1metros requeridos (<code>nombre<\/code>, <code>correo_electronico<\/code> y <code>telefono<\/code>) en el cuerpo de la solicitud en formato JSON.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><span style=\"color: var(--theme-palette-color-2, #25ff00);\" class=\"stk-highlight\">Para eliminar un cliente por ID<\/span>, puedes hacer una solicitud DELETE a la siguiente URL utilizando una herramienta como Postman: http:\/\/tusitio.com\/wp-json\/clientes\/v1\/1 \n<ul class=\"wp-block-list\">\n<li>Reemplaza &#8220;tusitio.com&#8221; con la URL de tu sitio web y &#8220;1&#8221; con el ID del cliente que deseas eliminar.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"conclusion\">C\u00f3digo Completo<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"php\" class=\"language-php\">&lt;?php\r\n\/*\r\nPlugin Name: REST API Clientes\r\nDescription: Este plugin agrega un endpoint a la API REST de WordPress para manipular datos de la tabla de clientes.\r\nVersion: 1.0\r\nAuthor: Tu Nombre\r\n*\/\r\n\r\n\/\/ Funci\u00f3n para crear la tabla de clientes al activar el plugin\r\nfunction crear_tabla_clientes() {\r\n    global $wpdb;\r\n    $tabla_clientes = $wpdb->prefix . 'clientes';\r\n\r\n    \/\/ Definir la estructura de la tabla\r\n    $sql = \"CREATE TABLE $tabla_clientes (\r\n        id INT NOT NULL AUTO_INCREMENT,\r\n        nombre VARCHAR(255),\r\n        correo_electronico VARCHAR(255),\r\n        telefono VARCHAR(20),\r\n        PRIMARY KEY (id)\r\n    )\";\r\n\r\n    \/\/ Incluir el archivo necesario para ejecutar dbDelta()\r\n    require_once( ABSPATH . 'wp-admin\/includes\/upgrade.php' );\r\n\r\n    \/\/ Crear o modificar la tabla en la base de datos\r\n    dbDelta( $sql );\r\n}\r\n\r\n\/\/ Agregar la acci\u00f3n para crear la tabla de clientes al activar el plugin\r\nregister_activation_hook( __FILE__, 'crear_tabla_clientes' );\r\n\r\n\r\n\/\/ Funci\u00f3n para obtener un cliente por ID\r\nfunction obtener_cliente( $request ) {\r\n    global $wpdb;\r\n    $tabla_clientes = $wpdb->prefix . 'clientes';\r\n    $id = $request['id'];\r\n\r\n    \/\/ Obtener el cliente de la base de datos\r\n    $cliente = $wpdb->get_row( \"SELECT * FROM $tabla_clientes WHERE id = $id\" );\r\n\r\n    return $cliente;\r\n}\r\n\r\n\/\/ Funci\u00f3n para crear un cliente\r\nfunction crear_cliente( $request ) {\r\n    global $wpdb;\r\n    $tabla_clientes = $wpdb->prefix . 'clientes';\r\n    $cliente = array(\r\n        'nombre' => $request->get_param( 'nombre' ),\r\n        'correo_electronico' => $request->get_param( 'correo_electronico' ),\r\n        'telefono' => $request->get_param( 'telefono' ),\r\n    );\r\n\r\n    \/\/ Insertar el cliente en la base de datos\r\n    $wpdb->insert( $tabla_clientes, $cliente );\r\n\r\n    \/\/ Devolver el ID del nuevo cliente\r\n    return $wpdb->insert_id;\r\n}\r\n\r\n\/\/ Funci\u00f3n para actualizar un cliente por ID\r\nfunction actualizar_cliente( $request ) {\r\n    global $wpdb;\r\n    $tabla_clientes = $wpdb->prefix . 'clientes';\r\n    $id = $request['id'];\r\n    $cliente = array(\r\n        'nombre' => $request->get_param( 'nombre' ),\r\n        'correo_electronico' => $request->get_param( 'correo_electronico' ),\r\n        'telefono' => $request->get_param( 'telefono' ),\r\n    );\r\n\r\n    \/\/ Actualizar el cliente en la base de datos\r\n    $wpdb->update( $tabla_clientes, $cliente, array( 'id' => $id ) );\r\n\r\n    \/\/ Devolver la cantidad de filas afectadas\r\n    return $wpdb->rows_affected;\r\n}\r\n\r\n\/\/ Funci\u00f3n para eliminar un cliente por ID\r\nfunction eliminar_cliente( $request ) {\r\n    global $wpdb;\r\n    $tabla_clientes = $wpdb->prefix . 'clientes';\r\n    $id = $request['id'];\r\n\r\n    \/\/ Eliminar el cliente de la base de datos\r\n    $wpdb->delete( $tabla_clientes, array( 'id' => $id ) );\r\n\r\n    \/\/ Devolver la cantidad de filas afectadas\r\n    return $wpdb->rows_affected;\r\n}\r\n\r\n\/\/ Funci\u00f3n para registrar el endpoint de la API REST\r\nfunction registrar_endpoint_rest_clientes() {\r\n    register_rest_route( 'clientes\/v1', '\/(?P&lt;id>\\d+)', array(\r\n        'methods' => WP_REST_Server::READABLE,\r\n        'callback' => 'obtener_cliente',\r\n        'args' => array(\r\n            'id' => array(\r\n                'validate_callback' => function( $param, $request, $key ) {\r\n                    return is_numeric( $param );\r\n                }\r\n            ),\r\n        ),\r\n    ) );\r\n\r\n    register_rest_route( 'clientes\/v1', '\/', array(\r\n        'methods' => WP_REST_Server::CREATABLE,\r\n        'callback' => 'crear_cliente',\r\n    ) );\r\n\r\n    register_rest_route( 'clientes\/v1', '\/(?P&lt;id>\\d+)', array(\r\n        'methods' => WP_REST_Server::EDITABLE,\r\n        'callback' => 'actualizar_cliente',\r\n        'args' => array(\r\n            'id' => array(\r\n                'validate_callback' => function( $param, $request, $key ) {\r\n                    return is_numeric( $param );\r\n                }\r\n            ),\r\n        ),\r\n    ) );\r\n\r\n    register_rest_route( 'clientes\/v1', '\/(?P&lt;id>\\d+)', array(\r\n        'methods' => WP_REST_Server::DELETABLE,\r\n        'callback' => 'eliminar_cliente',\r\n        'args' => array(\r\n            'id' => array(\r\n                'validate_callback' => function( $param, $request, $key ) {\r\n                    return is_numeric( $param );\r\n                }\r\n            ),\r\n        ),\r\n    ) );\r\n}\r\nadd_action( 'rest_api_init', 'registrar_endpoint_rest_clientes' );\r<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"conclusion\">Conclusion<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u00a1Felicitaciones! Ahora tienes un plugin que agrega un endpoint a la API REST de WordPress para realizar operaciones CRUD en una tabla personalizada. Puedes personalizar y ampliar este plugin seg\u00fan tus necesidades.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Recuerda que es importante tener precauci\u00f3n al trabajar con la API REST y asegurarte de proteger tus endpoints de manera adecuada, utilizando autenticaci\u00f3n y control de permisos seg\u00fan sea necesario.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Espero que este tutorial te haya sido \u00fatil y te haya brindado una comprensi\u00f3n clara de c\u00f3mo crear un plugin para la API REST de WordPress con operaciones CRUD en una tabla personalizada.<\/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>\u00a1Crea tu propio plugin en WordPress para manipular datos personalizados con la API REST! Nuestro tutorial paso a paso te guiar\u00e1 a trav\u00e9s de la creaci\u00f3n de un endpoint que permite operaciones CRUD en una tabla personalizada. Aprende c\u00f3mo crear, leer, actualizar y eliminar datos de forma flexible y segura. \u00a1Impulsa la funcionalidad y la eficiencia de tu sitio web con esta poderosa herramienta!<\/p>","protected":false},"author":1,"featured_media":2257,"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":[39],"class_list":["post-2255","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-tutoriales","tag-wordpress","niveles-avanzado"],"blocksy_meta":[],"acf":[],"_links":{"self":[{"href":"https:\/\/racmanuel.dev\/en\/wp-json\/wp\/v2\/posts\/2255","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=2255"}],"version-history":[{"count":6,"href":"https:\/\/racmanuel.dev\/en\/wp-json\/wp\/v2\/posts\/2255\/revisions"}],"predecessor-version":[{"id":2271,"href":"https:\/\/racmanuel.dev\/en\/wp-json\/wp\/v2\/posts\/2255\/revisions\/2271"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/racmanuel.dev\/en\/wp-json\/wp\/v2\/media\/2257"}],"wp:attachment":[{"href":"https:\/\/racmanuel.dev\/en\/wp-json\/wp\/v2\/media?parent=2255"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/racmanuel.dev\/en\/wp-json\/wp\/v2\/categories?post=2255"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/racmanuel.dev\/en\/wp-json\/wp\/v2\/tags?post=2255"},{"taxonomy":"niveles","embeddable":true,"href":"https:\/\/racmanuel.dev\/en\/wp-json\/wp\/v2\/niveles?post=2255"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}