WordPress как на ладони
wordpress jino

get_template_part() WP 3.0

Ищет и подключает указанные файлы темы. Похожа на PHP функцию include(), только не нужно указывать путь до темы.

Обычно get_template_part() используется для подключения файла (части шаблона) в сам шаблон, например для подключения файла отвечающего за: хлебные крошки, меню навигации, блок ссылок пагинации, цикл вывода постов и так далее. Рассмотрим пример:

get_template_part( 'breadcrumbs' ); 
// подключит файл breadcrumbs.php из каталога текущей темы

get_template_part( 'breadcrumbs', 'footer' ); 
// подключит файл breadcrumbs-footer.php из каталога текущей темы

Если файла указанного для подключения не существует, то функция ничего не подключит и не вызовет никаких PHP ошибок.

Дочерние темы

При использовании дочерних тем get_template_part() сначала попробует подключить файл из дочерней темы, если его нет, будет подключен файл из родительской темы. Использование этой функции при разработке тем, позволяет пользователям этих тем переопределять файлы темы в дочерней теме, а это в свою очередь дает возможность полноценно использовать дочерние темы и не изменять файлы основной темы, чтобы при обновлении изменения не слетели. Для этого пользователю нужно просто создать файл с соответствующим именем в дочерней теме.

Работает на основе: locate_template()
✈ 1 раз = 0.000044с = очень быстро | 50000 раз = 0.16с = очень быстро PHP 7.1.2, WP 4.7.3
Хуки из функции:

Использование

get_template_part( $slug, $name );
$slug(строка) (обязательный)
Название файла, который нужно подключить.
По умолчанию: нет
$name(строка)
Дополнительное название файла. Тоже самое, что параметр $name в функциях get_footer(), get_header() и т.п.
По умолчанию: нет

Примеры

#1 Использование файла loop.php в дочерней теме

Подразумевается что шаблоны лежат в каталоге wp-content/themes и родительская тема называется twentyten, а дочерняя twentytenchild, тогда следующий код будет пытаться подключить файлы в следующем порядке:

  1. wp-content/themes/twentytenchild/loop-index.php
  2. wp-content/themes/twentytenchild/loop.php
  3. wp-content/themes/twentyten/loop-index.php
  4. wp-content/themes/twentyten/loop.php
<?php get_template_part( 'loop', 'index' ); ?>

#2 Подключение навигации в шаблон с использованием файла nav.php

get_template_part( 'nav' );           // Navigation bar (nav.php) ?>
get_template_part( 'nav', '2' );      // Navigation bar #2 (nav-2.php) ?>
get_template_part( 'nav', 'single' ); // Navigation bar to use in single pages (nav-single.php) ?>

#3 Файл из подпапок

Если подгружаемые части находятся в папках то в первый параметр нужно указать относительный путь до файла:

get_template_part( 'inc/nav' );
// получит файл inc/nav.php

А если нужно получить файл inc/nav-single.php, то:

// подключать файл так:
get_template_part( 'inc/nav', 'single' );

// или так:
get_template_part( 'inc/nav-single' );

В первом случае, сначала будет проверяться файл inc/nav.php, потом inc/nav-single.php. Во втором только inc/nav-single.php.

Код get template part: wp-includes/general-template.php WP 4.9

<?php
function get_template_part( $slug, $name = null ) {
	/**
	 * Fires before the specified template part file is loaded.
	 *
	 * The dynamic portion of the hook name, `$slug`, refers to the slug name
	 * for the generic template part.
	 *
	 * @since 3.0.0
	 *
	 * @param string      $slug The slug name for the generic template.
	 * @param string|null $name The name of the specialized template.
	 */
	do_action( "get_template_part_{$slug}", $slug, $name );

	$templates = array();
	$name = (string) $name;
	if ( '' !== $name )
		$templates[] = "{$slug}-{$name}.php";

	$templates[] = "{$slug}.php";

	locate_template($templates, true, false);
}

Cвязанные функции

Из раздела: Подключение файлов

get_template_part 18 комментариев
Полезные 3 Вопросы 2 Все
  • Алексей @

    Здравствуйте! подскажите пожалуйста как сделать вывод постов на главной через файл loop а на всех последующих page 2,3,4.... вывод через loop2? Цель вывести на главной посты в 3 колонки а на всех page и категориях в 1 колонку Подскажите пожалуйста!

    Ответить2.5 года назад #
    • Kama4558
      if( ! is_paged() ){
      	// loop
      }
      else{
      	// loop2
      }
      Ответить2.5 года назад #
      • Алексей @

        Спасибо огромное! А не подскажите как ещё сделать чтобы на главной выводилось два поста а на page 2,3,4 по три поста?

        Ответить2.5 года назад #
  • Виталий cайт: realt.abrikos.us

    Тимур, здравствуйте!
    Сразу хочу выразить свое почтение, Ваш сайт очень помогает мне вот уже который год.
    Ну а теперь вопрос по существу: смотрите, у Вас в примере указано:

    get_template_part('inc/nav');
    // получит файл inc/nav.php

    А если, например, так:

    // получит файл inc/nav-single.php

    То нужно подключать файл таким образом:

    get_template_part('inc/nav', 'single');

    Я правильно понимаю?

    • Виталий cайт: realt.abrikos.us

      Уже сам разобрался. Мое предположение было правильным, если:

      // файл inc/nav-single.php
      

      то:

      get_template_part('inc/nav', 'single');

      Я копнул чуть глубже, и выяснил что если вдруг файл:

      // файл inc/nav-single-new.php

      То:

      get_template_part('inc/nav', 'single-new');
      2
      • campusboy1871 cайт: www.youtube.com/c/wpplus

        Ну или просто:

        get_template_part('inc/nav-single');
        get_template_part('inc/nav-single-new');
        3
  • я не совсем понял, в чём фишка в get_template_part(), если в дочерней теме можно скопировать любой файл с родительской и работать с ним как угодно без подключения...?
    Спасибо!

  • Владимир cайт: repetitor.msk.ru @

    Доброго времени!
    Во время работы над проектом появился вопрос как с помощью get_template_part() передать значение переменной в подключаемый файл. Можете подсказать решение?

    1
  • Palych

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

    Ответить3 месяца назад #
  • Евгений

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

    Ответить3 месяца назад #
    • campusboy1871 cайт: www.youtube.com/c/wpplus

      Привет. Используй буфер PHP:

      ob_start(); 
      get_template_part( 'бла-бла-бла' );
      $html = ob_get_clean(); // сюда попадёт всё, что пыталось вывестись на экран, то есть содержимое шаблона

      С переменной $html уже делаешь, что хочешь.

      1
      Ответить3 месяца назад #
  • Алексей @

    в теме самописного шаблона прописана PHP функция

    include 'index-pc.php';
    

    стоит ли заменять на

    get_template_part('index', 'pc');

    Как вобщем сказывается это на сайте? на загрузке? будут ли лишние запросы в базу данных?

    Ответить3 месяца назад #
    • Kama4558

      Если тема не публичная (не продается или распространяется для общего пользования), то нет смысла использовать эту функцию, потому что она в первую очередь нужна для поддержки дочерних тем. Она немного медленнее, потому что в ней используется фильтр и еще некоторые проверки. Но запросов лишних она не делает и в целом особо не отличается от прямого вызова.

      1
      Ответить3 месяца назад #
  • Лео

    А какой код должен быть если подключать файл находящийся в подпапке папки. Например, lib/inc/rating-box.php?

    Ответитьмесяц назад #

Здравствуйте, !

Ваш комментарий