TẤT CẢ Fix 'Variable not found' lỗi FAQ schema trong Zola

Fix 'Variable not found' lỗi FAQ schema trong Zola

Banner quảng cáo — về trang chủ
QUẢNG CÁO

Đặt banner quảng cáo của bạn tại đây

Nhấp để về trang chủ — Khu vực này sẽ hiển thị quảng cáo khi có hợp đồng.

Giới thiệu: Lỗi Template Variable trong Zola

Khi làm việc với Zola static site generator, một trong những lỗi phổ biến nhất là template variable errors — khi template cố gắng truy cập một biến không tồn tại hoặc có tên sai. Lỗi này có vẻ đơn giản nhưng có thể làm đỏ CI/CD pipeline nếu không debug kỹ.

Bài viết này sẽ hướng dẫn bạn cách chẩn đoán và khắc phục lỗi "Variable not found" trong FAQ schema — một trong những tình huống hay gặp nhất trong Zola.

Trường hợp thực tế: Zola FAQ schema variable not found error

Khi thêm FAQ schema vào một bài viết Zola, bạn có thể gặp lỗi "variable not found" như thế này:

ERROR Failed to render page 'content/posting/example.md'
ERROR Reason: Failed to render 'page.html'
ERROR Reason: Variable `item.q` not found in context while rendering 'page.html'

Lỗi này không liên quan tới bài viết nội dung của bạn — nó là lỗi template rendering, có nghĩa là Zola template đang cố truy cập một biến mà không tìm thấy.

Nguyên nhân gốc rễ

Vấn đề nằm ở mismatch giữa tên field trong frontmatter và tên biến mà template mong đợi. Khi bạn định nghĩa FAQ trong frontmatter như thế này:

[[extra.faq]]
question = "Câu hỏi của tôi?"
answer = "Câu trả lời của tôi"

Nhưng template page.html lại mong đợi:

{% for item in page.extra.faq %}
  <dt>{{ item.q }}</dt>
  <dd>{{ item.a }}</dd>
{% endfor %}

Zola sẽ không tìm thấy biến item.q vì object FAQ chỉ có fields questionanswer — không có qa. Kết quả là build fail.

Cách khắc phục: Sử dụng đúng tên field trong Zola FAQ schema

Zola FAQ schema yêu cầu tên field cụ thể để render đúng. Nếu bạn đang học về template syntax trong Zola, hãy xem thêm bài viết về Tera template errors để hiểu rõ hơn về cách Zola xử lý template.

❌ Sai — tên field không khớp template

[[extra.faq]]
question = "Tại sao lại có lỗi?"
answer = "Vì tên field sai"

Khi Zola render template và cố truy cập item.q, nó sẽ báo:

Variable `item.q` not found in context

✅ Đúng — tên field khớp template

[[extra.faq]]
q = "Tại sao lại có lỗi?"
a = "Vì tên field sai"

Bây giờ template sẽ tìm thấy item.qitem.a — không còn lỗi.

Vì sao Zola lại dùng tên field ngắn q/a?

Tên field ngắn này được chọn vì:

  1. JSON-LD FAQPage schema: Tên field qa được dùng trong FAQPage schema của Google để tạo rich snippets. Zola template sử dụng tên này trực tiếp khi sinh JSON-LD. Xem thêm tài liệu Zola frontmatter documentation để hiểu rõ cách định nghĩa extra fields.

  2. Convention của Zola: Các theme Zola mặc định sử dụng qa — nếu dùng tên khác, bạn phải custom template.

  3. Consistency: Tất cả các ví dụ và tài liệu Zola đều dùng q/a, nên dev dễ nhớ và tuân thủ.

Template rendering trong Zola: Cách nó hoạt động

Để hiểu rõ hơn tại sao lỗi này xảy ra, cần biết Zola render pages như thế nào:

1. Zola đọc frontmatter: [[extra.faq]] → tạo object { q: "...", a: "..." }
2. Zola truyền object này tới template page.html
3. Template loop qua `page.extra.faq` array
4. Mỗi iteration, template cố truy cập `item.q` và `item.a`
5. Nếu field không tồn tại → "Variable not found" error

Điểm quan trọng là template được hardcode để dùng tên field cụ thể — bạn không thể dùng tên bất kỳ mà phải khớp với gì template mong đợi.

Cách debug template variable errors hiệu quả

Khi gặp lỗi "Variable not found", làm theo các bước này:

Bước 1: Đọc error message kỹ lưỡng

Zola sẽ báo chính xác variable name, template file, và dòng lỗi (nếu có):

ERROR Reason: Variable `item.q` not found in context while rendering 'page.html'

Từ đây bạn biết:

  • Template file: page.html
  • Variable name: item.q
  • Object: item (từ array loop)

Bước 2: Tìm nơi template sử dụng biến đó

Mở templates/page.html và search item.q:

{% for item in page.extra.faq %}
  <dt>{{ item.q }}</dt>
  <dd>{{ item.a }}</dd>
{% endfor %}

Bây giờ bạn biết template mong đợi FAQ object có fields qa.

Bước 3: Check frontmatter của bài viết

Xem frontmatter của bài viết lỗi:

[[extra.faq]]
question = "...?"
answer = "..."

So sánh với template — tên field không khớp! Template dùng q nhưng frontmatter dùng question.

Bước 4: Fix frontmatter

Thay đổi tên field từ question/answer thành q/a:

[[extra.faq]]
q = "...?"
a = "..."

Bước 5: Test build lại

Chạy zola build để xác nhận lỗi đã fix:

zola build
# Output: "Building site..."
# No errors!

Các lỗi template variable khác thường gặp

Ngoài FAQ schema, có nhiều lỗi "variable not found" khác:

LỗiNguyên nhânCách fix
item.slug not foundDùng item.url thay vì item.slugCheck template đúng field name
page.author not foundField không tồn tại trong page contextThêm vào frontmatter hoặc config
section.title not foundTemplate dùng trong page context, không section contextKiểm tra if condition is_section trước
item.date not foundFormat date sai hoặc field có tên khácDùng page.date hoặc field đúng

Best practices khi làm việc với FAQ schema

1. Luôn kiểm tra template trước khi viết frontmatter

Mở page.html hoặc base.html và tìm FAQ rendering code:

grep -n "extra.faq" templates/page.html

Xem chính xác tên field mà template dùng.

2. Dùng editor validation

Nếu editor của bạn hỗ trợ TOML validation, nó sẽ cảnh báo tên field sai.

3. Test build local trước khi push

Luôn chạy zola build trên máy local để catch lỗi template trước push:

zola build  # Exit code 0 = OK, 1 = lỗi

4. Tuân thủ convention Zola

Dùng tên field chuẩn của Zolaqa cho FAQ — thay vì tự bịa tên khác.

Kinh nghiệm từ debugging: Lỗi FAQ schema trong CI/CD

Khi thêm bài viết mới với FAQ schema vào PR:

  1. Local build pass ✅ — bài viết sạch, lỗi chính tả OK
  2. Push PR → CI chạy zola build
  3. CI báo đỏ ❌ — Variable item.q not found
  4. Nguyên nhân: Frontmatter dùng question/answer, nhưng template mong q/a
  5. Fix: Sửa frontmatter, push lại
  6. CI xanh ✅ — PR merge được

Bài học: Luôn kiểm tra template trước khi định nghĩa frontmatter fields.

Cách test FAQ schema render đúng

Sau khi fix, xác nhận FAQ schema render đúng:

# Build site
zola build

# Kiểm tra HTML output có FAQ tag
grep -i "faq" public/posting/example/index.html

# Hoặc dùng browser DevTools inspect JSON-LD schema

Bạn sẽ thấy JSON-LD FAQPage schema được sinh đúng:

{
  "@type": "FAQPage",
  "mainEntity": [
    {
      "@type": "Question",
      "name": "Câu hỏi của tôi?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "Câu trả lời của tôi"
      }
    }
  ]
}

Kết luận: Template variable errors không phải khó

  • Nguyên nhân gốc: Tên field trong frontmatter không khớp tên biến mà template mong đợi
  • Cách debug: Đọc error message → tìm template → so sánh tên field → fix frontmatter
  • Best practice: Kiểm tra template trước khi viết frontmatter
  • Convention Zola: Dùng q/a cho FAQ schema, không tự bịa tên khác

Bằng cách hiểu rõ cách Zola render template và validate frontmatter, bạn sẽ tránh được những lỗi "variable not found" phiền phức và đẩy PR lên lần đầu tiên mà không lỗi.

Nếu bạn gặp các lỗi template khác, hãy áp dụng quy trình debug tương tự: đọc error → tìm template → so sánh → fix.

Tham khảo & Nguồn dữ liệu

1. Liên kết bên ngoài được sử dụng trong bài viết

2. Liên kết nội bộ liên quan

3. Bản quyền & Ghi nguồn

Một phần dữ liệu trong bài viết được tham khảo từ Zola frontmatter documentation và FAQPage schema của Google. Mọi thương hiệu, tên sản phẩm và tài liệu gốc thuộc quyền sở hữu của chủ sở hữu tương ứng. Bài viết chỉ trích dẫn, tổng hợp và phân tích — không nhằm thay thế tài liệu chính thức.

Câu hỏi thường gặp

Lỗi 'Variable item.q not found' là gì?
Đây là lỗi khi Zola template (page.html) cố gắng truy cập biến `q` từ FAQ object, nhưng frontmatter của bài sử dụng tên field khác (ví dụ `question` thay vì `q`).
Tại sao frontmatter FAQ lại dùng `q` và `a`?
Zola template sử dụng tên field ngắn `q` (question) và `a` (answer) để tạo FAQPage schema JSON-LD. Tên này được hardcode trong template page.html, nên frontmatter phải khớp đúng.
Làm sao fix lỗi 'Variable not found' trong Zola?
Kiểm tra tên field trong frontmatter [[extra.faq]] — phải dùng `q` và `a`, không phải `question`/`answer`. Nếu dùng tên khác, template sẽ báo lỗi 'variable not found'.
Có thể custom tên field FAQ không?
Được, nhưng phải sửa cả template page.html để khớp với tên field mới. Cách dễ nhất là tuân theo convention `q`/`a` của Zola để tương thích.
CI sẽ báo lỗi gì khi FAQ field sai?
Zola build sẽ báo: 'ERROR Failed to render page' → 'Variable `item.q` not found in context while rendering page.html'. Exit code 1, chặn deploy.
Làm sao debug template variable errors nhanh?
Đọc error message từ `zola build` output — nó chỉ ra chính xác variable name và template file. So sánh với frontmatter để tìm tên field sai.

Bình luận

Đang tải bình luận…

    Đăng nhập để tham gia thảo luận.

    Đăng nhập bằng Google để bình luận

    Chỉ dùng để bình luận. Không truy cập trình soạn thảo/CMS.