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

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 %}

Related

How to get all the products starting with title 'A' in Shopify

Is there a way to get all the products starting with title A or B or C in Shopify without using collection.
Unfortunately this might be not possible.
Ideally this would work but it doesn't:
{% assign my_products = collections['all'].products | where: "title.first", "A" %}
{% for product in my_products %}
{{ product.title }}
{% endfor %}

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.

Looping through metafields in shopify

I need to display n number of images for a product in shopify.
I have stored number of images in a metafields and created a loop for it.
Then each image's name is stored in a metafield, which i am trying to get with help of loop.
{% assign earrings = product.metafields.earrings %}
{% for i in (1..earrings.total-earrings) %}
{% assign earring = 'product.metafields.earring-' | append:i %}
{{ earring.name }}
{% endfor %}
This loop is giving me values for earring like:
product.metafields.earring-1
product.metafields.earring-2
but when i am trying to read value of metafield earring.name, i am not getting any output. I think because product.metafields.earring-1 is a string.
Is there any possible way to loop through metafields like this and get values?
Just in case it's helpful for someone.
Here's the updated code:
{% assign earrings = product.metafields.earrings %}
{% for i in (1..earrings.total-earrings) %}
{% assign dummy = 'earring-' | append:i %}
{% assign earring = product.metafields[dummy] %}
{{ earring.name }}
{% endfor %}

Shopify Sold Out Message

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 %}

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