Có gì khác biệt nếu tôi sử dụng index.php làm khung dây HTML so với viết từng tệp mẫu chính dưới dạng tài liệu HTML đầy đủ?


7

Giả sử một trang web nơi các yếu tố đầu trang và chân trang không đổi trong mọi chế độ xem: Do hệ thống phân cấp mẫu của WP, tôi có thể mã hóa bố cục trang web chung trong tệp index.php. Sau đó, tôi có thể sử dụng các thẻ có điều kiện trong index.php để xác định các mẫu nội dung bên trong sẽ hiển thị.

Mặt khác, tôi có thể viết bố cục cơ bản trong từng mẫu chính nhiều lần. Vì vậy, tôi sẽ viết thêm một số dòng mã và giới thiệu dư thừa hơn một chút. Tuy nhiên, có thể tôi lưu một số thao tác I / O của tệp, nếu, giả sử, tệp.php có thể được hiển thị hoàn toàn mà không cần phải quay lại index.php?

Tùy chọn 1 không có single.php, category.php, archive.php, v.v. nhưng với content-post.php, content-category.php ...

<?php
/**
 * The index.php file
 *
 */
get_header();
get_template_part('partials/layout-block-01');
get_template_part('partials/layout-block-02');
if (have_posts()) : 
  if (is_front_page()){
    ... // some front page specific markup and settings
  }
  elseif(is_category()){
    ... // some category specific markup and settings
  }
  elseif (is_singular()) {
    ... // some singular post specific markup and settings
  }
  elseif (is_archive()) {
    ... // some general archive specific markup and settings
  }
  else{
    ... // defaults
  }
  while (have_posts()) : 
    the_post();
    get_template_part( 'content', get_post_format());
  endwhile;
endif;
get_footer();
?>

Tùy chọn 2 : Mỗi tệp mẫu chính chứa toàn bộ lô, như vậy

<?php
/**
 * The single.php file
 *
 */
get_header();
get_template_part('partials/layout-block-01');
get_template_part('partials/layout-block-02');
if (have_posts()) : 
  while (have_posts()) : 
    the_post();
    ... // single post markup
  endwhile;
endif;
get_footer();
?>

Và một tệp mẫu chính khác

<?php
/**
 * The category.php file
 *
 */
get_header();
get_template_part('partials/layout-block-01');
get_template_part('partials/layout-block-02');
if (have_posts()) : 
  while (have_posts()) : 
    the_post();
    ... // category archive markup
  endwhile;
endif;
get_footer();
?>

Vì vậy, có bất kỳ vấn đề hiệu suất liên quan đến một trong hai tùy chọn? Có phải chỉ là một vấn đề của hương vị cá nhân?

Câu trả lời:


5

Tùy chọn 2 là lựa chọn tốt nhất. Để biết lý do tại sao, người ta cần nhìn vào trình tải mẫu .

( Hệ thống phân cấp mẫu có nghĩa là không có gì, nếu bạn không biết nó thực sự hoạt động như thế nào hoặc đến từ đâu )

    if ( defined('WP_USE_THEMES') && WP_USE_THEMES ) :
59          $template = false;
60          if     ( is_404()            && $template = get_404_template()            ) :
61          elseif ( is_search()         && $template = get_search_template()         ) :
62          elseif ( is_front_page()     && $template = get_front_page_template()     ) :
63          elseif ( is_home()           && $template = get_home_template()           ) :
64          elseif ( is_post_type_archive() && $template = get_post_type_archive_template() ) :
65          elseif ( is_tax()            && $template = get_taxonomy_template()       ) :
66          elseif ( is_attachment()     && $template = get_attachment_template()     ) :
67                  remove_filter('the_content', 'prepend_attachment');
68          elseif ( is_single()         && $template = get_single_template()         ) :
69          elseif ( is_page()           && $template = get_page_template()           ) :
70          elseif ( is_singular()       && $template = get_singular_template()       ) :
71          elseif ( is_category()       && $template = get_category_template()       ) :
72          elseif ( is_tag()            && $template = get_tag_template()            ) :
73          elseif ( is_author()         && $template = get_author_template()         ) :
74          elseif ( is_date()           && $template = get_date_template()           ) :
75          elseif ( is_archive()        && $template = get_archive_template()        ) :
76          elseif ( is_comments_popup() && $template = get_comments_popup_template() ) :
77          elseif ( is_paged()          && $template = get_paged_template()          ) :
78          else :
79                  $template = get_index_template();
80          endif;

Trình tải mẫu này chạy trên mỗi và mọi trang tải ở mặt trước bất kể. Như bạn có thể thấy, WordPress đi qua một danh sách và xác thực các điều kiện đối với trang được yêu cầu. Cho phép sử dụng trang danh mục làm ví dụ với danh mục là danh mục Chưa được phân loại.

Một câu lệnh if / other thực thi điều kiện đầu tiên trả về true và trên các trang danh mục, nó sẽ là is_category()câu lệnh có điều kiện. Tuyên bố này thực thi get_category_template()và cũng định giá tuyên bố. Nếu câu lệnh này cũng đúng ( trang danh mục hợp lệ có sẵn ), mẫu được tải tương ứng với những gì được tìm thấy, nếu câu lệnh này trả về sai, trình tải mẫu sẽ tiếp tục tìm câu lệnh đúng tiếp theo mà tôi sẽ giải quyết sau .

Những gì xảy ra bên trong get_category_template()là quan trọng. Hàm tạo ba tên mẫu theo trang danh mục được yêu cầu. Ví dụ, sau đây được tạo theo thứ tự category-uncategorized.php, category-1.phpcategory.php. Tên mẫu này được lưu trữ trong một mảng và được chuyển đến get_query_template(). Đây là chức năng có nhiệm vụ tìm kiếm các tên mẫu được truyền cho nó và trả về mẫu đầu tiên tồn tại và có sẵn. Điều này được thực hiện với locate_template().

Vì vậy, điều này đang nói là, WordPress ( thực sự locate_template()nếu bạn muốn có được kỹ thuật ) bắt đầu bằng cách tìm kiếm category-uncategorized.php, nếu nó được tìm thấy, mẫu được trả lại và được tải. Nếu không tìm thấy, WordPress sẽ chuyển sang thử category-1.phpvà nếu thất bại thì cuối cùng nó sẽ thử category.php. Nếu không có gì được tìm thấy, như tôi đã nói, của chúng tôi

elseif ( is_category()       && $template = get_category_template()  

điều kiện trả về sai và các điều kiện tiếp tục xuống được đánh giá. Điều kiện tiếp theo mà nhẫn đúng sẽ là is_archive()( nhớ, is_archive()trả về true trên danh mục, thẻ, phân loại, lưu trữ loại bài đăng tùy chỉnh, tác giả và các trang liên quan đến ngày ). Quá trình tương tự như trên xảy ra nhưng lần này với archive.phpviệc được tìm kiếm và tải nếu nó tồn tại. Nếu archive.phpkhông tồn tại, toàn bộ câu lệnh có điều kiện sẽ định giá theo mặc định mà nó tải index.phpqua get_index_template(). Đây là dự phòng cuối cùng cho mỗi trang

KẾT LUẬN VÀ TRẢ LỜI CUỐI CÙNG

Mặc dù bạn có thể nghĩ rằng việc đó category.phpsẽ dẫn đến một chi phí lớn, nhưng điều đó không xảy ra. Vào thời điểm đó index.phpđược nạp trên trang mục của bạn, ( cho phép sử dụng ví dụ của chúng tôi một lần nữa ) cho chưa được phân loại thể loại, WordPress đã nhìn và đã cố gắng tải category-uncategorized.php, category-1.php, category.phparchive.php. Vì vậy, hãy tiếp tục và có các mẫu đẹp để có ( tất cả các mẫu ngoại trừindex.php ) ( đó là TÙY CHỌN 2 của bạn ). Có 10 mẫu đẹp để có mẫu tốt hơn index.phpdòng sông Nile và có nhiều logic được nhồi nhét vào nó hơn những gì Albert Einstein có trong não ( đó là TÙY CHỌN 1 của bạn )

Điều cũng rất quan trọng, quay trở lại với Option1 là bạn giữ các mẫu càng ngắn càng tốt, có thể duy trì và có thể đọc được. Nó thực sự không có ích gì khi có một mẫu, có thể nhanh hơn 0,0000001 giây, nhưng là một mớ hỗn độn và một cơn ác mộng thực sự cần phải duy trì.

Cuối cùng, tùy chọn 2 có nhiều pro hơn so với tùy chọn 1.


Nếu tôi phải tạo một index.phpchủ đề thuần túy , thì sẽ rất hấp dẫn khi gọi nó nilestein;-)
birgire

@birgire Hahaha, đó sẽ là tên chính xác cho một chủ đề như vậy
Pieter Goosen 16/1/2016

Một lần nữa, Pieter, bạn đã cứu tôi khỏi bị tóc bạc vì vấn đề này. Tôi thực sự đánh giá cao sự giúp đỡ và chuyên môn của bạn. Điều này áp dụng cho tất cả các bạn khác, quá! Cảm ơn bạn.
Bunjip

Niềm vui của tôi, vui mừng bạn tìm thấy điều này hữu ích. Tận hưởng ;-)
Pieter Goosen

3

Lưu tập tin I / O hoạt động .
Bạn có thể tiết kiệm càng nhiều càng tốt ở mức đó nếu bạn muốn nhưng cuối cùng tất cả sẽ đến với cấu hình mã hóa / máy chủ của bạn, v.v.
Các tệp tĩnh / động cũng có thể / would / nên được lưu trong bộ nhớ cache (có thể ở cấp độ máy chủ hoặc theo mã plugin / mã riêng) và điều đó cũng sẽ giúp bạn bớt lo lắng hơn nếu đó là về những thứ nhỏ như các tệp 'đầy mã' hoặc số lượng mẫu.

Giảm mẫu
Giới thiệu về cách tiếp cận của bạn để giảm việc sử dụng các mẫu, không phải lúc nào cũng "ít hơn là nhiều hơn".
Ở đây một ví dụ khác (cũng được đề cập bởi ialocin):
Sử dụng một vòng lặp tiêu chuẩn ( front-page.php/index.php/page.php/single.phptất nhiên và các mẫu khác)

<?php
if ( have_posts() ) : 

    // Start the Loop.
    while ( have_posts() ) : the_post();

    // Include format-specific template for the content.
    get_template_part( 'content', get_post_format() );

    // End the loop.
    endwhile;
else :
    // If no content, include the "No posts found" template part.
    get_template_part( 'content', 'none' );

endif;
?>

Và sử dụng ví dụ này cho content.php(cần có trong thư mục chủ đề)

 <?php
 if ( is_front_page() ) { get_template_part( 'include/content', 'front' ); }
 if ( is_single() ) { get_template_part( 'include/content', 'single' ); }
 if ( is_page() ) { get_template_part( 'include/content', 'page' ); }
// and so on
?>

Và (trong thư mục bao gồm) bạn có thể sử dụng các tệp như content-front.php / content-single.phpthế.

Các tệp này template_parts(sẽ được bao gồm trong loop, như được đề cập trong các tệp có tên ở trên) chứa mã bạn muốn có cho các tệp mẫu đó.

Để tham khảo:

Cấu
trúc phân cấp mẫu vòng lặp
Lấy phần mẫu
Sắp xếp tệp chủ đề
Mẫu trang


Cách tiếp cận này có vẻ "ít nhạy cảm" hơn đối với một trang web khi chỉ mắc một lỗi nhỏ. Bởi vì ppl sẽ hoạt động chủ yếu trong các phần mẫu (trong thư mục con đó). Tất cả phụ thuộc vào loại sai lầm nhưng tôi nghĩ bạn biết ý nghĩa của nó.

Imho là cách này cũng nhanh hơn / dễ dàng hơn để kích hoạt lỗi và dễ tham khảo hơn một chút.


2

Ngắn và không đau, tôi khuyên bạn nên đi với Tùy chọn 2.

Tại sao? Bởi vì đó là những gì hệ thống phân cấp mẫu WordPress dành cho. Tôi không thể thấy một lý do từ câu hỏi của bạn khác với khái niệm phân cấp mẫu.

Cuối cùng nhưng không kém phần quan trọng, trong một số dự án, có thể đáng để xem xét để thậm chí có được phần vòng lặp tệp mẫu get_template_part().

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.