Estaba desarrollando una web que permite hacer donaciones con el plugin GiveWP, la funcionalidad es la siguiente:
Yo uso Formidable Pro para crear los campos que necesita el formulario de donación como por ejemplo un nombre, el monto meta, una descripción y una imagen. Estos campos me sirven para crear una vista donde si un usuario quiere donar a esa persona hace click y tiene el formulario de donación.
El problema:
Formidable tiene la opción de crear un Post cuando se envía un formulario, pues nos valemos de esta función para a su vez crear un formulario de donación. Hasta allí todo bien, pero yo dentro de los campos de mi formulario tengo el ID del post creado eso permite que en la vista al dar click a cada usuario este pueda llevarlo a su formulario de donación
Entonces yo necesito actualizar ese campo de forma automática al crearse el Post (Formulario de GiveWP), tiene que ser después porque antes no existe.
Solución:
Pues la solución es que al crear el Post, este me retorne su ID y ese ID pasarlo al campo de Formidable asi no tendría que ir actualizandolo manual cada vez que creo un nuevo registro el cual quiero que obtenga donaciones.
Nota: Esto lo hago para permitir a las personas crear sus propios formularios de donación desde el frontend, si lo quisiera hacer de otro modo pues tendría que hacer que los usuarios se creen una cuenta en mi página y no es lo que quiero.
Esto lo vamos a lograr creando un Hook de Formidable en el archivo functions de nuestro tema:
El código es el siguiente: (Lo explicaré lineas abajo)
//Función que permite obtener el post_id de un Give Form creado a través de Formidable Pro function process_form($entry_id, $form_id) { if($form_id == 16){ global $wpdb; $entry = FrmEntry::getOne($entry_id); $post_id = $entry->post_id; if ( $entry_id ) { //update entry $wpdb->update( $wpdb->prefix . 'frm_item_metas', array('meta_value' -> $post_id), array('item_id' -> $entry_id, 'field_id' -> '158')); } } } add_action('frm_after_create_entry', 'process_form', 50, 2);
Lo sé parece fácil,
Pero demore en encontrar la solución.
Primero debemos agregar el Hook de Formidable Pro que nos permite realizar una acción luego que se cree un post (add_action(‘frm_after_create_entry’, ‘process_form’, 50, 2); ) El primer parámetro es el nombre del hook: frm_after_create_entry, el segundo es el nombre de la función en este caso: process_form, los dos últimos aún en la misma documentación de Formidable no lo explican, así que si alguien lo sabe que lo deje en los comentarios.
Ya dentro de la función podemos observar que tenemos un primer condicional este condicional nos ayuda a solo actualizar cuando se envie el formulario que queremos ya que si no lo agregamos se va a disparar con cualquier formulario que tengamos.
A continuación estamos registrando de forma global la variable $wpdb ésta nos permitirá hacer consultas a la base de datos de wordpress.
Luego accedemos a la clase FrmEntry y su método estático getOne pasándole como parametro el entry_id que se crea con el registro.
Del objeto obtenido accedemos a su atributo post_id
Ya con esto tenemos la mitad del trabajo hecho ahora solo tenemos que actualizarlo en nuestro registro que se acaba de crear.
Volvemos a verificar que el entry_id exista
Llamamos al método update de la clase $wpdb y le pasamos la consulta: $wpdb->prefix . ‘frm_item_metas’, array(‘meta_value’ => $post_id), array(‘item_id’ => $entry_id, ‘field_id’ => ‘158’)
$wpdb->prefix devuelve el prefijo que usamos en wordpress. Ejemplo: wp_
Y lo concatenamos a frm_item_metas, este será el nombre de la tabla que usaremos para hacer el Update
El segundo argumento son los datos que queremos cambiar en este caso es el ‘meta_value’ y le asignamos el Post_ID obtenido arriba.
El tercer argumento es el condicional aquí le pasamos un array con el ‘item_id’ => $entry_id que es el id del registro insertado y ‘field_id’ => ‘158’ el field_id será el id del campo que tenga dentro del formulario
Con estas pocas líneas de código podremos actualizar el campo de un registro que acabamos de crear.
Espero les sirva de ayuda, abajo dejo los enlaces de las fuentes (En inglés)
- https://formidableforms.com/knowledgebase/database-schema/
- https://formidableforms.com/knowledgebase/frm_after_create_entry/#kb-usage
- https://formidableforms.com/help-desk/add-post-id-to-custom-post-title/
- https://codex.wordpress.org/Class_Reference/wpdb
- https://hotexamples.com/examples/-/FrmEntry/getOne/php-frmentry-getone-method-examples.html
Finalmente les dejo capturas de como funciona la aplicación que quiero conseguir.