Shopify Sold Out Message - shopify

I'm trying to display a sold out message when we set a product's quantity to 0. This bit of liquid code of kinda worked:
`{% assign variantQuantity = product.variants | map: 'inventory_quantity' | sort %}
{% if variantQuantity[0] < 1 %}
<strong><p style="color: #B21F1F;">This item is currently sold out.</p></strong>
{% else %}
{% endif %}`
The problem is it displays the sold out message when even one size is out of stock and other sizes are not. Is there a way to check and make sure all sizes are sold out?

You can just check the product.available attribute:
product.available
Returns true if a product is available for purchase. Returns false if
all of the products variants' inventory_quantity values are zero or
less, and their inventory_policy is not set to "Allow users to
purchase this item, even if it is no longer in stock."
So you can use for example:
{% if product.available == false %}
This item is currently sold out.
{% endif %}

have you tried the multiple checks in the manual?
{% if variant.inventory_quantity <= 0 and variant.available and variant.inventory_management != '' %}
so example being:
{% assign variantQuantity = product.variants | map: 'inventory_quantity' | sort %}
{% if variant.inventory_quantity <= 0 and variant.available and variant.inventory_management != '' %}
<strong><p style="color: #B21F1F;">This item is currently sold out.</p></strong>
{% else %}
{% endif %}

Related

Is there an alternate way to display line item prices on a Shopify packing slip?

By default, Shopify's packing slip uses
{% if item.sku == line_item.sku %}
{% assign final_price = line_item.final_price %}
{% endif %}
{% if final_price %}
{{ final_price | money }}
{% endif %}
to display a line item's price on a packing slip. I have a client who needs to use the same sku for multiple products, and this has resulted in the wrong line item prices being displayed on some packing slips. Does anyone know of a way to display the line-item price without referencing an item's sku? I have already tried using product and variant id, title, etc. Variant barcode looks like it may work, but this client does not have barcodes for their products.
These are the liquid objects available to you.
https://help.shopify.com/en/manual/shipping/setting-up-and-managing-your-shipping/packing-slips-variable-list
From that list I'm not sure if you can return the line_item.final_price value here.
But for the condition, i'd run it on variant_title
{% if item.variant_title == line_item.variant_title %}
{% assign final_price = line_item.final_price %}
{% endif %}
{% if final_price %}
{{ final_price | money }}
{% endif %}

On Shopify, check if a given product is not on any collection

Within the product page, I would like to hide a certain element if the current product isn't associated with any collection. Is there any way to check it with Liquid ?
The object product.collections is an array containing all collections where the product is listed.
So you may use this:
{% if product.collections.size < 1 %}
Do something
{% endif %}
Documentation about arrays here:
https://shopify.dev/api/liquid/filters#size
{% if 0 == product.collections | size %}
!! put your code here !!
{% endif %}
Or
{% for _ in product.collections %}
{% else %}
!! put your code here !!
{% endif %}

Shopify Inventory Display Output on Product Page

I've spent much of the day setting up a new shopify site - my first experience with shopify. Most of it has been pretty straightfoward, but I've found myself somewhat stumped when it comes to showing inventory on the product pages. I'm using the debut theme, and using the editor to update 'product-template.liquid'
After browsing the docs, I've added the following;
{% comment %} Inventory tracking on product page {% endcomment %}
<div id="variant-inventory" class="{% unless current_variant.available %} hide {% endunless %}">
{% if current_variant.inventory_management == "shopify" and current_variant.inventory_policy != "continue" %}
We have {{ current_variant.inventory_quantity }} in stock for next-day delivery when you order by 2pm.
{% else %}
Out of Stock
{% endif %}
</div>
However, this is currently returning 'out of stock' for items that are in fact, in stock. In addition, what I am hoping to achieve but haven't been able to find documentation for is;
'Items in stock' = We have {{ current_variant.inventory_quantity }} in stock for next-day delivery when you order by 2pm.
'No inventory, but customer allowed to order' = Order now for delivery within 7 days
'No inventory, customer not allowed to order' = Out of Stock
Any pointers much appreciated!
You have:
{% if current_variant.inventory_management == "shopify" and current_variant.inventory_policy != "continue" %}
We have {{ current_variant.inventory_quantity }} in stock for next-day delivery when you order by 2pm.
{% else %}
Out of Stock
{% endif %}
This will show the 'Out-of-Stock' message for either of the following conditions:
inventory_management is blank (which is the default value)
inventory_policy is continue
What you probably wanted was something like this:
{% if current_variant.inventory_management == "shopify" and current_variant.inventory_policy != "continue" %}
{% comment %}
We care about inventory on this product - is there any in stock?
{% endcomment %}
(% if current_variant.inventory_quantity > 0 %}
We have {{ current_variant.inventory_quantity }} in stock for next-day delivery when you order by 2pm.
{% else %}
Out of Stock
{% endif %}
{% else %}
{% comment %}
Any code/messages we might want for products where we don't care about inventory
{% endcomment %}
{% endif %}
I'm a little puzzled by this line of code:
{% if current_variant.inventory_management == "shopify" and current_variant.inventory_policy != "continue" %}
What you are checking is if you are using shopify to track inventory and if the variant options command to allow people to order even if it is out of stock is checked in the admin panel. I would assume that the latter is checked so it is always returning the else.
If it wasn't in stock nothing would show due to this line:
div id="variant-inventory" class="{% unless current_variant.available %} hide {% endunless %}">
As I am unsure how you plan to differentiate between the out of stock and the out of stock can order in 7 days. As there is nothing in the inventory tracker that allows you to enter incoming product (As far as I know). If you were so inclined to enter this manually you could go to product.template.liquid find Ctrl + F
{% unless current_variant.available %}
The Second one down is where to sold-out code takes place
and edit it through adding and removing tags (Using noOrder and noStockCanOrder as example tags)
{% if product.tags contains 'noOrder' %}
<div>No inventory, customer not allowed to order' = Out of Stock</div>
-Insert Current out of stock code here-
{% elsif product.tags contains 'noStockCanOrder' %}
<div>No inventory, but customer allowed to order' = Order now for delivery within 7 days</div>
-Insert Current in stock code here-
{% else %}
<div>Items in stock' = We have {{ current_variant.inventory_quantity }} in stock for next-day delivery when you order by 2pm.</div>
-Insert Current in stock code here-
{% endif %}
You may have to play around with this a little bit as I have never done exactly what you are asking but the theory should be sound and it should get you close to what you want and you can edit it from there.

Shopify: Order Print App is not picking up variables

I am trying to display a Final Sale message on order receipts for products that are 60% off. This bit of code does display the message on the individual product page, but when I insert in the template I'm using in the Order Printer app, the message does not seem to display.
I've contacted various Shopify support people, but they have not been able to identify the problem. Here's the code I'm inserting:
<!--if item is 60% off, it displays message: -->
{% if product.compare_at_price %}
{% assign sixtyPercentOff = product.compare_at_price | minus: product.price | times: 100.0 | divided_by: product.compare_at_price | round %}
{% if sixtyPercentOff == 60 %}
<p style="color: #B21F1F;">
This item is final sale -- no returns or exchanges are accepted.
</p>
{% endif %}
{% endif %}
Is it because Order Printer does not recognize variables such as "compare_at_price"?
product.compare_at_price doesn't exist.
For product you have: compare_at_price_max, compare_at_price_min, compare_at_price_varies
Do you mean to use something like: {% if product.compare_at_price_min > 0 %}
Or if you have variants you can use directly variant.compare_at_price
For first available variant of product: {% if product.variants[0].compare_at_price > 0 %}

Show item quantity in shopping cart for a product when on the collections page

I'm in need of some help, what I'd like to do is best described as follows:
When on the collections page
If Product X is added 2 times to the cart
Then add the number 2 next to that product
So the customer knows what products are already inside the cart
So basically, if taking a look at the collections page, I want to be able to see what products are already added into the cart.
I've tried this:
<!-- From 'product-grid-item.liquid' of the default Supply theme -->
{% assign count = 0 %}
{% for item in cart.items %}
{% if product.variants.first.id == item.id %}
{% assign count = count | plus: 1 %}
{% endif %}
{% endfor %}
{% if count > 0 %}<span>{{ count }}</span>{% endif %}
But it simply returns a 1 for Product X. It should return a 2 since it's added twice.
What am I doing wrong?
Here's the working code:
{% assign count = 0 %}
{% for item in cart.items %}
{% if product.id == item.product.id %}
{% assign count = count | plus: item.quantity %}
{% endif %}
{% endfor %}
{% if count > 0 %}<span>{{ count }}</span>{% endif %}
This is because cart.items returns the line items. So it will only return once per unique item id. If you want to count the total item quantity for any item id you need to look at line_item.quantity. Reference docs.shopify.com/themes/liquid-documentation/objects/cart