我发现 IPTC 几乎总是使用 XMP 格式嵌入为 xml,并且通常不在 APP13 插槽中。您有时可以使用 获取 IPTC 信息iptcparse($info['APP1'])
,但在没有第三方库的情况下获取它的最可靠方法是简单地从相关 xml 字符串中搜索图像文件(我从另一个答案中得到了这个,但我没有能够找到它,否则我会链接!):
关键字的 xml 始终具有以下形式"<dc:subject>...<rdf:Seq><rdf:li>Keyword 1</rdf:li><rdf:li>Keyword 2</rdf:li>...<rdf:li>Keyword N</rdf:li></rdf:Seq>...</dc:subject>"
因此,您可以使用 将文件作为字符串获取file_get_contents(get_attached_file($attachment_id))
,strpos()
用于查找每个开始 ( <rdf:li>
) 和结束 ( </rdf:li>
) XML 标记,并使用 获取它们之间的关键字substr()
。
以下片段适用于我测试过的所有 jpeg。它将$keys
使用从 wordpress 上带有 id 的图像中获取的 IPTC 标签填充数组$attachment_id
:
$content = file_get_contents(get_attached_file($attachment_id));
// Look for xmp data: xml tag "dc:subject" is where keywords are stored
$xmp_data_start = strpos($content, '<dc:subject>') + 12;
// Only proceed if able to find dc:subject tag
if ($xmp_data_start != FALSE) {
$xmp_data_end = strpos($content, '</dc:subject>');
$xmp_data_length = $xmp_data_end - $xmp_data_start;
$xmp_data = substr($content, $xmp_data_start, $xmp_data_length);
// Look for tag "rdf:Seq" where individual keywords are listed
$key_data_start = strpos($xmp_data, '<rdf:Seq>') + 9;
// Only proceed if able to find rdf:Seq tag
if ($key_data_start != FALSE) {
$key_data_end = strpos($xmp_data, '</rdf:Seq>');
$key_data_length = $key_data_end - $key_data_start;
$key_data = substr($xmp_data, $key_data_start, $key_data_length);
// $ctr will track position of each <rdf:li> tag, starting with first
$ctr = strpos($key_data, '<rdf:li>');
// Initialize empty array to store keywords
$keys = Array();
// While loop stores each keyword and searches for next xml keyword tag
while($ctr != FALSE && $ctr < $key_data_length) {
// Skip past the tag to get the keyword itself
$key_begin = $ctr + 8;
// Keyword ends where closing tag begins
$key_end = strpos($key_data, '</rdf:li>', $key_begin);
// Make sure keyword has a closing tag
if ($key_end == FALSE) break;
// Make sure keyword is not too long (not sure what WP can handle)
$key_length = $key_end - $key_begin;
$key_length = (100 < $key_length ? 100 : $key_length);
// Add keyword to keyword array
array_push($keys, substr($key_data, $key_begin, $key_length));
// Find next keyword open tag
$ctr = strpos($key_data, '<rdf:li>', $key_end);
}
}
}
我在插件中实现了这一点,将 IPTC 关键字放入 WP 的“描述”字段,您可以在此处找到。