文章目录[隐藏]
WordPress文创IP柔性联名合作管理插件开发详解
引言:文创IP联名合作的市场需求
在当今文创产业蓬勃发展的背景下,IP联名合作已成为品牌跨界营销的重要方式。然而,文创IP方与品牌方之间的合作管理往往面临诸多挑战:合作流程不透明、授权管理混乱、收益结算复杂等。针对这些痛点,我们开发了一款专门用于WordPress平台的文创IP柔性联名合作管理插件,帮助文创IP方高效管理多个联名合作项目。
插件核心功能设计
1. 合作项目管理模块
该模块允许IP方创建和管理多个联名合作项目,每个项目包含完整的合作信息、时间线和参与方详情。
2. 授权合同管理
数字化管理授权合同,支持合同模板、电子签名和状态跟踪,确保合作合法合规。
3. 收益分成计算
根据预设的分成比例自动计算各方收益,支持多种分成模式(固定费用、销售额分成等)。
4. 品牌方门户
为合作品牌方提供专属门户,方便查看合作进度、下载素材和提交设计稿。
5. 数据分析与报告
生成合作效果分析报告,帮助IP方评估联名合作的价值和ROI。
插件开发技术架构
环境准备与插件基础结构
<?php
/**
* Plugin Name: 文创IP联名合作管理
* Plugin URI: https://example.com/ip-collaboration
* Description: 用于管理文创IP联名合作项目的WordPress插件
* Version: 1.0.0
* Author: 文创科技
* License: GPL v2 or later
*/
// 防止直接访问
if (!defined('ABSPATH')) {
exit;
}
// 定义插件常量
define('IP_COLLAB_VERSION', '1.0.0');
define('IP_COLLAB_PLUGIN_DIR', plugin_dir_path(__FILE__));
define('IP_COLLAB_PLUGIN_URL', plugin_dir_url(__FILE__));
// 初始化插件
require_once IP_COLLAB_PLUGIN_DIR . 'includes/class-ip-collab-init.php';
register_activation_hook(__FILE__, array('IP_Collab_Init', 'activate'));
register_deactivation_hook(__FILE__, array('IP_Collab_Init', 'deactivate'));
// 主插件类
class IP_Collaboration_Plugin {
public function __construct() {
$this->init_hooks();
}
private function init_hooks() {
add_action('init', array($this, 'register_custom_post_types'));
add_action('admin_menu', array($this, 'add_admin_menu'));
add_action('wp_enqueue_scripts', array($this, 'enqueue_frontend_assets'));
add_action('admin_enqueue_scripts', array($this, 'enqueue_admin_assets'));
}
// 注册自定义文章类型
public function register_custom_post_types() {
// 合作项目CPT
register_post_type('ip_collaboration',
array(
'labels' => array(
'name' => __('联名合作项目'),
'singular_name' => __('合作项目')
),
'public' => true,
'has_archive' => true,
'supports' => array('title', 'editor', 'thumbnail', 'custom-fields'),
'menu_icon' => 'dashicons-portfolio',
'rewrite' => array('slug' => 'collaborations'),
)
);
// 合作品牌方CPT
register_post_type('ip_partner',
array(
'labels' => array(
'name' => __('合作品牌方'),
'singular_name' => __('品牌方')
),
'public' => false,
'show_ui' => true,
'supports' => array('title', 'custom-fields'),
'menu_icon' => 'dashicons-businessperson',
)
);
}
// 添加管理菜单
public function add_admin_menu() {
add_menu_page(
'IP联名合作管理',
'IP合作管理',
'manage_options',
'ip-collab-dashboard',
array($this, 'render_dashboard'),
'dashicons-admin-multisite',
30
);
}
// 前端资源加载
public function enqueue_frontend_assets() {
wp_enqueue_style(
'ip-collab-frontend',
IP_COLLAB_PLUGIN_URL . 'assets/css/frontend.css',
array(),
IP_COLLAB_VERSION
);
wp_enqueue_script(
'ip-collab-frontend',
IP_COLLAB_PLUGIN_URL . 'assets/js/frontend.js',
array('jquery'),
IP_COLLAB_VERSION,
true
);
// 本地化脚本
wp_localize_script('ip-collab-frontend', 'ipCollabAjax', array(
'ajax_url' => admin_url('admin-ajax.php'),
'nonce' => wp_create_nonce('ip_collab_nonce')
));
}
// 后台资源加载
public function enqueue_admin_assets($hook) {
if (strpos($hook, 'ip-collab') !== false) {
wp_enqueue_style(
'ip-collab-admin',
IP_COLLAB_PLUGIN_URL . 'assets/css/admin.css',
array(),
IP_COLLAB_VERSION
);
wp_enqueue_script(
'ip-collab-admin',
IP_COLLAB_PLUGIN_URL . 'assets/js/admin.js',
array('jquery', 'jquery-ui-datepicker'),
IP_COLLAB_VERSION,
true
);
}
}
// 渲染仪表盘
public function render_dashboard() {
include IP_COLLAB_PLUGIN_DIR . 'admin/views/dashboard.php';
}
}
// 初始化插件
new IP_Collaboration_Plugin();
?>
收益分成计算引擎
<?php
/**
* 收益分成计算类
* 处理各种分成模式的计算逻辑
*/
class IP_Revenue_Calculator {
/**
* 计算固定费用模式的收益
* @param float $fixed_amount 固定费用
* @param float $ip_share_percentage IP方分成比例
* @return array 包含各方收益的数组
*/
public static function calculate_fixed_fee($fixed_amount, $ip_share_percentage) {
$ip_revenue = $fixed_amount * ($ip_share_percentage / 100);
$partner_revenue = $fixed_amount - $ip_revenue;
return array(
'total' => $fixed_amount,
'ip_share' => $ip_revenue,
'partner_share' => $partner_revenue,
'ip_percentage' => $ip_share_percentage,
'partner_percentage' => 100 - $ip_share_percentage
);
}
/**
* 计算销售额分成模式的收益
* @param float $total_sales 总销售额
* @param float $ip_share_percentage IP方分成比例
* @param float $minimum_guarantee 最低保证金(可选)
* @return array 包含各方收益的数组
*/
public static function calculate_sales_share($total_sales, $ip_share_percentage, $minimum_guarantee = 0) {
$ip_revenue = $total_sales * ($ip_share_percentage / 100);
// 如果设置了最低保证金且计算出的收益低于保证金,则使用保证金
if ($minimum_guarantee > 0 && $ip_revenue < $minimum_guarantee) {
$ip_revenue = $minimum_guarantee;
}
$partner_revenue = $total_sales - $ip_revenue;
return array(
'total_sales' => $total_sales,
'ip_share' => $ip_revenue,
'partner_share' => $partner_revenue,
'ip_percentage' => $ip_share_percentage,
'partner_percentage' => 100 - $ip_share_percentage,
'minimum_guarantee_applied' => ($minimum_guarantee > 0 && $ip_revenue == $minimum_guarantee)
);
}
/**
* 计算阶梯式分成模式的收益
* @param float $total_sales 总销售额
* @param array $tiers 分成阶梯数组
* @return array 包含各方收益的数组
*/
public static function calculate_tiered_share($total_sales, $tiers) {
$ip_revenue = 0;
$remaining_sales = $total_sales;
// 按阶梯计算
foreach ($tiers as $tier) {
$tier_max = $tier['max'] ?? PHP_FLOAT_MAX;
$tier_min = $tier['min'] ?? 0;
$tier_percentage = $tier['percentage'];
// 计算当前阶梯的销售额
$tier_sales = min($remaining_sales, $tier_max - $tier_min);
if ($tier_sales > 0) {
$ip_revenue += $tier_sales * ($tier_percentage / 100);
$remaining_sales -= $tier_sales;
}
if ($remaining_sales <= 0) {
break;
}
}
$partner_revenue = $total_sales - $ip_revenue;
return array(
'total_sales' => $total_sales,
'ip_share' => $ip_revenue,
'partner_share' => $partner_revenue,
'tiers_used' => count($tiers),
'calculation_method' => 'tiered'
);
}
/**
* 生成收益报告
* @param int $collaboration_id 合作项目ID
* @param string $period 报告期间(monthly, quarterly, yearly)
* @return array 收益报告数据
*/
public static function generate_revenue_report($collaboration_id, $period = 'monthly') {
global $wpdb;
$table_name = $wpdb->prefix . 'ip_collab_revenue';
// 根据期间设置日期范围
$date_condition = '';
switch ($period) {
case 'monthly':
$date_condition = "AND DATE(record_date) >= DATE_SUB(CURDATE(), INTERVAL 1 MONTH)";
break;
case 'quarterly':
$date_condition = "AND DATE(record_date) >= DATE_SUB(CURDATE(), INTERVAL 3 MONTH)";
break;
case 'yearly':
$date_condition = "AND YEAR(record_date) = YEAR(CURDATE())";
break;
}
// 查询收益数据
$query = $wpdb->prepare(
"SELECT
SUM(total_amount) as total_revenue,
SUM(ip_share) as ip_revenue,
SUM(partner_share) as partner_revenue,
COUNT(*) as transaction_count,
DATE_FORMAT(record_date, '%%Y-%%m') as month
FROM {$table_name}
WHERE collaboration_id = %d
{$date_condition}
GROUP BY DATE_FORMAT(record_date, '%%Y-%%m')
ORDER BY record_date DESC",
$collaboration_id
);
$results = $wpdb->get_results($query, ARRAY_A);
// 计算汇总数据
$summary = array(
'total_revenue' => 0,
'total_ip_share' => 0,
'total_partner_share' => 0,
'average_ip_share_percentage' => 0,
'period' => $period,
'record_count' => count($results)
);
foreach ($results as $row) {
$summary['total_revenue'] += floatval($row['total_revenue']);
$summary['total_ip_share'] += floatval($row['ip_revenue']);
$summary['total_partner_share'] += floatval($row['partner_share']);
}
if ($summary['total_revenue'] > 0) {
$summary['average_ip_share_percentage'] =
($summary['total_ip_share'] / $summary['total_revenue']) * 100;
}
return array(
'summary' => $summary,
'monthly_data' => $results
);
}
}
?>
数据库设计与数据模型
<?php
/**
* 数据库表创建与维护
*/
class IP_Collab_Database {
public static function create_tables() {
global $wpdb;
$charset_collate = $wpdb->get_charset_collate();
// 合作项目详情表
$table_collaborations = $wpdb->prefix . 'ip_collab_details';
$sql_collaborations = "CREATE TABLE IF NOT EXISTS $table_collaborations (
id bigint(20) NOT NULL AUTO_INCREMENT,
post_id bigint(20) NOT NULL,
partner_id bigint(20) NOT NULL,
contract_type varchar(50) NOT NULL,
start_date date NOT NULL,
end_date date NOT NULL,
revenue_model varchar(50) NOT NULL,
ip_share_percentage decimal(5,2) DEFAULT 0.00,
minimum_guarantee decimal(10,2) DEFAULT 0.00,
status varchar(20) DEFAULT 'active',
created_at datetime DEFAULT CURRENT_TIMESTAMP,
updated_at datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (id),
KEY post_id (post_id),
KEY partner_id (partner_id),
KEY status (status)
) $charset_collate;";
// 收益记录表
$table_revenue = $wpdb->prefix . 'ip_collab_revenue';
$sql_revenue = "CREATE TABLE IF NOT EXISTS $table_revenue (
id bigint(20) NOT NULL AUTO_INCREMENT,
collaboration_id bigint(20) NOT NULL,
record_date date NOT NULL,
total_amount decimal(10,2) NOT NULL,
ip_share decimal(10,2) NOT NULL,
partner_share decimal(10,2) NOT NULL,
currency varchar(3) DEFAULT 'CNY',
payment_status varchar(20) DEFAULT 'pending',
notes text,
created_at datetime DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id),
KEY collaboration_id (collaboration_id),
KEY record_date (record_date),
KEY payment_status (payment_status)
) $charset_collate;";
// 合同文档表
$table_contracts = $wpdb->prefix . 'ip_collab_contracts';
$sql_contracts = "CREATE TABLE IF NOT EXISTS $table_contracts (
id bigint(20) NOT NULL AUTO_INCREMENT,
collaboration_id bigint(20) NOT NULL,
contract_name varchar(255) NOT NULL,
file_path varchar(500) NOT NULL,
file_type varchar(50) NOT NULL,
file_size int(11) NOT NULL,
version varchar(20) NOT NULL,
status varchar(20) DEFAULT 'draft',
signed_date date DEFAULT NULL,
digital_signature text,
created_at datetime DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id),
KEY collaboration_id (collaboration_id),
KEY status (status)
) $charset_collate;";
require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
dbDelta($sql_collaborations);
dbDelta($sql_revenue);
dbDelta($sql_contracts);
}
/**
* 获取合作项目统计数据
*/
public static function get_collaboration_stats() {
global $wpdb;
$table = $wpdb->prefix . 'ip_collab_details';
$stats = $wpdb->get_row(
"SELECT
COUNT(*) as total_projects,
SUM(CASE WHEN status = 'active' THEN 1 ELSE 0 END) as active_projects,
SUM(CASE WHEN status = 'completed' THEN 1 ELSE 0 END) as completed_projects,
SUM(CASE WHEN status = 'terminated' THEN 1 ELSE 0 END) as terminated_projects,
AVG(ip_share_percentage) as avg_ip_share
FROM $table",
ARRAY_A
);
return $stats;
}
}
?>
品牌方门户功能实现
<?php
/**
* 品牌方门户短代码和功能
*/
class IP_Partner_Portal {
/**
* 注册短代码
*/
public static function init() {
add_shortcode('ip_partner_portal', array(__CLASS__, 'render_partner_portal'));
add_action('wp_ajax_ip_partner_submit_design', array(__CLASS__, 'handle_design_submission'));
add_action('wp_ajax_nopriv_ip_partner_submit_design', array(__CLASS__, 'handle_design_submission'));
}
/**
* 渲染品牌方门户
*/
public static function render_partner_portal($atts) {
// 检查用户是否登录且有权限
if (!is_user_logged_in()) {
return '<div class="ip-portal-login-required">请先登录以访问品牌方门户</div>';
}
$user_id = get_current_user_id();
$partner_id = self::get_partner_id_by_user($user_id);
if (!$partner_id) {
return '<div class="ip-portal-access-denied">您没有访问品牌方门户的权限</div>';
}
ob_start();
?>
<div class="ip-partner-portal">
<div class="portal-header">
<h2>品牌合作门户</h2>
<div class="partner-info">
<?php echo self::render_partner_info($partner_id); ?>
</div>
</div>
<div class="portal-tabs">
<ul class="tab-nav">
<li><a href="#tab-projects" class="active">合作项目</a></li>
<li>设计稿提交</li>
<li><a href="#tab-documents">合同文档</a></li>
<li><a href="#tab-revenue">收益报表</a></li>
</ul>
<div class="tab-content">
<div id="tab-projects" class="tab-pane active">
<?php echo self::render_projects_tab($partner_id); ?>
</div>
<div id="tab-designs" class="tab-pane">
<?php echo self::render_designs_tab($partner_id); ?>
</div>
<div id="tab-documents" class="tab-pane">
<?php echo self::render_documents_tab($partner_id); ?>
</div>
<div id="tab-revenue" class="tab-pane">
<?php echo self::render_revenue_tab($partner_id); ?>
</div>
</div>
</div>
</div>
<script>
jQuery(document).ready(function($) {
// 标签页切换
$('.tab-nav a').on('click', function(e) {
e.preventDefault();
var target = $(this).attr('href');
$('.tab-nav a').removeClass('active');
$(this).addClass('active');
$('.tab-pane').removeClass('active');
$(target).addClass('active');
});
// 设计稿提交表单
$('#design-submission-form').on('submit', function(e) {
e.preventDefault();
var formData = new FormData(this);
formData.append('action', 'ip_partner_submit_design');
formData.append('nonce', ipCollabAjax.nonce);
$.ajax({
url: ipCollabAjax.ajax_url,
type: 'POST',
data: formData,
processData: false,
contentType: false,
beforeSend: function() {
$('#design-submit-btn').prop('disabled', true).text('提交中...');
},
success: function(response) {
if (response.success) {
alert('设计稿提交成功!');
$('#design-submission-form')[0].reset();
// 刷新设计稿列表
loadDesignsList();
} else {
alert('提交失败:' + response.data.message);
}
},
complete: function() {
$('#design-submit-btn').prop('disabled', false).text('提交设计稿');
}
});
});
});
</script>
<?php
return ob_get_clean();
}
/**
* 渲染合作项目标签页
*/
private static function render_projects_tab($partner_id) {
global $wpdb;
$table = $wpdb->prefix . 'ip_collab_details';
$projects = $wpdb->get_results(
$wpdb->prepare(
"SELECT cd.*, p.post_title
FROM $table cd
INNER JOIN {$wpdb->posts} p ON cd.post_id = p.ID
WHERE cd.partner_id = %d
ORDER BY cd.start_date DESC",
$partner_id
),
ARRAY_A
);
ob_start();
?>
<div class="projects-list">
<h3>我的合作项目</h3>
<?php if (empty($projects)): ?>
<p class="no-projects">暂无合作项目</p>
<?php else: ?>
<table class="ip-data-table">
<thead>
<tr>
<th>项目名称</th>
<th>合作类型</th>
<th>开始日期</th>
<th>结束日期</th>
<th>IP分成比例</th>
<th>状态</th>
<th>操作</th>
</tr>
</thead>
<tbody>
<?php foreach ($projects as $project): ?>
<tr>
<td><?php echo esc_html($project['post_title']); ?></td>
<td><?php echo esc_html($project['contract_type']); ?></td>
<td><?php echo date('Y-m-d', strtotime($project['start_date'])); ?></td>
<td><?php echo date('Y-m-d', strtotime($project['end_date'])); ?></td>
<td><?php echo floatval($project['ip_share_percentage']); ?>%</td>
<td>
<span class="status-badge status-<?php echo esc_attr($project['status']); ?>">
<?php echo self::get_status_label($project['status']); ?>
</span>
</td>
<td>
<a href="?project_id=<?php echo $project['id']; ?>" class="btn-view">查看详情</a>
</td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
<?php endif; ?>
</div>
<?php
return ob_get_clean();
}
/**
* 渲染设计稿提交标签页
*/
private static function render_designs_tab($partner_id) {
ob_start();
?>
<div class="designs-section">
<div class="design-submission">
<h3>提交新设计稿</h3>
<form id="design-submission-form" enctype="multipart/form-data">
<div class="form-group">
<label for="design-project">选择项目:</label>
<select id="design-project" name="project_id" required>
<option value="">请选择项目</option>
<?php echo self::get_projects_options($partner_id); ?>
</select>
</div>
<div class="form-group">
<label for="design-title">设计稿标题:</label>
<input type="text" id="design-title" name="design_title" required>
</div>
<div class="form-group">
<label for="design-description">设计说明:</label>
<textarea id="design-description" name="design_description" rows="4"></textarea>
</div>
<div class="form-group">
<label for="design-files">设计文件:</label>
<input type="file" id="design-files" name="design_files[]" multiple accept=".jpg,.jpeg,.png,.pdf,.ai,.psd">
<p class="help-text">支持图片、PDF和设计源文件,单个文件不超过10MB</p>
</div>
<div class="form-group">
<label for="design-notes">备注:</label>
<textarea id="design-notes" name="design_notes" rows="2"></textarea>
</div>
<button type="submit" id="design-submit-btn" class="btn-submit">提交设计稿</button>
</form>
</div>
<div class="designs-history">
<h3>已提交的设计稿</h3>
<div id="designs-list-container">
<?php echo self::render_designs_list($partner_id); ?>
</div>
</div>
</div>
<?php
return ob_get_clean();
}
/**
* 处理设计稿提交
*/
public static function handle_design_submission() {
// 验证nonce
if (!wp_verify_nonce($_POST['nonce'], 'ip_collab_nonce')) {
wp_die('安全验证失败');
}
// 验证用户权限
if (!is_user_logged_in()) {
wp_send_json_error(array('message' => '请先登录'));
}
$user_id = get_current_user_id();
$partner_id = self::get_partner_id_by_user($user_id);
if (!$partner_id) {
wp_send_json_error(array('message' => '无权限提交设计稿'));
}
// 处理文件上传
$uploaded_files = array();
if (!empty($_FILES['design_files'])) {
require_once(ABSPATH . 'wp-admin/includes/file.php');
require_once(ABSPATH . 'wp-admin/includes/image.php');
$files = $_FILES['design_files'];
foreach ($files['name'] as $key => $value) {
if ($files['name'][$key]) {
$file = array(
'name' => $files['name'][$key],
'type' => $files['type'][$key],
'tmp_name' => $files['tmp_name'][$key],
'error' => $files['error'][$key],
'size' => $files['size'][$key]
);
$upload_result = wp_handle_upload($file, array('test_form' => false));
if (!isset($upload_result['error'])) {
$uploaded_files[] = $upload_result['url'];
}
}
}
}
// 保存到数据库
global $wpdb;
$table = $wpdb->prefix . 'ip_collab_designs';
$data = array(
'partner_id' => $partner_id,
'project_id' => intval($_POST['project_id']),
'design_title' => sanitize_text_field($_POST['design_title']),
'design_description' => sanitize_textarea_field($_POST['design_description']),
'design_files' => maybe_serialize($uploaded_files),
'status' => 'pending_review',
'submitted_at' => current_time('mysql'),
'notes' => sanitize_textarea_field($_POST['design_notes'])
);
$result = $wpdb->insert($table, $data);
if ($result) {
// 发送通知邮件
self::send_design_submission_notification($data);
wp_send_json_success(array(
'message' => '设计稿提交成功',
'design_id' => $wpdb->insert_id
));
} else {
wp_send_json_error(array('message' => '保存失败'));
}
}
/**
* 发送设计稿提交通知
*/
private static function send_design_submission_notification($data) {
$admin_email = get_option('admin_email');
$subject = '新的设计稿提交 - ' . $data['design_title'];
$message = "有新的设计稿提交:nn";
$message .= "项目ID: " . $data['project_id'] . "n";
$message .= "设计标题: " . $data['design_title'] . "n";
$message .= "设计说明: " . $data['design_description'] . "n";
$message .= "提交时间: " . $data['submitted_at'] . "nn";
$message .= "请登录后台查看详情。";
wp_mail($admin_email, $subject, $message);
}
}
?>
## 合同管理模块实现
<?php
/**
- 合同管理功能
*/
class IP_Contract_Manager {
/**
* 初始化合同管理
*/
public static function init() {
add_action('add_meta_boxes', array(__CLASS__, 'add_contract_meta_box'));
add_action('save_post_ip_collaboration', array(__CLASS__, 'save_contract_data'));
add_action('wp_ajax_generate_contract_pdf', array(__CLASS__, 'generate_contract_pdf'));
}
/**
* 添加合同元框
*/
public static function add_contract_meta_box() {
add_meta_box(
'ip-contract-details',
'合同详情',
array(__CLASS__, 'render_contract_meta_box'),
'ip_collaboration',
'normal',
'high'
);
}
/**
* 渲染合同元框
*/
public static function render_contract_meta_box($post) {
wp_nonce_field('ip_contract_save', 'ip_contract_nonce');
$contract_data = get_post_meta($post->ID, '_ip_contract_data', true);
$contract_data = wp_parse_args($contract_data, array(
'contract_number' => '',
'contract_type' => 'exclusive',
'effective_date' => '',
'expiry_date' => '',
'territory' => 'china',
'categories' => array(),
'royalty_rate' => '10',
'advance_payment' => '0',
'payment_terms' => '',
'termination_clause' => ''
));
?>
<div class="ip-contract-form">
<div class="form-row">
<div class="form-group">
<label for="contract_number">合同编号:</label>
<input type="text" id="contract_number" name="contract[contract_number]"
value="<?php echo esc_attr($contract_data['contract_number']); ?>">
</div>
<div class="form-group">
<label for="contract_type">合同类型:</label>
<select id="contract_type" name="contract[contract_type]">
<option value="exclusive" <?php selected($contract_data['contract_type'], 'exclusive'); ?>>独家授权</option>
<option value="non_exclusive" <?php selected($contract_data['contract_type'], 'non_exclusive'); ?>>非独家授权</option>
<option value="joint_development" <?php selected($contract_data['contract_type'], 'joint_development'); ?>>联合开发</option>
<option value="commissioned" <?php selected($contract_data['contract_type'], 'commissioned'); ?>>委托创作</option>
</select>
</div>
</div>
<div class="form-row">
<div class="form-group">
<label for="effective_date">生效日期:</label>
<input type="date" id="effective_date" name="contract[effective_date]"
value="<?php echo esc_attr($contract_data['effective_date']); ?>">
</div>
<div class="form-group">
<label for="expiry_date">到期日期:</label>
<input type="date" id="expiry_date" name="contract[expiry_date]"
value="<?php echo esc_attr($contract_data['expiry_date']); ?>">
</div>
</div>
<div class="form-group">
<label>授权地域:</label>
<div class="checkbox-group">
<label><input type="checkbox" name="contract[territory][]" value="china"
<?php checked(in_array('china', (array)$contract_data['territory'])); ?>> 中国大陆</label>
<label><input type="checkbox" name="contract[territory][]" value="hongkong"
<?php checked(in_array('hongkong', (array)$contract_data['territory'])); ?>> 香港澳门</label>
<label><input type="checkbox" name="contract[territory][]" value="taiwan"
<?php checked(in_array('taiwan', (array)$contract_data['territory'])); ?>> 台湾地区</label>
<label><input type="checkbox" name="contract[territory][]" value="global"
<?php checked(in_array('global', (array)$contract_data['territory'])); ?>> 全球范围</label>
</div>
</div>
<div class="form-group">
<label>授权品类:</label>
<div class="checkbox-group">
<?php
$categories = array(
'apparel' => '服装服饰',
'accessories' => '配饰',
'stationery' => '文具',
'home' => '家居用品',
'digital' => '数码产品',
'food' => '食品饮料',
'beauty' => '美妆个护',
'toys' => '玩具'
);
foreach ($categories as $value => $label) {
$checked = in_array($value, (array)$contract_data['categories']) ? 'checked' : '';
echo "<label><input type='checkbox' name='contract[categories][]' value='{$value}' {$checked}> {$label}</label>";
}
?>
</div>
</div>
<div class="form-row">
<div class="form-group">
<label for="royalty_rate">版税率(%):</label>
<input type="number" id="royalty_rate" name="contract[royalty_rate]"
value="<?php echo esc_attr($contract_data['royalty_rate']); ?>" min="0" max="100" step="0.1">
</div>
<div class="form-group">
<label for="advance_payment">预付金:</label>
<input type="number" id="advance_payment" name="contract[advance_payment]"
value="<?php echo esc_attr($contract_data['advance_payment']); ?>" min="0" step="0.01">
</div>
</div>
<div class="form-group">
<label for="payment_terms">付款条款:</label>
<textarea id="payment_terms" name="contract[payment_terms]" rows="3"><?php
echo esc_textarea($contract_data['payment_terms']);
?></textarea>
</div>
<div class="form-group">
<label for="termination_clause">终止条款:</label>
<textarea id="termination_clause" name="contract[termination_clause]" rows="3"><?php
echo esc_textarea($contract_data['termination_clause']);
?></textarea>
</div>
<div class="form-actions">
<button type="button" class="button button-primary" onclick="generateContractPDF(<?php echo $post->ID; ?>)">
生成合同PDF
</button>
<button type="button" class="button" onclick="uploadContractFile(<?php echo $post->ID; ?>)">
上传合同文件
</button>
</div>
</div>
<style>
.ip-contract-form .form-row {
