ID); if ($product && $product->get_type() === Yoone_Product_Bundles::TYPE) { // 加载插件内的完整页面模板 $new_template = YOONE_PB_PATH . 'templates/single-product-yoone-bundle.php'; if (file_exists($new_template)) { return $new_template; } } } return $template; } /** * 在混装产品页增加 body class。 */ public function filter_body_class($classes) { global $post; if (is_singular('product') && $post) { $product = wc_get_product($post->ID); if ($product && $product->get_type() === Yoone_Product_Bundles::TYPE) { $classes[] = 'yoone-bundle-product'; } } return $classes; } /** * 校验混装产品加入购物车:至少选择一个组件。 */ public function validate_add_to_cart($passed, $product_id, $quantity, $variation_id = null, $variations = null, $cart_item_data = null) { $product = wc_get_product($product_id); if ($product->get_type() !== Yoone_Product_Bundles::TYPE) { return $passed; } $config = Yoone_Product_Bundles::get_bundle_config($product); $min_qty = max(1, absint($config['min_qty'])); $components = !empty($_POST['yoone_bundle_components']) ? $_POST['yoone_bundle_components'] : array(); $total_qty = 0; foreach ($components as $comp_id => $qty) { $qty = absint($qty); if ($qty > 0) { $total_qty += $qty; } } if ($total_qty < $min_qty) { wc_add_notice(sprintf(__('您需要至少选择 %d 件商品才能将此混装包加入购物车。', 'yoone-product-bundles'), $min_qty), 'error'); return false; } return $passed; } /** * 将混装组件数据添加到购物车项目。 */ public function add_cart_item_data($cart_item_data, $product_id, $variation_id) { $product = wc_get_product($product_id); if ($product->get_type() !== Yoone_Product_Bundles::TYPE) { return $cart_item_data; } if (isset($_POST['yoone_bundle_components'])) { $components = array(); foreach ($_POST['yoone_bundle_components'] as $comp_id => $qty) { $qty = absint($qty); if ($qty > 0) { $components[absint($comp_id)] = $qty; } } if (!empty($components)) { $cart_item_data['yoone_bundle_components'] = $components; } } return $cart_item_data; } /** * 在购物车和订单中显示混装组件的摘要。 */ public function display_cart_item_data($item_data, $cart_item) { if (empty($cart_item['yoone_bundle_components'])) { return $item_data; } $value = ""; foreach ($cart_item['yoone_bundle_components'] as $pid => $qty) { $product = wc_get_product($pid); if ($product) { $value .= $product->get_name() . ' × ' . $qty . "; "; } } $item_data[] = array( 'key' => __('混装明细', 'yoone-product-bundles'), 'value' => rtrim($value, "; "), 'display' => '' ); return $item_data; } /** * 在将商品添加到购物车之前,根据所选组件动态计算混装产品的总价。 */ public function adjust_bundle_price($cart) { if (is_admin() && !defined('DOING_AJAX')) return; foreach ($cart->get_cart() as $cart_item_key => $cart_item) { if (isset($cart_item['yoone_bundle_components'])) { $total_price = 0; foreach ($cart_item['yoone_bundle_components'] as $pid => $qty) { $product = wc_get_product($pid); if ($product) { $total_price += (float) $product->get_price() * $qty; } } $cart_item['data']->set_price($total_price); } } } }