¿Cómo conectar un formulario con una API en JavaScript?
Para interactuar de manera efectiva con una API, es esencial establecer una conexión correctamente desde el lado del cliente. Este proceso puede parecer desafiante al principio, pero con una estructura bien definida, puedes lograrlo sin problemas. A continuación, te explicamos cómo conectar un formulario web con una API usando JavaScript.
¿Cómo estructuramos nuestros archivos y carpetas?
Antes de escribir el código JavaScript necesario, es crucial organizar adecuadamente los archivos y carpetas del proyecto. Este paso preliminar facilitará las referencias y el trabajo en equipo.
Crear una carpeta llamada assets dentro de tu directorio public.
Generar una subcarpeta llamada js donde se almacenará el archivo registro.js.
Dentro de registro.js, se escribirá el código que manejará la interacción entre el formulario y la API.
¿Cómo inicializamos y configuramos nuestro JavaScript?
Una vez que tengas configurada la estructura de carpetas, puedes comenzar a escribir el código en registro.js. Inicia escuchando eventos y manipula el DOM adecuadamente:
document.addEventListener('DOMContentLoaded',()=>{const form =document.querySelector('#singin');// Selector del formulario form.addEventListener('submit',(e)=>{ e.preventDefault();// Prevenir la acción por defecto del formulariolet datos =newFormData(form);// Capturar los datos del formulariolet datosParse =newURLSearchParams(datos);// Formato que WordPress entiendefetch('http://yoursite.com/wp-json/registro',{method:'POST',body: datosParse
}).then(res=> res.json()).then(json=>console.log(json)).catch(error=>console.log(`Hay un error: ${error}`));});});
¿Cómo registramos y cargamos el script en WordPress?
Es vital que el archivo JavaScript se cargue solo cuando se necesite, en este caso, cuando el shortcode específico de WordPress que lo requiere está presente:
Registrar el script en WordPress:
Utiliza wp_register_script para asegurarte de que está disponible sin encolarlo inmediatamente.
¿Cómo verificamos que el script se ha cargado correctamente?
Siempre es buena práctica asegurarse de que los scripts se están ejecutando como se espera. Agrega una simple línea de console.log para ver la ejecución en las herramientas de desarrollo del navegador.
console.log('registro cargado');
Actualizando tu página y revisando la consola de desarrolladores, deberías ver el mensaje de que el script se cargó exitosamente.
¿Qué sería el siguiente paso?
Ahora que tienes el formulario conectado a la API, el siguiente paso natural sería desarrollar la lógica en WordPress para procesar los datos al crear un nuevo usuario. Esto involucrará trabajar directamente con las acciones y filtros de WordPress para manejar el backend.
¡Sigue así! Estás en el camino correcto hacia la creación de aplicaciones web dinámicas y funcionales. A medida que continúas aprendiendo y practicando, tus habilidades solo continuarán aumentando.
Conexión con API REST usando JavaScript en WordPress
window.addEventListener("DOMContentLoaded",function(){console.log("registro cargado")// Debugear si el registro fue cargadolet $form =document.querySelector("#signin"); $form.addEventListener("submit",function(e){ e.preventDefault();let datos =newFormData($form);let datosParse =newURLSearchParams(datos);// Parsear datos// fetch configurado para devolver un JSON (mensaje al consultar)fetch("https://yardsales.plz/wp-json/plz/registro",// Ruta estática por lo pronto{method:"POST",body: datosParse
}).then(res=>res.json()).then(json=>{console.log(json)}).catch(err=>{// Catch (error personalizado)console.log(`Hay un error: ${err}`)})})})
Cargar JS en el formulario: public/shortcode/form-registro.php
<?php//Registrar scriptfunctionplz_script_registro(){wp_register_script("plz-registro",plugins_url("../assets/js/registro.js",__FILE__));}add_action("wp_enqueue_scripts","plz_script_registro");functionplz_add_register_form(){//Poner script en colawp_enqueue_script("plz-registro");//...
Para los que no les cargue el archivo .js
En el archivo form-registro.php, la función
wp_enqueue_script("plz-registro");
debe ser llamada dentro del hook "wp_enqueue_scripts". De otra forma no cargará el js (al menos así fue en mi caso)
El código de el archivo public/shortcode/form-registro.php quedaría así
Lo que cambié fue:
wp_enqueue_script("plz-registro");
Lo llame dentro de la función plz_script_registro()
y luego llamé a la función plz_script_registro() al cargar el form.
(:
Gracias por el aporte pero después de haber realizado esos cambios sigue sin mostrarme la leyenda al abrir la consola en el inspector.
Tipico, tomo el curso lo sigo paso a paso y no me corre. pero agarro el codigo completo del profesor y si corre.
¿Lograste detectar que tenía mal tu código?
Yo sigo sin poder cargar el JS
Verifica el nombre de las funciones y como se registran, cuando usan enqueue se pone "script" (sin s al final) y cuando se registra la acción se pone "scripts" (con s al final)
¿Qué cursos puedo tomar para entender con mayor facilidad todo lo relacionado a POST y GET, Eventos en JS, lo de FETCH?
Me siento perdido siento que no fue suficiente el curso de Básico de JS.
Hola!
Son métodos del protocolo HTTP, puedes aprenderlo en los cursos de backend ya que son formas de "pedirle" cosas al servidor y como te comunicarás con el. Te recomiendo darte una vuelta por el Curso de Backend con Nodejs, ahi verás que es GET, POST, PATCH, DELETE, CRUD y otras cosas elementales.
Tengo el mismo sentir, la verdad que es un excelente curso, pero todavía no tengo los conocimientos de JS suficientes para seguirle el paso al maestro.
Lo logre de esta manera ☺️
window.addEventListener("DOMContentLoaded",function(){let $form =document.querySelector("#ypw_form_login"); $form.addEventListener("submit",asyncfunction(e){ e.preventDefault();// let datos = new FormData($form);// let datosParse = new URLSearchParams(datos); // Parsear datoslet formData =newFormData($form);// fetch configurado para devolver un JSON (mensaje al consultar)try{ res =awaitfetch("url-my-api-wp-json",// Ruta estática por lo pronto{method:"POST",body: formData,});console.log(await res.json());}catch(error){console.log(`Hay un error: ${error}`);}});});
Tuve demasiados para implementar lo hecho en clase, incluso decidí eliminar mis archivos, descargar los de la clase y probarlos en mi local pero sigo con los mismos errores en la consola al registrar al usuario con mis datos:
reload.js:22
WebSocket connection to 'ws://127.0.0.1:5500//ws'failed:
init @ reload.js:22
registro.js?ver=5.9:11
POST yardsales.plz/wp-json/plz/registro net::ERR_NAME_NOT_RESOLVED
(anónimo) @ registro.js?ver=5.9:11
registro.js?ver=5.9:22 Hay un error: TypeError: Failed to fetch
NOTA: BORRÉ EL HTTP DEL POST PORQUE PLATZI NO ME DEJA COLORCAR ENLACES "NO SEGUROS"
¡Hola, Julian! ¿Ese error proviene del LocalWP? ¿Que sistema operativo usas?
Hola profe, sí, estoy usando localWP y uso Windows 11.
Continué con el curso con uno de los repositorios de un estudiante y me funcionó perfectamente, no he podido detectectar a qué se debía el error.
Tengo una duda, cualquier usuario puede hacer peticiones al API ? es decir, alguien puede hacer un script desde otro sitio web que registre un millon de usuarios ? o solo es posible si se ejecuta desde el servidor ?
Lo más seguro es que desde un script externo el servidor devuelva un error de CORS. Igualmente, si quieres agregar una capa más de seguridad, puedes utilizar un argumento a la hora de registrar el endpoint para condicionar quien puede accederlo. Te dejo la documentación:
Yo pude crear un usuario desde Postman al terminar la clase 8, por lo que parece que si estamos expuestos con este formulario de registro. ¿Cómo se puede solucionar esta vulnerabilidad?
alguien más tampoco puede reproducir esta clase?
ayuda please :c
Hola
Mr funciona bien, prueba cambiiando de servidor, haz click en el boton en forma de engranaje y selecciona un nuevo servidor como en la imagen:
a mí no me funcionó, probé con todos los servidores
La viaje confiable en Platzi: "si no entiendes algo, toma otro curso". En este curso no te explicamos eso.
yo cuando termine este video mi web que estoy haciendo en Local, me da este error alguien me dice como solucionarlo ¿? gracias
Fatal error:Cannot re-assign auto-global variable _REQUEST inC:\Users\migue\LocalSites\pruebaplugin\app\public\wp-content\plugins\frontend-login\includes\API\api-registro.php on line 15CallStack# TimeMemoryFunctionLocation10.0004363576{main}()...\index.php:020.0009363856require('C:\Users\migue\Local Sites\pruebaplugin\app\public\wp-blog-header.php')...\index.php:1730.0010364464require_once('C:\Users\migue\Local Sites\pruebaplugin\app\public\wp-load.php')...\wp-blog-header.php:1340.0011364904require_once('C:\Users\migue\Local Sites\pruebaplugin\app\public\wp-config.php')...\wp-load.php:5050.0011373656require_once('C:\Users\migue\Local Sites\pruebaplugin\app\public\wp-settings.php')...\wp-config.php:7760.06382074920include_once('C:\Users\migue\Local Sites\pruebaplugin\app\public\wp-content\plugins\frontend-login\plugin-frontend-login.php')...\wp-settings.php:428Ha habido un error crítico en esta web.Aprende más sobre el diagnóstico de WordPress.
ya re vise esa linea de codigo pero esta todo bien, pero no se si es porque la pagina la estoy haciendo en Local, y no en un dominio real o porque
Esta clase se me complicó un poco, tengo un error 404 en la consola
GET becateco.local/wp-json/plz/registro 404 (Not Found)
¡Hola, Samuel! Muéstrame el código de la api de registro, así podemos ver cuál puede ser el problema.
A mí me ocurrió que el id del form no puede ser signin. Cambie el nombre en el form y el queryselector y funcionó sin problema
un saludo
hola a uds les carga el vídeo de esta clase? a mí no ,😞
Hola Rafael. Intenta cambiando de servidor A por B o C y viceversa. Si haces pausa en el vídeo podrás notar que existe la opción de Server A, B y C para cambiarlo.
Esto es aveces suficiente para ver con normalidad cualquiera de las clases. En caso de persistir el problema repórtalo al correo team@platzi.com para que te den una solución oportuna. 💪
No me imprime en la consola del inspector el console.log("registro cargado");
Habría que revisar las rutas que utilizaste en el wp_enqueue_script para llamar a tu archivos JS
Cuando hice el cambio del #signup a #signin en el HTML, me funcionó
Se podría haber explicado los AJAX ya que usa la función FETCH
Si les sale este error en la consola:
GET net::ERR_ABORTED 404 (Not Found)
Lo que hay que hacer es borrar la siguiente linea del footer del tema:
<script src="assets/js/script.js"></script>
Para la gente que no le funciono el console.log de registro cargado, fijense muy bien. Yo no continue el proyecto anterior y empecé uno desde cero, pero hay que tener un header.php y un footer.php (al estilo wordpress: con wp_head(), wp_footer, etc) para que esto funcione, puesto que si no lo tenemos no va a funcionar
No me reproduce el vídeo :(, ya cambie de server algunas veces y nada :(
Unas pequeñas acotaciones para entender un poco mas como funcionan estas cosas de API
URLSearchParams
Fetch
register_rest_route
Petición fetch()
Estoy creando un plugin para el admin de wordpress, hice un ligero cambio para que se cargara correctamente el script
add_action('admin_enqueue_scripts','my_script');//admin_enqueue_scripts se usó en lugar de wp_enqueue_scripts
Según leí wp_enqueue_scripts carga el script en el frontend de la pagina y el admin_enqueue_scripts permite cargarlos al panel de administrador