get_file_data()WP 2.9.0

Получает данные файла указанные в PHP комментариях файла.

Ищет метаданные в первых 8kiB (6000-8000 знаков) информации файла. Данные должны быть указаны в многострочном PHP комментарии (/*данные*/), как это делается в файлах плагина или темы. Каждая часть данных должна быть на отдельной строке. В значениях не должно быть переносов строк, потому что значение берется до первого переноса. См. пример 1.

Таким образом, если данные файла (плагина, темы) не находятся в пределах первых 8kiB, то автору плагина/темы нужно исправить свой файл и переместить заголовки данных наверх.

Определена на раннем этапе загрузки WordPress, еще до константы SHORTINIT.

1 раз — 0.0000751 сек (очень быстро) | 50000 раз — 0.46 сек (очень быстро) | PHP 7.4.25, WP 6.0.3
Хуки из функции

Возвращает

Строку[]. Массив полученных данных из заголовка файла в формате: Ключ => Значение.

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

get_file_data( $file, $default_headers, $context );
$file(строка) (обязательный)
Полный путь до файла.
$default_headers(массив) (обязательный)

Список значений, которые должна возвратить функция, в формате: [ $field => $regex ], где:

  • $field - индекс возвращаемого массива, в котором будет найденное значение $regex.
  • $regex - часть регулярного выражения отвечающая за название переменной. Например, если тут указать Description, то регулярка для поиска примет такой вид: '/^[ \t\/*#@]*Description:(.*)$/mi'.

Указанное в $regex значение обрабатывается функцией preg_quote(), поэтому любые спецсимволы регулярного выражения будут экранированы.

$context(строка)
Если указать, то будет срабатывать хук extra_{$context}_headers, через который можно дополнить параметр $default_headers.
По умолчанию: ''

Примеры

0

#1 Получим данные плагина

Допустим мы создали плагин и в основном файле он имеет такие комментарии:

/*
Plugin Name: Название
Description: Описание
Author: Kama
Version: 1.0
*/

Тогда, смотрите как сработает код:

// путь до основного файла плагина.
// В файле его можно получить используя магическую константу __FILE__
$file = '/home/example.com/wp-content/plugins/myplugin/index.php';
$get_headers = [ 
	'ver'    => 'Version', 
	'author' => 'Author', 
	'name'   => 'Plugin Name',
	'foo'    => 'bar' 
];

$data = get_file_data( $file, $get_headers );

/* $data будет содержать:
Array (
	[ver] => 1.0
	[author] => Kama
	[name] => Название
	[foo] => 
)
*/
0

#2 Динамическая версия плагина

Допустим мы пишем плагин и у нас есть Константа PLUGIN_VERSION. Каждый раз, при смене версии плагина в комментариях, нам нужно не забыть поменять её в константе. Это неудобство можно обойти использовав эту функцию. Для этого в самом начале плагина под комментариями используем функцию:

/*
Plugin Name: Название плагина
Plugin URI: http://wp-kama.ru
Description:  Описание плагина
Author: Kama
Version: 1.0
*/

$data = get_file_data( __FILE__, ['ver'=>'Version'] );

define( 'PLUGIN_VERSION', $data['ver'] );

Список изменений

С версии 2.9.0 Введена.

Код get_file_data() WP 6.4.3

function get_file_data( $file, $default_headers, $context = '' ) {
	// Pull only the first 8 KB of the file in.
	$file_data = file_get_contents( $file, false, null, 0, 8 * KB_IN_BYTES );

	if ( false === $file_data ) {
		$file_data = '';
	}

	// Make sure we catch CR-only line endings.
	$file_data = str_replace( "\r", "\n", $file_data );

	/**
	 * Filters extra file headers by context.
	 *
	 * The dynamic portion of the hook name, `$context`, refers to
	 * the context where extra headers might be loaded.
	 *
	 * @since 2.9.0
	 *
	 * @param array $extra_context_headers Empty array by default.
	 */
	$extra_headers = $context ? apply_filters( "extra_{$context}_headers", array() ) : array();
	if ( $extra_headers ) {
		$extra_headers = array_combine( $extra_headers, $extra_headers ); // Keys equal values.
		$all_headers   = array_merge( $extra_headers, (array) $default_headers );
	} else {
		$all_headers = $default_headers;
	}

	foreach ( $all_headers as $field => $regex ) {
		if ( preg_match( '/^(?:[ \t]*<\?php)?[ \t\/*#@]*' . preg_quote( $regex, '/' ) . ':(.*)$/mi', $file_data, $match ) && $match[1] ) {
			$all_headers[ $field ] = _cleanup_header_comment( $match[1] );
		} else {
			$all_headers[ $field ] = '';
		}
	}

	return $all_headers;
}