Yoone Subscriptions 需要 WooCommerce 插件才能正常工作。
';
});
return;
}
// 定义插件常量
define('YOONE_SUBSCRIPTIONS_VERSION', '1.0.0');
define('YOONE_SUBSCRIPTIONS_PLUGIN_FILE', __FILE__);
define('YOONE_SUBSCRIPTIONS_PLUGIN_BASENAME', plugin_basename(__FILE__));
define('YOONE_SUBSCRIPTIONS_PLUGIN_PATH', plugin_dir_path(__FILE__));
define('YOONE_SUBSCRIPTIONS_PLUGIN_URL', plugin_dir_url(__FILE__));
define('YOONE_SUBSCRIPTIONS_INCLUDES_PATH', YOONE_SUBSCRIPTIONS_PLUGIN_PATH . 'includes/');
define('YOONE_SUBSCRIPTIONS_TEMPLATES_PATH', YOONE_SUBSCRIPTIONS_PLUGIN_PATH . 'templates/');
define('YOONE_SUBSCRIPTIONS_ASSETS_URL', YOONE_SUBSCRIPTIONS_PLUGIN_URL . 'assets/');
/**
* 主插件类
*/
final class Yoone_Subscriptions {
/**
* 单例实例
*/
private static $instance = null;
/**
* 获取单例实例
*/
public static function instance() {
if (is_null(self::$instance)) {
self::$instance = new self();
}
return self::$instance;
}
/**
* 构造函数
*/
private function __construct() {
$this->init_hooks();
}
/**
* 初始化钩子
*/
private function init_hooks() {
// 插件激活和停用钩子
register_activation_hook(__FILE__, array($this, 'activate'));
register_deactivation_hook(__FILE__, array($this, 'deactivate'));
// 插件加载完成后初始化
add_action('plugins_loaded', array($this, 'init'), 10);
// 检查WooCommerce依赖
add_action('admin_notices', array($this, 'check_woocommerce_dependency'));
}
/**
* 插件初始化
*/
public function init() {
// 检查WooCommerce是否激活
if (!$this->is_woocommerce_active()) {
return;
}
// 加载文本域
$this->load_textdomain();
// 包含核心文件
$this->includes();
// 初始化类
$this->init_classes();
// 初始化钩子
$this->init_plugin_hooks();
}
/**
* 检查WooCommerce是否激活
*/
private function is_woocommerce_active() {
return class_exists('WooCommerce');
}
/**
* 检查WooCommerce依赖
*/
public function check_woocommerce_dependency() {
if (!$this->is_woocommerce_active()) {
echo '';
echo __('Yoone Subscriptions 需要 WooCommerce 插件才能正常工作。', 'yoone-subscriptions');
echo '
';
}
}
/**
* 加载文本域
*/
private function load_textdomain() {
load_plugin_textdomain(
'yoone-subscriptions',
false,
dirname(YOONE_SUBSCRIPTIONS_PLUGIN_BASENAME) . '/languages'
);
}
/**
* 包含核心文件
*/
private function includes() {
// 核心抽象类和接口
require_once YOONE_SUBSCRIPTIONS_PLUGIN_PATH . 'includes/abstracts/abstract-yoone-data.php';
require_once YOONE_SUBSCRIPTIONS_PLUGIN_PATH . 'includes/interfaces/interface-yoone-subscription.php';
// 核心类
require_once YOONE_SUBSCRIPTIONS_PLUGIN_PATH . 'includes/class-yoone-install.php';
require_once YOONE_SUBSCRIPTIONS_PLUGIN_PATH . 'includes/class-yoone-ajax.php';
require_once YOONE_SUBSCRIPTIONS_PLUGIN_PATH . 'includes/class-yoone-api.php';
// 混装产品层
require_once YOONE_SUBSCRIPTIONS_PLUGIN_PATH . 'includes/bundle/class-yoone-bundle-product.php';
require_once YOONE_SUBSCRIPTIONS_PLUGIN_PATH . 'includes/bundle/class-yoone-bundle-cart.php';
require_once YOONE_SUBSCRIPTIONS_PLUGIN_PATH . 'includes/bundle/class-yoone-bundle-admin.php';
// 订阅层
require_once YOONE_SUBSCRIPTIONS_PLUGIN_PATH . 'includes/subscription/class-yoone-subscription.php';
require_once YOONE_SUBSCRIPTIONS_PLUGIN_PATH . 'includes/subscription/class-yoone-subscription-manager.php';
require_once YOONE_SUBSCRIPTIONS_PLUGIN_PATH . 'includes/subscription/class-yoone-subscription-scheduler.php';
require_once YOONE_SUBSCRIPTIONS_PLUGIN_PATH . 'includes/subscription/class-yoone-subscription-admin.php';
// 支付层
require_once YOONE_SUBSCRIPTIONS_PLUGIN_PATH . 'includes/payment/class-yoone-moneris-gateway.php';
require_once YOONE_SUBSCRIPTIONS_PLUGIN_PATH . 'includes/payment/class-yoone-payment-token.php';
require_once YOONE_SUBSCRIPTIONS_PLUGIN_PATH . 'includes/payment/class-yoone-payment-tokens.php';
require_once YOONE_SUBSCRIPTIONS_PLUGIN_PATH . 'includes/payment/class-yoone-payment-scheduler.php';
// 前端类
if (!is_admin()) {
require_once YOONE_SUBSCRIPTIONS_PLUGIN_PATH . 'includes/frontend/class-yoone-frontend.php';
require_once YOONE_SUBSCRIPTIONS_PLUGIN_PATH . 'includes/frontend/class-yoone-shortcodes.php';
}
// 管理后台类
if (is_admin()) {
require_once YOONE_SUBSCRIPTIONS_PLUGIN_PATH . 'includes/admin/class-yoone-admin.php';
require_once YOONE_SUBSCRIPTIONS_PLUGIN_PATH . 'includes/admin/class-yoone-admin-menus.php';
require_once YOONE_SUBSCRIPTIONS_PLUGIN_PATH . 'includes/admin/class-yoone-admin-settings.php';
require_once YOONE_SUBSCRIPTIONS_PLUGIN_PATH . 'includes/admin/class-yoone-admin-logs.php';
require_once YOONE_SUBSCRIPTIONS_PLUGIN_PATH . 'includes/class-yoone-log-analyzer.php';
require_once YOONE_SUBSCRIPTIONS_PLUGIN_PATH . 'tests/test-config.php';
require_once YOONE_SUBSCRIPTIONS_PLUGIN_PATH . 'tests/test-subscription-flow.php';
require_once YOONE_SUBSCRIPTIONS_PLUGIN_PATH . 'tests/class-yoone-test-suite.php';
}
// 工具类
require_once YOONE_SUBSCRIPTIONS_PLUGIN_PATH . 'includes/class-yoone-logger.php';
require_once YOONE_SUBSCRIPTIONS_PLUGIN_PATH . 'includes/class-yoone-cache.php';
require_once YOONE_SUBSCRIPTIONS_PLUGIN_PATH . 'includes/class-yoone-helper.php';
}
/**
* 初始化类
*/
private function init_classes() {
// 初始化前端类
new Yoone_Frontend();
// 初始化后端类
if (is_admin()) {
new Yoone_Admin();
new Yoone_Admin_Logs();
new Yoone_Test_Suite();
}
// 初始化AJAX类
new Yoone_Ajax();
// 初始化计划任务类
new Yoone_Cron();
// 注册支付网关
add_filter('woocommerce_payment_gateways', array($this, 'add_payment_gateways'));
// 注册产品类型
add_filter('product_type_selector', array($this, 'add_product_types'));
add_action('woocommerce_product_data_tabs', array($this, 'add_product_data_tabs'));
add_action('woocommerce_product_data_panels', array($this, 'add_product_data_panels'));
}
/**
* 初始化插件钩子
*/
private function init_plugin_hooks() {
// 产品类型和数据面板
add_filter('product_type_selector', array($this, 'add_product_types'));
add_filter('woocommerce_product_data_tabs', array($this, 'add_product_data_tabs'));
add_action('woocommerce_product_data_panels', array($this, 'add_product_data_panels'));
// 订阅状态和端点
add_action('init', array($this, 'register_subscription_statuses'));
add_action('init', array($this, 'add_subscription_endpoints'));
// 管理菜单
add_action('admin_menu', array($this, 'add_admin_menus'));
// 订单状态变化处理
add_action('woocommerce_order_status_changed', array($this, 'handle_order_status_change'), 10, 4);
// 产品元数据保存
add_action('woocommerce_process_product_meta', array($this, 'save_product_meta'));
// 我的账户菜单项
add_filter('woocommerce_account_menu_items', array($this, 'add_account_menu_items'));
add_action('woocommerce_account_subscriptions_endpoint', array($this, 'subscriptions_endpoint_content'));
// 订阅续费处理
add_action('yoone_process_subscription_renewals', array($this, 'process_subscription_renewals'));
// 清理过期令牌
add_action('yoone_cleanup_expired_tokens', array($this, 'cleanup_expired_tokens'));
// 文本域加载
add_action('plugins_loaded', array($this, 'load_textdomain'));
}
/**
* 添加Moneris支付网关
*/
public function add_moneris_gateway($gateways) {
$gateways[] = 'Yoone_Moneris_Gateway';
return $gateways;
}
/**
* 初始化核心钩子
*/
private function init_core_hooks() {
// WooCommerce初始化后的钩子
add_action('woocommerce_init', array($this, 'woocommerce_init'));
// 加载模板钩子
add_filter('woocommerce_locate_template', array($this, 'locate_template'), 10, 3);
// 脚本和样式
add_action('wp_enqueue_scripts', array($this, 'enqueue_scripts'));
add_action('admin_enqueue_scripts', array($this, 'admin_enqueue_scripts'));
}
/**
* WooCommerce初始化
*/
public function woocommerce_init() {
// 注册自定义产品类型
add_filter('product_type_selector', array($this, 'add_bundle_product_type'));
// 注册自定义订单状态
add_action('init', array($this, 'register_subscription_statuses'));
}
/**
* 添加混装产品类型
*/
public function add_bundle_product_type($types) {
$types['bundle'] = __('混装产品', 'yoone-subscriptions');
return $types;
}
/**
* 注册订阅状态
*/
public function register_subscription_statuses() {
register_post_status('yoone-active', array(
'label' => __('激活', 'yoone-subscriptions'),
'public' => false,
'show_in_admin_status_list' => true,
'label_count' => _n_noop('激活 (%s)', '激活 (%s)', 'yoone-subscriptions')
));
register_post_status('yoone-paused', array(
'label' => __('暂停', 'yoone-subscriptions'),
'public' => false,
'show_in_admin_status_list' => true,
'label_count' => _n_noop('暂停 (%s)', '暂停 (%s)', 'yoone-subscriptions')
));
register_post_status('yoone-cancelled', array(
'label' => __('已取消', 'yoone-subscriptions'),
'public' => false,
'show_in_admin_status_list' => true,
'label_count' => _n_noop('已取消 (%s)', '已取消 (%s)', 'yoone-subscriptions')
));
}
/**
* 定位模板文件
*/
public function locate_template($template, $template_name, $template_path) {
if (strpos($template_name, 'yoone-') === 0) {
$plugin_template = YOONE_SUBSCRIPTIONS_PLUGIN_PATH . 'templates/' . $template_name;
if (file_exists($plugin_template)) {
return $plugin_template;
}
}
return $template;
}
/**
* 加载前端脚本和样式
*/
public function enqueue_scripts() {
wp_enqueue_style(
'yoone-subscriptions-frontend',
YOONE_SUBSCRIPTIONS_PLUGIN_URL . 'assets/css/frontend.css',
array(),
YOONE_SUBSCRIPTIONS_VERSION
);
wp_enqueue_script(
'yoone-subscriptions-frontend',
YOONE_SUBSCRIPTIONS_PLUGIN_URL . 'assets/js/frontend.js',
array('jquery', 'wc-add-to-cart'),
YOONE_SUBSCRIPTIONS_VERSION,
true
);
// 本地化脚本
wp_localize_script('yoone-subscriptions-frontend', 'yoone_ajax', array(
'ajax_url' => admin_url('admin-ajax.php'),
'nonce' => wp_create_nonce('yoone_nonce'),
'i18n' => array(
'loading' => __('加载中...', 'yoone-subscriptions'),
'error' => __('发生错误,请重试', 'yoone-subscriptions')
)
));
}
/**
* 加载后台脚本和样式
*/
public function admin_enqueue_scripts($hook) {
// 只在相关页面加载
if (strpos($hook, 'yoone') === false && !in_array($hook, array('post.php', 'post-new.php', 'edit.php'))) {
return;
}
wp_enqueue_style(
'yoone-subscriptions-admin',
YOONE_SUBSCRIPTIONS_PLUGIN_URL . 'assets/css/admin.css',
array(),
YOONE_SUBSCRIPTIONS_VERSION
);
wp_enqueue_script(
'yoone-subscriptions-admin',
YOONE_SUBSCRIPTIONS_PLUGIN_URL . 'assets/js/admin.js',
array('jquery', 'wc-enhanced-select'),
YOONE_SUBSCRIPTIONS_VERSION,
true
);
wp_localize_script('yoone-subscriptions-admin', 'yoone_admin', array(
'ajax_url' => admin_url('admin-ajax.php'),
'nonce' => wp_create_nonce('yoone_admin_nonce')
));
}
/**
* 插件激活
*/
public function activate() {
// 检查WooCommerce
if (!$this->is_woocommerce_active()) {
deactivate_plugins(YOONE_SUBSCRIPTIONS_PLUGIN_BASENAME);
wp_die(__('Yoone Subscriptions 需要 WooCommerce 插件才能激活。', 'yoone-subscriptions'));
}
// 创建数据库表
Yoone_Install::activate();
// 设置默认选项
$this->set_default_options();
// 刷新重写规则
flush_rewrite_rules();
}
/**
* 插件停用
*/
public function deactivate() {
// 清理定时任务
wp_clear_scheduled_hook('yoone_process_subscriptions');
wp_clear_scheduled_hook('yoone_retry_failed_payments');
// 刷新重写规则
flush_rewrite_rules();
}
/**
* 设置默认选项
*/
private function set_default_options() {
$defaults = array(
'yoone_bundle_min_quantity' => 10,
'yoone_subscription_billing_cycle' => 'monthly',
'yoone_payment_retry_attempts' => 3,
'yoone_payment_retry_interval' => 24
);
foreach ($defaults as $option => $value) {
if (get_option($option) === false) {
add_option($option, $value);
}
}
}
}
/**
* 获取插件主实例
*/
function yoone_subscriptions() {
return Yoone_Subscriptions::instance();
}
// 初始化插件
yoone_subscriptions();