Какая разница, если я использую index.php как каркас HTML по сравнению с написанием каждого основного файла шаблона в виде полного HTML-документа?


Предполагая веб-сайт, на котором элементы верхнего и нижнего колонтитулов страницы остаются неизменными в каждом представлении: Благодаря системе иерархии шаблонов WP я мог бы жестко запрограммировать общий макет веб-сайта в index.php . Затем я мог бы использовать условные теги в index.php чтобы определить, какие шаблоны внутреннего содержимого следует отображать.

С другой стороны, я мог бы повторно написать базовый макет в каждом из основных шаблонов. Таким образом, я бы написал еще несколько строк кода и представил немного больше избыточность. Однако, возможно, я сохраню некоторые операции ввода-вывода файлов, если, скажем, single.php может быть отрисован полностью без необходимости возвращаться к index.php ?

Вариант 1 без single.php, category.php, archive.php и так далее, но с 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();
?>

Вариант 2: Каждый основной файл шаблона содержит весь набор, например

<?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();
?>

И другой основной файл шаблона

<?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();
?>

Итак, есть ли какие-либо проблемы с производительностью в любом из вариантов? Это просто вопрос индивидуального вкуса?

Author: Bunjip, 2016-01-15

3 answers

Вариант 2 - лучший вариант. Чтобы узнать, почему, нужно взглянуть на загрузчик шаблонов .

( Иерархия шаблонов ничего не значит, если вы не знаете, как это на самом деле работает или происходит из)

    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;

Этот загрузчик шаблонов запускается при каждой загрузке страницы на переднем конце независимо от того. Как вы можете видеть, WordPress просматривает список и проверяет условия на соответствие запрашиваемой странице. Позволяет использовать страницу категории в качестве примера с категория, являющаяся Некатегоризированной категорией.

Оператор if/else выполняет первое условие, которое возвращает значение true, и на страницах категорий это будет условный оператор is_category(). Этот оператор выполняет get_category_template() а также оценивает заявление. Если это утверждение также звучит верно ( доступна допустимая страница категории ), шаблон загружается в соответствии с тем, что было найдено, если это утверждение возвращает значение false, загрузчик шаблонов продолжает поиск следующего истинное утверждение, о котором я расскажу немного позже.

Важно то, что происходит внутри get_category_template(). Функция создает три имени шаблона в соответствии с запрашиваемой страницей категории. В качестве примера, следующее создается для того, чтобы, category-uncategorized.php, category-1.php и category.php. Имена этих шаблонов хранятся в массиве и передаются в get_query_template(). Это функция, перед которой стоит задача поиска переданных ей имен шаблонов и возврата первого существующего и доступного шаблона. Это покончено с locate_template().

Итак, это означает, что WordPress ( на самом деле locate_template(), если вы хотите получить технические ) начинается с поиска category-uncategorized.php, если он найден, шаблон возвращается и загружается. Если не найдено, WordPress переходит к попыткам category-1.php, и если это не удается, он, наконец, пытается category.php. Если ничего не будет найдено, как я уже сказал, наш

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

Условие возвращает значение false, и далее оцениваются условия. Следующим условием, которое кажется верным, будет is_archive() ( помните, is_archive() возвращает значение true для категорий, тегов, таксономии, пользовательских архивов типов записей, страниц, связанных с автором и датой). Происходит тот же процесс, что и выше, но на этот раз archive.php ищется и загружается, если он существует. Если archive.php не существует, все условные операторы оцениваются по умолчанию, которое загружает index.php через get_index_template(). Это окончательный запасной вариант для каждой страницы

ЗАКЛЮЧЕНИЕ И ОКОНЧАТЕЛЬНЫЙ ОТВЕТ

Даже если вы можете подумать, что наличие category.php приведет к большие накладные расходы, это не так. К тому времени, когда index.php будет загружен на страницу вашей категории ( давайте снова используем наш пример ) для категории без категорий , WordPress уже посмотрел и попытался загрузить category-uncategorized.php, category-1.php, category.php и archive.php. Так что продолжайте и создавайте свои приятные шаблоны ( все шаблоны, кроме index.php)( какой у вас ВАРИАНТ 2). Наличие 10 приятных шаблонов лучше, чем index.php, который длиной с реку Нил и имеет больше логики втиснутый в него больше, чем то, что было у Альберта Эйнштейна в его мозгу (, что является вашим ВАРИАНТОМ 1)

Также очень важно, возвращаясь к Варианту1, чтобы шаблоны были как можно более короткими, удобными для обслуживания и удобочитаемыми. На самом деле нет смысла иметь шаблон, который может быть на 0,0000001 секунды быстрее, но это полный беспорядок и настоящий кошмар для поддержания.

В конце концов, вариант 2 имеет гораздо больше плюсов, чем вариант 1.

 5
Author: Pieter Goosen, 2016-01-16 12:37:18

Сохранение операций ввода-вывода файлов.
Вы можете сэкономить как можно больше на этом уровне, если хотите, но в конце концов все будет зависеть от вашей конфигурации кода/сервера и так далее.
Статические/динамические файлы также могут/должны/должны быть кэшированы (возможно, на уровне сервера или с помощью плагина/собственного кода), и это также поможет вам меньше беспокоиться, если речь идет о незначительных вещах, таких как файлы, "заполненные кодом" или количество шаблонов.

Сокращение шаблонов
О вашем подход к сокращению использования шаблонов, это не всегда "меньше значит больше".
Вот еще один пример (также упомянутый иалоцином):
Используйте стандартный цикл (для front-page.php/index.php/page.php/single.php и других шаблонов, конечно)

<?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;
?>

И используйте этот пример для content.php (который должен быть в папке темы)

 <?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
?>

И (в папке включения) вы можете использовать такие файлы, как content-front.php / content-single.php и так далее.

Эти template_parts (которые будут включены в loop, как указано в вышеупомянутых файлах) содержит код, который вы хотите иметь для этих файлов шаблонов.

Для справки:

Петля
Шаблон-иерархия
Получить часть шаблона
Организация файлов тем
Шаблоны страниц


Этот подход кажется "менее чувствительным" для сайта при совершении всего одной небольшой ошибки. Потому что ppl будет работать в основном в частях шаблона (в этой подпапке). Конечно, все зависит о какой-то ошибке, но я думаю, вы знаете, что имеется в виду.

Имхо, таким образом, также быстрее/проще вызывать ошибки и немного проще справляться.

 3
Author: Charles, 2016-01-15 20:58:03

Короткий и безболезненный, я бы рекомендовал выбрать вариант 2.

Почему? Потому что именно для этого существует иерархия шаблонов WordPress. Я не вижу причин, по которым ваш вопрос отличается от концепции иерархии шаблонов.

И последнее, но не менее важное: в некоторых проектах, возможно, стоит подумать о том, чтобы даже получить часть цикла файлов шаблонов через get_template_part().

 2
Author: Nicolai, 2016-01-15 14:00:49