Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Шапка, подвал и части шаблонов

Шапка и подвал одинаковы на всех страницах, а карточка записи повторяется в ленте, поиске и рубриках. Чтобы не копировать разметку из файла в файл, её выносят в отдельные части шаблона.

Шапка

<?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>&copy; <?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 и без полного адреса папки.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.