Какая разница, если я использую 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();
?>
Итак, есть ли какие-либо проблемы с производительностью в любом из вариантов? Это просто вопрос индивидуального вкуса?
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.
Сохранение операций ввода-вывода файлов.
Вы можете сэкономить как можно больше на этом уровне, если хотите, но в конце концов все будет зависеть от вашей конфигурации кода/сервера и так далее.
Статические/динамические файлы также могут/должны/должны быть кэшированы (возможно, на уровне сервера или с помощью плагина/собственного кода), и это также поможет вам меньше беспокоиться, если речь идет о незначительных вещах, таких как файлы, "заполненные кодом" или количество шаблонов.
Сокращение шаблонов
О вашем подход к сокращению использования шаблонов, это не всегда "меньше значит больше".
Вот еще один пример (также упомянутый иалоцином):
Используйте стандартный цикл (для 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 будет работать в основном в частях шаблона (в этой подпапке). Конечно, все зависит о какой-то ошибке, но я думаю, вы знаете, что имеется в виду.
Имхо, таким образом, также быстрее/проще вызывать ошибки и немного проще справляться.
Короткий и безболезненный, я бы рекомендовал выбрать вариант 2.
Почему? Потому что именно для этого существует иерархия шаблонов WordPress. Я не вижу причин, по которым ваш вопрос отличается от концепции иерархии шаблонов.
И последнее, но не менее важное: в некоторых проектах, возможно, стоит подумать о том, чтобы даже получить часть цикла файлов шаблонов через get_template_part()
.