// ... existing code ... $table_licenses = $wpdb->prefix . 'cat_bkn_licenses'; $sql_licenses = "CREATE TABLE $table_licenses ( id mediumint(9) NOT NULL AUTO_INCREMENT, license_code varchar(50) NOT NULL, status varchar(20) DEFAULT 'active' NOT NULL, used_by varchar(100) DEFAULT '' NOT NULL, created_at datetime DEFAULT '0000-00-00 00:00:00' NOT NULL, PRIMARY KEY (id), UNIQUE KEY license_code (license_code) ) $charset_collate;"; // 3. TABEL BARU: Tabel Bank Soal Asli $table_questions = $wpdb->prefix . 'cat_bkn_questions'; $sql_questions = "CREATE TABLE $table_questions ( id mediumint(9) NOT NULL AUTO_INCREMENT, category varchar(10) NOT NULL, /* TWK, TIU, TKP */ question_text text NOT NULL, option_a text NOT NULL, option_b text NOT NULL, option_c text NOT NULL, option_d text NOT NULL, option_e text NOT NULL, correct_answer varchar(5) NOT NULL, /* A, B, C, D, atau E */ explanation text NOT NULL, PRIMARY KEY (id) ) $charset_collate;"; require_once(ABSPATH . 'wp-admin/includes/upgrade.php'); dbDelta($sql_leaderboard); dbDelta($sql_licenses); dbDelta($sql_questions); // Eksekusi tabel soal }// ... existing code ... // MEMBUAT REST API (LEADERBOARD & VALIDASI LISENSI) add_action('rest_api_init', function () { register_rest_route('cat-bkn/v1', '/leaderboard', array( array('methods' => 'GET', 'callback' => 'cat_bkn_get_leaderboard', 'permission_callback' => '__return_true'), array('methods' => 'POST', 'callback' => 'cat_bkn_post_score', 'permission_callback' => '__return_true') )); register_rest_route('cat-bkn/v1', '/verify-license', array( array('methods' => 'POST', 'callback' => 'cat_bkn_verify_license', 'permission_callback' => '__return_true') )); // Tambahkan baris ini di bawah route verify-license register_rest_route('cat-bkn/v1', '/questions', array( array('methods' => 'GET', 'callback' => 'cat_bkn_get_questions', 'permission_callback' => '__return_true') )); }); function cat_bkn_verify_license(WP_REST_Request $request) { // ... existing code ... function cat_bkn_post_score(WP_REST_Request $request) { global $wpdb; $table_name = $wpdb->prefix . 'cat_bkn_leaderboard'; $params = $request->get_json_params(); if (empty($params['userId']) || !isset($params['score'])) return new WP_Error('invalid_data', 'Data tidak lengkap', array('status' => 400)); $wpdb->insert($table_name, array( 'user_id' => sanitize_text_field($params['userId']), 'display_name' => sanitize_text_field($params['displayName']), 'score' => intval($params['score']), 'twk' => intval($params['twk']), 'tiu' => intval($params['tiu']), 'tkp' => intval($params['tkp']), 'finished_at' => current_time('mysql') )); return rest_ensure_response(array('success' => true)); } // FUNGSI UNTUK MENGAMBIL SOAL DARI DATABASE function cat_bkn_get_questions() { global $wpdb; $table_name = $wpdb->prefix . 'cat_bkn_questions'; // Ambil semua soal dari database $results = $wpdb->get_results("SELECT * FROM $table_name"); $data = array(); foreach ($results as $r) { // Format data agar sesuai dengan struktur yang diminta JavaScript lama $data[] = array( 'id' => $r->category . '_' . $r->id, 'category' => $r->category, 'text' => $r->question_text, 'options' => array( 'A' => $r->option_a, 'B' => $r->option_b, 'C' => $r->option_c, 'D' => $r->option_d, 'E' => $r->option_e ), 'correct' => $r->correct_answer, 'explanation' => $r->explanation ); } return rest_ensure_response($data); }// ... existing code ... // APLIKASI UTAMA (HTML & JS) add_action('template_redirect', 'cat_bkn_serve_app'); function cat_bkn_serve_app() { if (isset($_GET['simulasi_cat']) && $_GET['simulasi_cat'] === 'app') { $is_logged_in = is_user_logged_in(); $current_user = wp_get_current_user(); $wp_api_url = rest_url('cat-bkn/v1/leaderboard'); $wp_api_verify_url = rest_url('cat-bkn/v1/verify-license'); $wp_api_questions_url = rest_url('cat-bkn/v1/questions'); ?> // ... existing code ...