我发现IPTC几乎总是使用XMP格式嵌入为xml,而且通常不在APP13槽中。有时候可以通过使用
iptcparse($info['APP1'])
来获取IPTC信息,但最可靠的方法是从相关的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格式的图片。它将从ID为
$attachment_id
的WordPress图片中获取IPTC标签,并将其填充到数组
$keys
中。
$content = file_get_contents(get_attached_file($attachment_id));
$xmp_data_start = strpos($content, '<dc:subject>') + 12;
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);
$key_data_start = strpos($xmp_data, '<rdf:Seq>') + 9;
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 = strpos($key_data, '<rdf:li>');
$keys = Array();
while($ctr != FALSE && $ctr < $key_data_length) {
$key_begin = $ctr + 8;
$key_end = strpos($key_data, '</rdf:li>', $key_begin);
if ($key_end == FALSE) break;
$key_length = $key_end - $key_begin;
$key_length = (100 < $key_length ? 100 : $key_length);
array_push($keys, substr($key_data, $key_begin, $key_length));
$ctr = strpos($key_data, '<rdf:li>', $key_end);
}
}
}
我已经在一个插件中实现了这个功能,将IPTC关键词放入WP的“描述”字段中,
您可以在此处找到。