Solução sem 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`
verifique se isso funciona. Está funcionando bem com dados estimulados. Você pode alterar desc para asc de acordo com seu requisito de classificação para datas passadas e futuras