ããã«ã¡ã¯ð
æ ªåŒäŒç€ŸããããŠã¬ã®@YushiYamamotoã§ãïŒ
ãããããµã€ãã®éçºã»éå¶ãæ
åœããªãããReact.jsã»Next.jså°éã®ããªãŒã©ã³ã¹ãšã³ãžãã¢ãšããŠã掻åããŠããŸãâïž
ãShopifyã®ããŒããšãã£ã¿ã ãããç©è¶³ããªãïŒãã£ãšèªç±ã«ã¹ãã¢ãã¶ã€ã³ãæãããïŒããä»ã®ã¹ãã¢ãšå·®ãã€ããããŠããŒã¯ãªæ©èœã远å ãããïŒããããªåäžå¿ããµããShopifyãªãŒããŒããããããããShopifyéçºã«ææŠããããšã³ãžãã¢ã®çãããžã
ãã®é¡ããå¶ããéµããããShopifyç¬èªã®ãã³ãã¬ãŒãèšèªãLiquidïŒãªãããïŒãã§ããLiquidãçè§£ã䜿ãããªããããã«ãªãã°ããŸãã§éæ³ã®ããã«ã¹ãã¢ã®èŠãç®ãåäœã**åçïŒãã€ãããã¯ïŒ**ã«å€åãããæãéãã®é«åºŠãªã«ã¹ã¿ãã€ãºãå®çŸã§ããŸãã
ãã®èšäºã§ã¯ãããã°ã©ãã³ã°åå¿è ããšã³ãžãã¢ååŠè ã®æ¹ã§ãLiquidã®äžçã«ã¹ã ãŒãºã«è¶³ãèžã¿å ¥ãããããããLiquidã®åºæ¬æŠå¿µããå ·äœçãªæžãæ¹ããããŠå®è·µçãªæŽ»çšäŸãŸã§ãå³è§£ããµã³ãã«ã³ãŒãã亀ããªãã培åºçã«è§£èª¬ããŸãïŒ
ãã®èšäºãèªã¿çµããé ã«ã¯ãããªããLiquidã®é åã«æ°ã¥ãããèªåã§ãã§ãããïŒããšããèªä¿¡ãšã¯ã¯ã¯ã¯æã§ãã£ã±ãã«ãªã£ãŠããã¯ãããããLiquidããã¹ã¿ãŒããŠãããªãã®Shopifyã¹ãã¢ãå¯äžç¡äºã®ååšãžãšé²åãããŸãããïŒ
Liquidãšã¯ïŒShopifyããŒãã®å¿èéšãåããèšèª ðª
Liquid (ãªããã) ãšã¯ãShopifyãéçºãããªãŒãã³ãœãŒã¹ã®ãã³ãã¬ãŒãèšèªã§ããRubyãšããããã°ã©ãã³ã°èšèªãããŒã¹ã«äœãããŠããŸãããRubyã®æ·±ãç¥èããªããŠãæ±ããããã«èšèšãããŠããŸãã
Liquidã®äž»ãªåœ¹å²:
Shopifyã¹ãã¢ã®ãµãŒããŒãµã€ãã§HTMLã³ã³ãã³ããåçã«çæããããšã§ããããã«ããã以äžã®ãããªããšãå¯èœã«ãªããŸãã
- ããŒã¿ããŒã¹ã«ä¿åãããŠããååæ å ±ïŒååãäŸ¡æ Œãç»åãåšåº«ãªã©ïŒããŠã§ãããŒãžã«è¡šç€ºããã
- 顧客æ å ±ïŒååãæ³šæå±¥æŽãªã©ïŒã«å¿ããŠè¡šç€ºå 容ãå€ããã
- ã³ã¬ã¯ã·ã§ã³ïŒååã«ããŽãªïŒå ã®ååãäžèŠ§è¡šç€ºããã
- ãããåšåº«ã0åãªãã売ãåãããšè¡šç€ºããããšãã£ãæ¡ä»¶ã«å¿ããŠè¡šç€ºãåå²ãããã
- åããã¶ã€ã³ã®éšåïŒäŸïŒååã«ãŒãïŒãç¹°ãè¿ã衚瀺ããã
ç°¡åã«èšããšãLiquidã¯**ãéçãªHTMLã®éªšçµã¿ãã«ãShopifyã®åçãªããŒã¿ããæµã蟌ã¿ããŠãŒã¶ãŒããšã«æé©åããããŠã§ãããŒãžãäœãåºãããã®æ¥çå€**ã®ãããªãã®ã§ãã
ããã³ãã¬ãŒãèšèªããšèããšé£ãããã«æãããããããŸããããåºæ¬çãªã«ãŒã«ã¯ã·ã³ãã«ã§ããHTMLã®ç¥èãããã°ãæ¯èŒçã¹ã ãŒãºã«åŠç¿ãå§ããããŸããïŒ
Liquidã®åºæ¬æ§é ïŒ3ã€ã®èŠçŽ ãèŠãããïŒð§±
Liquidã®ã³ãŒãã¯ãäž»ã«ä»¥äžã®3ã€ã®èŠçŽ ïŒããªãã¿ãšåŒã°ããç¹å¥ãªèšå·ã§å²ãŸããéšåïŒã§æ§æãããŸããããããèŠããã°ãLiquidã³ãŒããèªãã»æžãç¬¬äžæ©ã¯ã¯ãªã¢ã§ãïŒ
-
ãªããžã§ã¯ã (Objects):
{{ ... }}
(ããã«ã«ãŒãªãŒãã¬ãŒã¹)- 圹å²: Shopifyã®ããŒã¿ïŒæååãæ°å€ãé åãªã©ïŒãHTMLå ã«åºåïŒè¡šç€ºïŒããŸãã
-
æžãæ¹:
{{ object.property }}
ã®ããã«ããªããžã§ã¯ãåã®åŸã«ããªãªã.
ãæãã§ããããã£ïŒå±æ§ïŒåãèšè¿°ããŸãã -
äŸ:
-
{{ product.title }}
â ååã®ã¿ã€ãã«ã衚瀺ãããŸãã -
{{ cart.total_price }}
â ã«ãŒãã®åèšéé¡ã衚瀺ãããŸãã -
{{ shop.name }}
â ã¹ãã¢åã衚瀺ãããŸãã
-
-
ã¿ã° (Tags):
{% ... %}
(ã«ãŒãªãŒãã¬ãŒã¹ãšããŒã»ã³ã)- 圹å²: ããã°ã©ã ã®ããžãã¯ïŒåŠçã®æµãïŒãå¶åŸ¡æ§é ïŒæ¡ä»¶åå²ãç¹°ãè¿ããªã©ïŒãèšè¿°ããŸãããããã¯çŽæ¥HTMLã«åºåãããã®ã§ã¯ãªããHTMLã®çææ¹æ³ãå¶åŸ¡ããŸãã
-
æžãæ¹:
{% tag_name parameters %}
ã®ããã«ãã¿ã°åã®åŸã«å¿ èŠã«å¿ããŠãã©ã¡ãŒã¿ãèšè¿°ããŸããå€ãã®ã¿ã°ã¯{% endtag_name %}
ã§éããŸãã -
代衚çãªã¿ã°:
-
æ¡ä»¶åå²:
if
,unless
,elsif
,else
,case/when
-
ç¹°ãè¿ã:
for
,cycle
,tablerow
-
倿°å²ãåœãŠ:
assign
,capture
-
ã³ã¡ã³ã:
comment
-
ãã®ä»:
include
,render
,form
,paginate
ãªã©å€æ°ã
-
æ¡ä»¶åå²:
-
äŸ:
-
{% if product.available %}
...{% endif %}
â ããååãè³Œå ¥å¯èœãªã... -
{% for product_variant in product.variants %}
...{% endfor %}
â ååã®åããªãšãŒã·ã§ã³ã«å¯ŸããŠç¹°ãè¿ã...
-
-
ãã£ã«ã¿ãŒ (Filters):
|
(ãã€ã)- 圹å²: ãªããžã§ã¯ãã®åºåã倿Žã»å å·¥ããŸããæååæäœãæ°å€èšç®ãæ¥ä»ãã©ãŒããã倿Žãªã©ãæ§ã ãªäŸ¿å©ãªãã£ã«ã¿ãŒãçšæãããŠããŸãã
-
æžãæ¹:
{{ object | filter_name: parameter }}
ã®ããã«ããªããžã§ã¯ãã®åŸã«ãã€ã|
ãæã¿ããã£ã«ã¿ãŒåãšå¿ èŠã«å¿ããŠãã©ã¡ãŒã¿ãèšè¿°ããŸããè€æ°ã®ãã£ã«ã¿ãŒãé£çµããããšãå¯èœã§ãã -
äŸ:
-
{{ product.price | money }}
â äŸ¡æ Œãé©åãªé貚圢åŒïŒäŸ: Â¥1,234ïŒã§è¡šç€ºã -
{{ "hello world" | capitalize }}
â "Hello world" ãšå é ã倧æåã«ã -
{{ product.description | truncate: 100, "..." }}
â åå説æãæåã®100æåã«çç¥ããæ«å°Ÿã« "..." ã远å ã -
{{ article.published_at | date: "%Y幎%mæ%dæ¥" }}
â ããã°èšäºã®å ¬éæ¥ãã2023幎04æ01æ¥ãã®ãããªåœ¢åŒã§è¡šç€ºã
-
ãããã®èŠçŽ ãçµã¿åãããŠãHTMLãã¡ã€ã« (æ¡åŒµåã .liquid
ã®ãã¡ã€ã«) ã®äžã«èšè¿°ããŠããã®ãLiquidã³ãŒãã£ã³ã°ã®åºæ¬ã§ãã
Liquidã§äœãã§ããïŒå ·äœçãªã«ã¹ã¿ãã€ãºäŸãèŠãŠã¿ããïŒð
Liquidã䜿ãããªããšãããŒããšãã£ã¿ã ãã§ã¯å®çŸã§ããªãããã现ããã§åçãªã¹ãã¢ã«ã¹ã¿ãã€ãºãå¯èœã«ãªããŸãã
äŸ1ïŒååããŒãžã«ãæ®ãåšåº«ãããïŒãã¡ãã»ãŒãžã衚瀺ãã
{% comment %} ååããŒãž (product.liquid) ã®äžéšãæ³å® {% endcomment %}
<h1>{{ product.title }}</h1>
<p>äŸ¡æ Œ: {{ product.price | money }}</p>
{% if product.available %}
{% assign first_variant = product.variants.first %}
{% if first_variant.inventory_management == "shopify" and first_variant.inventory_quantity > 0 and first_variant.inventory_quantity <= 5 %}
<p style="color: red; font-weight: bold;">æ®ãåšåº«ãããã§ãïŒãæ©ãã«ïŒ</p>
{% endif %}
<form action="/cart/add" method="post">
<input type="hidden" name="id" value="{{ first_variant.id }}">
<button type="submit">ã«ãŒãã«è¿œå </button>
</form>
{% else %}
<p style="color: gray;">çŸåšå£²ãåãäžã§ãã</p>
{% endif %}
-
解説:
-
{% if product.available %}
: ãŸãååãè³Œå ¥å¯èœããã§ãã¯ã -
{% assign first_variant = product.variants.first %}
: ååã®æåã®ããªãšãŒã·ã§ã³æ å ±ãfirst_variant
ãšãã倿°ã«æ ŒçŽã -
{% if first_variant.inventory_management == "shopify" and first_variant.inventory_quantity > 0 and first_variant.inventory_quantity <= 5 %}
: åšåº«ç®¡çãShopifyã§è¡ãããŠããŠãåšåº«æ°ã1以äž5以äžã®å Žåã«æ¡ä»¶ãçã«ãªããŸãã - ãã®æ¡ä»¶ãæºããã°ããæ®ãåšåº«ãããã§ãïŒãæ©ãã«ïŒããšããèµ€ã倪åã®ã¡ãã»ãŒãžã衚瀺ãããŸãã
-
äŸ2ïŒããŒã ããŒãžã«ç¹å®ã®ã³ã¬ã¯ã·ã§ã³ã®ååã3ã€ã ã衚瀺ãã
ããŒã ããŒãžçšLiquidã³ãŒãäŸ (ç¹å®ã³ã¬ã¯ã·ã§ã³åå衚瀺)
{% comment %} ããŒã ããŒãž (index.liquid ãŸã㯠sections/featured-collection.liquid ãªã©) ã®äžéšãæ³å® {% endcomment %}
{% assign featured_collection_handle = 'summer-specials' %}
{% assign product_limit = 3 %}
{% if collections[featured_collection_handle].products.size > 0 %}
<h2>{{ collections[featured_collection_handle].title }}</h2>
<div class="product-grid">
{% for product in collections[featured_collection_handle].products limit: product_limit %}
<div class="product-card">
<a href="{{ product.url | within: collections[featured_collection_handle] }}">
{% if product.featured_image %}
<img src="{{ product.featured_image | image_url: width: 400 }}" alt="{{ product.featured_image.alt | escape }}">
{% else %}
{{ 'product-1' | placeholder_svg_tag: 'placeholder-svg' }}
{% endif %}
<h3>{{ product.title }}</h3>
<p>{{ product.price | money }}</p>
</a>
</div>
{% endfor %}
</div>
{% else %}
<p>çŸåšãããããååã¯ãããŸããã</p>
{% endif %}
-
解説:
-
{% assign featured_collection_handle = 'summer-specials' %}
: 衚瀺ãããã³ã¬ã¯ã·ã§ã³ã®ãã³ãã«ïŒURLã«äœ¿ãããèå¥åïŒã倿°ã«èšå®ã -
{% assign product_limit = 3 %}
: 衚瀺ããååæ°ã3ã€ã«èšå®ã -
{% if collections[featured_collection_handle].products.size > 0 %}
: æå®ããã³ã¬ã¯ã·ã§ã³ã«ååãååšããããã§ãã¯ã -
{% for product in collections[featured_collection_handle].products limit: product_limit %}
: ã³ã¬ã¯ã·ã§ã³å ã®ååããæå®ããæ°ã ãç¹°ãè¿ãåŠçã -
within: collections[featured_collection_handle]
ãã£ã«ã¿ãŒã¯ãååURLãçŸåšã®ã³ã¬ã¯ã·ã§ã³ã®ã³ã³ããã¹ãå ã§ããããšãä¿èšŒããŸãã -
image_url: width: 400
ãã£ã«ã¿ãŒã¯ãç»åã®å¹ ã400pxã«ãªãµã€ãºããŠè¡šç€ºããŸãã -
placeholder_svg_tag
ãã£ã«ã¿ãŒã¯ãååç»åããªãå Žåã«ä»£æ¿ã®SVGç»åã衚瀺ããŸãã
-
äŸ3ïŒãã°ã€ã³ããŠãã顧客ã«ã ãç¹å¥ãªã¡ãã»ãŒãžã衚瀺ãã
{% comment %} ããã㌠(layout/theme.liquid ã sections/header.liquid ãªã©) ã®äžéšãæ³å® {% endcomment %}
{% if customer %}
<div class="welcome-message">
ããã«ã¡ã¯ã{{ customer.first_name | default: "äŒå¡" }} æ§ïŒãã€ããå©çšããããšãããããŸãã
<a href="/account">ãã€ããŒãžãž</a> | <a href="/account/logout">ãã°ã¢ãŠã</a>
</div>
{% else %}
<div class="guest-message">
åããŠã®æ¹ã§ããïŒ <a href="/account/register">æ°èŠäŒå¡ç»é²</a> | <a href="/account/login">ãã°ã€ã³</a>
</div>
{% endif %}
-
解説:
-
{% if customer %}
: 顧客ããã°ã€ã³ããŠãããã©ããããã§ãã¯ãcustomer
ãªããžã§ã¯ãã¯ãã°ã€ã³ããŠããå Žåã«ã®ã¿ååšããŸãã - ãã°ã€ã³ããŠããã°ã顧客ã®ãã¡ãŒã¹ãããŒã ïŒãªããã°ãäŒå¡ãïŒãšå ±ã«ãŠã§ã«ã«ã ã¡ãã»ãŒãžãšãã€ããŒãž/ãã°ã¢ãŠããªã³ã¯ã衚瀺ã
- ãã°ã€ã³ããŠããªããã°ãæ°èŠç»é²/ãã°ã€ã³ãªã³ã¯ã衚瀺ã
-
default: "äŒå¡"
ãã£ã«ã¿ãŒã¯ãcustomer.first_name
ã空ã®å Žåã«ãäŒå¡ããšããæååã䜿çšããŸãã
-
ã³ãŒãç·šéã¯æ
éã«ïŒå¿
ãããã¯ã¢ãããïŒ
Liquidã³ãŒããç·šéããéã¯ãå¿
ãäºåã«ããŒããè€è£œããŠããã¯ã¢ãããåã£ãŠããäœæ¥ããŸããããShopify管çç»é¢ã®ããªã³ã©ã€ã³ã¹ãã¢ã>ãããŒããã§ãçŸåšäœ¿çšããŠããããŒãã®ãã¢ã¯ã·ã§ã³ããããè€è£œããããéžã¹ã°ç°¡åã«ããã¯ã¢ããã§ããŸããäžãäžãšã©ãŒãåºãŠããããã«å
ã®ç¶æ
ã«æ»ããããã«ããŠããããšãéåžžã«éèŠã§ãã
LiquidåŠç¿ã®ã¹ããããšåœ¹ç«ã€ãªãœãŒã¹ ð
Liquidããã¹ã¿ãŒããããã®åŠç¿ã¹ããããšãåèã«ãªããªãœãŒã¹ãã玹ä»ããŸãã
-
HTMLãšCSSã®åºæ¬ãçè§£ãã:
- Liquidã¯HTMLãšå¯æ¥ã«é¢é£ããŠããŸãããŸãã¯HTMLã§ãŠã§ãããŒãžã®æ§é ããCSSã§èŠãç®ãã©ãäœãã®ããåºæ¬çãªç¥èã身ã«ã€ããŸãããã
- åŠç¿ãµã€ãäŸ: Progate, ãããã€ã³ã¹ããŒã«
-
ShopifyããŒãã®æ§é ãææ¡ãã:
- ã©ã®Liquidãã¡ã€ã«ãã©ã®ããŒãžãéšåã«å¯Ÿå¿ããŠããã®ããããŒãå šäœã®ãã¡ã€ã«æ§æãçè§£ããããšãéèŠã§ãã
- äž»ãªãã£ã¬ã¯ããª:
layout/
,templates/
,sections/
,snippets/
,assets/
-
Liquidã®åºæ¬æ§æïŒãªããžã§ã¯ããã¿ã°ããã£ã«ã¿ãŒïŒãèŠãã:
- ãã®èšäºã§ç޹ä»ãã3ã€ã®èŠçŽ ã®åœ¹å²ãšåºæ¬çãªäœ¿ãæ¹ããã¹ã¿ãŒããŸãããã
-
Shopifyå
¬åŒããã¥ã¡ã³ã (Shopify.dev) ãåç
§ãã:
- Shopify.dev ã«ã¯ãLiquidã®å šãŠã®ãªããžã§ã¯ããã¿ã°ããã£ã«ã¿ãŒã®è©³çްãªãªãã¡ã¬ã³ã¹ããã¥ãŒããªã¢ã«ãæ²èŒãããŠããŸãããããæãä¿¡é Œã§ããæ å ±æºã§ãã
- æåã¯è±èªã§ããããã©ãŠã¶ã®ç¿»è𳿩èœãªã©ã䜿ãã°çè§£ã®å©ãã«ãªããŸãã
-
æ¢åã®ããŒãã³ãŒããèªãã§ã¿ã:
- å®éã«ShopifyããŒãïŒç¹ã«Dawnã®ãããªç¡æå
¬åŒããŒãïŒã®
.liquid
ãã¡ã€ã«ãéããã©ã®ããã«Liquidã䜿ãããŠãããèªãã§ã¿ãŸããããæåã¯åãããªããŠããåŸã ã«ãã¿ãŒã³ãèŠããŠããŸãã
- å®éã«ShopifyããŒãïŒç¹ã«Dawnã®ãããªç¡æå
¬åŒããŒãïŒã®
-
ç°¡åãªã«ã¹ã¿ãã€ãºãã詊ããŠã¿ã:
- ããã¹ãã®è²ãå€ãããå°ããªã¡ãã»ãŒãžã远å ãããªã©ãç°¡åãªå€æŽããå§ããŠãLiquidãã©ã®ããã«åäœããããäœæããŸãããã
-
Shopifyã³ãã¥ããã£ãããã°èšäºã掻çšãã:
- Shopifyã³ãã¥ããã£ãã©ãŒã©ã ããå€ãã®éçºè ãæžããŠããããã°èšäºã«ã¯ãå ·äœçãªã«ã¹ã¿ãã€ãºäŸããã©ãã«ã·ã¥ãŒãã£ã³ã°ã®æ å ±ããããããããŸãã
ãŸãšãïŒLiquidã§ãããªãã®ã¹ãã¢ã®å¯èœæ§ãç¡é倧ã«ïŒ ð
Liquidã¯ãShopifyã¹ãã¢ãåãªããååã䞊ã¹ãå Žæãããããã©ã³ãã®äžç芳ã衚çŸãã顧客ãšã€ã³ã¿ã©ã¯ãã£ãã«é¢ãããã€ãããã¯ãªç©ºéãžãšé²åãããããã®åŒ·åãªããŒã«ã§ãã
æåã¯é£ããæãããããããŸãããã
-
ãªããžã§ã¯ã
{{ ... }}
ã§ããŒã¿ã衚瀺ãã -
ã¿ã°
{% ... %}
ã§åŠçãã³ã³ãããŒã«ãã -
ãã£ã«ã¿ãŒ
|
ã§ããŒã¿ãå å·¥ãã
ãšããåºæ¬ããæŒãããã°ãããšã¯å®è·µããã®ã¿ïŒ
ããŒããšãã£ã¿ã®éçãè¶ ããããªãã®åµé æ§ãååã«çºæ®ããŠãã客æ§ãé äºãããŠããŒã¯ãªã¹ãã¢äœéšãäœãäžããŠãã ãããLiquidããã¹ã¿ãŒããã°ãShopifyã§ã®ã¹ãã¢éå¶ããã£ãšæ¥œããããã£ãšå¥¥æ·±ããªãããšééããªãã§ãïŒ
ãããLiquidã®åãåããŠãããªãã®Shopifyã¹ãã¢ã®å¯èœæ§ãç¡éã«åºããŸãããïŒå¿æŽããŠããŸãïŒð
æåŸã«ïŒæ¥åå§èšã®ãçžè«ãæ¿ããŸã
ç§ã¯æ¥åå§èšãšã³ãžãã¢ãšããŠWEBå¶äœãã·ã¹ãã éçºãè«ãè² ã£ãŠããŸããææ°æè¡ã掻çšããã¬ã¹ãã³ã·ããªWebãµã€ãå¶äœãã€ã³ã¿ã©ã¯ãã£ããªã¢ããªã±ãŒã·ã§ã³éçºãAPI飿ºãªã©å¹ åºããèŠæã«å¯Ÿå¿å¯èœã§ãã
ã課é¡è§£æ±ºã«åãã峿Šåãæ¬²ããããé«å質ãªWebå¶äœãäŸé Œãããããšããæ¹ã¯ããæ°è»œã«ãçžè«ãã ãããäžç·ã«ããžãã¹ã®æé·ãç®æããŸãããïŒ