Block theme và classic theme trong WordPress: so sánh thẳng thắn
Phân biệt block theme với classic theme trong 30 giây, xem mỗi loại bắt người biên tập và lập trình viên trả giá gì, rồi quyết định nên chuyển, nên ở lại, hay chỉ cần thêm theme.json.
Đã đăng
Mở thư mục theme của bạn ra. Nếu trong đó có thư mục templates với một file index.html bên trong, cộng thêm theme.json ở gốc, thì bạn đang dùng block theme. Nếu trong đó có index.php cùng với các file như header.php và footer.php, và sidebar quản trị hiện Appearance rồi Customizer, thì bạn đang dùng classic theme.
Chỉ riêng khác biệt về cấu trúc đó đã quyết định ai được sửa cái gì trên site của bạn, những thay đổi ấy được lưu ở đâu, và nửa nào của hệ sinh thái plugin WordPress sẽ chạy bình thường.
Nhận diện trong 30 giây
| Dấu hiệu | Classic theme | Block theme |
|---|---|---|
| File template gốc | index.php | templates/index.html |
| Header và footer | header.php, footer.php | parts/header.html, parts/footer.html |
| Cấu hình tổng thể | functions.php | theme.json (kèm functions.php tuỳ chọn) |
| Menu quản trị | Appearance > Customizer | Appearance > Editor |
| Nơi lưu chỉnh sửa | File trên đĩa | Database, dưới dạng bài viết wp_template |
| Màn hình Widgets | Có | Không có |
WordPress quyết định dựa vào việc có tồn tại templates/index.html hay không. Một theme có theme.json nhưng vẫn giữ template PHP thì vẫn bị xem là classic — trạng thái lưng chừng đó rất phổ biến và nó có tên hẳn hoi, nói ở phần dưới.
Nếu bạn có quyền truy cập shell, một câu lệnh là ngã ngũ:
wp eval 'var_dump( wp_is_block_theme() );'
WP-CLI là cách kiểm tra nhanh nhất trên một site không phải do bạn dựng, nhất là khi page builder đã giấu mất các menu quản trị quen thuộc.
Người biên tập site được và mất gì
Ở classic theme, header, footer, sidebar, màu sắc và logo nằm sau Customizer, và bạn chỉ có đúng những control mà tác giả theme quyết định làm ra. Nếu theme không đăng ký control cho dòng bản quyền ở footer thì đơn giản là không có control nào cả. Bạn sửa file PHP, hoặc chấp nhận sống chung.
Ở block theme, Site Editor mở toàn bộ trang ra. Header, footer, vòng lặp bài viết, trang 404, bố cục trang kết quả tìm kiếm — tất cả đều là block, tất cả đều sửa được bởi một người chưa từng nhìn thấy PHP. Đó mới là tính năng đáng nói nhất, và nó thật sự lớn.
Cái giá phải trả là: mọi thứ đều sửa được bởi một người chưa từng nhìn thấy PHP. Khách hàng có thể xoá tên site khỏi header lúc 2 giờ sáng, và trên đĩa không có lịch sử phiên bản nào để khôi phục — chỉ còn revisions của chính Site Editor. Có thể khoá bớt lại bằng tính năng khoá block và bằng cách giới hạn ai vào được editor, nhưng đó là việc bạn phải chủ động nhớ mà làm.
Hai mất mát nhỏ hơn nhưng cắn thật ngoài đời: block theme không có màn hình Widgets (widget area được thay bằng template part và block), và menu kiểu cũ được thay bằng block Navigation, lưu các mục menu như một loại nội dung riêng thay vì nằm trong màn hình Menus quen thuộc.
Lập trình viên được và mất gì
Classic theme dùng cây phân cấp template của PHP. WordPress phân giải một request theo một chuỗi đã biết — single-{post-type}.php, rồi single.php, rồi singular.php, rồi index.php — và file của bạn chạy, gọi get_header(), chạy The Loop, rồi in ra markup mà bạn kiểm soát tới từng ký tự.
<?php get_header(); ?>
<main class="site-main">
<?php while ( have_posts() ) : the_post(); ?>
<h1><?php the_title(); ?></h1>
<?php the_content(); ?>
<?php endwhile; ?>
</main>
<?php get_footer(); ?>
Block theme dùng đúng những tên đó trong cây phân cấp nhưng với đuôi .html, và bên trong file là markup block — HTML với các dấu phân cách block đặt trong comment — và không có template tag nào cả:
<!-- wp:template-part {"slug":"header","tagName":"header"} /-->
<!-- wp:group {"tagName":"main"} -->
<main class="wp-block-group">
<!-- wp:post-title {"level":1} /-->
<!-- wp:post-content /-->
</main>
<!-- /wp:group -->
<!-- wp:template-part {"slug":"footer","tagName":"footer"} /-->
Có ba hệ quả mà lập trình viên đụng phải ngay lập tức:
get_header() và get_footer() không bao giờ chạy. Bất cứ thứ gì hook vào các action đó, dù trong plugin hay trong một child theme cũ, sẽ lặng lẽ không làm gì. wp_head và wp_footer vẫn kích hoạt nên phần lớn việc enqueue vẫn sống, nhưng các hook riêng của header thì không.
Database thắng file của bạn. Ngay khi có người lưu một template trong Site Editor, WordPress lưu bản đó thành một bài viết wp_template và phục vụ nó thay cho file của bạn. Bạn có thể ngồi sửa file HTML cả buổi chiều mà front end không nhúc nhích. Xoá tuỳ biến của template đó thì bản trong file quay lại. Đây là báo lỗi “block theme của tôi hỏng rồi” phổ biến nhất, và nó không phải lỗi kỹ thuật.
Việc tạo style chuyển vào theme.json. Màu, thang spacing, typography và mặc định cho từng block được khai báo dưới dạng dữ liệu thay vì CSS, và WordPress tự sinh ra CSS. Cách này gọn hơn và nhất quán hơn nhiều — cho tới khi bạn cần một thứ mà schema không diễn đạt được, lúc đó bạn vẫn phải viết CSS và phải đánh nhau về độ ưu tiên với các rule được sinh tự động.
{
"version": 3,
"settings": {
"color": {
"palette": [
{ "slug": "brand", "color": "#1a1a1a", "name": "Brand" }
]
}
}
}
Hãy đối chiếu giá trị version với bản WordPress bạn đang chạy — schema đã sửa đổi hơn một lần, và chép số version từ một bài hướng dẫn cũ sẽ tạo ra những settings bị bỏ qua trong im lặng.
Lưu ý là functions.php không biến mất. Block theme vẫn dùng nó để enqueue, để đăng ký các mục add_image_size, tạo custom post type và mọi thứ khác cần PHP. Chỉ là bạn làm ít việc dựng template ở đó hơn nhiều.
Bạn thật sự được gì, và mất gì
Chọn block theme, bạn được: quyền chỉnh sửa cả trang từ editor, sự nhất quán thiết kế do theme.json áp đặt, ít file phải bảo trì hơn, và style khớp giữa editor với front end thường xuyên hơn hẳn so với những gì classic theme từng làm được.
Chọn block theme, bạn mất: quyền kiểm soát trực tiếp markup xuất ra, cách tuỳ biến đơn giản dựa trên hook, khả năng tương thích với mọi thứ giả định có template PHP, và sự yên tâm rằng diện mạo của site nằm trong version control.
Điều cuối cùng đáng nhấn mạnh. Ở classic theme, git log cho bạn biết cái gì đã thay đổi. Ở block theme, một phần đáng kể diện mạo site nằm trong database, nơi mà quy trình deploy của bạn không hề ngó tới.
Khi nào classic theme vẫn là câu trả lời đúng
- Site chạy bằng page builder. Elementor, Divi, Beaver Builder và các công cụ tương tự tự lo phần dựng template. Nhét thêm block theme bên dưới chỉ là thêm một hệ thống template thứ hai chẳng làm gì cả.
- Markup phải chuẩn từng ly. Thư viện component đặt riêng, markup yêu cầu khắt khe về khả năng tiếp cận, schema kiểu đặc thù — đầu ra của block bị giới hạn bởi những gì block sinh ra, và chống lại nó tốn kém hơn là ngồi viết PHP.
- Plugin dựng template nhiều. Các plugin về hội viên, LMS, danh bạ và những extension thương mại điện tử đời cũ thường đi kèm bản ghi đè template PHP. Nhiều cái giờ đã có bản dùng block; nhiều cái thì chưa.
- Site đã xong và đang chạy tốt. Một theme với năm năm tuỳ biến tích luỹ không có đường nâng cấp lên block, chỉ có làm lại từ đầu. “Vì đây là cách mới hơn” không phải là lý do kinh doanh.
- Chỉ mình bạn sửa nó. Lợi ích chính của Site Editor là trao quyền cho người không biết lập trình. Nếu chẳng có ai như vậy, bạn đang trả giá cho một lợi ích không ai dùng.
Vùng lai ở giữa
Một classic theme có thể thêm theme.json và nhận được hệ thống global styles, các preset màu và spacing, cùng style nhất quán trong editor — trong khi vẫn giữ template PHP và Customizer. WordPress không gọi đó là block theme, và Site Editor vẫn không dùng được, nhưng bạn có phần lớn lợi ích của một hệ thống thiết kế với một phần nhỏ công sức.
Với một site đang chạy ổn, đây thường là nước đi đầu tiên đúng đắn. Thêm theme.json, định nghĩa bảng màu và spacing, xoá phần CSS mà nó thay thế, rồi xem bạn có còn muốn phần còn lại nữa không.
FAQ
Câu hỏi
Làm sao biết theme WordPress của tôi là block theme hay classic theme?
Mở thư mục theme ra. Block theme có thư mục templates chứa index.html và gần như luôn có file theme.json ở gốc. Classic theme có index.php cùng các file template PHP như header.php và footer.php. Trong trang quản trị, block theme hiện Appearance rồi Editor, còn classic theme hiện Appearance rồi Customizer.
Block theme có tốt hơn classic theme không?
Không phải lúc nào cũng vậy. Block theme cho người không biết lập trình quyền kiểm soát thật sự với mọi phần của trang và bỏ bớt rất nhiều PHP lặp đi lặp lại. Classic theme cho lập trình viên kiểm soát markup chính xác tới từng ký tự và chạy được với toàn bộ kho plugin, page builder và hook tích luỹ bao năm nay. Chọn cái nào phụ thuộc vào ai là người sửa site sau khi ra mắt.
Tôi có thể chuyển classic theme thành block theme không?
Không phải chỉ bật một cái công tắc là xong. Chuyển đổi nghĩa là viết lại mọi template PHP thành markup block dạng HTML, đưa style vào theme.json, và thay widget area cùng menu bằng block. Với một theme đã tuỳ biến nhiều thì đây là làm lại từ đầu, không phải di chuyển. Cách lai — thêm theme.json vào classic theme — thường là bước đầu rẻ hơn nhiều.
Vì sao sửa file template xong lại không thấy gì đổi sau khi tôi động vào Site Editor?
Ngay khi có người sửa một template trong Site Editor, WordPress lưu bản đó vào database dưới dạng một bài viết wp_template, và bản trong database thắng file trên đĩa. Mọi chỉnh sửa file của bạn sẽ bị bỏ qua cho tới khi tuỳ biến của đúng template đó được xoá đi. Chuyện này làm gần như mọi lập trình viên bất ngờ ở block theme đầu tiên của họ.
Classic theme còn chạy được trên WordPress hiện tại không?
Có. Classic theme vẫn được hỗ trợ đầy đủ, không có cảnh báo ngừng hỗ trợ nào, và vẫn chạy đúng cây phân cấp template PHP như xưa nay. Customizer vẫn tải cho chúng. Sự chú ý của đội phát triển WordPress đã dồn về phía block theme, nên hãy chờ tính năng editor mới xuất hiện ở đó trước, nhưng không có kế hoạch nào làm hỏng classic theme cả.