product details
This commit is contained in:
@@ -1,136 +1,63 @@
|
||||
<?php
|
||||
|
||||
if ( ! defined( 'ABSPATH' ) ) {
|
||||
exit; // Exit if accessed directly
|
||||
}
|
||||
|
||||
/**
|
||||
* Implementas groups of optional packages available for wiaas standard package type
|
||||
*
|
||||
* Class Wiaas_Package_Option_Groups
|
||||
*/
|
||||
class Wiaas_Package_Option_Groups {
|
||||
|
||||
private static $package_option_groups_meta_key = '_wiaas_package_option_groups';
|
||||
|
||||
private static $cart_item_option_items_key = '_wiaas_option_items';
|
||||
|
||||
private static $cart_item_option_parent_key = '_wiaas_option_for';
|
||||
|
||||
public static function init() {
|
||||
|
||||
self::_add_options_hooks();
|
||||
|
||||
add_action( 'woocommerce_checkout_create_order_line_item', array( __CLASS__, 'add_order_item_meta' ), 10, 3 );
|
||||
|
||||
add_filter( 'woocommerce_hidden_order_itemmeta', array( __CLASS__, 'hidden_order_item_meta' ) );
|
||||
add_filter('wiaas_package_types', array( __CLASS__, 'register_option_package_type' ) );
|
||||
}
|
||||
|
||||
private static function _add_options_hooks() {
|
||||
// Add bundle-specific cart item data based on posted vars.
|
||||
add_filter( 'woocommerce_add_cart_item_data', array( __CLASS__, 'add_cart_item_data' ), 10, 2 );
|
||||
/**
|
||||
* Register option as ne of available wiaas package types
|
||||
* @param $package_types
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public static function register_option_package_type($package_types) {
|
||||
$package_types[] = 'option';
|
||||
|
||||
// Add option items to the cart.
|
||||
add_action( 'woocommerce_add_to_cart', array( __CLASS__, 'add_options_to_cart' ), 10, 6 );
|
||||
return $package_types;
|
||||
}
|
||||
|
||||
private static function _remove_options_hooks() {
|
||||
/**
|
||||
* Retrives options group name for package option
|
||||
* @param $package
|
||||
* @param $option_package
|
||||
*
|
||||
* @return string|null
|
||||
*/
|
||||
public static function get_group_name_for_package_option($package, $option_package) {
|
||||
$option_groups = $package->get_meta( '_wiaas_package_option_groups' );
|
||||
|
||||
remove_filter( 'woocommerce_add_cart_item_data', array( __CLASS__, 'add_cart_item_data' ));
|
||||
|
||||
remove_action('woocommerce_add_to_cart', array( __CLASS__, 'add_options_to_cart' ));
|
||||
}
|
||||
|
||||
public static function add_order_item_meta( $order_item, $cart_item_key, $cart_item ){
|
||||
if (isset($cart_item[self::$cart_item_option_items_key])) {
|
||||
$order_item->add_meta_data( self::$cart_item_option_items_key, $cart_item[self::$cart_item_option_items_key] );
|
||||
}
|
||||
if (isset($cart_item[self::$cart_item_option_parent_key])) {
|
||||
$order_item->add_meta_data( self::$cart_item_option_parent_key, $cart_item[self::$cart_item_option_parent_key], true );
|
||||
}
|
||||
}
|
||||
|
||||
public static function hidden_order_item_meta( $hidden ) {
|
||||
|
||||
return array_merge( $hidden, array(
|
||||
self::$cart_item_option_items_key,
|
||||
self::$cart_item_option_parent_key,
|
||||
) );
|
||||
}
|
||||
|
||||
public static function set_package_option_groups($package, $groups_data) {
|
||||
$package->update_meta_data( self::$package_option_groups_meta_key, $groups_data );
|
||||
$package->save_meta_data();
|
||||
}
|
||||
|
||||
public static function add_cart_item_data($cart_item_data, $package_id) {
|
||||
|
||||
// If cart item that will be added is actually requested package
|
||||
if ($_POST['package_id'] = $package_id) {
|
||||
// Prepare additional data for later use.
|
||||
if ( ! isset( $cart_item_data[self::$cart_item_option_items_key] ) ) {
|
||||
$cart_item_data[self::$cart_item_option_items_key ] = array();
|
||||
}
|
||||
}
|
||||
|
||||
return $cart_item_data;
|
||||
}
|
||||
|
||||
public static function add_options_to_cart($cart_item_key, $package_id, $quantity, $variation_id, $variation, $cart_item_data) {
|
||||
|
||||
$is_option_parent = $_POST['package_id'] = $package_id && isset($cart_item_data[self::$cart_item_option_items_key]);
|
||||
$has_selected_options = isset($_POST['options']) && is_array($_POST['options']);
|
||||
|
||||
if ($is_option_parent && $has_selected_options) {
|
||||
|
||||
self::_remove_options_hooks();
|
||||
|
||||
$options_ids = $_POST['options'];
|
||||
|
||||
foreach ($options_ids as $option_id) {
|
||||
$option_package = wc_get_product($option_id);
|
||||
if (is_object($option_package)) {
|
||||
|
||||
$option_cart_item_key = WC()->cart->add_to_cart($option_id);
|
||||
|
||||
if ($option_cart_item_key) {
|
||||
WC()->cart->cart_contents[$option_cart_item_key][self::$cart_item_option_parent_key] = $cart_item_key;
|
||||
|
||||
WC()->cart->cart_contents[ $cart_item_key ][self::$cart_item_option_items_key][] = $option_cart_item_key;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
self::_add_options_hooks();
|
||||
}
|
||||
}
|
||||
|
||||
public static function get_cart_item_options($cart_item) {
|
||||
$option_cart_items = array();
|
||||
|
||||
if (isset($cart_item[self::$cart_item_option_items_key])) {
|
||||
$option_cart_items_ids = $cart_item[self::$cart_item_option_items_key];
|
||||
|
||||
foreach ($option_cart_items_ids as $option_cart_item_id) {
|
||||
$option_cart_item = WC()->cart->get_cart_item($option_cart_item_id);
|
||||
|
||||
if (isset($option_cart_item)) {
|
||||
$option_cart_items[] = $option_cart_item;
|
||||
foreach ($option_groups as $option_group) {
|
||||
foreach ($option_group['options'] as $group_option_id) {
|
||||
if ((int) $group_option_id === $option_package->get_id()) {
|
||||
return $option_group['name'];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $option_cart_items;
|
||||
}
|
||||
|
||||
public static function get_order_item_options($order_items, $parent_order_item) {
|
||||
$option_order_items = array();
|
||||
|
||||
if (isset($parent_order_item['wiaas_option_items']) && isset($parent_order_item['bundle_cart_key'])) {
|
||||
foreach ($order_items as $order_item) {
|
||||
if (isset($order_item['bundle_cart_key']) && $order_item['wiaas_option_for'] === $parent_order_item['bundle_cart_key']) {
|
||||
$option_order_items[] = $order_item;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $option_order_items;
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve groups of optional packages configured for provided package
|
||||
* @param $package
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public static function get_package_option_groups($package) {
|
||||
|
||||
$groups_data = $package->get_meta( self::$package_option_groups_meta_key );
|
||||
$groups_data = $package->get_meta( '_wiaas_package_option_groups' );
|
||||
|
||||
$option_groups = array();
|
||||
|
||||
@@ -153,6 +80,16 @@ class Wiaas_Package_Option_Groups {
|
||||
|
||||
return $option_groups;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set groups of optional packages for provided package
|
||||
* @param $package
|
||||
* @param $groups_data
|
||||
*/
|
||||
public static function set_package_option_groups($package, $groups_data) {
|
||||
$package->update_meta_data( '_wiaas_package_option_groups', $groups_data );
|
||||
$package->save_meta_data();
|
||||
}
|
||||
}
|
||||
|
||||
Wiaas_Package_Option_Groups::init();
|
||||
Reference in New Issue
Block a user