如何从 wordpress 的媒体库中获取图像元数据,例如替代文本、标题和描述

How to get an image metadata such as alt text, caption and description from media library in wordpress

我正在尝试获取与特色图片关联的元数据,但 get_post_meta 保持 returning 为空。

$image_alt_text = get_post_meta($image_id, '_wp_attachment_image_alt', true); 

这有效并且 returns 数据,但下面的代码不起作用:

$image_description = get_post_meta($image_id, '_wp_attachment_description', true);
$image_caption = get_post_meta($image_id, '_wp_attachment_caption', true);

这两个return为空。我填写了这些字段,但无法将它们恢复到我的模板中!

我正在尝试使用特色图片的 Alt TextTitleCaptionDescription 来改善我的网站搜索引擎优化,但我不明白为什么他们出来是空的。

我找到了this post and this post,但它们让我更加困惑。

你能帮帮我吗?

提前致谢。

Caption 实际上是 POST Excerpt,Description 实际上是 POST Content

所以你会这样做:

/* int - the attachment id */
$image_data = get_post( int );
$description = apply_filters( 'the_content', $image_data->post_content );
$caption = apply_filters( 'the_excerpt', $image_data->post_excerpt );

"These two return empty"

因为在 post 元 table 中没有名为 '_wp_attachment_description' 的键。 '_wp_attachment_caption' 也一样。它们存储在 post 中 table。这就是为什么 get_post_meta return 是空的!


第一种方式

比方说,我上传了一个 wordpress 的徽标并填充了这些元数据字段,如下所示:

现在,为了获得您要查找的数据,您可以使用 attachment_url_to_postidget_post_field 函数。所以你可以这样做:

$image_id = attachment_url_to_postid( 'http://yourwebsite.dev/wp-content/uploads/2021/10/WordPress-logotype-alternative-white.png' );  

$image_alt_text        = get_post_meta($image_id, '_wp_attachment_image_alt', true);
$image_caption         = get_post_field('post_excerpt', $image_id);
$image_title           = get_post_field('post_title', $image_id);
$image_content         = get_post_field('post_content', $image_id);
$image_name            = get_post_field('post_name', $image_id);
$image_post_type       = get_post_field('post_type', $image_id);
$image_post_mime_type  = get_post_field('post_mime_type', $image_id);

为了测试它,我们可以这样做:

echo "<strong>This is the id of the featured image:</strong><span style='color:green;'> {$image_id}</span>";
echo '<br>';
echo "<strong>This is the alternative Text:</strong><span style='color:green;'> {$image_alt_text}</span>";
echo '<br>';
echo "<strong>This is the caption:</strong><span style='color:green;'> {$image_caption}</span>";
echo '<br>';
echo "<strong>This is the title:</strong><span style='color:green;'> {$image_title}</span>";
echo '<br>';
echo "<strong>This is the description of the image:</strong><span style='color:green;'> {$image_content}</span>";
echo '<br>';
echo "<strong>This is the original name of the file:</strong><span style='color:green;'> {$image_name}</span>";
echo '<br>';
echo "<strong>This is the post type:</strong><span style='color:green;'> {$image_post_type}</span>";
echo '<br>';
echo "<strong>This is the mime type of the image:</strong><span style='color:green;'> {$image_post_mime_type}</span>";
echo '<br>

输出这个:

注意:

  • 我对图像使用了一个虚拟 link 只是为了给你一个例子,所以一定要将它更改为你想要获取元数据的图像!
  • 如您在屏幕截图中所见,图像描述存储为 post_content,图像标题存储为 post_excerpt
  • 我也为你准备了 post_typemime_type

第二种方式,在wordpress循环中

如果你想在 wordpress 循环中获取元数据,我们可以使用 get_post_thumbnail_id 函数。所以你可以使用下面的代码:

$args = array(
  'post_type' => 'post',
  'posts_per_page' => -1,
);

$query = new WP_Query($args);

if($query){
  while($query->have_posts()){
    $query->the_post();
    echo "<strong>This is the title of a post: </strong>" . get_the_title();
    $image_id = get_post_thumbnail_id(get_the_id());
    echo '<br>';
    echo "<strong>This is the id of the featured image:</strong><span style='color:green;'> {$image_id}</span>";
    echo '<br>';
    $image_alt_text        = get_post_meta($image_id, '_wp_attachment_image_alt', true);
    $image_caption         = get_post_field('post_excerpt', $image_id);
    $image_title           = get_post_field('post_title', $image_id);
    $image_content         = get_post_field('post_content', $image_id);
    $image_name            = get_post_field('post_name', $image_id);
    $image_post_type       = get_post_field('post_type', $image_id);
    $image_post_mime_type  = get_post_field('post_mime_type', $image_id);

    echo "<strong>This is the alternative Text:</strong><span style='color:green;'> {$image_alt_text}</span>";
    echo '<br>';
    echo "<strong>This is the caption:</strong><span style='color:green;'> {$image_caption}</span>";
    echo '<br>';
    echo "<strong>This is the title:</strong><span style='color:green;'> {$image_title}</span>";
    echo '<br>';
    echo "<strong>This is the description of the image:</strong><span style='color:green;'> {$image_content}</span>";
    echo '<br>';
    echo "<strong>This is the original name of the file:</strong><span style='color:green;'> {$image_name}</span>";
    echo '<br>';
    echo "<strong>This is the post type:</strong><span style='color:green;'> {$image_post_type}</span>";
    echo '<br>';
    echo "<strong>This is the mime type of the image:</strong><span style='color:green;'> {$image_post_mime_type}</span>";
  }
}

wp_reset_postdata();

输出这个:


第三种方式,稍微重构和优化我们的代码!

在上述两种解决方案中,我们都在重复自己。因此,为了遵循“DRY”原则,我们可以编写一个可重用的函数,它将 return 与图像 ID 相关的元数据的关联数组。像这样:

此函数进入主题的 functions.php 文件。

/**
 * A function to retrieve corresponding metadata for an image uploaded through Media Library in Wordpress
 *
 * @author https://whosebug.com/users/15040627/ruvee
 * 
 * @param string|int The id of the image you're trying to get metadata for!
 * 
 * @return array This function returns an associative array of metadata related to the image id being passed to it.
 */

function getting_image_metadata($image_id){

  $image_metadata_array = array();

  $image_metadata_array['image_alt_text']        = get_post_meta($image_id, '_wp_attachment_image_alt', true) ?? '';
  $image_metadata_array['image_caption']         = get_post_field('post_excerpt', $image_id) ?? '';
  $image_metadata_array['image_title']           = get_post_field('post_title', $image_id) ?? '';
  $image_metadata_array['image_content']         = get_post_field('post_content', $image_id) ?? '';
  $image_metadata_array['image_name']            = get_post_field('post_name', $image_id) ?? '';
  $image_metadata_array['image_post_type']       = get_post_field('post_type', $image_id) ?? '';
  $image_metadata_array['image_post_mime_type']  = get_post_field('post_mime_type', $image_id) ?? '';

  return $image_metadata_array;
}

现在为了在您的模板中使用此功能,您可以这样做:

$image_id = attachment_url_to_postid( 'http://yourwebsite.dev/wp-content/uploads/2021/10/WordPress-logotype-alternative-white.png' );

$image_metadata_array = getting_image_metadata($image_id);

echo "<pre>";
print_r($image_metadata_array);
echo "</pre>";

或者在 wordpress 循环中:

$image_id = get_post_thumbnail_id(get_the_id()); 

$image_metadata_array = getting_image_metadata($image_id);

echo "<pre>";
print_r($image_metadata_array);
echo "</pre>";

输出这个关联数组:


希望这个回答能帮您解决问题![​​=33=]


此答案已经在 wordpress 5.8 上进行了全面测试并且工作正常!