Penso che tu abbia bisogno di qualcosa del genere:
AND us.first_post_created_at > NOW() - INTERVAL '7 DAYS'
(documentazione PostgreSQL su date/ora)
Per escludere i messaggi privati, è necessario eseguire un JOIN con la tabella topics (seguendo la chiave esterna posts.topic_id) e verificare la colonna archetype. Aggiungi questo prima della clausola WHERE:
JOIN topics t ON p.topic_id = t.id
…e questo prima della clausola ORDER BY:
AND t.archetype = 'regular'