is_fresh( $value ) ) { return null; } $max_urls = $value['max_urls'] ?? null; $manual = $value['manual_runs_remaining'] ?? null; $automatic = $value['automatic_runs_enabled'] ?? null; $connected = $value['connected'] ?? null; $history = $value['history_days'] ?? null; if ( ! is_int( $max_urls ) || ! is_int( $manual ) || ! is_bool( $automatic ) ) { return null; } if ( ! is_bool( $connected ) || ! is_int( $history ) ) { return null; } return new RunCapabilities( $max_urls, $manual, $automatic, new RunAccountAccess( $connected, $history ) ); } public function store( RunCapabilities $capabilities ): void { update_option( Options::RUN_CAPABILITIES, array( 'max_urls' => $capabilities->max_urls, 'manual_runs_remaining' => $capabilities->manual_runs_remaining, 'automatic_runs_enabled' => $capabilities->automatic_runs_enabled, 'connected' => $capabilities->account->connected, 'history_days' => $capabilities->account->history_days, 'checked_at' => time(), ), false ); } public function allows_automatic_collection(): bool { $capabilities = $this->get(); return ! $capabilities instanceof RunCapabilities || $capabilities->automatic_runs_enabled; } /** @param array $value WordPress option boundary value. */ private function is_fresh( array $value ): bool { $checked_at = $value['checked_at'] ?? null; return is_int( $checked_at ) && time() - $checked_at < self::TTL_SECONDS; } }