get_template_part() — подключает файлы темы

Возможно вы уже знаете, что файл header.php (и все его производные — header-1.php, header-home.php, header-main.php и так далее) подключает функция get_header(), файл footer.phpget_footer(), а функция get_sidebar() подключит sidebar.php.

А как подключить скажем nav.php или content.php? А что, если файл находится в подпапке темы?

Итак, get_template_part(). По сути это аналог include() или require() (функции PHP), но с некоторыми особенностями.

  • Во-первых, она уже знает, где расположена ваша тема и будет искать запрошенный файл непосредственно в директории текущей темы.
  • Во-вторых, если запрашиваемого файла не существует, она не выдаст предупреждение или ошибку, кроме того, она попробует подключить другой подходящий файл.
  • Поддерживает дочерние темы WordPress.
get_template_part( $slug, $name = null )
$slug
(строка) название файла, который будем подключать, его первая часть, также может содержать названия директорий через слэш.
$name
(строка) вторая часть названия (для того, чтобы понять, как работать с параметрами функции, смотрите примеры).

Примеры

get_template_part( 'mymenu' ); // mymenu.php в директории темы
get_template_part( 'mymenu', 'header' ); // mymenu-header.php в папке темы
get_template_part( 'mymenu', 'footer' ); // mymenu-footer.php в папке темы
get_template_part( 'parts/entry' ); // entry.php в директории 'parts', которая, в свою очередь, находится в папке с темой
get_template_part( 'parts/entry', 'video' ); // entry-video.php в директории 'parts'

Мы также можем подключать файлы динамически, например в зависимости от возвращаемых значений функций get_post_type() и get_post_format().

get_template_part( 'includes/entry', get_post_type() );
get_template_part( 'includes/entry', get_post_format() );

Порядок подключения файлов

get_template_part( 'nav', 'footer' );

Приоритет подключения файлов в данном случае:

  1. nav-footer.php в дочерней теме,
  2. nav-footer.php в родительской теме,
  3. nav.php в дочерней теме,
  4. nav.php в родительской теме.

Хук get_template_part_{$slug}

Хук запускается в самом начале функции и позволяет выполнить какой-либо код в зависимости от значений переменных $slug и $name.

do_action( "get_template_part_{$slug}", $slug, $name );

Комментарии 3

  • Евгений27 августа 2015 в 22:08 #

    Здравствуйте!
    Использую адаптивный шаблон "Awaken".
    Установил плагин "Ultimate WP Query Search Filter", но возникли проблемы с отображением результатов ajax-поиска... автор плагина дал мне код для function.php -

    add_filter('uwpqsf_result_tempt', 'customize_output', '', 4);
    function customize_output($results , $arg, $id, $getdata ){
    	 // The Query
                $apiclass = new uwpqsfprocess();
                 $query = new WP_Query( $arg );
    		ob_start();	$result = '';
    			// The Loop
     
    			if ( $query->have_posts() ) {
    			while ( $query->have_posts() ) {
    				$query->the_post();global $post; 
     
    				get_template_part( 'content', get_post_format() );
    			}
                            echo  $apiclass->ajax_pagination($arg['paged'],$query->max_num_pages, 4, $id, $getdata);
    		 } else {
    					 get_template_part( 'content', 'none' );
    				}
    				/* Restore original Post Data */
    				wp_reset_postdata();
     
    		$results = ob_get_clean();
    			return $results;
    }

    Думаю проблема с - get_template_part( 'content', get_post_format() );
    Почему-то не корректно отображается вывод статей... стили применяются к каждой статье, а не ко всем, как в стандартном поиске.

    В чем может быть загвоздка?
    Заранее спасибо!

  • Евгений27 августа 2015 в 22:08 #

    В index.php есть код, который отвечает за "правильный" вывод статей -

    <?php /* Start the Loop */ 
    				$counter = 0;
    			?>
    			<div class="row">
    			<?php while ( have_posts() ) : the_post(); ?>
     
    				<?php
    					/* Include the Post-Format-specific template for the content.
    					 * If you want to override this in a child theme, then include a file
    					 * called content-___.php (where ___ is the Post Format name) and that will be used instead.
    					 */
    					get_template_part( 'content', get_post_format() );
    				?>
     
    			<?php 
    				$counter++;
    				if ($counter % 2 == 0) {
    					echo '</div><div class="row">';
    			 	} 
    			?>
    			<?php endwhile; ?>
     
    			<div class="col-xs-12 col-sm-12 col-md-12">
    				<?php awaken_paging_nav(); ?>
    			</div>
    		</div><!-- .row -->

    Вот он почему-то и не срабатывает в ajax-выводе....

    • Миша31 августа 2015 в 14:08 #

      Здравствуйте!
      Сорри за задержку, был в отъезде.

      В первую очередь на вашем месте я бы проанализировал HTML статей с которыми всё ок и HTML статей, с которыми проблемы. Нашел бы, в чем отличие. И уже отталкивался бы от этого.

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

phpjsHTMLCSSSQLПросто код
  Для того, чтобы оставить комментарий, пожалуйста, зарегистрируйтесь или авторизуйтесь на сайте.
Получайте новости блога по email или следите за мной в социальных сетях.
  • Владимир: и на третьей строке не хватает скобки ) закрывающей if :)

  • Миша: Добрый вечер! Рекомендую получить ID пользователя через функцию get_current_user_id().

  • Дмитрий: Миша, подскажите пожалуйста, я использую такой редирект, но он не срабатывает: add_action( 'template_redirect', funct...

  • Миша: Ну как не определена - это аргумент функции. Или я просто вас не до конца понимаю.

  • Артем: Ага, понял. Вот только почему $args? Она же нигде не определена, по логике должна быть переменная $true_field_params или...