» » » Функция get_template_part(). Структура современных шаблонов WordPress
logotip

Функция get_template_part(). Структура современных шаблонов WordPress

Всем привет! Сегодня на 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, то современные темы пестрят разными, не знакомыми названиями.

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

struktura shablonov

Для чего это нужно? Делается это для сокращения повторений кода в основных файлах, что конечно облегчает верстку шаблонов, но зачастую вводит в тупик начинающих веб-мастеров.

В львиной доле статей, на тему расширения функционала сайтов на 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(), то без труда сможем выявить любые прикрепленные файлы, даже если шаблон разделен на множество секций.

До встречи!

С уважением, Виталий Кириллов

(предыдущая статья)

Комментарии: 9

  1. Роман llgr:

    Здравствуйте Виталий!
    У меня при использовании функции 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, а какую кодировку Вы ему дали?

      Ответить
      • Роман llgr:

        Большое спасибо! Смена кодировки файла на UTF решила проблему. Что-то я об этом на ночь глядя не подумал.

        Ответить
  2. Алексей:

    В теме шаблона используется include 'single-1.php'; стоит ли заменить на get_template_part( 'single-1'); ?

    Ответить
    • Виталий Кириллов:

      Я так понял, что и так все работает. Я бы попробовал даже ради эксперимента, так как люблю это дело.

      Ответить
      • Алексей:

        Установил плагин Theme Check — проверяет темку на наличие ошибок в коде вот он и просит заменить include. Уже опробовал работает так и так наверно все таки include оставлю хоть по коду короче

        Ответить
        • Виталий Кириллов:

          include — это чистый php, а get_template_part() — функция WordPress, так для общей информации.

          Ответить
  3. Елена:

    Здравствуйте снова, Виталий.
    А у меня в index.php вот так прописана строчка:
    <?php get_template_part( 'content', 'archives' )ни loop, ни index нет.
    А в файле single.php вообще нет <?php get_template_part
    Надо ли их прописать?

    Ответить
    • Виталий Кириллов:

      Нет, прописывать ничего не надо.
      Параметры loop и index вовсе не обязательные. Параметры функции зависят от названий файлов.

      Ответить

Оставить комментарий

Внимание комментатор! Прежде чем вставить: HTML, JavaScript или PHP код в свой комментарий, преобразуй его в html сущность!

Subscribe without commenting

» Подписаться на комментарии по RSS