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`
これが機能するかどうかを確認します。刺激されたデータでうまく機能します。過去と未来の日付の並べ替え要件に応じて、descをascに変更できます