首页 / 教程文章 / WordPress文创IP柔性联名合作管理插件开发详解

WordPress文创IP柔性联名合作管理插件开发详解

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 {
       
本文来自网络,不代表柔性供应链服务中心立场,转载请注明出处:https://mall.org.cn/5967.html

EXCHANGES®作者

上一篇
下一篇

为您推荐

发表回复

联系我们

联系我们

18559313275

在线咨询: QQ交谈

邮箱: vip@exchanges.center

工作时间:周一至周五,9:00-17:30,节假日休息
返回顶部