yoone-wc-product-bundles/includes/admin/class-yoone-product-bundles...

106 lines
5.2 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
/**
* 后台:为混装产品提供配置界面(可混装商品、最小数量、分类)。
*/
defined('ABSPATH') || exit;
class Yoone_Product_Bundles_Admin {
protected static $instance = null;
public static function instance() {
if (null === self::$instance) self::$instance = new self();
return self::$instance;
}
private function __construct() {
// 添加一个产品数据标签页
add_filter('woocommerce_product_data_tabs', array($this, 'add_product_data_tab'));
// 对应的面板内容
add_action('woocommerce_product_data_panels', array($this, 'render_product_data_panel'));
// 保存配置
add_action('woocommerce_admin_process_product_meta', array($this, 'save_product_meta'));
}
public function add_product_data_tab($tabs) {
$tabs['yoone_bundle'] = array(
'label' => __('混装产品', 'yoone-product-bundles'),
'target' => 'yoone_bundle_data',
'class' => array('show_if_yoone_bundle'), // 仅当类型为 yoone_bundle 时显示
'priority' => 70,
);
return $tabs;
}
public function render_product_data_panel() {
global $post;
$product = wc_get_product($post->ID);
$config = Yoone_Product_Bundles::get_bundle_config($product);
$allowed = $config['allowed_products'];
$min_qty = $config['min_qty'];
$cats = $config['categories'];
echo '<div id="yoone_bundle_data" class="panel woocommerce_options_panel hidden">';
echo '<div class="options_group">';
echo '<p>' . esc_html__('配置可混装的简单商品、最小混装数量以及前端展示的分类分组。', 'yoone-product-bundles') . '</p>';
// 可混装商品:使用 Woo 的产品搜索select2multiple
echo '<p class="form-field"><label>' . esc_html__('可混装商品', 'yoone-product-bundles') . '</label>';
echo '<select class="wc-product-search" multiple style="width: 90%;" name="yoone_bundle_allowed_products[]" data-placeholder="' . esc_attr__('选择可混装的简单商品…', 'yoone-product-bundles') . '" data-action="woocommerce_json_search_products_and_variations">';
if (! empty($allowed)) {
foreach ($allowed as $pid) {
$p = wc_get_product($pid);
if ($p) {
printf('<option value="%d" selected>%s</option>', $pid, esc_html($p->get_formatted_name()));
}
}
}
echo '</select>';
echo '<span class="description">' . esc_html__('仅支持 simple product变体商品可在后续版本支持。', 'yoone-product-bundles') . '</span>';
echo '</p>';
// 最小混装数量
woocommerce_wp_text_input(array(
'id' => 'yoone_bundle_min_quantity',
'label' => __('最小混装数量', 'yoone-product-bundles'),
'type' => 'number',
'desc_tip' => true,
'description' => __('顾客选择的总数量需不小于该值,方可加入购物车。', 'yoone-product-bundles'),
'value' => $min_qty,
'custom_attributes' => array('min' => '0'),
));
// 展示分类product_cat
echo '<p class="form-field"><label>' . esc_html__('前端展示分类', 'yoone-product-bundles') . '</label>';
echo '<select class="wc-enhanced-select" multiple style="width: 90%;" name="yoone_bundle_categories[]" data-placeholder="' . esc_attr__('选择用于分组展示的分类…', 'yoone-product-bundles') . '">';
$terms = get_terms(array('taxonomy' => 'product_cat', 'hide_empty' => false));
foreach ($terms as $t) {
$selected = in_array($t->term_id, $cats, true) ? 'selected' : '';
printf('<option value="%d" %s>%s</option>', $t->term_id, $selected, esc_html($t->name));
}
echo '</select>';
echo '<span class="description">' . esc_html__('用于在前端页面按分类分组展示可混装商品(仅展示与所选分类匹配的可混装商品)。', 'yoone-product-bundles') . '</span>';
echo '</p>';
echo '</div>'; // options_group
echo '</div>'; // panel
}
public function save_product_meta($post_id) {
$product = wc_get_product($post_id);
if (! $product || $product->get_type() !== Yoone_Product_Bundles::TYPE) return;
// 保存 allowed products
$allowed = isset($_POST['yoone_bundle_allowed_products']) ? (array) $_POST['yoone_bundle_allowed_products'] : array();
$allowed = array_values(array_filter(array_map('absint', $allowed)));
update_post_meta($post_id, Yoone_Product_Bundles::META_ALLOWED_PRODUCTS, $allowed);
// 保存 min qty
$min_qty = isset($_POST['yoone_bundle_min_quantity']) ? absint($_POST['yoone_bundle_min_quantity']) : 0;
update_post_meta($post_id, Yoone_Product_Bundles::META_MIN_QTY, max(0, $min_qty));
// 保存 categories
$cats = isset($_POST['yoone_bundle_categories']) ? (array) $_POST['yoone_bundle_categories'] : array();
$cats = array_values(array_filter(array_map('absint', $cats)));
update_post_meta($post_id, Yoone_Product_Bundles::META_CATEGORIES, $cats);
}
}