spivurno
3/15/2015 - 5:04 AM

Gravity Wiz // WooCommerce Gravity Forms Product Add-ons // Process Feeds & Send Notifications

Gravity Wiz // WooCommerce Gravity Forms Product Add-ons // Process Feeds & Send Notifications

<?php
/**
 * Gravity Wiz // WooCommerce Gravity Forms Product Add-ons // Process Feeds & Send Notifications
 *
 * Process Gravity Forms feeds on checkout for any GF-powered product in the cart. Currently supports GF Mailchimp add-on.
 *
 * @version	  1.0
 * @author    David Smith <david@gravitywiz.com>
 * @license   GPL-2.0+
 * @link      http://gravitywiz.com/...
 *
 * Plugin Name: WooCommerce - Gravity Forms Product Add-Ons - Process Feeds & Notifications
 * Plugin URI: http://gravitywiz.com
 * Description: Process Gravity Forms feeds on checkout for any GF-powered product in the cart. Currently supports GF Mailchimp add-on.
 * Author: David Smith
 * Version: 1.0
 * Author URI: http://gravitywiz.com
 */
class GW_WCGFPA_Process_Feeds {

	private static $instance = null;

	public static function get_instance() {
		if( null == self::$instance )
			self::$instance = new self;
		return self::$instance;
	}

    private function __construct() {

	    add_action( 'init', array( $this, 'init' ), 11 );

    }

	function init() {

		add_filter( 'woocommerce_add_cart_item_data',         array( $this, 'add_cart_item_data' ), 10, 2 );
		add_filter( 'woocommerce_get_cart_item_from_session', array( $this, 'get_cart_item_from_session' ), 10, 2 );
		add_action( 'woocommerce_add_order_item_meta',        array( $this, 'add_order_item_meta' ), 10, 2 );

		add_action( 'woocommerce_checkout_order_processed', array( $this, 'maybe_process_feeds' ) );

		remove_filter( 'gform_entry_post_save', array( GFMailChimp::get_instance(), 'maybe_process_feed' ), 10, 2 );

	}

	public function add_cart_item_data( $cart_item_meta, $product_id ) {

		// only add entry ID meta if WCGFPA plugin has added entry data for this product
		if( ! isset( $cart_item_meta['_gravity_form_lead'] ) ) {
			return $cart_item_meta;
		}

		$gravity_form_data = get_post_meta( $product_id, '_gravity_form_data', true );
		$form_id           = $gravity_form_data['id'];
		$entry             = GFFormDisplay::$submission[ $form_id ]['lead'];

		$cart_item_meta['_gf_entry_id'] = $entry['id'];

		return $cart_item_meta;
	}

	public function get_cart_item_from_session( $cart_item, $values ) {

		if ( isset( $values['_gf_entry_id'] ) ) {
			$cart_item['_gf_entry_id'] = $values['_gf_entry_id'];
		}

		return $cart_item;
	}

	public function add_order_item_meta( $item_id, $values ) {

		if( isset( $values['_gf_entry_id'] ) ) {
			wc_add_order_item_meta( $item_id, '_gf_entry_id', $values['_gf_entry_id'], true );
		}

	}

	public function maybe_process_feeds( $order_id ) {

		$order      = wc_get_order( $order_id );
		$line_items = $order->get_items( 'line_item' );

		foreach( $line_items as $item_id => $item ) {

			$entry_id = wc_get_order_item_meta( $item_id, '_gf_entry_id', true );
			if( ! $entry_id ) {
				continue;
			}

			$entry = GFAPI::get_entry( $entry_id );
			if( is_wp_error( $entry ) ) {
				continue;
			}

			$form = GFAPI::get_form( $entry['form_id'] );

			$this->process_feeds( $entry, $form );
			$this->send_notifications( $entry, $form );

		}

	}

	public function process_feeds( $entry, $form ) {

		$mailchimp = GFMailChimp::get_instance();
		$mailchimp->maybe_process_feed( $entry, $form );

	}

	public function send_notifications( $entry, $form ) {
		GFAPI::send_notifications( $form, $entry );
	}

}

function gw_wc_process_feeds() {
	return GW_WCGFPA_Process_Feeds::get_instance();
}

gw_wc_process_feeds();