'
. 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();