问题描述

我目前正在使用 WordPress 内置的 Custom Headers 来获取我的网站主页上的幻灯片图像。在很大程度上,这是按照意图工作的; 它允许我上传一组图像,并让客户端可视化发生了什么。

但是,我发现一些不理想的东西。当您上传标题图像然后裁剪时,您在原始图像上设置的”meta data”(即名称,描述等) 不会转移到新裁剪的图像 (与原始图像分开保存) 。这给人的印象是,当您添加标题图像时,”meta data” 未保存。然后更新”meta data” 的唯一方法是转到媒体库,并从那里进行编辑。你可以看到,它不是一个非常直观的 UX,可能会导致混乱。

我可以想到的最好的解决方案是以某种方式挂钩到 WordPress 事件中,并将原始图像中的”meta data” 传输到裁剪的图像。尽管我可以告诉你,没有办法做到这一点,所以我想听听你的想法。

我对所有的想法和解决方案都开放。

这是对我正在描述的更直观的表示:

最佳解决方案

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

/**
 * 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 );

这里我们通过 wp_create_file_in_uploadswp_insert_attachment_data 滤镜从原始图像复制 descriptioncaption 。要限制它在自定义标题 ajax 裁剪的上下文中,我们检查它:

 doing_action('wp_ajax_custom-header-crop')` 

在这里,我们还将原始图像的 $attachment_id 传递给使用 use 关键字的关闭。

如果我们需要复制图像元素,那么我们可以通过 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 );

希望可以根据您的需要进行调整。

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。