WordPress как на ладони
WordPress темы и плагины за 250 рублей wordpress jino

locate_template() WP 2.7

Находит наиболее подходящий серверный путь к указанному файлу шаблона. При поиске учитывается дочерняя тема. В параметрах можно указать, чтобы файл сразу подключался в PHP.

В функцию можно передать массив названий файлов. Тогда она будет проверять по очереди наличие файлов и при первом найденном файле, сразу вернет путь до него (следующие обрабатываться не будут). Если указать второй параметр, этот файл будет подключен в PHP. Рассмотрим пример:

$files = array(
	'foot.php', // не существует
	'header.php', // существует, будет возвращен
	'baz.php', // проверяться не будет
);
$file_path = locate_template( $files );

echo $file_path;
// выведет: /home/wp-kama.ru/wp-content/themes/wp-kama/header.php

Данный код выполнит поиск файлов в следующем порядке. При первом обнаружении любого файла, поиск остановиться:

  1. foot.php в дочерней теме
  2. foot.php в родительской теме
  3. header.php в дочерней теме
  4. header.php в родительской теме
  5. baz.php в дочерней теме
  6. baz.php в родительской теме

Если во втором параметре вместо false указать true. То файл будет подключен PHP функций require_once().

Использует WordPress константы (пути): STYLESHEETPATH затем TEMPLATEPATH. Это значит что дочерняя тема имеет приоритет над родительской и может переписывать её файлы.

При подключении файлов, когда второй параметр равен true, используется функция load_template().

Работает на основе: load_template()
✈ 1 раз = 0.000039с = очень быстро | 50000 раз = 0.16с = очень быстро PHP 7.1.2, WP 4.7.3

Хуков нет.

Возвращает

Строку. Название файла, если он был найден. Пустую строку, если не удалось найти файл.

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

locate_template( $template_names, $load, $require_once );
$template_names(строка/массив) (обязательный)

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

Для файлов нужно указывать расширение (пр: header.php).

Вместо массива можно указать название файла в виде строки.

$load(логический)
true означает, что файл должен быть подключен. В противном случае функция ничего не подключит, а просто вернет путь до указанного файла.
По умолчанию: false
$require_once(логический)
Если указать true, то файл шаблона будет загружен с помощью PHP функции require_once. При false будет использована функция require. Нет смысла указывать этот параметр, если $load установлен в false.
По умолчанию: true

Примеры

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

Создадим возможность выводить контент страницы как-то по особенному в случае необходимости. Для этого нужно будет в теме создать файл content-СЛАГ_СТРАНИЦЫ.php и его код будет использован вместо функции the_content():

$pageName = $post->post_name;
$locate_template = locate_template("content-$pageName.php");
if( $locate_template ) {
	// ОК, подключаем файл шаблона
	require $locate_template;

	// или так:
	//get_template_part('content', $pageName );
}
else {
	// Файл не найден, загружаем контент стандартно
	the_content();
}

#2 Получение пути файла

echo locate_template('header.php');

//> /home/site.ru/public_html/wp-content/themes/pink/header.php

#3 Можно указывать подпапки

В эту функцию можно указать не только название файла, но и относительный путь от корня темы:

locate_template('inc/filename.php', true);

Подключит файл filename.php, который находится в папке inc в каталоге дочерней темы или просто темы, если нет дочерней.

Код locate template: wp-includes/template.php VER 4.9.6

<?php
function locate_template($template_names, $load = false, $require_once = true ) {
	$located = '';
	foreach ( (array) $template_names as $template_name ) {
		if ( !$template_name )
			continue;
		if ( file_exists(STYLESHEETPATH . '/' . $template_name)) {
			$located = STYLESHEETPATH . '/' . $template_name;
			break;
		} elseif ( file_exists(TEMPLATEPATH . '/' . $template_name) ) {
			$located = TEMPLATEPATH . '/' . $template_name;
			break;
		} elseif ( file_exists( ABSPATH . WPINC . '/theme-compat/' . $template_name ) ) {
			$located = ABSPATH . WPINC . '/theme-compat/' . $template_name;
			break;
		}
	}

	if ( $load && '' != $located )
		load_template( $located, $require_once );

	return $located;
}

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

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

4 коммента
  • campusboy2787 cайт: www.youtube.com/c/wpplus

    Получается, используя load_template(), сайт начинает медленнее работать. Основываюсь на слухах о том, что require_once() работает довольно медленно.

    Ответить1.4 год назад #
    • Kama5346

      Вот факты, сейчас проверил на PHP 7

      // 1 раз
      require 'foo.php'; // 0.00002 сек.
      require_once 'foo.php'; // 0.00002 сек.
      
      // 50 000 раз
      require 'foo.php'; // 0.154 сек.
      require_once 'foo.php'; // 0.007 сек.

      Нет разницы получается и require_once даже быстрее если несколько раз подключать один файл...

      Ответить1.4 год назад #
      • campusboy2787 cайт: www.youtube.com/c/wpplus

        Спасибо за тесты! Те, кто говорит так, основываются на том, что require_once в отличие от просто require, делает дополнительные действия по анализу, был ли подключен файл или нет. Но как видим, разницы нет в масштабах теста.

        Ответить1.4 год назад #

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