How can filter orders made after a certain date in liquid/ Shopify? - shopify

{% for orders in checkout.customer.orders %}
//count the orders
{% endfor %}
I need to count orders made only after a certain date?
How can I do this in Liquid / Shopify?

All Orders have a created_at date that you can output in various formats using the Liquid date filter — you would loop thru the Orders as above and compare that with whatever the "threshold date" in question is, using unix-format dates for comparison:
{% assign ordersThresholdUnix = '2019-01-01' | date: '%s' %}
{% assign ordersCount = 0 %}
{% for orders in checkout.customer.orders %}
{% assign orderDateUnix = order.created_at | date: '%s' %}
{% if orderDateUnix > ordersThresholdUnix %}
{% assign ordersCount = 0 %}
{% endif %}
{% endfor %}
You can then output {{ ordersCount }}.
Note: that I don't think Shopify will allow you to paginate further back than 50 Orders.

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

donation counter on starting page

I need a donation counter (total sum), which shows on the starting page and on a specific page. My problem here is, that I included a snippet to get the total donation and these donations come from one specific product. I managed to get to get the total sum of donations and I can display it on the product page. But I want to display it on the startpage and on a specific page. I wrote a product-sold-count.liquid as following:
{% assign productStartCount = product.metafields.stock.initial | times:1 %}
{% if productStartCount > 0 %}
{% assign productInventory = product.variants.first.inventory_quantity %}
{% assign totalSum = productStartCount | minus:productInventory | times: product.price | times: product.metafields.donation.percent | divided_by: 10000 %}
<p>{{ totalSum }} € were donated until now!</p>
{% endif %}
Now I want to get this totalSum to another page or more likely to the start page and to other pages? I tried: {% include 'product-sold-count' %} on the specific liquids like page.liquid or theme.liquid but that won't work. How can I achieve this?
The problem is on product page, you have the variable product. But on other pages, this variable is longer valid.
In order to have total count for all product, you can repeat the above code for each product and get the sum of all products. Note that Shopify provide all_products variable, but limit to 20 products per page. You can use collection.products if it's on a collection (or, assign all donation products to donation collection then get all products of this collection)
{% assign allProductCount = 0 %}
{% for product in all_products %}
{% assign productStartCount = product.metafields.stock.initial | times:1 %}
{% if productStartCount > 0 %}
{% assign productInventory = product.variants.first.inventory_quantity %}
{% assign totalSum = productStartCount | minus:productInventory | times:
product.price | times: product.metafields.donation.percent | divided_by: 10000 %}
{% assign allProductCount = allProductCount | plus: totalSum %}
{% endif %}
{% endfor %}
<p>{{ allProductCount }} € were donated until now!</p>

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