See if this gives you what you want. the ORDER BY 2 means order the results by the second field returned, in this case the max(date):
SELECT category, max(date) as max_date FROM posts WHERE category != '' group by category ORDER BY 2 DESC
Or this might do it (I'm too lazy to test these suggestions):
SELECT category FROM posts WHERE category != '' group by category ORDER BY max(date) DESC