158 lines
4.9 KiB
PHP
158 lines
4.9 KiB
PHP
<?php
|
|
|
|
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' ) );
|
|
}
|
|
|
|
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 );
|
|
|
|
// Add option items to the cart.
|
|
add_action( 'woocommerce_add_to_cart', array( __CLASS__, 'add_options_to_cart' ), 10, 6 );
|
|
}
|
|
|
|
private static function _remove_options_hooks() {
|
|
|
|
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;
|
|
}
|
|
}
|
|
}
|
|
|
|
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;
|
|
}
|
|
|
|
public static function get_package_option_groups($package) {
|
|
|
|
$groups_data = $package->get_meta( self::$package_option_groups_meta_key );
|
|
|
|
$option_groups = array();
|
|
|
|
foreach ($groups_data as $group_data) {
|
|
$group = array(
|
|
'id' => $group_data['id'],
|
|
'name' => $group_data['name'],
|
|
'default' => $group_data['default'],
|
|
'options' => array()
|
|
);
|
|
|
|
foreach ($group_data['options'] as $option_id) {
|
|
$option_package = wc_get_product( $option_id );
|
|
if (is_object($option_package)) {
|
|
$group['options'][] = $option_package;
|
|
}
|
|
}
|
|
$option_groups[] = $group;
|
|
}
|
|
|
|
return $option_groups;
|
|
}
|
|
}
|
|
|
|
Wiaas_Package_Option_Groups::init(); |