Solución sin usar 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`
comprueba si esto funciona. Funciona bien con datos estimulados. Puede cambiar desc a asc de acuerdo con su requisito de clasificación para fechas pasadas y futuras