Шапка, подвал и части шаблонов
Шапка и подвал одинаковы на всех страницах, а карточка записи повторяется в ленте, поиске и рубриках. Чтобы не копировать разметку из файла в файл, её выносят в отдельные части шаблона.
Шапка
<?php
// header.php
?>
<!DOCTYPE html>
<html <?php language_attributes(); ?>>
<head>
<meta charset="<?php bloginfo('charset'); ?>">
<meta name="viewport" content="width=device-width, initial-scale=1">
<?php wp_head(); ?>
</head>
<body <?php body_class(); ?>>
<?php wp_body_open(); ?>
<header class="site-header">
<a href="<?php echo esc_url(home_url('/')); ?>"><?php bloginfo('name'); ?></a>
</header>
<main>Подвал
<?php
// footer.php
?>
</main>
<footer class="site-footer">
<p>© <?php echo esc_html(date('Y')); ?> <?php bloginfo('name'); ?></p>
</footer>
<?php wp_footer(); ?>
</body>
</html>Подключение
<?php
// page.php
get_header();
while (have_posts()) :
the_post();
the_content();
endwhile;
get_footer();get_header() подключает header.php, get_footer() — footer.php. Для особой шапки вызывают get_header('shop') — подключится header-shop.php.
Часть шаблона
Карточку записи кладут в папку template-parts:
<?php
// template-parts/card.php
?>
<article class="card">
<h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>
<?php the_excerpt(); ?>
</article><?php
// index.php
get_header();
while (have_posts()) :
the_post();
get_template_part('template-parts/card');
endwhile;
get_footer();Аргументы
Третий параметр передаёт в часть шаблона данные — они доступны в массиве $args:
<?php
// index.php
get_template_part('template-parts/card', null, ['show_date' => true]);<?php
// template-parts/card.php
if (!empty($args['show_date'])) {
echo '<time>' . esc_html(get_the_date()) . '</time>';
}Меню
Тема объявляет места для меню, а пункты редактор расставляет в панели:
// functions.php
add_action('after_setup_theme', function () {
register_nav_menus([
'primary' => 'Главное меню',
'footer' => 'Меню в подвале',
]);
});<?php
// header.php
wp_nav_menu([
'theme_location' => 'primary',
'container' => 'nav',
'menu_class' => 'menu',
'fallback_cb' => false,
]);Области виджетов
Боковая колонка — место, куда в панели добавляют блоки: поиск, список рубрик, свежие записи.
// functions.php
add_action('widgets_init', function () {
register_sidebar([
'name' => 'Боковая колонка',
'id' => 'sidebar',
'before_widget' => '<section class="widget">',
'after_widget' => '</section>',
]);
});<?php
// sidebar.php
if (is_active_sidebar('sidebar')) {
dynamic_sidebar('sidebar');
}Частая ошибка
Части шаблона подключают функцией get_template_part(), а не include или require. Только она ищет файл сначала в дочерней теме, а потом в родительской — без этого дочерняя тема не сможет заменить ни один фрагмент. По той же причине путь пишут без .php и без полного адреса папки.