Su problema está en la consulta:
$sql = "SELECT *,YEAR(FROM_UNIXTIME(timestamp)) AS YEAR,
MONTH(FROM_UNIXTIME(timestamp)) AS MONTH
FROM ".NEWS_ARTICLES." GROUP BY YEAR, MONTH ORDER BY YEAR DESC, MONTH ";
La mayoría de las bases de datos que no sean MySQL rechazarían esta consulta, porque está agrupando en 2 campos mientras selecciona muchos campos.
El group by year, month
solo mostrará una única fila (aleatoria) de un mes y ocultará todas las demás.
La solución es eliminar el group by
cláusula por completo y reescriba la consulta así:
$sql = "SELECT *,YEAR(FROM_UNIXTIME(timestamp)) AS YEAR,
MONTH(FROM_UNIXTIME(timestamp)) AS MONTH
FROM ".NEWS_ARTICLES." ORDER BY YEAR DESC, MONTH ASC";
Observación
Es extraño que no tengas un WHERE
cláusula. ¿Realmente desea seleccionar todos artículos cada vez?
Un mejor enfoque sería limitar el número de artículos seleccionados en la consulta mediante algún filtro.
Siempre es más rápido filtrar en la base de datos que en php.