首页 / 教程文章 / WordPress文创插件实现柔性定价策略教程

WordPress文创插件实现柔性定价策略教程

WordPress文创插件实现柔性定价策略教程

引言:为什么需要柔性定价策略?

在文创产品销售中,一成不变的价格策略往往难以满足多样化的市场需求。柔性定价策略允许您根据不同的客户群体、购买数量、促销活动等因素动态调整价格,从而提高转化率和客户满意度。本教程将指导您如何在WordPress中通过自定义插件实现这一功能。

环境准备与插件基础结构

首先,我们需要创建一个基础的WordPress插件。在您的WordPress安装目录下的wp-content/plugins/文件夹中,创建一个名为flexible-pricing的新文件夹。

<?php
/**
 * Plugin Name: 文创产品柔性定价
 * Plugin URI: https://yourwebsite.com/
 * Description: 为文创产品提供灵活的定价策略
 * Version: 1.0.0
 * Author: 您的名称
 * License: GPL v2 or later
 * Text Domain: flexible-pricing
 */

// 防止直接访问
if (!defined('ABSPATH')) {
    exit;
}

// 定义插件常量
define('FLEXIBLE_PRICING_VERSION', '1.0.0');
define('FLEXIBLE_PRICING_PLUGIN_DIR', plugin_dir_path(__FILE__));
define('FLEXIBLE_PRICING_PLUGIN_URL', plugin_dir_url(__FILE__));

// 初始化插件
add_action('plugins_loaded', 'flexible_pricing_init');

function flexible_pricing_init() {
    // 检查WooCommerce是否激活(如果您的文创产品使用WooCommerce)
    if (class_exists('WooCommerce')) {
        // 加载核心类
        require_once FLEXIBLE_PRICING_PLUGIN_DIR . 'includes/class-flexible-pricing-core.php';
        $flexible_pricing = new Flexible_Pricing_Core();
        $flexible_pricing->init();
    } else {
        // 如果没有WooCommerce,显示警告
        add_action('admin_notices', function() {
            echo '<div class="notice notice-error"><p>';
            echo __('柔性定价插件需要WooCommerce支持。请先安装并激活WooCommerce插件。', 'flexible-pricing');
            echo '</p></div>';
        });
    }
}
?>

核心定价策略类实现

在插件目录中创建includes/class-flexible-pricing-core.php文件:

<?php
/**
 * 柔性定价核心类
 * 处理所有定价逻辑和规则应用
 */

class Flexible_Pricing_Core {
    
    private $pricing_rules = array();
    
    public function init() {
        // 加载定价规则
        $this->load_pricing_rules();
        
        // 挂钩到WooCommerce价格显示
        add_filter('woocommerce_product_get_price', array($this, 'apply_pricing_rules'), 99, 2);
        add_filter('woocommerce_product_get_regular_price', array($this, 'apply_pricing_rules'), 99, 2);
        add_filter('woocommerce_product_variation_get_price', array($this, 'apply_pricing_rules'), 99, 2);
        
        // 添加管理界面
        add_action('admin_menu', array($this, 'add_admin_menu'));
        
        // 保存定价规则
        add_action('admin_post_save_pricing_rules', array($this, 'save_pricing_rules'));
    }
    
    /**
     * 加载定价规则
     */
    private function load_pricing_rules() {
        // 从数据库加载规则
        $this->pricing_rules = get_option('flexible_pricing_rules', array());
        
        // 如果没有规则,设置默认规则
        if (empty($this->pricing_rules)) {
            $this->pricing_rules = $this->get_default_rules();
            update_option('flexible_pricing_rules', $this->pricing_rules);
        }
    }
    
    /**
     * 获取默认定价规则
     */
    private function get_default_rules() {
        return array(
            'user_role' => array(
                'vip' => 0.8,      // VIP用户享受8折
                'subscriber' => 0.9 // 订阅用户享受9折
            ),
            'quantity_tier' => array(
                5 => 0.95,   // 购买5件以上享受95折
                10 => 0.9,   // 购买10件以上享受9折
                20 => 0.85   // 购买20件以上享受85折
            ),
            'seasonal_discount' => array(
                '12-25' => 0.85,  // 圣诞节折扣
                '01-01' => 0.9    // 元旦折扣
            )
        );
    }
    
    /**
     * 应用定价规则到产品价格
     */
    public function apply_pricing_rules($price, $product) {
        if (empty($price) || !is_numeric($price)) {
            return $price;
        }
        
        $original_price = $price;
        $final_price = $original_price;
        
        // 应用用户角色折扣
        $final_price = $this->apply_user_role_discount($final_price);
        
        // 应用数量阶梯折扣(需要在购物车环境中)
        $final_price = $this->apply_quantity_discount($final_price, $product);
        
        // 应用季节性折扣
        $final_price = $this->apply_seasonal_discount($final_price);
        
        // 确保价格不会低于成本价(假设成本价为原价的50%)
        $cost_price = $original_price * 0.5;
        if ($final_price < $cost_price) {
            $final_price = $cost_price;
        }
        
        return round($final_price, 2);
    }
    
    /**
     * 应用用户角色折扣
     */
    private function apply_user_role_discount($price) {
        if (!is_user_logged_in()) {
            return $price;
        }
        
        $user = wp_get_current_user();
        $user_roles = $user->roles;
        
        foreach ($user_roles as $role) {
            if (isset($this->pricing_rules['user_role'][$role])) {
                $discount = $this->pricing_rules['user_role'][$role];
                return $price * $discount;
            }
        }
        
        return $price;
    }
    
    /**
     * 应用数量阶梯折扣
     */
    private function apply_quantity_discount($price, $product) {
        // 仅在购物车页面应用数量折扣
        if (!is_cart() && !is_checkout()) {
            return $price;
        }
        
        $product_id = $product->get_id();
        $cart_item_quantities = $this->get_cart_item_quantities();
        
        if (isset($cart_item_quantities[$product_id])) {
            $quantity = $cart_item_quantities[$product_id];
            
            // 查找适用的数量阶梯
            $applicable_discount = 1;
            krsort($this->pricing_rules['quantity_tier']);
            
            foreach ($this->pricing_rules['quantity_tier'] as $min_quantity => $discount) {
                if ($quantity >= $min_quantity) {
                    $applicable_discount = $discount;
                    break;
                }
            }
            
            return $price * $applicable_discount;
        }
        
        return $price;
    }
    
    /**
     * 获取购物车中商品数量
     */
    private function get_cart_item_quantities() {
        if (!WC()->cart) {
            return array();
        }
        
        $quantities = array();
        foreach (WC()->cart->get_cart() as $cart_item) {
            $product_id = $cart_item['product_id'];
            $quantities[$product_id] = $cart_item['quantity'];
        }
        
        return $quantities;
    }
    
    /**
     * 应用季节性折扣
     */
    private function apply_seasonal_discount($price) {
        $current_date = date('m-d');
        
        if (isset($this->pricing_rules['seasonal_discount'][$current_date])) {
            $discount = $this->pricing_rules['seasonal_discount'][$current_date];
            return $price * $discount;
        }
        
        return $price;
    }
    
    /**
     * 添加管理菜单
     */
    public function add_admin_menu() {
        add_submenu_page(
            'woocommerce',
            __('柔性定价策略', 'flexible-pricing'),
            __('柔性定价', 'flexible-pricing'),
            'manage_options',
            'flexible-pricing',
            array($this, 'render_admin_page')
        );
    }
    
    /**
     * 渲染管理页面
     */
    public function render_admin_page() {
        ?>
        <div class="wrap">
            <h1><?php echo esc_html__('文创产品柔性定价策略', 'flexible-pricing'); ?></h1>
            
            <form method="post" action="<?php echo admin_url('admin-post.php'); ?>">
                <input type="hidden" name="action" value="save_pricing_rules">
                
                <h2><?php echo esc_html__('用户角色折扣', 'flexible-pricing'); ?></h2>
                <table class="form-table">
                    <tr>
                        <th><?php echo esc_html__('VIP用户折扣', 'flexible-pricing'); ?></th>
                        <td>
                            <input type="number" name="user_role[vip]" 
                                   value="<?php echo esc_attr($this->pricing_rules['user_role']['vip'] * 100); ?>"
                                   min="1" max="100" step="1"> %
                            <p class="description"><?php echo esc_html__('VIP用户享受的折扣百分比', 'flexible-pricing'); ?></p>
                        </td>
                    </tr>
                    <!-- 可以添加更多用户角色 -->
                </table>
                
                <h2><?php echo esc_html__('数量阶梯折扣', 'flexible-pricing'); ?></h2>
                <table class="form-table">
                    <?php foreach ($this->pricing_rules['quantity_tier'] as $quantity => $discount): ?>
                    <tr>
                        <th><?php printf(esc_html__('购买%s件以上', 'flexible-pricing'), $quantity); ?></th>
                        <td>
                            <input type="number" name="quantity_tier[<?php echo esc_attr($quantity); ?>]" 
                                   value="<?php echo esc_attr($discount * 100); ?>"
                                   min="1" max="100" step="1"> %
                        </td>
                    </tr>
                    <?php endforeach; ?>
                </table>
                
                <?php submit_button(__('保存设置', 'flexible-pricing')); ?>
            </form>
        </div>
        <?php
    }
    
    /**
     * 保存定价规则
     */
    public function save_pricing_rules() {
        // 检查权限
        if (!current_user_can('manage_options')) {
            wp_die(__('您没有权限执行此操作。', 'flexible-pricing'));
        }
        
        // 验证nonce(安全令牌)
        check_admin_referer('save_pricing_rules_nonce');
        
        // 处理并保存数据
        if (isset($_POST['user_role'])) {
            foreach ($_POST['user_role'] as $role => $discount_percent) {
                $this->pricing_rules['user_role'][$role] = floatval($discount_percent) / 100;
            }
        }
        
        if (isset($_POST['quantity_tier'])) {
            $this->pricing_rules['quantity_tier'] = array();
            foreach ($_POST['quantity_tier'] as $quantity => $discount_percent) {
                $quantity = intval($quantity);
                $this->pricing_rules['quantity_tier'][$quantity] = floatval($discount_percent) / 100;
            }
            ksort($this->pricing_rules['quantity_tier']);
        }
        
        update_option('flexible_pricing_rules', $this->pricing_rules);
        
        // 重定向回设置页面
        wp_redirect(admin_url('admin.php?page=flexible-pricing&saved=true'));
        exit;
    }
}
?>

前端价格显示增强

为了让客户清楚地看到折扣信息,我们需要在前端显示价格变化。创建assets/js/flexible-pricing-frontend.js

/**
 * 前端价格显示增强
 * 动态显示折扣信息和节省金额
 */

jQuery(document).ready(function($) {
    
    // 监听价格变化
    $(document).on('found_variation', 'form.cart', function(event, variation) {
        displayDiscountInfo(variation);
    });
    
    // 显示折扣信息
    function displayDiscountInfo(variation) {
        var originalPrice = variation.display_price;
        var discountedPrice = variation.price_html;
        
        // 这里可以添加逻辑来比较原价和折扣价
        // 并显示节省的金额
        
        $('.product-price').append(
            '<div class="discount-info">' +
            '<span class="you-save">节省: ' + 
            calculateSavings(originalPrice, discountedPrice) + 
            '</span>' +
            '</div>'
        );
    }
    
    // 计算节省金额
    function calculateSavings(original, discounted) {
        // 这里需要根据实际情况解析价格
        // 简化示例:
        var savings = original - discounted;
        return wc_price(savings);
    }
    
    // 购物车页面显示折扣摘要
    if ($('body').hasClass('cart')) {
        updateCartDiscountSummary();
    }
    
    // 更新购物车折扣摘要
    function updateCartDiscountSummary() {
        $.ajax({
            url: flexible_pricing_ajax.ajax_url,
            type: 'POST',
            data: {
                action: 'get_cart_discount_summary',
                security: flexible_pricing_ajax.nonce
            },
            success: function(response) {
                if (response.success) {
                    $('.cart_totals').before(response.data.summary_html);
                }
            }
        });
    }
});

高级定价策略扩展

除了基本的折扣策略,您还可以扩展更多高级功能。在插件中添加以下类:

<?php
/**
 * 高级定价策略扩展
 * 包括捆绑销售、动态定价、会员专享价等
 */

class Flexible_Pricing_Extensions {
    
    /**
     * 捆绑销售折扣
     * 当用户购买特定产品组合时提供额外折扣
     */
    public static function apply_bundle_discount($cart) {
        $bundle_products = array(101, 102, 103); // 产品ID数组
        $bundle_discount = 0.8; // 8折
        
        $cart_products = array();
        foreach ($cart->get_cart() as $cart_item) {
            $cart_products[] = $cart_item['product_id'];
        }
        
        // 检查购物车是否包含所有捆绑产品
        $has_all_bundle_products = empty(array_diff($bundle_products, $cart_products));
        
        if ($has_all_bundle_products) {
            foreach ($cart->get_cart() as $cart_item_key => $cart_item) {
                if (in_array($cart_item['product_id'], $bundle_products)) {
                    $cart_item['data']->set_price(
                        $cart_item['data']->get_price() * $bundle_discount
                    );
                }
            }
        }
    }
    
    /**
     * 动态定价基于库存
     * 库存较少时提高价格,库存充足时降低价格促进销售
     */
    public static function dynamic_pricing_by_stock($price, $product) {
        $stock_quantity = $product->get_stock_quantity();
        
        if ($stock_quantity !== null) {
            if ($stock_quantity < 10) {
                // 库存紧张,价格上浮10%
                return $price * 1.1;
            } elseif ($stock_quantity > 100) {
                // 库存充足,价格下调5%促进销售
                return $price * 0.95;
            }
        }
        
        return $price;
    }
    
    /**
     * 时间敏感定价
     * 根据一天中的不同时间调整价格
     */
    public static function time_sensitive_pricing($price) {
        $current_hour = date('H');
        
        // 深夜促销 (0点-6点)
        if ($current_hour >= 0 && $current_hour < 6) {
            return $price * 0.9; // 9折
        }
        
        // 午间特惠 (12点-14点)
        if ($current_hour >= 12 && $current_hour < 14) {
            return $price * 0.95; // 95折
        }
        
        return $price;
    }
}
?>

测试与部署建议

在部署柔性定价插件前,请务必进行充分测试:

  1. 单元测试:测试每个定价规则函数
  2. 集成测试:测试规则组合应用
  3. 性能测试:确保不影响网站加载速度
  4. 用户验收测试:让真实用户测试购买流程

建议的部署步骤:

  1. 在开发环境中完成所有测试
  2. 在生产环境的测试站点验证
  3. 使用分阶段部署,先对部分用户开放
  4. 监控销售数据和用户反馈
  5. 根据数据调整定价参数

总结

通过本教程,您已经学会了如何在WordPress中创建柔性定价插件。这种灵活的定价策略可以帮助您:

  1. 提高文创产品的竞争力
  2. 增加客户满意度和忠诚度
  3. 优化库存管理和销售策略
  4. 最大化收入和利润

记住,定价策略需要根据市场反馈不断调整。建议定期分析销售数据,了解不同定价策略的效果,并持续优化您的定价模型。

您可以根据自己的具体需求扩展这个基础插件,添加更多定价规则和高级功能,如A/B测试不同价格点、机器学习预测最优价格等。祝您的文创产品销售取得成功!

WordPress文创插件实现柔性定价策略教程(续)

数据库设计与规则存储优化

为了实现更复杂的定价策略,我们需要优化数据库设计。创建includes/class-database-manager.php

<?php
/**
 * 数据库管理器
 * 处理定价规则的存储和检索
 */

class Flexible_Pricing_Database {
    
    private $table_rules;
    private $table_rule_meta;
    
    public function __construct() {
        global $wpdb;
        $this->table_rules = $wpdb->prefix . 'flexible_pricing_rules';
        $this->table_rule_meta = $wpdb->prefix . 'flexible_pricing_rule_meta';
    }
    
    /**
     * 创建数据库表
     */
    public function create_tables() {
        global $wpdb;
        
        $charset_collate = $wpdb->get_charset_collate();
        
        // 主规则表
        $sql_rules = "CREATE TABLE IF NOT EXISTS {$this->table_rules} (
            rule_id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
            rule_name VARCHAR(200) NOT NULL,
            rule_type VARCHAR(50) NOT NULL,
            rule_priority INT(11) NOT NULL DEFAULT 10,
            rule_status TINYINT(1) NOT NULL DEFAULT 1,
            start_date DATETIME DEFAULT NULL,
            end_date DATETIME DEFAULT NULL,
            conditions TEXT,
            actions TEXT,
            created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
            updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
            PRIMARY KEY (rule_id),
            KEY rule_type (rule_type),
            KEY rule_status (rule_status),
            KEY rule_priority (rule_priority)
        ) $charset_collate;";
        
        // 规则元数据表
        $sql_meta = "CREATE TABLE IF NOT EXISTS {$this->table_rule_meta} (
            meta_id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
            rule_id BIGINT(20) UNSIGNED NOT NULL,
            meta_key VARCHAR(255) NOT NULL,
            meta_value LONGTEXT,
            PRIMARY KEY (meta_id),
            KEY rule_id (rule_id),
            KEY meta_key (meta_key)
        ) $charset_collate;";
        
        require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
        dbDelta($sql_rules);
        dbDelta($sql_meta);
    }
    
    /**
     * 获取所有活跃的定价规则
     */
    public function get_active_rules($product_id = null, $user_id = null) {
        global $wpdb;
        
        $current_time = current_time('mysql');
        
        $sql = "SELECT r.* FROM {$this->table_rules} r
                WHERE r.rule_status = 1
                AND (r.start_date IS NULL OR r.start_date <= %s)
                AND (r.end_date IS NULL OR r.end_date >= %s)";
        
        $params = array($current_time, $current_time);
        
        // 如果有产品ID,添加产品条件
        if ($product_id) {
            $sql .= " AND EXISTS (
                SELECT 1 FROM {$this->table_rule_meta} rm
                WHERE rm.rule_id = r.rule_id
                AND rm.meta_key = 'applicable_products'
                AND (rm.meta_value = 'all' OR FIND_IN_SET(%d, rm.meta_value))
            )";
            $params[] = $product_id;
        }
        
        // 如果有用户ID,添加用户条件
        if ($user_id) {
            $user = get_userdata($user_id);
            $user_roles = $user->roles;
            
            $sql .= " AND EXISTS (
                SELECT 1 FROM {$this->table_rule_meta} rm
                WHERE rm.rule_id = r.rule_id
                AND rm.meta_key = 'applicable_user_roles'
                AND (rm.meta_value = 'all' OR ";
            
            $role_conditions = array();
            foreach ($user_roles as $role) {
                $role_conditions[] = "FIND_IN_SET(%s, rm.meta_value)";
                $params[] = $role;
            }
            $sql .= implode(' OR ', $role_conditions) . ")
            )";
        }
        
        $sql .= " ORDER BY r.rule_priority ASC, r.rule_id ASC";
        
        return $wpdb->get_results($wpdb->prepare($sql, $params));
    }
    
    /**
     * 保存定价规则
     */
    public function save_rule($rule_data) {
        global $wpdb;
        
        $defaults = array(
            'rule_name' => '',
            'rule_type' => 'discount',
            'rule_priority' => 10,
            'rule_status' => 1,
            'start_date' => null,
            'end_date' => null,
            'conditions' => '',
            'actions' => '',
            'meta_data' => array()
        );
        
        $rule_data = wp_parse_args($rule_data, $defaults);
        
        // 序列化条件和动作
        if (is_array($rule_data['conditions'])) {
            $rule_data['conditions'] = maybe_serialize($rule_data['conditions']);
        }
        
        if (is_array($rule_data['actions'])) {
            $rule_data['actions'] = maybe_serialize($rule_data['actions']);
        }
        
        // 保存主规则
        $result = $wpdb->insert(
            $this->table_rules,
            array(
                'rule_name' => sanitize_text_field($rule_data['rule_name']),
                'rule_type' => sanitize_text_field($rule_data['rule_type']),
                'rule_priority' => intval($rule_data['rule_priority']),
                'rule_status' => intval($rule_data['rule_status']),
                'start_date' => $rule_data['start_date'],
                'end_date' => $rule_data['end_date'],
                'conditions' => $rule_data['conditions'],
                'actions' => $rule_data['actions']
            ),
            array('%s', '%s', '%d', '%d', '%s', '%s', '%s', '%s')
        );
        
        if (!$result) {
            return false;
        }
        
        $rule_id = $wpdb->insert_id;
        
        // 保存元数据
        foreach ($rule_data['meta_data'] as $key => $value) {
            $this->save_rule_meta($rule_id, $key, $value);
        }
        
        return $rule_id;
    }
    
    /**
     * 保存规则元数据
     */
    private function save_rule_meta($rule_id, $key, $value) {
        global $wpdb;
        
        if (is_array($value)) {
            $value = maybe_serialize($value);
        }
        
        return $wpdb->insert(
            $this->table_rule_meta,
            array(
                'rule_id' => $rule_id,
                'meta_key' => sanitize_text_field($key),
                'meta_value' => $value
            ),
            array('%d', '%s', '%s')
        );
    }
    
    /**
     * 获取规则的所有元数据
     */
    public function get_rule_meta($rule_id) {
        global $wpdb;
        
        $results = $wpdb->get_results(
            $wpdb->prepare(
                "SELECT meta_key, meta_value FROM {$this->table_rule_meta} WHERE rule_id = %d",
                $rule_id
            )
        );
        
        $meta_data = array();
        foreach ($results as $row) {
            $meta_data[$row->meta_key] = maybe_unserialize($row->meta_value);
        }
        
        return $meta_data;
    }
}
?>

规则引擎与条件评估系统

创建强大的规则引擎来处理复杂的定价逻辑:

<?php
/**
 * 规则引擎
 * 评估条件并执行相应的定价动作
 */

class Flexible_Pricing_Rule_Engine {
    
    private $db;
    private $current_context;
    
    public function __construct() {
        $this->db = new Flexible_Pricing_Database();
        $this->current_context = array();
    }
    
    /**
     * 设置当前上下文
     */
    public function set_context($context) {
        $this->current_context = wp_parse_args($context, array(
            'product_id' => null,
            'user_id' => null,
            'quantity' => 1,
            'cart_total' => 0,
            'user_role' => null,
            'purchase_history' => array(),
            'current_time' => current_time('timestamp')
        ));
    }
    
    /**
     * 评估所有适用的规则
     */
    public function evaluate_rules() {
        $rules = $this->db->get_active_rules(
            $this->current_context['product_id'],
            $this->current_context['user_id']
        );
        
        $applicable_rules = array();
        
        foreach ($rules as $rule) {
            if ($this->evaluate_rule_conditions($rule)) {
                $applicable_rules[] = $rule;
            }
        }
        
        return $applicable_rules;
    }
    
    /**
     * 评估单个规则的条件
     */
    private function evaluate_rule_conditions($rule) {
        $conditions = maybe_unserialize($rule->conditions);
        
        if (empty($conditions)) {
            return true;
        }
        
        foreach ($conditions as $condition) {
            if (!$this->evaluate_single_condition($condition)) {
                return false;
            }
        }
        
        return true;
    }
    
    /**
     * 评估单个条件
     */
    private function evaluate_single_condition($condition) {
        $condition_type = $condition['type'] ?? '';
        $operator = $condition['operator'] ?? '';
        $value = $condition['value'] ?? '';
        
        switch ($condition_type) {
            case 'user_role':
                return $this->evaluate_user_role_condition($operator, $value);
                
            case 'purchase_history':
                return $this->evaluate_purchase_history_condition($operator, $value);
                
            case 'cart_total':
                return $this->evaluate_cart_total_condition($operator, $value);
                
            case 'product_category':
                return $this->evaluate_product_category_condition($operator, $value);
                
            case 'date_range':
                return $this->evaluate_date_range_condition($operator, $value);
                
            case 'time_of_day':
                return $this->evaluate_time_of_day_condition($operator, $value);
                
            default:
                return true;
        }
    }
    
    /**
     * 评估用户角色条件
     */
    private function evaluate_user_role_condition($operator, $value) {
        $user_roles = $this->current_context['user_role'] ?? array();
        
        if (empty($user_roles)) {
            $user = wp_get_current_user();
            $user_roles = $user->roles;
        }
        
        switch ($operator) {
            case 'is':
                return in_array($value, $user_roles);
                
            case 'is_not':
                return !in_array($value, $user_roles);
                
            case 'includes_any':
                $required_roles = is_array($value) ? $value : explode(',', $value);
                return !empty(array_intersect($required_roles, $user_roles));
                
            default:
                return true;
        }
    }
    
    /**
     * 评估购买历史条件
     */
    private function evaluate_purchase_history_condition($operator, $value) {
        $purchase_history = $this->current_context['purchase_history'];
        $total_spent = $purchase_history['total_spent'] ?? 0;
        $order_count = $purchase_history['order_count'] ?? 0;
        
        list($field, $comparison_value) = explode(':', $value);
        
        switch ($field) {
            case 'total_spent':
                $actual_value = $total_spent;
                break;
                
            case 'order_count':
                $actual_value = $order_count;
                break;
                
            default:
                return true;
        }
        
        return $this->compare_values($actual_value, $operator, $comparison_value);
    }
    
    /**
     * 评估购物车总额条件
     */
    private function evaluate_cart_total_condition($operator, $value) {
        $cart_total = $this->current_context['cart_total'];
        return $this->compare_values($cart_total, $operator, $value);
    }
    
    /**
     * 比较数值
     */
    private function compare_values($actual, $operator, $expected) {
        switch ($operator) {
            case 'greater_than':
                return $actual > $expected;
                
            case 'less_than':
                return $actual < $expected;
                
            case 'equals':
                return $actual == $expected;
                
            case 'not_equals':
                return $actual != $expected;
                
            case 'greater_than_or_equals':
                return $actual >= $expected;
                
            case 'less_than_or_equals':
                return $actual <= $expected;
                
            default:
                return true;
        }
    }
    
    /**
     * 执行规则动作
     */
    public function execute_rule_actions($rules, $base_price) {
        $final_price = $base_price;
        $applied_discounts = array();
        
        foreach ($rules as $rule) {
            $actions = maybe_unserialize($rule->actions);
            
            foreach ($actions as $action) {
                $result = $this->execute_single_action($action, $final_price);
                
                if ($result['price'] != $final_price) {
                    $final_price = $result['price'];
                    $applied_discounts[] = array(
                        'rule_name' => $rule->rule_name,
                        'discount_amount' => $base_price - $final_price,
                        'discount_type' => $action['type']
                    );
                }
            }
        }
        
        return array(
            'final_price' => $final_price,
            'applied_discounts' => $applied_discounts
        );
    }
    
    /**
     * 执行单个动作
     */
    private function execute_single_action($action, $current_price) {
        $action_type = $action['type'] ?? '';
        $value = $action['value'] ?? 0;
        
        switch ($action_type) {
            case 'percentage_discount':
                $discount = $current_price * ($value / 100);
                return array(
                    'price' => max($current_price - $discount, 0),
                    'type' => 'percentage'
                );
                
            case 'fixed_discount':
                return array(
                    'price' => max($current_price - $value, 0),
                    'type' => 'fixed'
                );
                
            case 'fixed_price':
                return array(
                    'price' => $value,
                    'type' => 'fixed_price'
                );
                
            case 'multiply_price':
                return array(
                    'price' => $current_price * $value,
                    'type' => 'multiply'
                );
                
            default:
                return array(
                    'price' => $current_price,
                    'type' => 'none'
                );
        }
    }
}
?>

高级管理界面与规则构建器

创建直观的管理界面,让非技术人员也能轻松创建定价规则:

<?php
/**
 * 规则构建器界面
 * 提供拖放式规则创建界面
 */

class Flexible_Pricing_Rule_Builder {
    
    public function render_rule_builder() {
        wp_enqueue_script('flexible-pricing-builder');
        wp_enqueue_style('flexible-pricing-builder-css');
        ?>
        
        <div class="wrap">
            <h1><?php _e('定价规则构建器', 'flexible-pricing'); ?></h1>
            
            <div id="rule-builder-app">
                <!-- Vue.js或React应用容器 -->
                <div class="rule-builder-container">
                    
                    <!-- 规则基本信息 -->
                    <div class="rule-basic-info">
                        <div class="form-group">
                            <label for="rule-name"><?php _e('规则名称', 'flexible-pricing'); ?></label>
                            <input type="text" id="rule-name" v-model="ruleName" 
                                   placeholder="<?php esc_attr_e('例如:VIP用户专属折扣', 'flexible-pricing'); ?>">
                        </div>
                        
                        <div class="form-group">
                            <label for="rule-priority"><?php _e('规则优先级', 'flexible-pricing'); ?></label>
                            <input type="number" id="rule-priority" v-model="rulePriority" min="1" max="100">
                            <p class="description"><?php _e('数字越小优先级越高', 'flexible-pricing'); ?></p>
                        </div>
                    </div>
                    
                    <!-- 条件构建器 -->
                    <div class="conditions-builder">
                        <h3><?php _e('条件', 'flexible-pricing'); ?></h3>
                        <div class="condition-group" v-for="(condition, index) in conditions">
                            <select v-model="condition.type" @change="updateConditionOptions(index)">
                                <option value="user_role"><?php _e('用户角色', 'flexible-pricing'); ?></option>
                                <option value="purchase_history"><?php _e('购买历史', 'flexible-pricing'); ?></option>
                                <option value="cart_total"><?php _e('购物车总额', 'flexible-pricing'); ?></option>
                                <option value="product_category"><?php _e('产品分类', 'flexible-pricing'); ?></option>
                                <option value="date_range"><?php _e('日期范围', 'flexible-pricing'); ?></option>
                            </select>
                            
                            <select v-model="condition.operator">
                                <option v-for="op in getOperatorsForType(condition.type)" 
                                        :value="op.value">{{ op.label }}</option>
                            </select>
                            
                            <input type="text" v-model="condition.value" 
                                   :placeholder="getValuePlaceholder(condition.type)">
                            
                            <button class="button button-small" 
                                    @click="removeCondition(index)"><?php _e('删除', 'flexible-pricing'); ?></button>
                        </div>
                        
本文来自网络,不代表柔性供应链服务中心立场,转载请注明出处:https://mall.org.cn/5807.html

EXCHANGES®作者

上一篇
下一篇

为您推荐

发表回复

联系我们

联系我们

18559313275

在线咨询: QQ交谈

邮箱: vip@exchanges.center

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