WordPress Version: 6.2
/**
* Retrieves metadata from a file.
*
* Searches for metadata in the first 8 KB of a file, such as a plugin or theme.
* Each piece of metadata must be on its own line. Fields can not span multiple
* lines, the value will get cut at the end of the first line.
*
* If the file data is not within that first 8 KB, then the author should correct
* their plugin file and move the data headers to the top.
*
* @link https://codex.wordpress.org/File_Header
*
* @since 2.9.0
*
* @param string $file Absolute path to the file.
* @param array $default_headers List of headers, in the format `array( 'HeaderKey' => 'Header Name' )`.
* @param string $context Optional. If specified adds filter hook {@see 'extra_$context_headers'}.
* Default empty string.
* @return string[] Array of file header values keyed by header name.
*/
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;
}