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
