get_type() === Yoone_Product_Bundles::TYPE) { // Replace price_html with hint, keep descriptions intact. $data['price_html'] = '' . esc_html__('Price depends on selected items.', 'yoone-product-bundles') . ''; } } catch (\Throwable $e) { // Fail silently to avoid breaking APFS rendering. } return $data; } /** * Declare APFS features supported by yoone_bundle products. * Mirrors capabilities of official 'bundle' type so APFS renders single-product options. * * @param bool $supported * @param WC_Product $product * @param string $feature * @return bool */ public static function product_supports_feature($supported, $product, $feature) { if (! $product || ! is_a($product, 'WC_Product')) { return $supported; } if ($product->get_type() !== Yoone_Product_Bundles::TYPE) { return $supported; } switch ($feature) { case 'subscription_schemes': case 'subscription_scheme_switching': case 'subscription_content_switching': case 'subscription_scheme_options_product_single': case 'subscription_scheme_options_product_cart': case 'subscription_management_add_to_subscription_product_single': return true; } return $supported; } /** * Ensure SATT admin tab is visible for yoone_bundle products. * * @param array $tabs * @return array */ public static function add_show_if_class_for_tab($tabs) { if (isset($tabs['satt'])) { if (! isset($tabs['satt']['class']) || ! is_array($tabs['satt']['class'])) { $tabs['satt']['class'] = array(); } $tabs['satt']['class'][] = 'show_if_' . Yoone_Product_Bundles::TYPE; // show_if_yoone_bundle } return $tabs; } /** * Ensure children of a yoone_bundle container inherit the same subscription scheme when it changes. * * @param array $cart_item * @param string $cart_item_key */ public static function propagate_scheme_to_children($cart_item, $cart_item_key) { if (empty($cart_item['yoone_bundle_container_id'])) { // Not a container; skip. return; } if (! isset($cart_item['wcsatt_data'])) { return; } $active_scheme = isset($cart_item['wcsatt_data']['active_subscription_scheme']) ? $cart_item['wcsatt_data']['active_subscription_scheme'] : null; if (null === $active_scheme) { // No explicit choice made; let APFS defaults handle children. return; } $container_id = $cart_item['yoone_bundle_container_id']; foreach (WC()->cart->get_cart() as $child_key => $child_item) { if (isset($child_item['yoone_bundle_parent_id']) && $child_item['yoone_bundle_parent_id'] === $container_id) { if (! isset(WC()->cart->cart_contents[$child_key]['wcsatt_data'])) { WC()->cart->cart_contents[$child_key]['wcsatt_data'] = array(); } WC()->cart->cart_contents[$child_key]['wcsatt_data']['active_subscription_scheme'] = $active_scheme; } } } } // Initialize after plugins are loaded to ensure APFS hooks are available. add_action('plugins_loaded', array('Yoone_PB_APFS_Integration', 'init'), 20);