Потому что в первом случае вы в $new_events присваиваете результат сравнения
$order->get_new_events_count('comments') > 0
(это может быть
true или
false).
echo true; // выведет "1"
echo false; // выведет "" (пустую строку).
Поэтому, какое бы число ни возвращала функция
get_new_events_count, если оно больше
0 - всегда будет выводиться цифра
1.
Правильно делать так:
<?php
$new_events = $order->get_new_events_count('comments');
?>
<?php if ($new_events > 0): ?>
<?= $new_events; ?>
<?php endif; ?>
Можно было бы написать то же самое вот так:
<? if (($new_events = $order->get_new_events_count('comments')) > 0): ?>
<?= $new_events; ?>
<? endif; ?>
Но, сами видите, в таком коде легко допустить ошибку. Присвоение внутри оператора сравнения считается плохой практикой, помимо проблем с порядком выполнения нередки ситуации, когда разработчик пишет
if ($foo = $bar)
, вместо
if ($foo == $bar)
А во втором в
if выполняется нормальная проверка, но функция
get_new_events_count вызывается дважды, вы, судя по всему, именно этого хотите избежать.