Profile
Quỳnh thích tối ưu

Setup Obsidian Template để tạo blog post tự động

Ở bài trước Tận dụng Obsidian làm editor chính, mình có nhắc đến "nỗi đau" khi phải gõ tay từng dòng Frontmatter cho mỗi bài viết mới.

Hôm nay mình sẽ chia sẻ chi tiết cách mình xử lý vấn đề này bằng plugin Templater.

🤔 Tại sao cần Templater?

Ban đầu mình nghĩ dùng tính năng Templates có sẵn (Core Plugin) của Obsidian là đủ. Nhưng nó quá đơn giản, chỉ chèn được ngày giờ và một vài thông tin cơ bản.

Nhu cầu của mình thì phức tạp hơn:

  1. Hỏi tiêu đề ngay khi tạo: Không muốn phải click vào title để sửa.
  2. Slug tự động: Mình muốn nhập tiêu đề "Cách nấu phở" thì nó phải tự sinh ra slug cach-nau-pho (bỏ dấu tiếng Việt, thay khoảng trắng...).
  3. Tên file chuẩn: Tự động đổi tên file Untitled thành 20260116-cach-nau-pho.md.

Nên mình lựa chọn cài thêm plugin Templater (với khả năng chạy JavaScript) để có thể tự động hóa quy trình này.

🛠️ Các bước Setup

Bước 1: Cài đặt Plugin

Vào SettingsCommunity Plugins → Tắt "Restricted mode" → Tìm và cài Templater.

Bước 2: Chuẩn bị folder chứa template

Mình tạo một folder riêng để chứa các file mẫu, ví dụ: src/content/_templates.

Vào SettingsTemplater, ở mục "Template folder location", trỏ đến folder vừa tạo.

Bước 3: Tạo file Script

Tạo một file mới trong folder template đó, đặt tên là blog-post.md. Copy đoạn code này vào:

<%*
// 1. Hỏi tiêu đề bài viết
let title = tp.file.title;
if (title.startsWith("Untitled") || title === "") {
    title = await tp.system.prompt("Nhập tiêu đề bài viết");
}

// 2. Tạo slug từ tiêu đề (bỏ dấu, thường, gạch nối)
const slug = title
    .toLowerCase()
    .normalize("NFD")
    .replace(/[\u0300-\u036f]/g, "")
    .replace(/đ/g, "d")
    .replace(/Đ/g, "d")
    .replace(/[^a-z0-9\s-]/g, "")
    .trim()
    .replace(/\s+/g, "-")
    .replace(/-+/g, "-");

// 3. Lấy ngày hiện tại
const pubDate = tp.date.now("YYYY-MM-DD");
const dateString = tp.date.now("YYYYMMDD");

// 4. Đổi tên file theo format chuẩn
const newFileName = `${dateString}-${slug}`;
await tp.file.rename(newFileName);
-%>
---
title: "<% title %>"
slug: "<% slug %>"
pubDate: <% pubDate %>
description: ""
coverImage: ""
draft: true
tags: []
categories: []
projects: []
---

<% tp.file.cursor() %>

Cách script này hoạt động:

  1. Hỏi tiêu đề: Khi chạy, nó sẽ hiện một popup hỏi bạn "Bài này tên gì?".
  2. Xử lý Slug: Nó dùng JavaScript để biến "Tiếng Việt có dấu" thành "tieng-viet-khong-dau".
  3. Tự đổi tên file: File Untitled sẽ tự biến thành 20260116-tieng-viet-khong-dau.md.
  4. Đặt trỏ chuột: tp.file.cursor() sẽ đưa con trỏ chuột xuống dưới cùng, sẵn sàng để bạn viết.

🚀 Sử dụng

Quy trình viết bài mới của mình giờ chỉ còn 2 bước:

  1. Bấm Cmd + N để tạo file mới từ template (phím tắt mình gán cho Templater).
  2. Nhập tiêu đề và Enter.

Bùm! File được đổi tên, frontmatter được điền, và mình có thể bắt đầu viết ngay lập tức. Mọi thứ diễn ra trong chưa đầy 5 giây.

Bạn có thể áp dụng cách này cho Daily Note, Project Note, hay bất cứ loại nội dung nào có cấu trúc lặp đi lặp lại.


Bài tiếp theo: Sau khi tạo bài viết dễ dàng rồi, làm sao để mình có thể quản lý danh sách hàng chục bài viết?
→ Mời bạn xem tiếp Quản lý danh sách bài Blog với Obsidian Properties