裁剪标题图像时,保留元数据(即名称、描述等)从原始图像?

时间:2016-05-13 作者:Josh Foskett

我目前正在使用WordPress的内置Custom Headers 在我的网站主页上获取幻灯片图像。在大多数情况下,这已经达到了预期效果;它允许我上传一组图像,并让客户端可视化正在发生的事情。

然而,我发现有些东西并不理想。当您上载标题图像并裁剪它时,您在原始图像上设置的“元数据”(即名称、描述等)不会转移到新裁剪的图像(与原始图像分开保存)。这给人的印象是,添加标题图像时没有保存“元数据”。然后更新“元数据”的唯一方法是转到媒体库,并从那里编辑它。正如您所看到的,这不是一个非常直观的用户体验,可能会导致混淆。

我能想到的最好的解决方案是以某种方式连接到WordPress事件,并将原始图像中的“元数据”传输到裁剪后的图像。虽然就我所知,没有办法做到这一点,所以我想听听你的想法。

我对所有想法和解决方案都持开放态度。

下面是我所描述内容的更直观的表示:

enter image description here

enter image description here

enter image description here

enter image description here

enter image description here

一二

enter image description here

1 个回复
最合适的回答,由SO网友:birgire 整理而成

这里有一个想法,可能需要进一步测试:

/**
 * Cropped header image with the same description/caption as the original image
 */
add_filter( \'wp_create_file_in_uploads\', function( $cropped, $attachment_id )
{
    add_filter( \'wp_insert_attachment_data\', function( $data ) use ( $attachment_id)
    {
        if( doing_action( \'wp_ajax_custom-header-crop\' ) && is_array( $data ) )
        {
            // Copy the original description to the cropped image
            $data[\'post_content\'] = get_post_field( \'post_content\', $attachment_id, \'db\' );
            // Copy the original caption to the cropped image
            $data[\'post_excerpt\'] = get_post_field( \'post_excerpt\', $attachment_id, \'db\' );
        }
        return $data;
    } );
    return $cropped;
}, 10, 2 );
这里我们复制descriptioncaption 从原始图像到wp_create_file_in_uploadswp_insert_attachment_data 过滤器。要在自定义标题ajax裁剪的上下文中对其进行限制,请使用以下选项进行检查:

 doing_action(\'wp_ajax_custom-header-crop\')` 
这里我们还传递$attachment_id, 在使用关键字的帮助下,将原始图像转换为闭包。

如果我们还需要复制图像元,那么我们可以通过wp_header_image_attachment_metadata 过滤器:

/**
 * Cropped header image with the same image meta as the original one
 */
add_filter( \'wp_create_file_in_uploads\', function( $cropped, $attachment_id )
{
    add_filter( \'wp_header_image_attachment_metadata\', function( $metadata ) use ( $attachment_id )
    {
        if( doing_action( \'wp_ajax_custom-header-crop\' ) && isset( $metadata[\'image_meta\'] ) )
        {
            // Fetch the image meta of the original image
            $original_metadata = wp_get_attachment_metadata( $attachment_id );
            // Copy the original image meta data for the cropped image
            if( is_array( $original_metadata[\'image_meta\'] ) )
                $metadata[\'image_meta\'] = $original_metadata[\'image_meta\'];
        }       
        return $metadata;
    } );
    return $cropped;
}, 10, 2 );
希望您能根据需要进行调整。

相关推荐

About wordpress child themes

我对WordPress和儿童主题有一些问题。据我所知,如果我不想在更新主题时失去任何东西,使用子主题是很重要的。我是WordPress的初学者,到目前为止,我一直在使用PageBuilder(管理面板上的板载自定义选项)自定义我的网站,并在“附加CSS”选项中加入几行CSS。所有这些都是在主主题上完成的(只是玩转尝试学习),现在我想开始使用一个儿童主题。问题如下:我不知道我是否可以像通过管理界面设计父主题那样设计我的子主题,或者我是否必须通过文本编辑器(在我的计算机上,然后通过FTP等方式上传)对所有内容