# sellkit/1.3.2/includes/funnel/steps/checkout.php

SellKit – Funnel builder and checkout optimizer for WooCommerce to sell more, faster, version 1.3.2. 266 lines.

- Page: https://pluginprobe.com/plugins/sellkit/1.3.2/code/includes/funnel/steps/checkout.php
- Raw: https://pluginprobe.com/plugins/sellkit/1.3.2/raw/includes/funnel/steps/checkout.php
- Modified: 2022-10-31T08:54:32+00:00

Line numbers below start at 1. Link to a line or a range by appending a fragment to the
page URL, for example `https://pluginprobe.com/plugins/sellkit/1.3.2/code/includes/funnel/steps/checkout.php#L10-L20`.

```php
<?php

namespace Sellkit\Funnel\Steps;

use Sellkit\Funnel\Analytics\Data_Updater;
use Sellkit_Funnel;

defined( 'ABSPATH' ) || die();

/**
 * Class Sellkit_Checkout.
 *
 * @SuppressWarnings(PHPMD.ExcessiveClassComplexity)
 * @since 1.1.0
 */
class Checkout {

	/**
	 * Funnel instance.
	 *
	 * @var Sellkit_Funnel Funnel object.
	 * @since 1.1.0
	 */
	public $funnel;

	/**
	 * Checkout constructor.
	 *
	 * @since 1.1.0
	 */
	public function __construct() {
		$this->update_funnel_data();

		if ( empty( $this->funnel->funnel_id ) ) {
			return;
		}

		add_action( 'woocommerce_checkout_create_order', [ $this, 'save_order_custom_meta_data' ], 10 );
		add_action( 'woocommerce_after_order_notes', [ $this, 'custom_checkout_hidden_fields' ], 10 );
		add_action( 'wc_ajax_update_order_review', [ $this, 'do_actions' ] );
	}

	/**
	 * Adding items to the checkout page.
	 *
	 * @since 1.1.0
	 * @SuppressWarnings(PHPMD.NPathComplexity)
	 * @SuppressWarnings(PHPMD.CyclomaticComplexity)
	 */
	public function do_actions() {
		// These variables should be used in checkout builder widget.
		$funnel_data       = $this->funnel->current_step_data;
		$optimization_data = ! empty( $funnel_data['data']['optimization'] ) ? $funnel_data['data']['optimization'] : '';
		$redirect_url      = ! empty( $optimization_data['closed_checkout_redirect_url'] ) ? $optimization_data['closed_checkout_redirect_url'] : site_url();

		add_action( 'template_redirect', function () use ( $funnel_data ) {
			$product_settings = ! empty( $funnel_data['data']['products']['settings'] ) ? $funnel_data['data']['products']['settings'] : '';
			$bump_data        = ! empty( $funnel_data['bump'] ) ? $funnel_data['bump'] : '';

			if ( ! empty( $product_settings ) ) {
				set_query_var( 'funnel_product_settings', $product_settings );
			}

			if ( ! empty( $bump_data ) ) {
				$bump_data = $this->get_valid_bumps( $bump_data );

				set_query_var( 'bump_data', $bump_data );
			}
		} );

		if (
			! empty( $optimization_data['expiration_date'] ) &&
			! empty( $optimization_data['expire_checkout_coupons_switch'] ) &&
			time() > $optimization_data['expiration_date'] &&
			'on' === $optimization_data['expire_checkout_coupons_switch']
		) {
			wp_redirect( $redirect_url ); // phpcs:ignore
			exit;
		}

		if ( empty( $funnel_data ) ) {
			return;
		}

		if (
			empty( $funnel_data['data']['products']['list'] ) ||
			! is_array( $funnel_data['data']['products']['list'] )
		) {
			return;
		}

		$funnel_products = $funnel_data['data']['products']['list'];

		if ( ! sellkit()->has_valid_dependencies() ) {
			return;
		}

		$action = sellkit_htmlspecialchars( INPUT_GET, 'wc-ajax' );

		if ( 'update_order_review' !== $action && 'checkout' !== $action ) {
			wc()->cart->empty_cart();

			foreach ( $funnel_products as $product_id => $product ) {
				$quantity = ! empty( $product['quantity'] ) ? $product['quantity'] : 1;

				wc()->cart->add_to_cart( $product_id, $quantity );
			}
		}

		if ( empty( $optimization_data ) ) {
			return;
		}

		if ( self::apply_coupon_validation( $optimization_data ) ) {
			foreach ( $optimization_data['auto_apply_coupons'] as $auto_apply_coupon ) {
				wc()->cart->add_discount( get_the_title( $auto_apply_coupon['value'] ) );
			}

			wc_clear_notices();
		}
	}

	/**
	 * Saving the funnel data to the order.
	 *
	 * @since 1.1.0
	 * @param object $order Order object.
	 */
	public function save_order_custom_meta_data( $order ) {
		if ( empty( $this->funnel->next_step_data ) ) {
			return;
		}

		$analytics_updater = new Data_Updater();

		$analytics_updater->set_funnel_id( $this->funnel->funnel_id );
		$analytics_updater->add_new_order_log( $order );

		$order->update_meta_data( 'sellkit_funnel_next_step_data', $this->funnel->next_step_data );
	}

	/**
	 * Adding page id field to the inputs.
	 *
	 * @since 1.1.0
	 */
	public function custom_checkout_hidden_fields() {
		woocommerce_form_field( 'sellkit_current_page_id', [
			'type'  => 'hidden',
			'class' => [ 'hidden form-row-wide' ],
		], get_the_ID() );
	}

	/**
	 * Check If a coupon should be applied.
	 *
	 * @since 1.1.0
	 * @param array $optimization_data Optimization data.
	 */
	public static function apply_coupon_validation( $optimization_data ) {
		if (
			empty( $optimization_data['auto_apply_coupons_switch'] ) ||
			'on' !== $optimization_data['auto_apply_coupons_switch']
		) {
			return false;
		}

		if (
			empty( $optimization_data['auto_apply_coupons'] ) ||
			! is_array( $optimization_data['auto_apply_coupons'] )
		) {
			return false;
		}

		return true;
	}

	/**
	 * Calculate total discount.
	 *
	 * @since 1.1.0
	 * @param string $total Total.
	 * @param string $value Value.
	 * @param string $type  Type.
	 * @return false|float|int|mixed
	 */
	public function calculate_discount( $total, $value, $type ) {
		if ( empty( $value ) || 1 > $value ) {
			return 0;
		}

		if ( strpos( $type, 'fixed' ) !== false ) {
			return $value;
		}

		if ( strpos( $type, 'percentage' ) !== false ) {
			return ( floatval( $total ) * floatval( $value ) ) / 100;
		}

		return 0;
	}

	/**
	 * Gets extracted post data.
	 *
	 * @since 1.1.0
	 * @param string $post_data Post data.
	 */
	private function get_current_page_id_by_post_data( $post_data ) {
		$vars           = explode( '&', $post_data );
		$extracted_data = [];

		foreach ( $vars as $value ) {
			$result                       = explode( '=', urldecode( $value ) );
			$extracted_data[ $result[0] ] = $result[1];
		}

		if ( empty( $extracted_data['sellkit_current_page_id'] ) ) {
			return null;
		}

		return $extracted_data['sellkit_current_page_id'];
	}

	/**
	 * Checks all bumps and return data.
	 *
	 * @since 1.1.0
	 * @param array $bump_data Bump data.
	 */
	public function get_valid_bumps( $bump_data ) {
		$valid_bumps = [];

		foreach ( $bump_data as $bump ) {
			$conditions = ! empty( $bump['data']['conditions'] ) ? $bump['data']['conditions'] : '';

			if ( ! empty( $conditions ) && empty( sellkit_conditions_validation( $conditions ) ) ) {
				continue;
			}

			$valid_bumps[] = $bump;
		}

		return $valid_bumps;
	}

	/**
	 * Updates funnel data.
	 *
	 * @since 1.1.0
	 */
	public function update_funnel_data() {
		$action = sellkit_htmlspecialchars( INPUT_GET, 'wc-ajax' );

		if ( 'update_order_review' === $action ) {
			$post_data = sellkit_htmlspecialchars( INPUT_POST, 'post_data' );

			$this->funnel = new Sellkit_Funnel( $this->get_current_page_id_by_post_data( $post_data ) );

			return;
		}

		$this->funnel = Sellkit_Funnel::get_instance();
	}
}

```
