如何让程序化的图片上传生成缩略图和大小?

时间:2020-05-18 作者:Robert Andrews

我编写了一个函数,将远程托管的图像添加到媒体库中。确实如此。

然而,它不会在媒体库中生成缩略图,我认为标准做法也应该是组成一系列图像尺寸(?),但事实并非如此。

$source_url = \'https://res.cloudinary.com/braincloud/image/fetch/c_thumb,g_face,w_275,h_275/https://contexthq.com/wp-content/uploads/promo329755877.png\'
$filename = \'jana-eisenstein\';
$img_title = \'Jana Eisenstein avatar\';

  // cf. https://wordpress.stackexchange.com/a/50666/39300
  function add_remote_image_to_library($source_url, $filename, $img_title) {

    include_once( ABSPATH . \'wp-admin/includes/image.php\' );

    // ****** 1. Set folder and filename ****** //
    $uploaddir = wp_upload_dir();
    $uploadfile = $uploaddir[\'path\'] . \'/avatars/\' . $filename.\'.\'.pathinfo($source_url)[\'extension\'];

    // ****** 2. Get the image ****** //
    $contents= file_get_contents($source_url);

    // ****** 3. Upload the image ****** //
    $savefile = fopen($uploadfile, \'w\');
    fwrite($savefile, $contents);
    fclose($savefile);

    // ****** 4. Insert to Media Library ****** //
    // Insert
    $wp_filetype = wp_check_filetype(basename($filename), null );
    $attachment = array(
        \'post_mime_type\' => $wp_filetype[\'type\'],
        \'post_title\' => $img_title,
        \'post_content\' => \'\',
        \'post_status\' => \'inherit\'
    );

    $attach_id = wp_insert_attachment( $attachment, $uploadfile);

    // Meta data
    $imagenew = get_post( $attach_id );
    $fullsizepath = get_attached_file( $imagenew->ID );
    $attach_data = wp_generate_attachment_metadata( $attach_id, $fullsizepath );

    wp_update_attachment_metadata( $attach_id, $attach_data );

  }
文件将添加到正确的目录中。但是,在媒体库中,只有一个空白图像图标。。。

enter image description here

该部分正在发生(或没有发生)某些事情// Meta data, 我觉得它需要生成缩略图。

请注意,我没有将此图像附加到帖子。

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

为了wp_generate_attachment_metadata() 要正常工作,它会创建缩略图和其他中间/图像大小,如mediumlarge, 图像附件/发布数据必须具有正确的MIME类型(post_mime_type), 尽管你在$attachment 数组(post数据),代码中的此部分存在问题:

$wp_filetype = wp_check_filetype(basename($filename), null ); 
哪里$filename 定义为$filename = \'jana-eisenstein\'; 这是一个不带扩展名的文件名(例如。.png), 并且该变量的值在函数中保持不变,因此在上面的代码中exttype$wp_filetype 数组是false.

因此\'post_mime_type\' => $wp_filetype[\'type\'] 相当于\'post_mime_type\' => false, 导致图像附件的MIME类型无效。

要修复它,您可以将完整文件路径传递给wp_check_filetype(), 或使用basename( $uploadfile ) 而不是basename( $filename ):

$wp_filetype = wp_check_filetype( $uploadfile, null ); // pass full path
$wp_filetype = wp_check_filetype( basename( $uploadfile ), null ); // OR this works, too

备用选项this example 其中使用media_handle_sideload() 并自动调用wp_update_attachment_metadata(), 因此,您无需手动调用它。:)

function add_remote_image_to_library( $source_url, $filename, $img_title ) {
    require_once ABSPATH . \'wp-admin/includes/image.php\';
    require_once ABSPATH . \'wp-admin/includes/media.php\'; // load media_handle_sideload()
    require_once ABSPATH . \'wp-admin/includes/file.php\';  // load download_url()

    // Download the file to a temporary (system) file.
    $tmp = download_url( $source_url );

    // Build an array like in the $_FILES superglobal.
    $wp_filetype = wp_check_filetype( basename( $source_url ) );
    $file_array = array(
        \'name\'     => $filename . \'.\' . $wp_filetype[\'ext\'],
        \'tmp_name\' => $tmp,
    );

    // Must manually delete the file in case of download errors.
    if ( is_wp_error( $tmp ) ) {
        @unlink( $file_array[ \'tmp_name\' ] );
        return $tmp;
    }

    // Now create the attachment plus thumbnails and other sizes.
    $post_id = 0; // the parent post ID, if applicable
    $id = media_handle_sideload( $file_array, $post_id, null, array(
        \'post_title\' => $img_title,
    ) );

    // You should delete the temporary file if the above resulted in a WP_Error.
    if ( is_wp_error( $id ) ) {
        @unlink( $file_array[\'tmp_name\'] );
        return $id;
    }

    return $id; // return the attachment ID or whatever that you want to return..
}

相关推荐

Column Images Showing Gaps

我正在使用带有Avada主题的Wordpress。在页面顶部,我有一个fusion滑块。下面我将设置一个包含2列的容器。我为每一列插入了一幅图像。我无法解决如何消除图像左右两侧的间隙(我需要它们转到屏幕边缘)以及融合滑块与下方两幅图像之间的间隙。谢谢