' . esc_html__( 'AD-SD Referral CouponCore EcoSystem', 'adsd-referral-couponcore' ) . ' ' . esc_html( sprintf( /* translators: 1: required PHP version, 2: current PHP version */ __( 'requires PHP %1$s or higher. You are running PHP %2$s.', 'adsd-referral-couponcore' ), ADSD_RCC_MIN_PHP, PHP_VERSION ) ) . '

'; } ); return false; } if ( version_compare( $wp_version, ADSD_RCC_MIN_WP, '<' ) ) { add_action( 'admin_notices', static function () use ( $wp_version ) { echo '

' . esc_html__( 'AD-SD Referral CouponCore EcoSystem', 'adsd-referral-couponcore' ) . ' ' . esc_html( sprintf( /* translators: 1: required WP version, 2: current WP version */ __( 'requires WordPress %1$s or higher. You are running WordPress %2$s.', 'adsd-referral-couponcore' ), ADSD_RCC_MIN_WP, $wp_version ) ) . '

'; } ); return false; } return true; } if ( ! adsd_rcc_check_requirements() ) { return; } /* * Translations are loaded automatically by WordPress since version 4.6. * The text domain "adsd-referral-couponcore" and Domain Path "/languages" * declared in the plugin header are sufficient — no manual call required. */ /** * Load all dependency class files. */ function adsd_rcc_load_dependencies(): void { $includes = ADSD_RCC_DIR . 'includes/'; require_once $includes . 'class-adsd-rcc-install.php'; require_once $includes . 'class-adsd-rcc-settings.php'; require_once $includes . 'class-adsd-rcc-crypto.php'; require_once $includes . 'class-adsd-rcc-code-generator.php'; require_once $includes . 'class-adsd-rcc-db.php'; require_once $includes . 'email/class-adsd-rcc-mailer.php'; require_once $includes . 'fraud/class-adsd-rcc-fraud-guard.php'; require_once $includes . 'class-adsd-rcc-referral-engine.php'; require_once $includes . 'class-adsd-rcc-reward-engine.php'; require_once $includes . 'class-adsd-rcc-registration.php'; require_once $includes . 'public/class-adsd-rcc-shortcodes.php'; require_once $includes . 'admin/class-adsd-rcc-admin.php'; require_once $includes . 'api/class-adsd-rcc-rest-api.php'; } adsd_rcc_load_dependencies(); /** * Main plugin bootstrap class — singleton. */ final class ADSD_RCC_Plugin { /** @var ADSD_RCC_Plugin|null */ private static ?ADSD_RCC_Plugin $instance = null; /** * Get the singleton instance. */ public static function instance(): self { if ( null === self::$instance ) { self::$instance = new self(); } return self::$instance; } /** * Constructor — register all hooks. */ private function __construct() { register_activation_hook( ADSD_RCC_FILE, array( 'ADSD_RCC_Install', 'activate' ) ); register_deactivation_hook( ADSD_RCC_FILE, array( 'ADSD_RCC_Install', 'deactivate' ) ); add_action( 'plugins_loaded', array( $this, 'on_plugins_loaded' ) ); add_action( 'init', array( $this, 'on_init' ) ); add_action( 'wp_enqueue_scripts', array( $this, 'enqueue_public_assets' ) ); add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_admin_assets' ) ); } /** * Boot subsystems after all plugins are loaded. */ public function on_plugins_loaded(): void { // Allow email-based login (plugin registers users by email only). add_filter( 'authenticate', array( $this, 'allow_email_login' ), 20, 3 ); // Suppress WP's built-in new-user email — plugin sends its own verification email. add_filter( 'wp_send_new_user_notifications', '__return_false' ); // Boot subsystems — order matters. ADSD_RCC_Mailer::instance(); ADSD_RCC_Admin::instance(); ADSD_RCC_Shortcodes::instance(); ADSD_RCC_REST_API::instance(); ADSD_RCC_Registration::instance(); ADSD_RCC_Referral_Engine::instance(); // WooCommerce integration boots on init so DB is guaranteed ready. if ( self::is_woocommerce_active() ) { add_action( 'init', array( $this, 'boot_woo_integration' ), 5 ); } } /** * Boot WooCommerce integration after init. */ public function boot_woo_integration(): void { if ( ! self::is_woocommerce_active() ) { return; } $woo_file = ADSD_RCC_DIR . 'includes/woocommerce/class-adsd-rcc-woo-integration.php'; if ( ! class_exists( 'ADSD_RCC_Woo_Integration' ) && file_exists( $woo_file ) ) { require_once $woo_file; } if ( class_exists( 'ADSD_RCC_Woo_Integration' ) ) { ADSD_RCC_Woo_Integration::instance(); } } /** * Init hook — flush rewrite rules once after activation. */ public function on_init(): void { if ( get_option( 'adsd_rcc_flush_rewrite_rules' ) ) { flush_rewrite_rules(); delete_option( 'adsd_rcc_flush_rewrite_rules' ); } } /** * Enqueue frontend scripts and styles. */ public function enqueue_public_assets(): void { wp_enqueue_style( 'adsd-rcc-public', ADSD_RCC_URL . 'assets/css/adsd-rcc-public.css', array(), ADSD_RCC_VERSION ); wp_enqueue_script( 'adsd-rcc-public', ADSD_RCC_URL . 'assets/js/adsd-rcc-public.js', array( 'jquery' ), ADSD_RCC_VERSION, true ); wp_localize_script( 'adsd-rcc-public', 'ADSD_RCC', array( 'ajax_url' => admin_url( 'admin-ajax.php' ), 'nonce' => wp_create_nonce( 'adsd_rcc_public_nonce' ), 'rest_url' => esc_url_raw( rest_url( 'adsd-rcc/v1/' ) ), 'rest_nonce' => wp_create_nonce( 'wp_rest' ), 'i18n' => array( 'copied' => __( 'Copied!', 'adsd-referral-couponcore' ), 'copy_fail' => __( 'Copy failed. Please copy manually.', 'adsd-referral-couponcore' ), 'confirm_claim' => __( 'Apply this reward to your cart?', 'adsd-referral-couponcore' ), 'processing' => __( 'Processing…', 'adsd-referral-couponcore' ), ), ) ); /* * Register — but do NOT enqueue — the set-password module. * It will be enqueued on-demand by the [adsd_rcc_set_password] shortcode * only on pages where that shortcode is rendered. */ wp_register_script( 'adsd-rcc-set-password', ADSD_RCC_URL . 'assets/js/adsd-rcc-set-password.js', array(), // No jQuery dependency — written in vanilla JS. ADSD_RCC_VERSION, true // Load in footer. ); } /** * Enqueue admin scripts and styles — only on plugin pages. * * @param string $hook Current admin page hook. */ public function enqueue_admin_assets( string $hook ): void { if ( false === strpos( $hook, 'adsd-rcc' ) && false === strpos( $hook, 'adsd-referral' ) ) { return; } wp_enqueue_style( 'adsd-rcc-admin', ADSD_RCC_URL . 'assets/css/adsd-rcc-admin.css', array(), ADSD_RCC_VERSION ); wp_enqueue_script( 'adsd-rcc-admin', ADSD_RCC_URL . 'assets/js/adsd-rcc-admin.js', array( 'jquery' ), ADSD_RCC_VERSION, true ); wp_localize_script( 'adsd-rcc-admin', 'ADSD_RCC_Admin', array( 'ajax_url' => admin_url( 'admin-ajax.php' ), 'nonce' => wp_create_nonce( 'adsd_rcc_admin_nonce' ), ) ); } /** * Allow users to authenticate using their email address. * * @param WP_User|WP_Error|null $user Existing authenticated user or error. * @param string $username The submitted username/email value. * @param string $password The submitted password. * @return WP_User|WP_Error|null */ public function allow_email_login( $user, string $username, string $password ) { if ( $user instanceof WP_User ) { return $user; } if ( ! is_email( $username ) ) { return $user; } $email_user = get_user_by( 'email', $username ); if ( ! $email_user ) { return new WP_Error( 'invalid_email', __( 'No account found with that email address.', 'adsd-referral-couponcore' ) ); } if ( ! wp_check_password( $password, $email_user->user_pass, $email_user->ID ) ) { return new WP_Error( 'incorrect_password', __( 'Incorrect password.', 'adsd-referral-couponcore' ) ); } return $email_user; } /** * Check if WooCommerce is active. */ public static function is_woocommerce_active(): bool { return class_exists( 'WooCommerce' ); } } /** * Global accessor function. * * @return ADSD_RCC_Plugin */ function adsd_rcc(): ADSD_RCC_Plugin { return ADSD_RCC_Plugin::instance(); } adsd_rcc();