The objective is simply to have a completed sale via WooCommerce automatically register the customer for a webinar at GoToWebinar.com. The two main complicating factors are 1) GTW’s complicated API, which requires multiple authentication steps, including the re-acquisition of time-limited tokens via a custom GTW app, and 2) addition of a custom field to WooCommerce product variations.
To achieve the first goal, rather than write a completely new application or fork the existing one, I found it more practical to install a plugin from the WordPress repo – GoToWP, – and utilize its already reasonably well-developed authentication and synchronization features. All of the code is therefore enclosed in a function_exists()
conditional, and the main new function is a custom function that in turn relies on options settings derived from the plugin.
The downside of this approach is that it relies on GoToWP remaining reasonably well-updated. However, that will be a risk with any application based on an API, since those are subject to change – as anyone coding for Facebook or Instagram or Twitter, et al, can attest. The plugin authors have been in business since 2012, and maintain a site selling numerous GoTo… plugins, so they seem as good a bet as any, even if they haven’t updated this particular plugin in around a year. (If GoToWP falls behind, then a new set of functions to replace gotowp_personal_get_organizer_key()
, gotowp_personal_get_access_token()
, and also gotowp_personal_json_decode
will have to be written, as well as new admin page code for setting and syncing if desired.)
//don't do any of this if Go to Webinar plugin is not installed if ( function_exists( 'gotowp_personal_get_organizer_key' ) ) : /** * Upon completion of WooCommerce payment, create Webinar Registrant * using WooCommerce Order data and Product Variation Custom Field **/ add_action( 'woocommerce_payment_complete', 'gotoweb_wooc_add_on', 10, 1 ) ; function gotoweb_wooc_add_on( $order_id ) { $order = wc_get_order( $order_id ); $form_data = array( 'firstName' => $order->get_billing_first_name(), 'lastName' => $order->get_billing_last_name(), 'email' => $order->get_billing_email(), ) ; $items = $order->get_items(); foreach ( $items as $item ) { $webinar_id = get_post_meta( $item->get_variation_id(), 'webinar_id', true ) ; if ( $webinar_id ) { $registrant = ckm_gotowp_personal_create_registrant( $webinar_id, $form_data ) ; } } } /** *Use "gotowp_personal' options for authentication purposes **/ function ckm_gotowp_personal_create_registrant( $webinar_id, $form_data ) { //two critical GoToWP Personal functions $organizer_key = gotowp_personal_get_organizer_key(); $access_token = gotowp_personal_get_access_token(); $gtw_url = 'https://api.getgo.com/G2W/rest/v2/organizers/' . $organizer_key . '/webinars/' . $webinar_id . '/registrants'; $json_feed = wp_remote_post($gtw_url, array( 'headers' => array( 'Authorization' => $access_token, 'Accept' => 'application/vnd.citrix.g2wapi-v1.1+json', ), 'body' => json_encode( $form_data ), )); $json_response = wp_remote_retrieve_response_code( $json_feed ); if ( $json_response == 201 ) { $json_data = wp_remote_retrieve_body( $json_feed ); //critical GoToWP Personal function $registrant = gotowp_personal_json_decode( $json_data ); if ( isset( $registrant->registrantKey ) ) { return $registrant; } return false; } else { return false; } } /** CREATE CUSTOM FIELD IN PRODUCT VARIATIONS * Code framework from https://businessbloomer.com/woocommerce-add-custom-field-product-variation/ **/ // Add custom field input @ Product Data > Variations > Single Variation add_action( 'woocommerce_variation_options_pricing', 'ckm_add_custom_field_to_variations', 10, 3 ); function ckm_add_custom_field_to_variations( $loop, $variation_data, $variation ) { woocommerce_wp_text_input( array( 'id' => 'webinar_id[' . $loop . ']', 'class' => 'short', 'label' => __( 'Webinar ID', 'woocommerce' ), 'value' => get_post_meta( $variation->ID, 'webinar_id', true ) ) ); } //Save custom field on product variation save add_action( 'woocommerce_save_product_variation', 'ckm_save_custom_field_variations', 10, 2 ); function ckm_save_custom_field_variations( $variation_id, $i ) { $custom_field = $_POST['webinar_id'][$i]; if ( isset( $custom_field ) ) { update_post_meta( $variation_id, 'webinar_id', esc_attr( $custom_field ) ); } } //Store custom field value into variation data add_filter( 'woocommerce_available_variation', 'ckm_add_custom_field_variation_data' ); function ckm_add_custom_field_variation_data( $variations ) { $variations['webinar_id'] = '<div class="woocommerce_custom_field">Webinar ID: <span>' . get_post_meta( $variations[ 'webinar_id' ], 'webinar_id', true ) . '</span></div>'; return $variations; } endif; //if GTW plugin active