Menu

Get page và Template page trong WordPress

Template page là một file PHP trong thư mục theme, có khai báo Template Name, để WordPress nhận diện và cho phép chọn trong Dashboard.

Mặc định WordPress dùng:

page.php

Nhưng khi bạn muốn layout riêng → bạn tạo template page tùy chỉnh.

Get page và Template page trong WordPress

Get page và Template page trong WordPress

Cách tạo Template Page từ đầu (chuẩn production)

Bước 1: Tạo file trong theme

Ví dụ:

template-landing.php

Bước 2: Khai báo Template Name

<?php
/*
Template Name: Landing Page Chuyên Biệt
*/
get_header();
?>

<main class="landing-page">

    <section class="hero">
        <h1><?php the_title(); ?></h1>
    </section>

    <section class="content">
        <?php
        if ( have_posts() ) :
            while ( have_posts() ) : the_post();
                the_content();
            endwhile;
        endif;
        ?>
    </section>

</main>

<?php get_footer(); ?>

Sau khi lưu file:

  • Vào Dashboard → Pages
  • Edit một Page
  • Chọn template “Landing Page Chuyên Biệt”

Đó là quy trình chuẩn để tạo template

Template Page không cần khai báo (theo slug)

Nếu bạn có page:

example.com/contact

Slug là: contact

Chỉ cần tạo file:

page-contact.php

WordPress sẽ tự động sử dụng file này.

Ưu điểm:

  • Không cần chọn trong Dashboard
  • Không phụ thuộc user
  • Kiểm soát bằng code hoàn toàn

Đây là cách làm chuyên nghiệp khi build site cho client lớn.

Cấu trúc chuẩn của một Page

Một template page production-ready nên:

  • Gọi get_header()
  • Có The Loop
  • Tách component bằng get_template_part()
  • Không viết logic nặng trong file template

Ví dụ cấu trúc nâng cao:

<?php
/*
Template Name: Service Page
*/
get_header();
?>

<?php get_template_part('template-parts/section', 'hero'); ?>

<?php get_template_part('template-parts/section', 'services'); ?>

<?php get_template_part('template-parts/section', 'cta'); ?>

<?php get_footer(); ?>

Và trong template-parts/section-hero.php:

<section class="hero">
    <h1><?php the_title(); ?></h1>
</section>

Tách như vậy giúp:

  • Dễ maintain
  • Dễ scale
  • Dễ reuse component

Get Page là gì?

Trong WordPress, Page thực chất là một post type (post_type = page). Vì vậy:

  • get_page() (cũ)
  • get_post() (khuyến nghị hiện tại)

đều có thể dùng để truy xuất dữ liệu Page.

Hiện nay nên dùng:

get_post()

Cách Get Page theo ID (Chuẩn nhất)

Giả sử bạn có Page “Giới thiệu” ID = 42
Và muốn hiển thị nội dung nó trong template page.

<?php
$about_page = get_post(42);

if ( $about_page ) :
?>

<section class="about-section">
    <h2><?php echo $about_page->post_title; ?></h2>

    <div class="content">
        <?php echo apply_filters('the_content', $about_page->post_content); ?>
    </div>
</section>

<?php endif; ?>

Lưu ý quan trọng:

  • Luôn dùng apply_filters('the_content', ...)
  • Nếu không dùng → shortcode & block Gutenberg sẽ không render

Get Page theo Slug (Chuyên nghiệp hơn)

Không nên hardcode ID.

Nên dùng:

$about_page = get_page_by_path('gioi-thieu');

Hoặc chuẩn hơn với WP_Query:

$args = array(
    'post_type' => 'page',
    'name'      => 'gioi-thieu'
);

$query = new WP_Query($args);

if ( $query->have_posts() ) :
    while ( $query->have_posts() ) : $query->the_post();
        the_title('<h2>', '</h2>');
        the_content();
    endwhile;
    wp_reset_postdata();
endif;

Cách này giúp:

✔ Không phụ thuộc ID
✔ An toàn khi migrate database

Get nhiều Page trong Template Page

Giả sử landing page cần:

  • Page 1: Giới thiệu
  • Page 2: Dịch vụ
  • Page 3: Liên hệ

Không nên gọi:

get_post(1);
get_post(2);
get_post(3);

Thay vào đó:

$args = array(
    'post_type' => 'page',
    'post__in'  => array(1,2,3),
    'orderby'   => 'post__in'
);

$query = new WP_Query($args);

if ( $query->have_posts() ) :
    while ( $query->have_posts() ) : $query->the_post();
?>

<section class="dynamic-section">
    <h2><?php the_title(); ?></h2>
    <?php the_content(); ?>
</section>

<?php
    endwhile;
    wp_reset_postdata();
endif;

Cách này tối ưu hơn vì:

  • Chỉ 1 query
  • Kiểm soát thứ tự hiển thị
  • Dễ scale

Get Page và Separation of Concerns

Template page chỉ nên hiển thị.
Logic query nên đặt trong functions.php hoặc class riêng.

Ví dụ:

function get_landing_sections() {
    return new WP_Query(array(
        'post_type' => 'page',
        'post__in'  => array(1,2,3),
        'orderby'   => 'post__in'
    ));
}

Trong template:

$sections = get_landing_sections();

if ( $sections->have_posts() ) :
    while ( $sections->have_posts() ) : $sections->the_post();
        the_title('<h2>','</h2>');
        the_content();
    endwhile;
    wp_reset_postdata();
endif;

Kiến trúc này giúp:

  • Template sạch
  • Dễ test
  • Dễ bảo trì

Template trong wordpress và SEO

Tạo page với tempate cho phép bạn:

  • Thêm schema riêng
  • Chèn meta tag custom
  • Tối ưu heading structure
  • Thiết kế layout không phụ thuộc page.php

Ví dụ thêm schema JSON-LD:

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "Service",
  "name": "<?php the_title(); ?>"
}
</script>

Điều này rất quan trọng khi build landing page bán hàng.

Khi nào nên tạo Template riêng cho page?

Bạn nên dùng template page khi:

  • ✔ Layout khác hoàn toàn page mặc định
  • ✔ Trang cần cấu trúc HTML riêng
  • ✔ Trang cần performance tối ưu riêng
  • ✔ Trang có logic hiển thị đặc biệt

Không nên dùng template page nếu:

  • ✘ Chỉ thay đổi màu sắc
  • ✘ Chỉ chỉnh CSS nhẹ

Lỗi phổ biến

  1. Quên The Loop → nội dung không hiển thị
  2. Không gọi wp_head() trong header
  3. Query quá nhiều → làm chậm trang
  4. Nhồi logic vào template → phá vỡ separation of concerns

Nguyên tắc chuẩn:

Template page chỉ nên xử lý presentation.
Logic nên đặt trong functions.php hoặc class riêng.

Template nâng cao (truyền dữ liệu riêng)

Bạn có thể truyền dữ liệu tùy chỉnh:

get_template_part(
    'template-parts/section',
    'hero',
    array(
        'title' => 'Dịch vụ cao cấp',
        'subtitle' => 'Giải pháp toàn diện'
    )
);

Trong file section-hero.php:

<h1><?php echo $args['title']; ?></h1>
<p><?php echo $args['subtitle']; ?></p>

Cách này giúp template page linh hoạt như một mini-framework.

Kết luận

Tóm lại, template page là công cụ cốt lõi giúp bạn kiểm soát hoàn toàn layout cho từng Page trong WordPress, từ cấu trúc HTML đến chiến lược SEO và hiệu suất tải trang. Khi kết hợp đúng với kỹ thuật get page, bạn không chỉ tạo ra giao diện riêng biệt mà còn chủ động điều phối dữ liệu một cách linh hoạt, sạch kiến trúc và dễ mở rộng.

Một developer chuyên nghiệp không chỉ biết tạo file template, mà còn hiểu cách tách logic, tối ưu query và tổ chức code theo hướng bền vững cho các dự án dài hạn. Bạn có thể tham khảo về template page và post ở tài liệu gốc của wordpress để tham khảo thêm nhé

Giải đáp thắc mắc về Template Page và Get Page trong WordPress

Template Page trong WordPress là gì và dùng để làm gì?

Template Page là file PHP trong theme có khai báo ‘Template Name’, được dùng để tạo ra các bố cục (layout) riêng biệt cho từng trang thay vì dùng page.php mặc định.

Làm sao để WordPress tự nhận diện template mà không cần chọn trong Dashboard?

Bạn chỉ cần đặt tên file theo định dạng page-{slug}.php, WordPress sẽ tự động ưu tiên sử dụng file này cho trang có slug tương ứng mà không cần thao tác thủ công.

Tại sao khi lấy nội dung trang phải dùng apply_filters cho the_content?

Hàm này đảm bảo các thành phần như shortcode và blocks của Gutenberg được xử lý và hiển thị đúng định dạng thay vì chỉ hiển thị văn bản thô.

Cách lấy dữ liệu một Page theo ID hay Slug chuyên nghiệp hơn?

Lấy theo Slug (sử dụng get_page_by_path hoặc WP_Query) tốt hơn vì nó giúp code linh hoạt, không bị lỗi khi migrate dữ liệu sang website khác có ID thay đổi.

Lợi ích của việc tách component bằng get_template_part trong template là gì?

Kỹ thuật này giúp mã nguồn sạch sẽ, dễ bảo trì, tối ưu hóa quy trình làm việc và dễ dàng tái sử dụng các thành phần giao diện cho nhiều trang khác nhau.

Làm thế nào để lấy dữ liệu nhiều Page cùng lúc trong một Template Page?

Sử dụng WP_Query với mảng ‘post__in’ chứa danh sách ID hoặc slug, giúp tối ưu hiệu suất hệ thống bằng cách chỉ thực hiện một truy vấn duy nhất.

Template Page giúp tối ưu SEO cho website như thế nào?

Cho phép tùy biến cấu trúc thẻ Heading chuẩn SEO, chèn Schema JSON-LD riêng biệt cho từng dịch vụ và kiểm soát hoàn toàn mã nguồn để tăng tốc độ tải trang.

Những lỗi phổ biến nào cần tránh khi tự tạo Template Page?

Các lỗi thường gặp gồm: quên vòng lặp The Loop, thiếu hàm wp_head/wp_footer, thực hiện quá nhiều query gây chậm trang và nhồi nhét logic vào file hiển thị.

Bài trước Hướng dẫn shortcode trong wordpress toàn tập Bài tiếp theo Ajax trong wordpress

Đánh giá từ khách hàng

Tổng hợp trải nghiệm thực tế từ khách đã lưu trú.

5,0 /5

Tuyệt vời

9 đánh giá

Tuyệt vời
9
Rất tốt
0
Trung bình
0
Tạm được
0
Tệ
0
Chất lượng nội dung
5,0
Áp dụng thực tế
5,0
Trình bày bài viết
5,0
Giá trị kiến thức
5,0
BD

Bùi Tiến Dũng

Đã đánh giá vào 14/02/2026

5,0 /5

Một bài viết không thể thiếu cho những ai muốn tự build theme custom. Từ việc get page theo ID đến dùng slug đều được giải thích rất gãy gọn. Hình ảnh minh họa cũng rất trực quan, dễ theo dõi.

NB

Ngô Quốc Bảo

Đã đánh giá vào 14/02/2026

5,0 /5

Việc truyền dữ liệu qua mảng `$args` trong `get_template_part` là kỹ thuật mình đang tìm kiếm bấy lâu để làm các section linh hoạt hơn. Ad cho hỏi là cách này có giới hạn gì về kiểu dữ liệu truyền vào không, ví dụ mình truyền cả một object query vào luôn có được không?

VY

Vũ Hải Yến

Đã đánh giá vào 14/02/2026

5,0 /5

Cảm ơn tác giả đã phân biệt rõ khi nào nên dùng template riêng và khi nào chỉ cần chỉnh CSS. Nhiều bạn cứ đụng tí là tạo template mới làm thư mục theme rối tung cả lên. Một bài viết rất định hướng!

ĐH

Đặng Quang Huy

Đã đánh giá vào 14/02/2026

5,0 /5

Hướng dẫn rất bài bản! Hồi mới bắt đầu mình hay bị lỗi quên gọi `the_post()` trong vòng lặp nên dữ liệu cứ bị loạn xạ. Đọc bài này thấy admin nhắc lại mấy lỗi phổ biến như quên `wp_head()` hay `the loop` thấy chuẩn không cần chỉnh.

HA

Hoàng Anh

Đã đánh giá vào 14/02/2026

5,0 /5

Kết nhất đoạn hướng dẫn chèn Schema JSON-LD trực tiếp vào template page. Việc tùy biến cấu trúc dữ liệu cho từng trang dịch vụ riêng biệt như vậy cực kỳ có lợi cho SEO. Mình đã áp dụng ngay và thấy cấu trúc heading của trang sạch hơn hẳn so với dùng plugin mặc định.

Phạm Văn Đức

Đã đánh giá vào 14/02/2026

5,0 /5

Admin cho mình hỏi chút, nếu mình dùng WP_Query để lấy nội dung của khoảng 5-6 trang con để hiển thị trên một Landing Page duy nhất như hướng dẫn thì có cần lưu ý gì thêm về caching để tối ưu tốc độ load không ạ? Bài viết rất hay và thực tế!

LN

Lê Hoàng Nam

Đã đánh giá vào 14/02/2026

5,0 /5

Cách admin hướng dẫn tách logic ra functions.php hoặc class riêng rồi mới gọi ở template page là một tư duy rất chuẩn (Separation of Concerns). Nó giúp việc bảo trì theme sau này nhàn hơn hẳn, nhất là với các dự án lớn cho khách hàng. Rất mong có thêm nhiều bài về kiến trúc code như thế này.

TT

Trần Thị Thu Thảo

Đã đánh giá vào 14/02/2026

5,0 /5

Mình là dân mới học WP, trước giờ toàn tạo template rồi vào Dashboard chọn thủ công thôi. Nay mới biết cái vụ đặt tên file theo slug `page-{slug}.php` là nó tự nhận luôn, tiện mà chuyên nghiệp thật sự. Bài viết trình bày rất dễ hiểu cho người mới.

NT

Nguyễn Minh Tuấn

Đã đánh giá vào 14/02/2026

5,0 /5

Bài viết cực kỳ chi tiết! Đặc biệt là phần lưu ý dùng `apply_filters('the_content', ...)` khi lấy nội dung trang bằng code. Trước mình cứ thắc mắc tại sao dùng `get_post` mà mấy cái shortcode với block Gutenberg nó không hiển thị đúng, hóa ra là thiếu bước lọc này. Cảm ơn admin rất nhiều!

Viết đánh giá của bạn

Vui lòng đăng nhập để gửi đánh giá.
Chất lượng nội dung
Áp dụng thực tế
Trình bày bài viết
Giá trị kiến thức

Tối đa 5 ảnh, mỗi ảnh không quá 5MB.

    Tìm kiếm... Ctrl+K

    Kira ChatBox - Trợ lý AI