true, 'nav' => true, 'next_completes' => true, ); } public static function site(): array { if ( null === self::$memo ) { $loaded = wp_load_alloptions(); $stored = isset( $loaded[ self::OPTION ] ) ? maybe_unserialize( $loaded[ self::OPTION ] ) : array(); self::$memo = self::sanitize( is_array( $stored ) ? $stored : array() ); } return self::$memo; } public static function for_learner( int $user_id, int $course_id ): array { $site = self::site(); if ( $user_id <= 0 || $course_id <= 0 ) { return $site; } if ( ! self::orgs_override() ) { return $site; } $key = $user_id . ':' . $course_id; if ( ! isset( self::$learners[ $key ] ) ) { $org_id = Services::steering()->org_for( $user_id, $course_id ); $org = $org_id > 0 ? Services::org_repo()->get( $org_id ) : null; self::$learners[ $key ] = self::merge( $site, null === $org ? null : $org->settings->lesson_buttons ); } return self::$learners[ $key ]; } public static function orgs_override(): bool { return true === \RoosterLMS\Core\Settings::get( 'lesson_buttons_orgs' ); } public static function note_org_override(): void { if ( ! self::orgs_override() ) { \RoosterLMS\Core\Settings::update( array( 'lesson_buttons_orgs' => true ) ); } } public static function merge( array $site, ?array $overrides ): array { foreach ( self::clean_map( $overrides ) ?? array() as $key => $value ) { $site[ $key ] = $value; } return $site; } public static function clean_map( $raw ): ?array { if ( ! is_array( $raw ) ) { return null; } $out = array(); foreach ( self::KEYS as $key ) { if ( array_key_exists( $key, $raw ) ) { $bool = is_bool( $raw[ $key ] ) ? $raw[ $key ] : filter_var( $raw[ $key ], FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE ); if ( null !== $bool ) { $out[ $key ] = $bool; } } } return array() === $out ? null : $out; } public static function update( array $values ): void { update_option( self::OPTION, self::sanitize( array_merge( self::site(), $values ) ), true ); self::forget(); } public static function forget(): void { self::$memo = null; self::$learners = array(); } public static function sanitize( array $values ): array { $out = self::defaults(); foreach ( self::KEYS as $key ) { if ( array_key_exists( $key, $values ) ) { $bool = filter_var( $values[ $key ], FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE ); if ( null !== $bool ) { $out[ $key ] = $bool; } } } return $out; } }