*/ public const KEYS = [ self::INSTRUCTIONS, self::CONSENT, self::ONBOARDING_CHECKLIST_DISMISSED, self::ONBOARDING_CHECKLIST_COMPLETED, self::ONBOARDING_TOUR_COMPLETED, ]; public function instructions(int $userId): string { return $userId > 0 ? (string) get_user_meta($userId, self::INSTRUCTIONS, true) : ''; } public function setInstructions(int $userId, string $text): void { if ($text === '') { delete_user_meta($userId, self::INSTRUCTIONS); return; } update_user_meta($userId, self::INSTRUCTIONS, $text); } public function consented(int $userId): bool { return $this->consentVersion($userId) >= self::CONSENT_VERSION; } public function consentVersion(int $userId): int { return $userId > 0 ? (int) get_user_meta($userId, self::CONSENT, true) : 0; } public function consent(int $userId): void { update_user_meta($userId, self::CONSENT, self::CONSENT_VERSION); } public function onboardingChecklistCompleted(int $userId): bool { return $userId > 0 && get_user_meta($userId, self::ONBOARDING_CHECKLIST_COMPLETED, true) === '1'; } /** A prior pre-release version stored dismissal; retain it for personal-data export and erasure. */ public function legacyOnboardingChecklistDismissed(int $userId): bool { return $userId > 0 && get_user_meta($userId, self::ONBOARDING_CHECKLIST_DISMISSED, true) === '1'; } public function setOnboardingChecklistCompleted(int $userId, bool $completed): void { if ($userId <= 0) { return; } if ($completed) { update_user_meta($userId, self::ONBOARDING_CHECKLIST_COMPLETED, '1'); return; } delete_user_meta($userId, self::ONBOARDING_CHECKLIST_COMPLETED); } public function onboardingTourCompleted(int $userId): bool { return $userId > 0 && get_user_meta($userId, self::ONBOARDING_TOUR_COMPLETED, true) === '1'; } public function setOnboardingTourCompleted(int $userId, bool $completed): void { if ($userId <= 0) { return; } if ($completed) { update_user_meta($userId, self::ONBOARDING_TOUR_COMPLETED, '1'); return; } delete_user_meta($userId, self::ONBOARDING_TOUR_COMPLETED); } public function forget(int $userId): bool { if ($userId <= 0) { return false; } $removed = false; foreach (self::KEYS as $key) { $exists = get_user_meta($userId, $key, false) !== []; $deleted = delete_user_meta($userId, $key); if ($exists && !$deleted) { throw new \RuntimeException('A personal preference could not be erased.'); } $removed = $removed || $exists; } return $removed; } }