Recientemente he tenido que desarrollar un portal similar a un Market Place con algunas funciones a la medida para el modelo de negocio a implementar desde dicho sitio web, una de las funciones que se implemento a base de sudor, sangre y código fue la de cargar un producto de Woocommerce al registrar un usuario en WordPress. Antes de comenzar a explicar como llegue a implementar dicha funcionalidad, quiero contarles a grandes rasgos sobre los requerimientos del portal.
Sin una idea concreta
Al principio con el encargado del proyecto pensamos que era un simple y cotidiano Market Place, por lo que nos basamos en el diseño del theme de Dokan. Al presentar dicho diseño el usuario quedo «encantado» sobre la apariencia, pero una vez se le menciono la palabra Market Place pego un grito al cielo, y esto debido a que no era un simple Market Place lo que buscaba. La idea de usar el theme de Dokan quedo descartada, ya que se inicio otra entrevista con el cliente, detallando punto a punto lo que el pensaba que necesitaba, y así poder organizar dichas ideas sueltas en algo sensato.
El usuario requería que existieran usuarios que ofrecían productos en cantidad para vender, usuarios con productos según una cantidad personalizada, usuarios publicando productos de interés a adquirir, directorio de usuarios según la necesidad o finalidad, registro de usuarios, carga de producto cuando el usuario se registraba, pago de membresía para determinadas funciones, entre otras cositas.
De esta breve etapa aprendimos un par de cosas, entre ellas que el plugin complementario para el theme de Dokan nos seria de gran utilidad a futuro; y lo mas importante el cliente en realidad no sabia lo que quería, y nosotros no sabíamos en el pequeño problema que se nos vendría encima, pero sera una historia a contar en otro merecido articulo.
Una función sin ayudas
Uno de los tantos requerimientos expuestos por el cliente era el de crear una especie de cotizador de productos, donde el usuario publicara un producto en el cual estuviera interesado a adquirir, pero al mismo tiempo se realizara el registro del usuario, es decir, el usuario se registraba y creaba de manera simultanea un producto. En su momento realice una búsqueda para ver que plugin me facilitaba este proceso, pero en realidad no encontré alguno, ya que según el diseño el formulario era un registro con algunos campos personalizados y una organizacion de campos algo particular.
En este punto ya estaba usando Ultimate Member para la gestión de usuarios y directorio de estos. Lo que mas me llamo la atención de este plugin fue la manera en que podía personalizar el formulario de registro, algo que me facilito acomodarlo según el diseño provisto. Me había enfocado tanto en buscar un plugin para cargar el producto una vez se registrara el usuario que no me fije que Ultimate Member dispone de algunas acciones a usar según requiera el desarrollador, una de ella es la de um_after_user_is_approved
con la cual se puede realizar una acción después de que un usuario ha sido aprobado o registrado desde Ultimate Member.
Ya teniendo claro que Ultimate Member me brindaba algunas acciones bastantes útiles, me enfoque a usarlas para lo que requería, por lo que la solución no estaba en los plugins como tal, sino en el código.
Vamos a darle!
En este punto ya estaba en la etapa casi final del proyecto, ya que el punto de cargar un producto de Woocommerce cuando un usuario se registrara lo había tomado como algo difícil y por lo tanto lo había dejado de ultimo para implementar.
En síntesis, lo que hice fue crear un formulario de registro, asignar un rol de Ultimate Member a este formulario de registro, luego crear el formulario según el diseño, y luego implementar unas cuantas lineas de código para crear el producto y asignar los datos ingresados desde el formulario. No te preocupes, ya viene el ejemplo de como lo hice y espero que sea de gran utilidad.
Programando ando….
A continuación mostrare el código en general a usar, esta comentado antes de las lineas de «gran interés». Este código se debe de añadir en el archivo functions.php:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 | /* Codigo para Ultimate Member durante la aprobación del usuario */ add_action('um_after_user_is_approved', 'sync_um_and_wp_role', 99 ); function sync_um_and_wp_role( $user_id ) { /* Obtener el rol de Ultimate Member del usuario registrado */ $role = get_user_meta( $user_id, 'role', true ); $wp_user_object = new WP_User( $user_id ); if($role == "comprador"){ /*Cuando el usuario se registra para cotizar y cargar producto woocommerce*/ /*En caso de que se desee añadir un rol previamente creado en WP se hace uso de la siguiente linea*/ /*$wp_user_object->add_role('comprador');*/ /*Se obtienen los datos del productos desde el formulario*/ $nom_prod = um_user('nomb_prod'); $cat_prod = um_user('cate_prod'); $des_prod = um_user('deta_prod'); $val_prod = um_user('prec_prod'); /*Creamos un array con los datos basicos para crear el producto*/ $post = array( 'post_author' => $user_id, 'post_content' => $des_prod, 'post_status' => "publish", 'post_title' => $nom_prod, 'post_parent' => '', 'post_type' => "product", ); /*Creando el producto*/ $post_id = wp_insert_post( $post, $wp_error ); /*Modificamos algunos datos del producto*/ wp_set_object_terms( $post_id, $cat_prod, 'product_cat' ); wp_set_object_terms($post_id, 'simple', 'product_type'); /*Modificamos o actualizamos algunos datos del producto, en este caso hay campos vacios pero se pueden crear campos en el formulario para llenar los campos vacios en el siguiente bloque*/ update_post_meta( $post_id, '_visibility', 'visible' ); update_post_meta( $post_id, '_stock_status', 'instock'); update_post_meta( $post_id, 'total_sales', '0'); update_post_meta( $post_id, '_downloadable', 'no'); update_post_meta( $post_id, '_virtual', 'no'); update_post_meta( $post_id, '_regular_price', $val_prod ); update_post_meta( $post_id, '_sale_price', "" ); update_post_meta( $post_id, '_featured', "no" ); update_post_meta( $post_id, '_weight', "" ); update_post_meta( $post_id, '_price', "" ); update_post_meta( $post_id, '_sold_individually', "" ); update_post_meta( $post_id, '_product_image_gallery', ''); /*En caso de que hayan campos personalizados se modificarian de la siguiente manera*/ /*update_post_meta( $post_id, 'cant_prod', $cannegocio ); update_post_meta( $post_id, 'presupuesto_prod', $valnegocio ); */ /*Cargar la imagen principal del producto, para esto se crear un campo de imagen desde el formulario de registro*/ $result = um_user_uploads_uri().um_user('img_prod'); Generate_Featured_Image( $result, $post_id ); } } function Generate_Featured_Image( $image_url, $post_id ){ $upload_dir = wp_upload_dir(); $image_data = file_get_contents($image_url); $filename = basename($image_url); if(wp_mkdir_p($upload_dir['path'])) $file = $upload_dir['path'] . '/' . $filename; else $file = $upload_dir['basedir'] . '/' . $filename; file_put_contents($file, $image_data); $wp_filetype = wp_check_filetype($filename, null ); $attachment = array( 'post_mime_type' => $wp_filetype['type'], 'post_title' => sanitize_file_name($filename), 'post_content' => '', 'post_status' => 'inherit' ); $attach_id = wp_insert_attachment( $attachment, $file, $post_id ); require_once(ABSPATH . 'wp-admin/includes/image.php'); $attach_data = wp_generate_attachment_metadata( $attach_id, $file ); $res1= wp_update_attachment_metadata( $attach_id, $attach_data ); $res2= set_post_thumbnail( $post_id, $attach_id ); } |
/* Codigo para Ultimate Member durante la aprobación del usuario */ add_action('um_after_user_is_approved', 'sync_um_and_wp_role', 99 ); function sync_um_and_wp_role( $user_id ) { /* Obtener el rol de Ultimate Member del usuario registrado */ $role = get_user_meta( $user_id, 'role', true ); $wp_user_object = new WP_User( $user_id ); if($role == "comprador"){ /*Cuando el usuario se registra para cotizar y cargar producto woocommerce*/ /*En caso de que se desee añadir un rol previamente creado en WP se hace uso de la siguiente linea*/ /*$wp_user_object->add_role('comprador');*/ /*Se obtienen los datos del productos desde el formulario*/ $nom_prod = um_user('nomb_prod'); $cat_prod = um_user('cate_prod'); $des_prod = um_user('deta_prod'); $val_prod = um_user('prec_prod'); /*Creamos un array con los datos basicos para crear el producto*/ $post = array( 'post_author' => $user_id, 'post_content' => $des_prod, 'post_status' => "publish", 'post_title' => $nom_prod, 'post_parent' => '', 'post_type' => "product", ); /*Creando el producto*/ $post_id = wp_insert_post( $post, $wp_error ); /*Modificamos algunos datos del producto*/ wp_set_object_terms( $post_id, $cat_prod, 'product_cat' ); wp_set_object_terms($post_id, 'simple', 'product_type'); /*Modificamos o actualizamos algunos datos del producto, en este caso hay campos vacios pero se pueden crear campos en el formulario para llenar los campos vacios en el siguiente bloque*/ update_post_meta( $post_id, '_visibility', 'visible' ); update_post_meta( $post_id, '_stock_status', 'instock'); update_post_meta( $post_id, 'total_sales', '0'); update_post_meta( $post_id, '_downloadable', 'no'); update_post_meta( $post_id, '_virtual', 'no'); update_post_meta( $post_id, '_regular_price', $val_prod ); update_post_meta( $post_id, '_sale_price', "" ); update_post_meta( $post_id, '_featured', "no" ); update_post_meta( $post_id, '_weight', "" ); update_post_meta( $post_id, '_price', "" ); update_post_meta( $post_id, '_sold_individually', "" ); update_post_meta( $post_id, '_product_image_gallery', ''); /*En caso de que hayan campos personalizados se modificarian de la siguiente manera*/ /*update_post_meta( $post_id, 'cant_prod', $cannegocio ); update_post_meta( $post_id, 'presupuesto_prod', $valnegocio ); */ /*Cargar la imagen principal del producto, para esto se crear un campo de imagen desde el formulario de registro*/ $result = um_user_uploads_uri().um_user('img_prod'); Generate_Featured_Image( $result, $post_id ); } } function Generate_Featured_Image( $image_url, $post_id ){ $upload_dir = wp_upload_dir(); $image_data = file_get_contents($image_url); $filename = basename($image_url); if(wp_mkdir_p($upload_dir['path'])) $file = $upload_dir['path'] . '/' . $filename; else $file = $upload_dir['basedir'] . '/' . $filename; file_put_contents($file, $image_data); $wp_filetype = wp_check_filetype($filename, null ); $attachment = array( 'post_mime_type' => $wp_filetype['type'], 'post_title' => sanitize_file_name($filename), 'post_content' => '', 'post_status' => 'inherit' ); $attach_id = wp_insert_attachment( $attachment, $file, $post_id ); require_once(ABSPATH . 'wp-admin/includes/image.php'); $attach_data = wp_generate_attachment_metadata( $attach_id, $file ); $res1= wp_update_attachment_metadata( $attach_id, $attach_data ); $res2= set_post_thumbnail( $post_id, $attach_id ); }
Lo anterior no tiene nada complejo, pero a continuación explico lo mas importante a tener en cuenta:
1. En la linea 7, se obtiene el rol de Ultimate Member del usuario registrado.
2. En la linea 16, asignamos un rol de WordPress al nuevo usuario registrado, algunas veces es necesario esto debido a que unos cuantos plugins basan su funcionalidad dependiendo del rol del usuario. Si no se necesita asignar un rol de WordPress, solo se debe de omitir esta linea.
3. De la linea 19 a la 22 se obtienen los datos a configurar en el producto a crear. um_user
es la función que retorna los datos de los campos creados en un formulario de Ultimate Member, estos campos se les asigna o ya tienen un Meta Key asignado en cada campo.
4. En las lineas 58 y 59 se asignan algunos datos a campos personalizados en Woocommerce, los cuales fueron creados desde código.
5. En la linea 64 la función um_user_uploads_uri
es para obtener la de la carpeta para las imágenes cargadas por el usuario, y con um_user('img_producto')
obtenemos el nombre de la imagen a configurar como la imagen principal.
6. En la linea 65 se encuentra la función encargada para tomar la imagen brindada por el formulario, y genera la imagen principal para el producto.
¿Como funciona? (Video)
A continuación un video explicando el funcionamiento del código. El entorno de prueba tiene las siguientes caracteristicas:
1. Servidor local, usando XAMPP 5.5.38
2. WordPress – ultima versión
3. Woocommerce – ultima versión
4. Ultimate Member – ultima versión
Saludos, buen articulo. Me dio risa encontrar esto después de llevar varios días desarrollando algo parecido para crear «employees» (post’s customer) de la plantilla Sidney al aprobar un usuario. Aún no lo termino pero aprovecho este contenido para terminar la carga de la imagen.
Te felicito, excelente aporte!
Gracias desde Venezuela!!!!