prefix . 'userhub_sites'; $charset_collate = $wpdb->get_charset_collate(); $sql = "CREATE TABLE {$table_name} ( id bigint(20) unsigned NOT NULL AUTO_INCREMENT, site_name varchar(255) NOT NULL DEFAULT '', site_url varchar(500) NOT NULL, api_key varchar(255) NOT NULL, status varchar(20) NOT NULL DEFAULT 'unknown', last_ping datetime DEFAULT NULL, wp_version varchar(20) DEFAULT '', php_version varchar(20) DEFAULT '', user_count int(11) DEFAULT 0, created_at datetime NOT NULL DEFAULT '0000-00-00 00:00:00', updated_at datetime NOT NULL DEFAULT '0000-00-00 00:00:00', PRIMARY KEY (id), UNIQUE KEY site_url (site_url(191)) ) {$charset_collate};"; require_once ABSPATH . 'wp-admin/includes/upgrade.php'; dbDelta( $sql ); update_option( 'wpuhm_db_version', WPUHM_VERSION ); } // register_deactivation_hook( __FILE__, 'wpuhm_deactivate' ); function wpuhm_deactivate() { // Don't drop table on deactivation — preserve data } /** * Self-healing DB check: Ensure database table is created automatically if missing. */ add_action( 'admin_init', 'wpuhm_check_db_version' ); function wpuhm_check_db_version() { $db_version = get_option( 'wpuhm_db_version', '' ); if ( $db_version !== WPUHM_VERSION ) { wpuhm_activate(); } } /** * ============================================================= * ADMIN MENU * ============================================================= */ add_action( 'admin_menu', 'wpuhm_admin_menu' ); function wpuhm_admin_menu() { // Top-level menu add_menu_page( __( 'User Hub', 'absoluit-user-hub' ), __( 'User Hub', 'absoluit-user-hub' ), 'manage_options', 'userhub-dashboard', 'wpuhm_render_dashboard', 'dashicons-networking' ); // Submenu pages add_submenu_page( 'userhub-dashboard', __( 'Dashboard', 'absoluit-user-hub' ), __( 'Dashboard', 'absoluit-user-hub' ), 'manage_options', 'userhub-dashboard', 'wpuhm_render_dashboard' ); add_submenu_page( 'userhub-dashboard', __( 'Connected Sites', 'absoluit-user-hub' ), __( 'Connected Sites', 'absoluit-user-hub' ), 'manage_options', 'userhub-sites', 'wpuhm_render_sites' ); add_submenu_page( 'userhub-dashboard', __( 'Add User', 'absoluit-user-hub' ), __( 'Add User', 'absoluit-user-hub' ), 'manage_options', 'userhub-add-user', 'wpuhm_render_add_user' ); add_submenu_page( 'userhub-dashboard', __( 'Remove User', 'absoluit-user-hub' ), __( 'Remove User', 'absoluit-user-hub' ), 'manage_options', 'userhub-remove-user', 'wpuhm_render_remove_user' ); add_submenu_page( 'userhub-dashboard', __( 'All Users', 'absoluit-user-hub' ), __( 'All Users', 'absoluit-user-hub' ), 'manage_options', 'userhub-users', 'wpuhm_render_users' ); } /** * ============================================================= * ENQUEUE ADMIN ASSETS * ============================================================= */ add_action( 'admin_enqueue_scripts', 'wpuhm_enqueue_admin_assets' ); function wpuhm_enqueue_admin_assets( $hook ) { // Only load on our pages if ( strpos( $hook, 'userhub' ) === false ) { return; } // Google Fonts wp_enqueue_style( 'wpuhm-google-fonts', 'https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap', array(), null ); wp_enqueue_style( 'wpuhm-admin-style', WPUHM_PLUGIN_URL . 'admin/css/admin-style.css', array(), WPUHM_VERSION ); wp_enqueue_script( 'wpuhm-admin-script', WPUHM_PLUGIN_URL . 'admin/js/admin-script.js', array( 'jquery' ), WPUHM_VERSION, true ); wp_localize_script( 'wpuhm-admin-script', 'wpuhm_ajax', array( 'ajax_url' => admin_url( 'admin-ajax.php' ), 'nonce' => wp_create_nonce( 'wpuhm_nonce' ), 'strings' => array( 'confirm_delete_site' => __( 'Are you sure you want to remove this site?', 'absoluit-user-hub' ), 'confirm_delete_user' => __( 'Are you sure you want to delete this user from the selected sites?', 'absoluit-user-hub' ), 'testing' => __( 'Testing...', 'absoluit-user-hub' ), 'connected' => __( 'Connected', 'absoluit-user-hub' ), 'failed' => __( 'Failed', 'absoluit-user-hub' ), 'processing' => __( 'Processing...', 'absoluit-user-hub' ), 'complete' => __( 'Complete!', 'absoluit-user-hub' ), 'error' => __( 'Error', 'absoluit-user-hub' ), ), ) ); } /** * ============================================================= * PAGE RENDERERS * ============================================================= */ function wpuhm_render_dashboard() { include WPUHM_PLUGIN_DIR . 'admin/views/dashboard.php'; } function wpuhm_render_sites() { include WPUHM_PLUGIN_DIR . 'admin/views/sites.php'; } function wpuhm_render_add_user() { include WPUHM_PLUGIN_DIR . 'admin/views/add-user.php'; } function wpuhm_render_remove_user() { include WPUHM_PLUGIN_DIR . 'admin/views/remove-user.php'; } function wpuhm_render_users() { include WPUHM_PLUGIN_DIR . 'admin/views/users.php'; }