Конкретно с этим кодом, с минимальными затратами времени я бы сделал следующее:
1. В функциях я оставил бы только формирование массивов данных. Переименовал бы их в `get_news()`, `get_news_menu()`. Они бы возвращали только массивы данных, например:
$news = [
0 => [
'photo' => 'photoValue',
'title' => 'Title Value',
'description' => 'Some long Description',
],
1 => [
'photo' => 'photoValue',
'title' => 'Title Value',
'description' => 'Some long Description',
],
];
С меню так же - возвращаете массив, только вместо photo, title, description уже будут url, title, что-то ещё.
2. Всю HTML-разметку можно вынести в отдельный файл, например, который в данном случае подключить при помощи include(). Но это особо не повлияет на качество кода :)
Саму разметку уже делать подобным способом, на примере с меню:
<div class="card" style="height: 30px;">
<?php foreach (get_menu_items() as $menuItem) : ?>
<a href="<?= $menuItem['url'] ?>"><?= $menuItem['title'] ?></a>
<?php endforeach; ?>
</div>
Потом, с опытом, придёт понимание того, что некоторые части повторяются и их можно и нужно выносить в отдельные блоки (Twig), паршалы (symfony1, zend1).
3. Относительно аякса, то ничто вам не мешает, если это аякс возвращать на клиент json структуры ваших новостей, который клиент уже будет рендерить так, как пожелает. А на сервере это всего лишь `json_encode(get_news());` отправить в браузер.
P.S. мог допустить синтаксических ошибок, так как в IDE не проверял. Надеюсь, что помог.