文章目录
-
- 在当今文创产业蓬勃发展的背景下,IP联名合作已成为品牌跨界营销的重要方式。然而,文创IP方与品牌方之间的合作管理往往面临诸多挑战:合作流程不透明、授权管理混乱、收益结算复杂等。针对这些痛点,我们开发了一款专门用于WordPress平台的文创IP柔性联名合作管理插件,帮助文创IP方高效管理多个联名合作项目。
-
- <?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 {
在当今文创产业蓬勃发展的背景下,IP联名合作已成为品牌跨界营销的重要方式。然而,文创IP方与品牌方之间的合作管理往往面临诸多挑战:合作流程不透明、授权管理混乱、收益结算复杂等。针对这些痛点,我们开发了一款专门用于WordPress平台的文创IP柔性联名合作管理插件,帮助文创IP方高效管理多个联名合作项目。
该模块允许IP方创建和管理多个联名合作项目,每个项目包含完整的合作信息、时间线和参与方详情。
数字化管理授权合同,支持合同模板、电子签名和状态跟踪,确保合作合法合规。
根据预设的分成比例自动计算各方收益,支持多种分成模式(固定费用、销售额分成等)。
为合作品牌方提供专属门户,方便查看合作进度、下载素材和提交设计稿。
生成合作效果分析报告,帮助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
/**
* 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_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_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>
<?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 {


