141 lines
6.2 KiB
PHP
141 lines
6.2 KiB
PHP
<?php
|
||
/**
|
||
* Yoone Product Bundles - 混装产品单页模板 (v2)
|
||
*
|
||
* 此模板将完全取代 WooCommerce 的默认 single-product.php,提供一个包含卡片式选项的自定义布局。
|
||
* 它通过调用 get_header(), get_footer() 和 do_action() 来确保与主题的兼容性。
|
||
*
|
||
* @version 2.0.0
|
||
*/
|
||
|
||
defined('ABSPATH') || exit;
|
||
|
||
global $product;
|
||
|
||
// 确保这是一个混装产品
|
||
if (!$product || $product->get_type() !== Yoone_Product_Bundles::TYPE) {
|
||
// 如果不是,则回退到标准模板
|
||
wc_get_template_part('content', 'single-product');
|
||
return;
|
||
}
|
||
|
||
// --- 数据准备逻辑 ---
|
||
$config = Yoone_Product_Bundles::get_bundle_config($product);
|
||
$allowed = $config['allowed_products'];
|
||
$min_qty = max(0, absint($config['min_qty']));
|
||
$cat_ids = $config['categories'];
|
||
|
||
$allowed_products = array();
|
||
foreach ($allowed as $pid) {
|
||
$p = wc_get_product($pid);
|
||
if ($p && $p->is_type('simple')) {
|
||
$allowed_products[$pid] = $p;
|
||
}
|
||
}
|
||
|
||
$groups = array();
|
||
if (!empty($cat_ids)) {
|
||
$others = array();
|
||
foreach ($allowed_products as $pid => $p) {
|
||
$terms = get_the_terms($pid, 'product_cat');
|
||
$matched = false;
|
||
if (is_array($terms)) {
|
||
foreach ($terms as $t) {
|
||
if (in_array($t->term_id, $cat_ids, true)) {
|
||
if (!isset($groups[$t->term_id])) {
|
||
$groups[$t->term_id] = array('term' => $t, 'items' => array());
|
||
}
|
||
$groups[$t->term_id]['items'][] = $p;
|
||
$matched = true;
|
||
}
|
||
}
|
||
}
|
||
if (!$matched) $others[] = $p;
|
||
}
|
||
if (!empty($others)) $groups[0] = array('term' => null, 'items' => $others);
|
||
} else {
|
||
$groups[0] = array('term' => null, 'items' => array_values($allowed_products));
|
||
}
|
||
// --- 数据准备逻辑结束 ---
|
||
|
||
get_header('shop');
|
||
?>
|
||
|
||
<?php do_action('woocommerce_before_main_content'); ?>
|
||
|
||
<div id="product-<?php the_ID(); ?>" <?php wc_product_class('yoone-bundle-product-page', $product); ?>>
|
||
|
||
<?php do_action('woocommerce_before_single_product_summary'); ?>
|
||
|
||
<div class="summary entry-summary">
|
||
<?php
|
||
do_action('woocommerce_single_product_summary');
|
||
?>
|
||
</div>
|
||
|
||
<div class="yoone-bundle-form-container">
|
||
<form class="cart yoone-bundle-form" action="<?php echo esc_url(apply_filters('woocommerce_add_to_cart_form_action', $product->get_permalink())); ?>" method="post" enctype="multipart/form-data">
|
||
<div class="yoone-bundle-meta">
|
||
<p class="yoone-bundle-min"><?php printf(esc_html__('至少选择 %d 件混装组件', 'yoone-product-bundles'), $min_qty); ?></p>
|
||
<p class="yoone-bundle-selected"><?php esc_html_e('当前选择数量:', 'yoone-product-bundles'); ?><span class="yoone-bundle-selected-count">0</span></p>
|
||
</div>
|
||
|
||
<?php if (empty($allowed_products)) : ?>
|
||
<p><?php esc_html_e('暂无可混装商品,请在后台为该混装产品配置。', 'yoone-product-bundles'); ?></p>
|
||
<?php else : ?>
|
||
<?php foreach ($groups as $gid => $group) : ?>
|
||
<div class="yoone-bundle-group">
|
||
<?php if (!empty($group['term'])) : ?>
|
||
<h3 class="yoone-bundle-group-title"><?php echo esc_html($group['term']->name); ?></h3>
|
||
<?php else : ?>
|
||
<h3 class="yoone-bundle-group-title"><?php esc_html_e('可混装商品', 'yoone-product-bundles'); ?></h3>
|
||
<?php endif; ?>
|
||
|
||
<?php if (empty($group['items'])) : ?>
|
||
<p class="yoone-bundle-no-items"><?php esc_html_e('该分组暂无可混装商品', 'yoone-product-bundles'); ?></p>
|
||
<?php else : ?>
|
||
<div class="yoone-bundle-items-wrapper">
|
||
<?php foreach ($group['items'] as $item) : ?>
|
||
<?php
|
||
$pid = $item->get_id();
|
||
$thumbnail = $item->get_image('woocommerce_thumbnail');
|
||
?>
|
||
<div class="yoone-bundle-item-card">
|
||
<div class="item-image">
|
||
<a href="<?php echo esc_url(get_permalink($pid)); ?>" target="_blank">
|
||
<?php echo $thumbnail ? $thumbnail : wc_placeholder_img('woocommerce_thumbnail'); ?>
|
||
</a>
|
||
</div>
|
||
<h4 class="item-title">
|
||
<a href="<?php echo esc_url(get_permalink($pid)); ?>" target="_blank"><?php echo esc_html($item->get_name()); ?></a>
|
||
</h4>
|
||
<div class="item-price">
|
||
<?php echo wp_kses_post($item->get_price_html()); ?>
|
||
</div>
|
||
<div class="item-quantity">
|
||
<input type="number" min="0" step="1" class="yoone-bundle-qty" name="yoone_bundle_components[<?php echo esc_attr($pid); ?>]" value="0" placeholder="0" />
|
||
</div>
|
||
</div>
|
||
<?php endforeach; ?>
|
||
</div>
|
||
<?php endif; ?>
|
||
</div>
|
||
<?php endforeach; ?>
|
||
<?php endif; ?>
|
||
|
||
<div class="yoone-bundle-actions">
|
||
<input type="hidden" name="add-to-cart" value="<?php echo esc_attr($product->get_id()); ?>" />
|
||
<button type="submit" class="single_add_to_cart_button button alt" disabled><?php esc_html_e('加入购物车', 'yoone-product-bundles'); ?></button>
|
||
</div>
|
||
</form>
|
||
</div>
|
||
|
||
<?php
|
||
do_action('woocommerce_after_single_product_summary');
|
||
?>
|
||
|
||
</div>
|
||
|
||
<?php do_action('woocommerce_after_single_product'); ?>
|
||
|
||
<?php get_footer('shop'); ?>
|