Làm cách nào để sử dụng get_template_part ()?


25

Ai đó có thể vui lòng giải thích cho tôi làm thế nào chức năng này hoạt động? Tôi biết nó làm gì nhưng khi tôi xem mã nguồn trong mẫu hai mươi_ten, tôi không hiểu làm thế nào tất cả các vòng lặp được thu thập trong một loop.php duy nhất (tôi cũng thấy tệp đó).

Vì vậy, làm thế nào để ví dụ trừu tượng đi một phần chung của mẫu và sau đó sử dụng lại nó trên các mẫu khác?


Câu trả lời:


25

Một số câu trả lời giới thiệu rất tốt ở đây.

Về cơ bản, get_template_part()cho phép các nhà phát triển chủ đề thiết lập một thứ tự đặc thù của các tệp mẫu. Hãy nghĩ về nó tương tự như tính đặc hiệu vì nó áp dụng cho các bộ chọn CSS. Khi thiết kế một cái gì đó, bạn muốn bắt đầu với độ đặc hiệu tối thiểu, để nó có thể dễ dàng bị ghi đè trong các phần của thiết kế cần chú ý riêng.

Vì vậy, ví dụ, bạn đang tạo kiểu cho một blog và bạn tạo một tệp loop.php hoạt động tốt để đánh dấu các bài đăng. Nhưng bạn có kế hoạch trước và bạn gọi nó trong các tệp mẫu của bạn sau với các chỉ định ngữ cảnh bổ sung - giả sử, trên trang chỉ mục, bạn gọi get_template_part( 'loop', 'index' );, trên một mẫu duy nhất, bạn gọi get_template_part( 'loop', 'single' );, trên các trang lưu trữ, bạn gọi get_template_part( 'loop', 'archive' );, v.v. Điều này giúp bạn dễ dàng thực hiện khi bạn quyết định đánh dấu vòng lặp trên các trang lưu trữ của mình khác với trang chủ: chỉ cần tạo mẫu loop-archive.php và nó sẽ được sử dụng thay vì loop.php chung .

Nhưng ma thuật đằng sau get_template_part()là trong chức năng locate_template(), đầu tiên kiểm tra thư mục chủ đề, sau đó là thư mục mẹ (nếu có) cho tệp có tên. Điều này rất hữu ích cho việc phát triển plugin. Trong một trong các plugin của mình, tôi xác định loại bài đăng tùy chỉnh và tạo tệp mẫu vòng lặp cho loại bài đăng tùy chỉnh đó trong thư mục plugin của mình. Nhưng ... tôi muốn cho phép các chủ đề sử dụng plugin của mình để ghi đè đánh dấu nếu chúng chọn. Đây là nơi locate_template()thực sự làm việc kỳ diệu.

locate_template($template_names, $load = false, $require_once = true )

sẽ tìm kiếm từng tên trong mảng $ template_names trong thư mục biểu định kiểu, sau đó trong thư mục mẫu. Truyền 'true' làm đối số $ load có nghĩa là nó sẽ yêu cầu tệp đầu tiên được tìm thấy và sẽ trả về một chuỗi trống nếu không có tệp mẫu nào được đặt. Vì vậy, tôi có thể làm một cái gì đó như thế này trong plugin của mình:

if ( '' === locate_template( 'loop-mycustomposttype.php', true, false ) )
    include( 'loop-mycustomposttype.php' );

... Điều này hy vọng sẽ giúp các nhà phát triển chủ đề dễ dàng tùy chỉnh plugin của tôi chỉ bằng cách bao gồm một tệp có tên loop-mycustomposttype.php trong chủ đề của họ.


2
Thay thế định vị bằng cách này, xin vui lòng. include(locate_template( 'loop-mycustomposttype.php')) Cách này có thể vượt qua các biến. Tôi đã tìm thấy liên kết này ở đây . Nó cực kỳ hữu ích!
Pablo SG Pacheco

1
Làm như vậy sẽ cần thiết phải thay đổi điều này nếu có. Như thế nàyif ( false === include(locate_template( 'loop-mycustomposttype.php')) )
Pablo SG Pacheco

1
Oh, điểm tốt. Với công thức tôi đã đưa ra, requirehoặc require_oncecuộc gọi (từ locate_template) nằm trong một hàm và do đó không có quyền truy cập vào phạm vi hiện tại.
Goldenapples

5

Không phải tất cả các vòng lặp, vòng lặp chính. ;-) Không có vấn đề gì nếu bạn nhìn vào trang đầu của bạn hoặc một danh mục hoặc whoknowswhat, bạn sẽ luôn có một vòng lặp chính. Nội dung của vòng lặp chính đó được xác định bởi truy vấn đã được chạy trước khi mẫu của bạn được gọi.

Mẫu loop.php chỉ chạy trên các mục trong vòng lặp và định dạng chúng. Xem tài liệu tại Codex .

Nếu bạn nhìn vào loop.php của Twenty-Ten, bạn có thể thấy Twenty-Ten sau đó đa dạng hóa trong tệp mẫu đơn đó.

get_template_part()chỉ tải một phần mẫu và chạy qua nó. Bạn cũng có thể trích xuất các phần của loop.php thành các tệp riêng biệt và thay thế chúng bằng get_template_part('loop', 'category')các cuộc gọi.

Hoặc bạn có thể có một phần mẫu cho mỗi bài đăng riêng lẻ trong vòng lặp và có vòng lặp.php của bạn chỉ gọi get_template_part('loop','post');trong while...mệnh đề. Tùy bạn quyết định.


3

Từ codex get_template_part :

<?php get_template_part( 'loop', 'index' ); ?>

sẽ thực hiện một PHP yêu cầu () cho tệp đầu tiên tồn tại ...

Vì vậy, hiệu quả của nó sẽ hoạt động như thể bạn đang yêu cầu một tệp php khác.

Cập nhật : Có một chút khác biệt so với 'yêu cầu' - Nó được gói bên trong một hàm vì vậy bạn phải globalnếu bạn muốn chuyển bất kỳ biến nào từ mẫu của bạn sang phần mẫu của bạn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.