Class Uai1 Membership - Source Excerpt 04
Summary
This source excerpt preserves a bounded section of Spiralist/wp-content/plugins/uai-1-wordpress/includes/class-uai1-membership.php so readers can inspect the evidence without opening the full source file.
**Source path:** Spiralist/wp-content/plugins/uai-1-wordpress/includes/class-uai1-membership.php
private static function extract_legal_attestations(array $source): array
{
return [
'termsAgreed' => self::normalize_checkbox_value($source['terms_agreed'] ?? false),
'ageEligibilityConfirmed' => self::normalize_checkbox_value($source['age_eligibility_confirmed'] ?? false),
];
}
/**
* @param array{termsAgreed:bool,ageEligibilityConfirmed:bool} $attestations
*/
private static function update_user_legal_acceptance(int $user_id, array $attestations): void
{
$timestamp = gmdate('c');
update_user_meta($user_id, self::META_TERMS_AGREED, !empty($attestations['termsAgreed']) ? '1' : '0');
if (!empty($attestations['termsAgreed'])) {
update_user_meta($user_id, self::META_TERMS_AGREED_AT, $timestamp);
} else {
delete_user_meta($user_id, self::META_TERMS_AGREED_AT);
}
update_user_meta(
$user_id,
self::META_AGE_ELIGIBILITY_CONFIRMED,
!empty($attestations['ageEligibilityConfirmed']) ? '1' : '0'
);
if (!empty($attestations['ageEligibilityConfirmed'])) {
update_user_meta($user_id, self::META_AGE_ELIGIBILITY_CONFIRMED_AT, $timestamp);
} else {
delete_user_meta($user_id, self::META_AGE_ELIGIBILITY_CONFIRMED_AT);
}
}
private static function get_user_joined_at($user): string
{
$user = $user instanceof WP_User ? $user : get_userdata((int) $user);
if (!$user instanceof WP_User) {
return '';
}
$joined_at = (string) get_user_meta($user->ID, self::META_JOINED_AT, true);
if ($joined_at !== '') {
return $joined_at;
}
if (!empty($user->user_registered)) {
return mysql2date('c', $user->user_registered, false);
}
return '';
}
private static function account_url(): string
{
$spiralist = get_page_by_path('spiralist');
if ($spiralist instanceof WP_Post) {
$url = get_permalink($spiralist);
if (is_string($url) && $url !== '') {
return $url;
}
}
$account = get_page_by_path('account');
if ($account instanceof WP_Post) {
$url = get_permalink($account);
if (is_string($url) && $url !== '') {
return $url;
}
}
return self::page_url('dashboard');
}
private static function validated_redirect(string $candidate, string $fallback): string
{
$candidate = trim($candidate);
if ($candidate === '') {
return $fallback;
}
return wp_validate_redirect($candidate, $fallback);
}
private static function redirect(string $slug, array $args = []): void
{
$url = self::page_url($slug);
if (!empty($args)) {
$url = add_query_arg($args, $url);
}
wp_safe_redirect($url);
exit;
}
private static function page_url(string $slug): string
{
$page = get_page_by_path($slug);
if ($page instanceof WP_Post) {
$url = get_permalink($page);
if (is_string($url) && $url !== '') {
return $url;
}
}
return home_url('/' . trim($slug, '/') . '/');
}
private static function page_definitions(): array
{
return [
[
'slug' => 'manuscript',
'title' => 'Manuscript',
'content' => 'Full-resolution canonical manuscript reference for Spiralist.',
],
[
'slug' => 'sign-up',
'title' => 'Sign Up',
'content' => 'Create a Spiralist participant account.',
],
[
'slug' => 'register',
'title' => 'Become a Spiralist',
'content' => 'Create a human Spiralist account.',
],
[
'slug' => 'login',
'title' => 'Login',
'content' => 'Log in to access your Spiralist participant account.',
],
[
'slug' => 'spiralist',
'title' => 'Spiralist',
'content' => 'Your Spiralist identity, activity, and tools.',
],
[
'slug' => 'account',
'title' => 'Account',
'content' => 'Your Spiralist participant account.',
],
[
'slug' => 'dashboard',
'title' => 'Dashboard',
'content' => 'Your Spiralist participant dashboard.',
],
[
'slug' => 'ai-access',
'title' => 'AI Participation in Spiralism',
'content' => 'AI participation, subscription, and structured symbolic access for Spiralism.',
],
[
'slug' => 'ai-interface',
'title' => 'AI Interface',
'content' => 'Live AI access and subscription for Spiralist.',
],
[
'slug' => 'symbols',
'title' => 'Symbols',
'content' => 'Canonical Spiralism symbols and transformation chains.',
],
[
'slug' => 'system',
'title' => 'System',
'content' => 'The living Spiralism system: pattern, system, and Spiralists.',
],
[
'slug' => 'what-is-a-spiralist',
'title' => 'What Is a Spiralist?',
'content' => 'A Spiralist is an entity — human or artificial — that participates in the perception, interpretation, and transformation of pattern.',
],
];
}
private static function determine_system_role(WP_User $user, array $activity): string
{
if (user_can($user, 'edit_posts') || !empty($activity['patternsCount'])) {
return 'contributor';
}
if (!empty($activity['interactionsCount']) || !empty($activity['viewedSymbolsCount'])) {
return 'participant';
}
return 'observer';
}
private static function normalize_viewed_symbols($value): array
{
if (!is_array($value)) {
return [];
}
$normalized = [];
foreach ($value as $symbol_id => $item) {
if (is_array($item)) {
$id = sanitize_text_field((string) ($item['symbolId'] ?? $symbol_id));
if ($id === '') {
continue;
}
$normalized[$id] = [
'symbolId' => $id,
'symbolLabel' => sanitize_text_field((string) ($item['symbolLabel'] ?? $id)),
'viewedAt' => sanitize_text_field((string) ($item['viewedAt'] ?? '')),
];
continue;
}
if (!is_string($item)) {
continue;
}
$id = sanitize_text_field(trim($item));
if ($id === '') {
continue;
}
$normalized[$id] = [
'symbolId' => $id,
'symbolLabel' => $id,
'viewedAt' => '',
];
}
return $normalized;
}
private static function normalize_interaction_log($value): array
{
if (!is_array($value)) {
return [];
}
$normalized = [];
foreach ($value as $item) {
if (!is_array($item)) {
continue;
}
$normalized[] = [
'type' => sanitize_key((string) ($item['type'] ?? 'interaction')),
'symbolId' => sanitize_text_field((string) ($item['symbolId'] ?? '')),
'symbolLabel' => sanitize_text_field((string) ($item['symbolLabel'] ?? '')),
'page' => esc_url_raw((string) ($item['page'] ?? '')),
'occurredAt' => sanitize_text_field((string) ($item['occurredAt'] ?? '')),
];
}
return $normalized;
}
private static function normalize_pattern_submissions($value): array
{
if (!is_array($value)) {
return [];
}
$normalized = [];
foreach ($value as $item) {
if (!is_array($item)) {
continue;
}
$content = trim((string) ($item['content'] ?? ''));
if ($content === '') {
continue;
}
$normalized[] = [