文章目录[隐藏]
WordPress文创商品柔性预售与社区团购插件集成教程
一、项目概述与需求分析
在文创电商领域,柔性预售和社区团购是两种极具潜力的商业模式。柔性预售允许商家根据订单量灵活安排生产,减少库存压力;社区团购则通过社交裂变实现低成本获客。本教程将指导您如何在WordPress中集成这两种功能。
核心需求:
- 商品支持预售模式,可设置预售期限和最小起订量
- 社区团购功能,支持团长管理和佣金结算
- 用户友好的前台界面和后台管理
- 与WooCommerce无缝集成
二、环境准备与插件规划
2.1 环境要求
<?php
/**
* 检查系统环境要求
* 需要PHP 7.4+、WordPress 5.6+、WooCommerce 4.0+
*/
function check_environment_requirements() {
$errors = array();
// 检查PHP版本
if (version_compare(PHP_VERSION, '7.4.0', '<')) {
$errors[] = '需要PHP 7.4或更高版本';
}
// 检查WordPress版本
if (version_compare(get_bloginfo('version'), '5.6', '<')) {
$errors[] = '需要WordPress 5.6或更高版本';
}
// 检查WooCommerce是否激活
if (!class_exists('WooCommerce')) {
$errors[] = '需要安装并激活WooCommerce插件';
}
return $errors;
}
// 执行环境检查
$env_errors = check_environment_requirements();
if (!empty($env_errors)) {
foreach ($env_errors as $error) {
echo '<div class="error"><p>' . esc_html($error) . '</p></div>';
}
}
?>
2.2 插件结构规划
wp-content/plugins/cultural-presale-groupbuy/
├── assets/ # 静态资源
├── includes/ # 核心代码
│ ├── class-presale.php
│ ├── class-groupbuy.php
│ └── class-integration.php
├── templates/ # 模板文件
├── cultural-presale-groupbuy.php # 主文件
└── uninstall.php # 卸载脚本
三、预售功能开发实现
3.1 预售商品数据模型
<?php
/**
* 预售商品自定义字段
*/
class Cultural_Presale_Product {
/**
* 初始化预售功能
*/
public function init() {
// 添加商品预售设置字段
add_action('woocommerce_product_options_general_product_data', array($this, 'add_presale_fields'));
add_action('woocommerce_process_product_meta', array($this, 'save_presale_fields'));
// 修改商品显示
add_filter('woocommerce_get_price_html', array($this, 'display_presale_price'), 10, 2);
}
/**
* 添加预售设置字段到商品编辑页面
*/
public function add_presale_fields() {
global $product_object;
echo '<div class="options_group presale-options">';
// 预售开关
woocommerce_wp_checkbox(array(
'id' => '_is_presale',
'label' => __('启用预售', 'cultural-presale'),
'description' => __('启用商品预售功能', 'cultural-presale'),
'value' => $product_object->get_meta('_is_presale', true),
));
// 预售开始时间
woocommerce_wp_text_input(array(
'id' => '_presale_start_date',
'label' => __('预售开始时间', 'cultural-presale'),
'type' => 'datetime-local',
'value' => $product_object->get_meta('_presale_start_date', true),
));
// 预售结束时间
woocommerce_wp_text_input(array(
'id' => '_presale_end_date',
'label' => __('预售结束时间', 'cultural-presale'),
'type' => 'datetime-local',
'value' => $product_object->get_meta('_presale_end_date', true),
));
// 最小起订量
woocommerce_wp_text_input(array(
'id' => '_presale_min_qty',
'label' => __('最小起订量', 'cultural-presale'),
'type' => 'number',
'value' => $product_object->get_meta('_presale_min_qty', true) ?: 10,
'custom_attributes' => array('min' => '1'),
));
// 预计发货时间
woocommerce_wp_text_input(array(
'id' => '_estimated_delivery_date',
'label' => __('预计发货时间', 'cultural-presale'),
'type' => 'date',
'value' => $product_object->get_meta('_estimated_delivery_date', true),
));
echo '</div>';
}
/**
* 保存预售字段数据
*/
public function save_presale_fields($product_id) {
$product = wc_get_product($product_id);
// 保存预售开关
$is_presale = isset($_POST['_is_presale']) ? 'yes' : 'no';
$product->update_meta_data('_is_presale', $is_presale);
// 保存预售时间
if (isset($_POST['_presale_start_date'])) {
$product->update_meta_data('_presale_start_date', sanitize_text_field($_POST['_presale_start_date']));
}
if (isset($_POST['_presale_end_date'])) {
$product->update_meta_data('_presale_end_date', sanitize_text_field($_POST['_presale_end_date']));
}
// 保存最小起订量
if (isset($_POST['_presale_min_qty'])) {
$product->update_meta_data('_presale_min_qty', absint($_POST['_presale_min_qty']));
}
// 保存预计发货时间
if (isset($_POST['_estimated_delivery_date'])) {
$product->update_meta_data('_estimated_delivery_date', sanitize_text_field($_POST['_estimated_delivery_date']));
}
$product->save();
}
/**
* 显示预售价格信息
*/
public function display_presale_price($price, $product) {
if ($product->get_meta('_is_presale') === 'yes') {
$end_date = $product->get_meta('_presale_end_date');
$delivery_date = $product->get_meta('_estimated_delivery_date');
if ($end_date) {
$price .= '<div class="presale-badge">';
$price .= '<span class="presale-label">' . __('预售商品', 'cultural-presale') . '</span>';
$price .= '<span class="presale-end">' . sprintf(__('预售截止: %s', 'cultural-presale'), date('Y-m-d H:i', strtotime($end_date))) . '</span>';
if ($delivery_date) {
$price .= '<span class="delivery-date">' . sprintf(__('预计发货: %s', 'cultural-presale'), date('Y-m-d', strtotime($delivery_date))) . '</span>';
}
$price .= '</div>';
}
}
return $price;
}
}
// 初始化预售功能
$presale_product = new Cultural_Presale_Product();
$presale_product->init();
?>
四、社区团购功能开发
4.1 团长管理与佣金系统
<?php
/**
* 社区团购功能核心类
*/
class Cultural_Groupbuy {
private $table_name;
public function __construct() {
global $wpdb;
$this->table_name = $wpdb->prefix . 'cultural_groupbuy_leaders';
// 初始化数据库表
register_activation_hook(__FILE__, array($this, 'create_tables'));
// 添加用户角色
add_action('init', array($this, 'add_groupbuy_leader_role'));
// 团长申请表单
add_shortcode('groupbuy_leader_application', array($this, 'leader_application_form'));
}
/**
* 创建团长数据表
*/
public function create_tables() {
global $wpdb;
$charset_collate = $wpdb->get_charset_collate();
$sql = "CREATE TABLE IF NOT EXISTS {$this->table_name} (
id mediumint(9) NOT NULL AUTO_INCREMENT,
user_id bigint(20) NOT NULL,
community_name varchar(200) NOT NULL,
contact_phone varchar(20) NOT NULL,
wechat_id varchar(100),
address text NOT NULL,
status varchar(20) DEFAULT 'pending',
commission_rate decimal(5,2) DEFAULT 10.00,
total_commission decimal(10,2) DEFAULT 0.00,
created_at datetime DEFAULT CURRENT_TIMESTAMP,
updated_at datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (id),
KEY user_id (user_id),
KEY status (status)
) $charset_collate;";
require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
dbDelta($sql);
}
/**
* 添加团长用户角色
*/
public function add_groupbuy_leader_role() {
add_role('groupbuy_leader', __('社区团长', 'cultural-groupbuy'), array(
'read' => true,
'edit_posts' => false,
'delete_posts' => false,
'manage_groupbuy' => true,
));
}
/**
* 团长申请表单短代码
*/
public function leader_application_form() {
ob_start();
if (is_user_logged_in()) {
$user_id = get_current_user_id();
$existing_application = $this->get_leader_application($user_id);
if ($existing_application) {
echo '<div class="groupbuy-notice">';
echo '<p>' . sprintf(__('您已提交申请,当前状态: %s', 'cultural-groupbuy'),
$this->get_status_text($existing_application->status)) . '</p>';
echo '</div>';
} else {
?>
<form id="groupbuy-leader-application" method="post" class="woocommerce-form">
<h3><?php _e('社区团长申请表', 'cultural-groupbuy'); ?></h3>
<p class="form-row">
<label for="community_name"><?php _e('社区/小区名称', 'cultural-groupbuy'); ?> <span class="required">*</span></label>
<input type="text" name="community_name" id="community_name" required>
</p>
<p class="form-row">
<label for="contact_phone"><?php _e('联系电话', 'cultural-groupbuy'); ?> <span class="required">*</span></label>
<input type="tel" name="contact_phone" id="contact_phone" required>
</p>
<p class="form-row">
<label for="wechat_id"><?php _e('微信号', 'cultural-groupbuy'); ?></label>
<input type="text" name="wechat_id" id="wechat_id">
</p>
<p class="form-row">
<label for="address"><?php _e('详细地址', 'cultural-groupbuy'); ?> <span class="required">*</span></label>
<textarea name="address" id="address" rows="3" required></textarea>
</p>
<p class="form-row">
<input type="submit" name="submit_application" value="<?php _e('提交申请', 'cultural-groupbuy'); ?>">
</p>
<?php wp_nonce_field('groupbuy_leader_application', 'groupbuy_nonce'); ?>
</form>
<script>
jQuery(document).ready(function($) {
$('#groupbuy-leader-application').on('submit', function(e) {
e.preventDefault();
$.ajax({
url: '<?php echo admin_url('admin-ajax.php'); ?>',
type: 'POST',
data: {
action: 'submit_groupbuy_application',
nonce: $('#groupbuy_nonce').val(),
form_data: $(this).serialize()
},
success: function(response) {
if (response.success) {
alert(response.data.message);
location.reload();
} else {
alert(response.data);
}
}
});
});
});
</script>
<?php
}
} else {
echo '<p>' . __('请先登录再申请成为团长', 'cultural-groupbuy') . '</p>';
echo '<a href="' . wp_login_url(get_permalink()) . '" class="button">' . __('登录', 'cultural-groupbuy') . '</a>';
}
return ob_get_clean();
}
/**
* 获取团长申请状态文本
*/
private function get_status_text($status) {
$statuses = array(
'pending' => __('审核中', 'cultural-groupbuy'),
'approved' => __('已通过', 'cultural-groupbuy'),
'rejected' => __('已拒绝', 'cultural-groupbuy')
);
return isset($statuses[$status]) ? $statuses[$status] : $status;
}
}
// 初始化社区团购功能
$groupbuy = new Cultural_Groupbuy();
?>
五、功能集成与前端展示
5.1 商品页面集成
<?php
/**
* 商品页面预售和团购功能集成
*/
class Cultural_Product_Integration {
public function init() {
// 在商品页面添加预售和团购信息
add_action('woocommerce_before_add_to_cart_button', array($this, 'display_product_features'));
// 修改加入购物车按钮文本
add_filter('woocommerce_product_single_add_to_cart_text', array($this, 'change_add_to_cart_text'), 10, 2);
// 添加团购专属价格
add_action('woocommerce_before_add_to_cart_quantity', array($this, 'add_groupbuy_price_option'));
}
/**
* 显示商品特色功能
*/
public function display_product_features() {
global $product;
$is_presale = $product->get_meta('_is_presale') === 'yes';
$is_groupbuy = $product->get_meta('_is_groupbuy') === 'yes';
if ($is_presale || $is_groupbuy) {
echo '<div class="cultural-product-features">';
if ($is_presale) {
$this->display_presale_info($product);
}
if ($is_groupbuy) {
$this->display_groupbuy_info($product);
}
echo '</div>';
}
}
/**
* 显示预售信息
*/
private function display_presale_info($product) {
$end_date = $product->get_meta('_presale_end_date');
$min_qty = $product->get_meta('_presale_min_qty');
$delivery_date = $product->get_meta('_estimated_delivery_date');
echo '<div class="presale-info-box">';
echo '<h4>' . __('🎯 预售说明', 'cultural-presale') . '</h4>';
echo '<ul>';
if ($end_date) {
echo '<li>' . sprintf(__('• 预售截止: %s', 'cultural-presale'),
date('Y年m月d日 H:i', strtotime($end_date))) . '</li>';
}
if ($min_qty) {
echo '<li>' . sprintf(__('• 最小起订量: %d件', 'cultural-presale'), $min_qty) . '</li>';
}
if ($delivery_date) {
echo '<li>' . sprintf(__('• 预计发货: %s', 'cultural-presale'),
date('Y年m月d日', strtotime($delivery_date))) . '</li>';
}
echo '<li>' . __('• 达到起订量后安排生产', 'cultural-presale') . '</li>';
echo '<li>' . __('• 支持随时退款(发货前)', 'cultural-presale') . '</li>';
echo '</ul>';
echo '</div>';
}
/**
* 显示团购信息
*/
private function display_groupbuy_info($product) {
$groupbuy_price = $product->get_meta('_groupbuy_price');
$groupbuy_end = $product->get_meta('_groupbuy_end_date');
$joined_count = $this->get_groupbuy_joined_count($product->get_id());
echo '<div class="groupbuy-info-box">';
echo '<h4>' . __('👥 社区团购', 'cultural-groupbuy') . '</h4>';
if ($groupbuy_price) {
echo '<p class="groupbuy-price">' . sprintf(__('团购价: <strong>%s</strong>', 'cultural-groupbuy'),
wc_price($groupbuy_price)) . '</p>';
}
if ($groupbuy_end) {
$time_left = strtotime($groupbuy_end) - current_time('timestamp');
$days_left = ceil($time_left / DAY_IN_SECONDS);
echo '<div class="groupbuy-progress">';
echo '<p>' . sprintf(__('已有 %d 人参与团购', 'cultural-groupbuy'), $joined_count) . '</p>';
if ($days_left > 0) {
echo sprintf(__('剩余时间: %d天', 'cultural-groupbuy'), $days_left);
} else {
echo '<p class="time-ended">' . __('团购已结束', 'cultural-groupbuy') . '</p>';
}
echo '</div>';
}
// 团购加入按钮
echo '<button type="button" class="button join-groupbuy" data-product-id="' . $product->get_id() . '">';
echo __('加入社区团购', 'cultural-groupbuy');
echo '</button>';
echo '</div>';
// 团购加入模态框
$this->render_groupbuy_modal();
}
/**
* 修改加入购物车按钮文本
*/
public function change_add_to_cart_text($text, $product) {
if ($product->get_meta('_is_presale') === 'yes') {
return __('立即预订', 'cultural-presale');
}
if ($product->get_meta('_is_groupbuy') === 'yes') {
return __('参与团购', 'cultural-groupbuy');
}
return $text;
}
/**
* 添加团购价格选项
*/
public function add_groupbuy_price_option() {
global $product;
if ($product->get_meta('_is_groupbuy') === 'yes') {
$regular_price = $product->get_regular_price();
$groupbuy_price = $product->get_meta('_groupbuy_price');
if ($groupbuy_price && $groupbuy_price < $regular_price) {
echo '<div class="price-options">';
echo '<label class="price-option">';
echo '<input type="radio" name="price_option" value="regular" checked> ';
echo sprintf(__('单独购买: %s', 'cultural-groupbuy'), wc_price($regular_price));
echo '</label>';
echo '<label class="price-option groupbuy-option">';
echo '<input type="radio" name="price_option" value="groupbuy"> ';
echo sprintf(__('参与团购: %s', 'cultural-groupbuy'), wc_price($groupbuy_price));
echo '</label>';
echo '</div>';
}
}
}
/**
* 渲染团购加入模态框
*/
private function render_groupbuy_modal() {
?>
<div id="groupbuy-modal" class="cultural-modal" style="display:none;">
<div class="modal-content">
<span class="close-modal">×</span>
<h3><?php _e('选择社区团长', 'cultural-groupbuy'); ?></h3>
<div class="leaders-list">
<?php $this->render_leaders_list(); ?>
</div>
<div class="modal-actions">
<button type="button" class="button confirm-join"><?php _e('确认加入', 'cultural-groupbuy'); ?></button>
<button type="button" class="button button-secondary close-modal"><?php _e('取消', 'cultural-groupbuy'); ?></button>
</div>
</div>
</div>
<style>
.cultural-modal {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: rgba(0,0,0,0.5);
z-index: 9999;
}
.modal-content {
background: white;
width: 90%;
max-width: 500px;
margin: 50px auto;
padding: 20px;
border-radius: 8px;
}
.close-modal {
float: right;
cursor: pointer;
font-size: 24px;
}
</style>
<script>
jQuery(document).ready(function($) {
// 打开团购模态框
$('.join-groupbuy').on('click', function() {
$('#groupbuy-modal').show();
});
// 关闭模态框
$('.close-modal').on('click', function() {
$('#groupbuy-modal').hide();
});
// 确认加入团购
$('.confirm-join').on('click', function() {
var selectedLeader = $('input[name="leader_id"]:checked').val();
var productId = $('.join-groupbuy').data('product-id');
if (!selectedLeader) {
alert('请选择社区团长');
return;
}
$.ajax({
url: '<?php echo admin_url('admin-ajax.php'); ?>',
type: 'POST',
data: {
action: 'join_groupbuy',
product_id: productId,
leader_id: selectedLeader,
nonce: '<?php echo wp_create_nonce('join_groupbuy'); ?>'
},
success: function(response) {
if (response.success) {
alert('成功加入团购!');
$('#groupbuy-modal').hide();
location.reload();
} else {
alert(response.data);
}
}
});
});
});
</script>
<?php
}
/**
* 渲染团长列表
*/
private function render_leaders_list() {
global $wpdb;
$leaders = $wpdb->get_results("
SELECT l.*, u.display_name
FROM {$wpdb->prefix}cultural_groupbuy_leaders l
LEFT JOIN {$wpdb->users} u ON l.user_id = u.ID
WHERE l.status = 'approved'
ORDER BY l.community_name
");
if (empty($leaders)) {
echo '<p>' . __('暂无可用团长', 'cultural-groupbuy') . '</p>';
return;
}
foreach ($leaders as $leader) {
echo '<div class="leader-item">';
echo '<label>';
echo '<input type="radio" name="leader_id" value="' . esc_attr($leader->id) . '"> ';
echo '<strong>' . esc_html($leader->community_name) . '</strong>';
echo '<span class="leader-info">';
echo '团长:' . esc_html($leader->display_name);
echo ' | 联系方式:' . esc_html($leader->contact_phone);
echo '</span>';
echo '</label>';
echo '</div>';
}
}
}
$product_integration = new Cultural_Product_Integration();
$product_integration->init();
?>
六、订单处理与佣金计算
6.1 订单处理逻辑
<?php
/**
* 订单处理与佣金计算
*/
class Cultural_Order_Handler {
public function init() {
// 订单状态变更时处理佣金
add_action('woocommerce_order_status_changed', array($this, 'handle_order_status_change'), 10, 4);
// 添加佣金结算短代码
add_shortcode('leader_commission', array($this, 'leader_commission_dashboard'));
// 处理AJAX请求
add_action('wp_ajax_leader_withdraw_commission', array($this, 'handle_withdraw_request'));
}
/**
* 处理订单状态变更
*/
public function handle_order_status_change($order_id, $old_status, $new_status, $order) {
// 只处理已完成和已取消的订单
if (!in_array($new_status, array('completed', 'cancelled'))) {
return;
}
// 检查是否为团购订单
$is_groupbuy = $order->get_meta('_is_groupbuy_order');
$leader_id = $order->get_meta('_groupbuy_leader_id');
if ($is_groupbuy && $leader_id) {
if ($new_status === 'completed') {
$this->calculate_commission($order, $leader_id);
} elseif ($new_status === 'cancelled') {
$this->reverse_commission($order, $leader_id);
}
}
}
/**
* 计算佣金
*/
private function calculate_commission($order, $leader_id) {
global $wpdb;
// 获取团长信息
$leader = $wpdb->get_row($wpdb->prepare(
"SELECT * FROM {$wpdb->prefix}cultural_groupbuy_leaders WHERE id = %d",
$leader_id
));
if (!$leader) {
return;
}
// 计算佣金(订单总额 * 佣金比例)
$order_total = $order->get_total();
$commission_rate = floatval($leader->commission_rate);
$commission = $order_total * ($commission_rate / 100);
// 更新团长佣金总额
$wpdb->update(
$wpdb->prefix . 'cultural_groupbuy_leaders',
array(
'total_commission' => $leader->total_commission + $commission,
'updated_at' => current_time('mysql')
),
array('id' => $leader_id)
);
// 记录佣金明细
$wpdb->insert(
$wpdb->prefix . 'cultural_commission_records',
array(
'leader_id' => $leader_id,
'order_id' => $order->get_id(),
'amount' => $commission,
'status' => 'pending',
'created_at' => current_time('mysql')
)
);
// 发送佣金通知
$this->send_commission_notification($leader, $order, $commission);
}
/**
* 团长佣金面板
*/
public function leader_commission_dashboard() {
if (!is_user_logged_in() || !current_user_can('groupbuy_leader')) {
return '<p>' . __('请以团长身份登录', 'cultural-groupbuy') . '</p>';
}
$user_id = get_current_user_id();
$leader = $this->get_leader_by_user_id($user_id);
if (!$leader) {
return '<p>' . __('您还不是团长', 'cultural-groupbuy') . '</p>';
}
ob_start();
?>
<div class="leader-commission-dashboard">
<h3><?php _e('我的佣金', 'cultural-groupbuy'); ?></h3>
<div class="commission-summary">
<div class="summary-item">
<span class="label"><?php _e('累计佣金', 'cultural-groupbuy'); ?></span>
<span class="value"><?php echo wc_price($leader->total_commission); ?></span>
</div>
<div class="summary-item">
<span class="label"><?php _e('可提现佣金', 'cultural-groupbuy'); ?></span>
<span class="value"><?php echo wc_price($this->get_available_commission($leader->id)); ?></span>
</div>
<div class="summary-item">
<span class="label"><?php _e('佣金比例', 'cultural-groupbuy'); ?></span>
<span class="value"><?php echo $leader->commission_rate; ?>%</span>
</div>
</div>
<div class="withdraw-section">
<h4><?php _e('佣金提现', 'cultural-groupbuy'); ?></h4>
<form id="commission-withdraw-form">
<div class="form-group">
<label for="withdraw_amount"><?php _e('提现金额', 'cultural-groupbuy'); ?></label>
<input type="number"
id="withdraw_amount"
name="withdraw_amount"
min="1"
max="<?php echo $this->get_available_commission($leader->id); ?>"
step="0.01">
</div>
<div class="form-group">
<label for="withdraw_method"><?php _e('提现方式', 'cultural-groupbuy'); ?></label>
<select id="withdraw_method" name="withdraw_method">
<option value="alipay"><?php _e('支付宝', 'cultural-groupbuy'); ?></option>
<option value="wechat"><?php _e('微信支付', 'cultural-groupbuy'); ?></option>
<option value="bank"><?php _e('银行转账', 'cultural-groupbuy'); ?></option>
</select>
</div>
<div class="form-group">
<label for="account_info"><?php _e('账户信息', 'cultural-groupbuy'); ?></label>
<input type="text"
id="account_info"
name="account_info"
placeholder="<?php _e('请输入收款账户', 'cultural-groupbuy'); ?>"
required>
</div>
<button type="submit" class="button"><?php _e('提交提现申请', 'cultural-groupbuy'); ?></button>
<?php wp_nonce_field('commission_withdraw', 'withdraw_nonce'); ?>
</form>
</div>
<div class="commission-history">
<h4><?php _e('佣金记录', 'cultural-groupbuy'); ?></h4>
<?php $this->render_commission_history($leader->id); ?>
</div>
</div>
<script>
jQuery(document).ready(function($) {
$('#commission-withdraw-form').on('submit', function(e) {
e.preventDefault();
var formData = $(this).serialize();
$.ajax({
url: '<?php echo admin_url('admin-ajax.php'); ?>',
type: 'POST',
data: {
action: 'leader_withdraw_commission',
leader_id: <?php echo $leader->id; ?>,
form_data: formData
},
success: function(response) {
if (response.success) {
alert(response.data.message);
location.reload();
} else {
alert(response.data);
}
}
});
});
});
</script>
<?php
return ob_get_clean();
}
}
$order_handler = new Cultural_Order_Handler();
$order_handler->init();
?>
七、后台管理与设置
7.1 后台管理界面
<?php
/**
* 后台管理功能
*/
class Cultural_Admin_Manager {
public function init() {
// 添加管理菜单
add_action('admin_menu', array($this, 'add_admin_menu'));
// 团长申请审核
add_action('wp_ajax_approve_leader_application', array($this, 'approve_leader_application'));
// 佣金提现审核
add_action('wp_ajax_process_withdraw_request', array($this, 'process_withdraw_request'));
// 添加商品批量操作
add_filter('bulk_actions-edit-product', array($this, 'add_product_bulk_actions'));
add_filter('handle_bulk_actions-edit-product', array($this, 'handle_product_bulk_actions'), 10, 3);
}
/**
* 添加管理菜单
*/
public function add_admin_menu() {
// 主菜单
add_menu_page(
__('文创预售团购', 'cultural-presale-groupbuy'),
__('文创预售团购', 'cultural-presale-groupbuy'),
'manage_options',
'cultural-presale-groupbuy',
array($this, 'render_dashboard'),
'dashicons-store',
56
);
// 子菜单
add_submenu_page(
'cultural-presale-groupbuy',
__('团长管理', 'cultural-presale-groupbuy'),
__('团长管理', 'cultural-presale-groupbuy'),
'manage_options',
'cultural-leaders',
array($this, 'render_leaders_page')
);
add_submenu_page(
'cultural-presale-groupbuy',
__('佣金管理', 'cultural-presale-groupbuy'),
__('佣金管理', 'cultural-presale-groupbuy'),
'manage_options',
'cultural-commissions',
array($this, 'render_commissions_page')
);
add_submenu_page(
'cultural-presale-groupbuy',
__('预售统计', 'cultural-presale-groupbuy'),
__('预售统计', 'cultural-presale-groupbuy'),
'manage_options',
'cultural-presale-stats',
array($this, 'render_presale_stats')
);
add_submenu_page(
'cultural-presale-groupbuy',
__('设置', 'cultural-presale-groupbuy'),
__('设置', 'cultural-presale-groupbuy'),
'manage_options',
'cultural-settings',
array($this, 'render_settings_page')
);
}
/**
* 渲染仪表板
*/
public function render_dashboard() {
?>
<div class="wrap cultural-dashboard">
<h1><?php _e('文创预售与团购管理', 'cultural-presale-groupbuy'); ?></h1>
<div class="dashboard-widgets">
<div class="widget">
<h3><?php _e('今日数据', 'cultural-presale-groupbuy'); ?></h3>
<div class="widget-content">
<?php $this->render_today_stats(); ?>
</div>
</div>
<div class="widget">
<h3><?php _e('预售商品', 'cultural-presale-groupbuy'); ?></h3>
<div class="widget-content">
<?php $this->render_presale_products(); ?>
</div>
</div>
<div class="widget">
<h3><?php _e('待处理申请', 'cultural-presale-groupbuy'); ?></h3>
<div class="widget-content">
<?php $this->render_pending_applications(); ?>
</div>
</div>
</div>
</div>
<style>
.cultural-dashboard .dashboard-widgets {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
gap: 20px;
margin-top: 20px;
}
.cultural-dashboard .widget {
background: white;
border: 1px solid #ccd0d4;
border-radius: 4px;
padding: 15px;
}
.cultural-dashboard .widget h3 {
margin-top: 0;
border-bottom: 1px solid #eee;
padding-bottom: 10px;
}
</style>
<?php
}
/**


