Soluzione senza utilizzare UNION/CASE
SELECT * FROM posts
ORDER BY
DATE(published_at)=DATE(NOW()) DESC,
DATE(published_at)<DATE(NOW()) DESC,
DATE(published_at)>DATE(NOW()) ASC`
controlla se funziona. Funziona bene con i dati stimolati. Puoi cambiare desc in asc in base ai tuoi requisiti di ordinamento per date passate e future