Bỏ qua tới nội dung
WordPress· ·9 phút đọc

Template hierarchy WordPress hoạt động như thế nào

Nguyen Hien
Template hierarchy WordPress hoạt động như thế nào
Cỡ chữ

Khi một người mở một URL trên website của bạn, WordPress phải trả lời một câu hỏi rất cụ thể: dùng file giao diện nào để vẽ trang này ra? Câu trả lời không phải ngẫu nhiên. WordPress xác định loại nội dung đang được yêu cầu (một bài viết, một trang tĩnh, một danh mục, một kết quả tìm kiếm…), rồi lần lượt dò một danh sách tên file đã định sẵn cho loại đó. File đầu tiên tồn tại trong theme sẽ được chọn. Hiểu được quy luật này, bạn sẽ biết chính xác cần tạo file nào để đổi giao diện cho đúng nhóm trang mình muốn, thay vì chỉnh mò.

Quy luật cốt lõi: từ riêng đến chung

Mọi nhánh trong cơ chế này đều theo một nguyên tắc duy nhất: WordPress thử file cụ thể nhất trước, không có thì lùi dần xuống file tổng quát hơn, và điểm dừng cuối cùng luôn là index.php (hoặc index.html với theme block). Vì index là file bắt buộc tối thiểu của mọi theme, WordPress luôn có thứ gì đó để hiển thị, kể cả khi bạn chưa tạo file nào khác.

Nói cách khác, để override (ghi đè — thay file mặc định bằng file của riêng bạn) giao diện một nhóm trang, bạn chỉ cần thêm vào theme một file có tên nằm cao hơn trong danh sách dò. WordPress sẽ tự ưu tiên nó. Không cần sửa core, không cần hook.

Sơ đồ thứ tự dò template của một bài viết đơn từ riêng đến chung
WordPress dò từ file cụ thể nhất xuống tổng quát, điểm dừng là index.

Sơ đồ thứ tự ưu tiên theo từng loại trang

Dưới đây là bảng các nhánh hay gặp nhất. Cột bên trái là loại trang; cột bên phải là thứ tự dò file (trên xuống dưới = ưu tiên cao đến thấp). Tên trong ngoặc nhọn là biến: {slug} là đường dẫn tĩnh, {id} là ID, {post_type} là loại nội dung.

Loại trangThứ tự dò file (riêng → chung)
Bài viết đơn (single post)single-{post_type}-{slug}.phpsingle-{post_type}.phpsingle.phpsingular.phpindex.php
Trang tĩnh (page){template-tự-chọn}.phppage-{slug}.phppage-{id}.phppage.phpsingular.phpindex.php
Danh mục (category)category-{slug}.phpcategory-{id}.phpcategory.phparchive.phpindex.php
Thẻ (tag)tag-{slug}.phptag-{id}.phptag.phparchive.phpindex.php
Taxonomy tuỳ biếntaxonomy-{taxonomy}-{term}.phptaxonomy-{taxonomy}.phptaxonomy.phparchive.phpindex.php
Lưu trữ theo loại nội dungarchive-{post_type}.phparchive.phpindex.php
Tác giả (author)author-{nicename}.phpauthor-{id}.phpauthor.phparchive.phpindex.php
Tìm kiếmsearch.phpindex.php
404 (không tìm thấy)404.phpindex.php
Trang chủ / trang bài viếtfront-page.phphome.phpindex.php

Một điểm hay nhầm: trang chủ có hai nhánh. Nếu trong Cài đặt → Đọc bạn đặt trang chủ hiển thị danh sách bài mới nhất, WordPress dùng nhánh home.php; nếu bạn gán một trang tĩnh làm trang chủ, nó vào nhánh front-page.php. File front-page.php luôn được dò trước trong cả hai trường hợp.

Theme block: cùng quy luật, đổi đuôi file

Trong theme block (block theme — kiến trúc Full Site Editing mặc định của WordPress hiện nay), toàn bộ phân cấp này giữ nguyên thứ tự, chỉ khác hai điểm: file template nằm trong thư mục templates/ và mang đuôi .html thay vì .php. Ví dụ single.php trở thành templates/single.html, category-tin-tuc.php trở thành templates/category-tin-tuc.html.

Theo tài liệu của developer.wordpress.org, WordPress dò template block ở ba nơi theo thứ tự: template do người dùng tự sửa lưu trong cơ sở dữ liệu (bảng wp_template), rồi đến thư mục templates/ của child theme nếu có, cuối cùng là templates/ của theme cha. Vì lớp ưu tiên đầu là cơ sở dữ liệu, một template bạn chỉnh qua trình Site Editor sẽ ghi đè lên file cùng tên trong theme. File bắt buộc duy nhất của theme block là templates/index.html.

Override đúng cách: ví dụ thực tế

Giả sử bạn có một danh mục tên Tin tức với slug tin-tuc, và muốn riêng danh mục này có bố cục khác mọi danh mục còn lại. Bạn không sửa category.php (sẽ ảnh hưởng tất cả), mà tạo một file mới:

// File: category-tin-tuc.php (đặt ở thư mục gốc của theme)
<?php get_header(); ?>

<main class="archive archive--tin-tuc">
  <h1><?php single_cat_title(); ?></h1>

  <?php if ( have_posts() ) : ?>
    <?php while ( have_posts() ) : the_post(); ?>
      <article>
        <h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>
        <?php the_excerpt(); ?>
      </article>
    <?php endwhile; ?>
  <?php endif; ?>
</main>

<?php get_footer(); ?>

category-tin-tuc.php đứng cao nhất trong nhánh danh mục, WordPress chọn nó cho riêng danh mục tin-tuc. Mọi danh mục khác vẫn rơi xuống category.php hoặc archive.php như cũ. Đó chính là sức mạnh của cơ chế này: bạn khoanh vùng thay đổi rất gọn, không đụng tới phần còn lại.

Vòng lặp while ( have_posts() ) ở trên là The Loop (vòng lặp chính) — WordPress đã chuẩn bị sẵn đúng danh sách bài cho trang hiện tại, file template chỉ việc trình bày. Điều này giải thích vì sao chọn đúng file template lại quan trọng hơn là viết truy vấn dữ liệu thủ công.

So sánh khi nào nên và không nên tạo file template riêng
Khoanh vùng thay đổi gọn, tránh đẻ file thừa phải bảo trì.

Khi nào KHÔNG nên tạo file riêng

Phân cấp template mạnh nhưng dễ bị lạm dụng. Nếu một thay đổi áp dụng cho mọi bài viết, hãy sửa single.php; đừng tạo hàng loạt single-{slug}.php. Mỗi file thừa là một thứ phải bảo trì về sau. Theo kinh nghiệm dựng theme custom của Web22, một theme gọn thường chỉ cần vài file lõi (index, single, page, archive, search, 404) và chỉ tách file riêng khi có lý do thiết kế rõ ràng — chẳng hạn một loại nội dung tuỳ biến (custom post type — loại bài tự định nghĩa) cần bố cục hoàn toàn khác.

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

Làm sao biết WordPress đang dùng file template nào?

Bật chế độ gỡ lỗi và dùng hằng WP_DEBUG, hoặc cài một plugin xem template; nhiều theme dev còn in tên template qua hook template_include. Cách nhanh nhất là tạm thêm dòng nhận biết vào từng file nghi ngờ rồi xem dòng nào xuất hiện.

File template tuỳ chọn (custom page template) khác gì với page-{slug}.php?

File template tuỳ chọn có dòng chú thích Template Name: ở đầu và được gán thủ công qua thuộc tính trang trong trình soạn thảo, nên nó ưu tiên cao nhất trong nhánh trang. Còn page-{slug}.php được WordPress tự nhận theo đường dẫn, không cần gán tay.

Theme block có còn dùng file PHP không?

Phần lớn template chuyển sang .html, nhưng một số mảnh như template nhúng (embed) vẫn dựa trên PHP đặt ở gốc theme. Logic dò file thì giữ nguyên thứ tự cũ.

Nắm vững phân cấp template là nền tảng để tự kiểm soát giao diện một website WordPress thay vì phụ thuộc plugin. Nếu bạn cần một bộ template được tổ chức gọn gàng ngay từ đầu, tham khảo dịch vụ theme tuỳ biến của Web22, hoặc xem thêm bài về dựng theme WordPress từ con số không.

Đọc tiếp

Bài viết
cùng chủ đề.

Tất cả bài viết