Тут есть три варианта решения, через HTML+CSS, через JS и через PHP.
В первом случае я бы посоветовал вам копать в сторону обрезания содержимого блоков через overflow, overflow-text и так далее. Есть и еще один вариант через HTML, когда вы будете не обрезать блоки, а выстраивать из них такую сетку, где один блок не будет налезать на другой, как у вас это сейчас. Это можно сделать через CSS flexbox.
Во втором случае вы можете как сами написать некий код, который будет изменять текст блоков и/или их размеры, так и воспользоваться различными библиотеками, например - Masonry. Руководство можно сразу взять
тут.
В третьем случае все совсем просто - вам нужно текст, который меняется в зависимости от блока, обрезать по длине, выводя первые его 300, например, символов. Чтобы прочитать остальное, можно предлагать пользователю ссылку "Далее..." и перенаправлять его на отдельную страницу объявления, которые у вас уже реализованы.