В общем сам додумал и смог учесть случай с 1 или 2 товарами в одном слайде
Слайдер на Bootstrap 5.3:
<div id="carouselExample" class="carousel slide">
<div class="carousel-inner">
<?php $menu = mysqli_query($link, "SELECT * FROM `menu` ORDER BY `id` DESC LIMIT 5");
$length = mysqli_num_rows($menu);
$i = 0; ?>
<div class="carousel-item active">
<div class="row">
<?php while ($card = mysqli_fetch_assoc($menu)) :
$i++;
// ДОБАВЛЯЕМ ВСЕ ТОВАРЫ
if ($i % 3 != 0 || $i == $length) {
include 'vendor/components/card-load.php';
} elseif ($i % 3 == 0) {
// ЕСЛИ НА СЛАЙДЕ 3 ТОВАРА, ТО ЗАКРЫВАЕМ ЕГО И ДЕЛАЕМ НОВЫЙ
include 'vendor/components/card-load.php';
echo '</div>
</div>
<div class="carousel-item">
<div class="row">';
}
// ЕСЛИ НА ОДНОМ СЛАЙДЕ МЕНЕЕ, ЧЕМ 3 ТОВАРА,
// ТО ДОБАВЛЯЕМ ПУСТУЮ КОЛОНКУ.
// ЧИСЛО СЛАЙДА ОТНИМАЕМ ОТ ОСТАТКА СЛАЙДА
// ПРИ ДЕЛЕНИИ И СРАВНИВАЕМ С $j.
// (СЛАЙДЕР БУДЕТ ВЫГЛЯДЕТЬ КОРРЕКТНО)
if ($i == $length && $length % 3 != 0) {
for ($j = 0; $j < 3 - ($i % 3); $j++) {
echo '<div class="col"></div>';
}
}
endwhile; ?>
</div>
</div>
</div>
<button class="carousel-control-prev" type="button" data-bs-target="#carouselExample" data-bs-slide="prev">
<span class="carousel-control-prev-icon" aria-hidden="true"></span>
</button>
<button class="carousel-control-next" type="button" data-bs-target="#carouselExample" data-bs-slide="next">
<span class="carousel-control-next-icon" aria-hidden="true"></span>
</button>
</div>
</div>
Структура файла card-load.php:
<div class="col">
<a href="card-info.php?id=<?= $card['id'] ?>" class="card">
<div class="card__img img">
<img src="<?= $card['img'] ?>" class="card-img-top" alt="<?= $card['img'] ?>">
</div>
<div class="card-body">
<h5 class="card-title"><?= $card['title'] ?></h5>
<p class="card-text"><?= $card['description'] ?></p>
</div>
<div class="card-footer">
<div class="row align-items-center">
<div class="col-5">
<p class="m-0"><?= $card['price'] ?> р.</p>
</div>
<object class="col">
<a href="#" class="btn btn-primary w-100">В корзину</a>
</object>
</div>
</div>
</a>
</div>