Lösning utan att använda 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`
kolla om detta fungerar. Det fungerar bra med stimulerad data. Du kan ändra desc till asc enligt ditt sorteringskrav för tidigare och framtida datum