File "class-ajax.php"

Full Path: /home/romayxjt/public_html/wp-content/plugins/orderable/inc/class-ajax.php
File size: 7.53 KB
MIME-type: text/x-php
Charset: utf-8

<?php
/**
 * Ajax methods.
 *
 * @package Orderable/Classes
 */

defined( 'ABSPATH' ) || exit;

/**
 * Ajax class.
 */
class Orderable_Ajax {
	/**
	 * Run.
	 */
	public static function run() {
		$methods = array(
			'get_product_options'    => true,
			'add_to_cart'            => true,
			'get_onboard_woo_fields' => false,
			'get_cart_item_options'  => true,
		);

		self::add_ajax_methods( $methods, __CLASS__ );
	}

	/**
	 * Add ajax methods helper.
	 *
	 * @param array         $methods
	 * @param object|string $class
	 */
	public static function add_ajax_methods( $methods, $class ) {
		if ( empty( $methods ) ) {
			return;
		}

		foreach ( $methods as $method => $nopriv ) {
			add_action( 'wp_ajax_orderable_' . $method, array( $class, $method ) );

			if ( $nopriv ) {
				add_action( 'wp_ajax_nopriv_orderable_' . $method, array( $class, $method ) );
			}
		}
	}

	/**
	 * Get product options for a variable product.
	 */
	public static function get_product_options() {
		$product_id = absint( filter_input( INPUT_POST, 'product_id', FILTER_SANITIZE_NUMBER_INT ) );

		if ( empty( $product_id ) ) {
			wp_send_json_error();
		}

		// phpcs:ignore WordPress.Security.NonceVerification
		$focus   = empty( $_POST['focus'] ) ? '' : sanitize_text_field( wp_unslash( $_POST['focus'] ) );
		$product = wc_get_product( $product_id );

		$response = array(
			'product_id' => $product_id,
			'product'    => $product,
		);

		if ( Orderable_Helpers::is_variable_product( $product->get_type() ) ) {
			$attributes           = Orderable_Products::get_available_attributes( $product );
			$available_variations = $product->get_available_variations();
			$variations_json      = wp_json_encode( $available_variations );
		}

		$args = array(
			'images' => true,
			'focus'  => $focus,
		);

		ob_start();

		include Orderable_Helpers::get_template_path( 'templates/product/options.php' );

		$response['html'] = ob_get_clean();

		wp_send_json_success( $response );
	}

	/**
	 * Get cart item options for a variable product.
	 */
	public static function get_cart_item_options() {
		// phpcs:ignore WordPress.Security.NonceVerification.Missing
		if ( empty( $_POST['cart_item_key'] ) ) {
			wp_send_json_error();
		}

		// phpcs:ignore WordPress.Security.NonceVerification.Missing
		$cart_item_key = sanitize_text_field( wp_unslash( $_POST['cart_item_key'] ) );

		if ( empty( $cart_item_key ) ) {
			wp_send_json_error();
		}

		$cart_item = WC()->cart->get_cart_item( $cart_item_key );

		if ( empty( $cart_item ) ) {
			wp_send_json_error();
		}

		$product_id = $cart_item['product_id'];
		$product    = wc_get_product( $product_id );

		$response = array(
			'product_id' => $product_id,
			'product'    => $product,
		);

		if ( Orderable_Helpers::is_variable_product( $product->get_type() ) ) {
			$selected             = $cart_item['variation'];
			$attributes           = Orderable_Products::get_available_attributes( $product );
			$available_variations = $product->get_available_variations();
			$variations_json      = html_entity_decode( wp_json_encode( $available_variations ) );
		}

		$args = array(
			'images' => true,
		);

		add_filter(
			'orderable_get_group_data',
			/**
			 * Fill the value of the fields.
			 *
			 * @param array $field_group The field group data.
			 *
			 * @return array
			 */
			function( $field_group ) use ( $cart_item ) {
				foreach ( $field_group as $key => $value ) {
					if ( empty( $cart_item['orderable_fields'][ $value['id'] ] ) ) {
						continue;
					}

					switch ( $value['type'] ) {
						case 'text':
							$field_group[ $key ]['default'] = $cart_item['orderable_fields'][ $value['id'] ]['value'];

							break;

						case 'select':
						case 'visual_radio':
							foreach ( $value['options'] as $key_option => $option ) {
								if ( $option['label'] === $cart_item['orderable_fields'][ $value['id'] ]['value'] ) {
									$field_group[ $key ]['options'][ $key_option ]['selected'] = '1';

									break;
								}
							}

							break;

						case 'visual_checkbox':
							foreach ( $value['options'] as $key_option => $option ) {
								if ( empty( $cart_item['orderable_fields'][ $value['id'] ]['value'] ) ) {
									continue;
								}

								$field_value = $cart_item['orderable_fields'][ $value['id'] ]['value'];

								if ( ! is_array( $field_value ) ) {
									continue;
								}

								if ( ! in_array( $option['label'], $field_value, true ) ) {
									$field_group[ $key ]['options'][ $key_option ]['selected'] = '0';
									continue;
								}

								$field_group[ $key ]['options'][ $key_option ]['selected'] = '1';
							}

							break;
					}
				}

				return $field_group;
			}
		);

		ob_start();

		include ORDERABLE_TEMPLATES_PATH . 'product/options.php';

		$response['html'] = ob_get_clean();

		wp_send_json_success( $response );
	}

	/**
	 * AJAX add to cart.
	 */
	public static function add_to_cart() {
		ob_start();

		// phpcs:disable WordPress.Security.NonceVerification.Missing
		$product_id = absint( filter_input( INPUT_POST, 'product_id', FILTER_SANITIZE_NUMBER_INT ) );

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

		$variation_id      = absint( filter_input( INPUT_POST, 'variation_id', FILTER_SANITIZE_NUMBER_INT ) );
		$quantity          = empty( $_POST['quantity'] ) ? 1 : wc_stock_amount( wp_unslash( $_POST['quantity'] ) );
		$passed_validation = apply_filters( 'woocommerce_add_to_cart_validation', true, $product_id, $quantity );
		$product_status    = get_post_status( $product_id );
		$attributes        = empty( $_POST['attributes'] ) ? array() : (array) json_decode( sanitize_text_field( wp_unslash( $_POST['attributes'] ) ), true );
		$attributes        = array_map( 'wp_unslash', array_filter( $attributes ) );

		if ( $passed_validation && false !== WC()->cart->add_to_cart( $product_id, $quantity, $variation_id, $attributes ) && 'publish' === $product_status ) {
			do_action( 'woocommerce_ajax_added_to_cart', $product_id );
		}

		WC_AJAX::get_refreshed_fragments();
		// phpcs:enable
	}

	/**
	 * Get countries states.
	 */
	public static function get_onboard_woo_fields() {
		$response = array(
			'default_country'    => self::get_default_country_options(),
			'business_address'   => WC()->countries->get_base_address(),
			'business_address_2' => WC()->countries->get_base_address_2(),
			'business_city'      => WC()->countries->get_base_city(),
			'business_postcode'  => WC()->countries->get_base_postcode(),
		);

		wp_send_json_success( $response );
	}

	/**
	 * Get country/state options.
	 *
	 * @return string
	 */
	public static function get_default_country_options() {
		$countries_states = Orderable_Settings::get_countries_states();

		if ( empty( $countries_states ) ) {
			return false;
		}

		ob_start();

		require ORDERABLE_INC_PATH . '/vendor/iconic-onboard/inc/class-settings.php';

		$base    = wc_get_base_location();
		$default = '';

		if ( isset( $base['country'] ) && isset( $countries_states[ 'country:' . $base['country'] ] ) ) {
			$default = 'country:' . $base['country'];
		}

		if ( isset( $base['country'] ) && isset( $base['state'] ) && isset( $countries_states[ $base['country'] ] ) ) {
			$state = 'state:' . $base['country'] . ':' . $base['state'];
			if ( isset( $countries_states[ $base['country'] ]['values'][ $state ] ) ) {
				$default = $state;
			}
		}

		Orderable_Onboard_Settings::generate_select_field(
			array(
				'id'      => 'default_country',
				'title'   => __( 'Country / State', 'orderable' ),
				'desc'    => '',
				'choices' => $countries_states,
				'value'   => $default,
				'name'    => '',
				'class'   => '',
			)
		);

		return strip_tags( ob_get_clean(), '<option><optgroup>' );
	}
}