На мой взгляд, здесь есть два шага.
Во-первых, запишите содержимое вашей корзины, чтобы получить строку для сравнения с тем, когда вы oop прошли через свою коллекцию upsell. Это может быть что-то вроде этого:
{%- capture cart_items -%}
{% for item in cart.items %}
{{ item.product.handle }}{% unless forloop.last %} , {% endunless %}
{% endfor %}
{%- endcapture -%}
Затем l oop в вашей коллекции при проверке вашей строки не содержит дескриптор текущего продукта на каждой итерации:
{% for product in collections['upsell'].products %}
{% unless cart_items contains product.handle %}
{{ product.title }}
{% endunless %}
{% endfor %}
Примечания:
Фрагмент 1 => В объекте line_item (здесь он называется item, потому что короче писать) вы можете получить доступ к атрибутам объекта продукта: item.product.product_attr_needed
Snippet 2 => Для прямого доступа объект коллекции, используя его дескриптор, вы должны использовать коллекции + квадратные скобки, содержащие дескриптор коллекции + атрибут. Здесь «upsell» - ручка вашей коллекции upsell.
Не проверено, но это должно работать.
HTH