Всем привет! Сегодня на seo-mayak.com я познакомлю Вас с функцией get_template_part().
С выходом WordPress версии 3.0, структура шаблонов претерпела существенные изменения.
Если до этого шаблоны в основном состояли из стандартного набора файлов, таких как index.php, header.php, single.php, footer.php, archive.php, functions.php, sidebar.php, category.php, page.php, comments.php и style.css, то современные темы пестрят разными, не знакомыми названиями.
Что же изменилось? Просто у разработчиков появилась возможность подключать к основным файлам шаблона, дополнительные файлы, тем самым разбивая функционал, как бы, на отдельные секции.
Для чего это нужно? Делается это для сокращения повторений кода в основных файлах, что конечно облегчает верстку шаблонов, но зачастую вводит в тупик начинающих веб-мастеров.
В львиной доле статей, на тему расширения функционала сайтов на WordPress, описаны приемы, которые не вписываются в современную структуру шаблонов и образовался некий информационный вакуум, который я и собираюсь заполнить.
Надеюсь новичкам, после прочтении данной статьи, будет намного проще ориентироваться в шаблоне и изменять или дополнять его функционал. Поехали!
Функция get_template_part()
В качестве примера, возьмем тему twentyten, которая входит в стандартную сборку WordPress и доступна всем. Давайте посмотрим как устроен файл index.php. Если убрать все комментарии к коду, то содержимое файла будет следующим:
<?php get_header(); ?> <div id="container"> <div id="content" role="main"> <?php get_template_part( 'loop', 'index' );?> </div> </div> <?php get_sidebar(); ?> <?php get_footer(); ?>
Как не странно, в файле находится всего несколько строк кода. Вопрос, куда подевался цикл WordPress, постраничная навигация и т.д?
Вместо всего этого в коде прописана всего одна строчка:
<?php get_template_part( 'loop', 'index' );?>
А теперь откроем файл single.php и посмотрим что прописано там, естественно убрав комментарии к коду:
<?php get_header(); ?> <div id="container"> <div id="content" role="main"> <?php get_template_part( 'loop', 'single' );?> </div> </div> <?php get_sidebar(); ?> <?php get_footer(); ?>
Как видно код практически не изменился, за исключением одного слова в уже знакомой нам строчке:
<?php get_template_part( 'loop', 'single' );?>
Почему так устроены файлы и какую роль в них играет функция get_template_part()?
Название get_template_part можно перевести так: — «Присоединить часть шаблона». Т.е, существует файл, который является частью шаблона и функция get_template_part() его присоединяет.
Но как определить, какой файл присоединяется? Для этого надо разобраться с параметрами функции.
Параметры функции get_template_part()
Функция get_template_part() может принимать один или два параметра. На первом примере, приведенным мной выше, функция приняла два параметра:
( 'loop', 'index' )
Это ничто иное, как название файлов, расположенных в той же директории. Смотрим, действительно в шаблоне темы twentyten есть файл loop.php, в котором и находятся «потерянный» цикл WordPress. Также в шаблоне есть файл index.php.
Теперь давайте проведем несколько экспериментов (для экспериментов советую использовать Денвер).
Эксперимент №1. Уберем второй параметр из функции, т.е. функция примет такой вид:
<?php get_template_part( 'loop' );?>
Что произойдет? Удивительно, но главная страница загрузилась без ошибок и шаблон работает исправно.
Эксперимент №2. Уберем первый параметр, но оставим второй:
<?php get_template_part( 'index' );?>
Обновляем страницу. Опа! Фатальная ошибка, но шаблон при этом все равно загружается, правда уже без контента.
Эксперимент №3. А теперь попробуем поменять параметры местами:
<?php get_template_part( 'index', 'loop' );?>
Опять фатальная ошибка, все точно также, как при эксперименте №2. Почему так происходит?
Дело в том что первый параметр имеет приоритет, т.е. в данном случаи функция get_template_part() в первую очередь ищет файл loop.php, а если такой не будет обнаружен, то в качестве запасного варианта будет задействован файл index.php, для того, чтобы загрузился хотя бы шаблон.
Теперь посмотрим на файл single.php. Здесь функция get_template_part(), имеет следующие параметры:
( 'loop', 'single' )
Судя по проведенным ранее экспериментам, приоритетом присоединения должен обладать файл loop.php, так как он прописан в качестве первого параметра, но не тут то было.
В шаблоне есть еще один файл, который называется loop-single.php и именно он будет иметь более высокий приоритет, так как сочетает в своем названии оба параметра, прописанные через дефис. Такие дела! Но и это еще не все.
Если допустить, что у темы twentyten есть дочерняя тема, например twentyten two и в корне этой темы также существует файл loop-single.php, то функция get_template_part() присвоит вышеупомянутому файл, расположенному в дочерней теме, наивысший приоритет.
Если Вы не знаете, что такое дочерняя тема, для чего она нужна и как ее можно создать, то очень советую подписаться на обновления блога.
Теперь, когда мы знаем, как работает функция get_template_part(), то без труда сможем выявить любые прикрепленные файлы, даже если шаблон разделен на множество секций.
До встречи!
С уважением, Виталий Кириллов
Здравствуйте Виталий!
У меня при использовании функции get_template_part() возникла проблема с кодировкой.
Использую на сайте Office Responsive Business Theme.
В этой теме через функцию get_template_part() реализована вставка подписи автора поста author-bio:
<?php get_template_part('author-bio'); ?>
Я по аналогии создал sh-butt:
<?php get_template_part('author-bio'); ?>
Вывоз этих функций вставлен в шаблон по очереди, сначала sh-butt, затем author-bio.
Внутри author-bio.php:
<div class="author-info row">
<h4><?php printf( __( 'About %s', 'wpex' ), get_the_author() ); ?></h4>
<div class="author-info-inner boxed clr">
<div class="author-avatar">
<span class="author-link">
<?php echo get_avatar( get_the_author_meta( 'user_email' ), apply_filters( 'wpex_author_bio_avatar_size', 74 ) ); ?>
</span>
</div><!— .author-avatar —>
<div class="author-description">
<p><?php the_author_meta( 'description' ); ?></p>
</div><!— .author-description —>
</div><!— .author-info-inner —>
</div><!— .author-info —>
Внутри моего sh-butt.php:
<div class="sh-butt-begin"><i class="icon-llgr-smile share"></i>жмите на кнопки</div>
<div class="social-likes">
<div class="facebook" title="Поделиться ссылкой на Фейсбуке">Facebook</div>
<div class="twitter" data-via="likageorgieva" title="Поделиться ссылкой в Твиттере">Twitter</div>
<div class="mailru" title="Поделиться ссылкой в Моём мире">Mir</div>
<div class="vkontakte" title="Поделиться ссылкой во Вконтакте">VK</div>
<div class="odnoklassniki" title="Поделиться ссылкой в Одноклассниках">OK</div>
<div class="plusone" title="Поделиться ссылкой в Гугл-плюсе">Google+</div>
</div>
<script src="//dogshow.me/wp-content/themes/wpex-office/js/social-likes.min.js"></script>
В результате русские буквы из sh-butt.php меняют кодировку и отображаются вопросами, а в author-bio.php такой проблемы нет.
В чём может быть проблема?
Благодарю за ответ.
Здравствуйте Роман! Вот Вы создали новый файл sh-butt.php, а какую кодировку Вы ему дали?
Большое спасибо! Смена кодировки файла на UTF решила проблему. Что-то я об этом на ночь глядя не подумал.
В теме шаблона используется include 'single-1.php'; стоит ли заменить на get_template_part( 'single-1'); ?
Я так понял, что и так все работает. Я бы попробовал даже ради эксперимента, так как люблю это дело.
Установил плагин Theme Check — проверяет темку на наличие ошибок в коде вот он и просит заменить include. Уже опробовал работает так и так наверно все таки include оставлю хоть по коду короче
include — это чистый php, а get_template_part() — функция WordPress, так для общей информации.
Здравствуйте снова, Виталий.
А у меня в index.php вот так прописана строчка:
<?php get_template_part( 'content', 'archives' )ни loop, ни index нет.
А в файле single.php вообще нет <?php get_template_part
Надо ли их прописать?
Нет, прописывать ничего не надо.
Параметры loop и index вовсе не обязательные. Параметры функции зависят от названий файлов.