WP媒体上传器如何创建3种不同尺寸的图像,如何复制它


17

我终于有了!得到了我已经尝试过12次并采用12种不同方式制作的东西,但最终使它起作用了……。

我制作了一个自定义元框,用于将图像上传和附加到帖子,并且不需要您使用WP中内置的可怕的thickbox媒体上传器。我讨厌那件事。不,我所做的只是一组输入(标题,描述,文件),您也可以复制它们,以根据需要添加其他附件。因此,您填写字段,选择要上传的图像,然后保存草稿或发布帖子。将附件添加到帖子后,元框将显示输入字段,以及添加的每个附件的附件图像的预览图像。标题和描述字段用于生成文件元数据,据我所知,没有任何内容保存为post_meta。到目前为止,这就是我目前要做的全部工作。

我需要这样做,以便在您保存/发布帖子时,依次上传/创建附件文件,它将创建三个图像尺寸,如默认的wp上传器会显示缩略图,中型,大尺寸,并且也保留全尺寸图像。如果可能的话。如果没有,我想用其他方式add_image_size()创建/定义新的自定义尺寸,并在上传时以这种方式生成它们。

我不确定哪种功能最适合在这种情况下使用,也许该image_make_intermediate_size()功能会更好,或者wp_create_thumbnail()或者wp_crop_image()...谁知道!

如果我需要wp_handle_upload()为每个程序运行该功能,或者可能需要涉及该wp_generate_attachment_metadata()功能的某个程序,则我无法弄清楚该怎么做。这让我感到困惑,因为这3个图像尺寸将作为同一附件的变体以及执行该操作的方式进行关联。

我搜寻了网络,阅读了每个wp媒体/上传/图像相关文件的源,并使用了媒体上载内容的几乎所有功能,却找不到WP如何在任何地方创建3种图像尺寸,或如何做我自己。

在wp-includes / media.php中,该image_resize()功能似乎是最好的,因为它确实应该如此。我只是无法弄清楚我的一生,我到底想念什么,或者尝试做些什么,但是制作图像缩略图做错了。

这是我执行工作的功能wp_handle_upload(),但是它还需要创建100px的拇指,并调整图像的最大尺寸,例如最大宽度为500px,并另存为上载的新文件。

function update_attachment(){
  global $post;

  wp_update_attachment_metadata( $post->ID, $_POST['a_image'] );

  if( !empty( $_FILES['a_image']['name'] )) { //New upload
    require_once( ABSPATH . 'wp-admin/includes/file.php' );

    $override['action'] = 'editpost';
    $url = wp_handle_upload( $_FILES['a_image'], $override );

    // $medium = image_make_intermediate_size( $uploaded_file['url'], 500, 400, true );
    // $thumb = = image_make_intermediate_size( $uploaded_file['url'], 100, 100, true );

    if ( isset( $file['error'] )) {
      return new WP_Error( 'upload_error', $file['error'] );
    }

    $array_type = wp_check_filetype
    $allowed_file_types = array('image/jpg','image/jpeg','image/gif','image/png');

    $name_parts = pathinfo( $name );
    $name = trim( substr( $name, 0, - ( 1 + strlen( $name_parts['extension'] )) ));

    $type = $file['type'];
    $file = $file['file'];
    $title = $_POST['a_title'] ? $_POST['a_title'] : $name;
    $content = $_POST['a_desc']

    $post_id = $post->ID;
    $attachment = array(
      'post_title' => $title,
      'post_type' => 'attachment',
      'post_content' => $content,
      'post_parent' => $post_id,
      'post_mime_type' => $type,
      'guid' => $url['url']
    );


    // Save the data
    $id = wp_insert_attachment( $attachment, $_FILES['a_image'][ 'file' ]/*, $post_id - for post_thumbnails*/);

    if ( !is_wp_error( $id )) {
      $attach_meta = wp_generate_attachment_metadata( $id, $uploaded_file['url'] );
      wp_update_attachment_metadata( $attach_id, $attach_meta );
    }
    update_post_meta( $post->ID, 'a_image', $uploaded_file['url'] );
  }
}

任何能够帮助我最终解决此问题以使其正常工作的人都会受到爱戴。我花了很多时间来荒谬地无数小时地尝试开发这个东西,但是文档却很烂,而且在任何地方都没有关于如何做到这一点的好帖子。

谢谢


查看以下各种答案的评论,我想我还是@בנייתאתרים或我们俩都对您的需求感到困惑。
MikeSchinkel '01

有人解决了吗?有一个类似的问题,在这个问题上一直困扰着网络。

Answers:


6

@jaredwilli:

杜德!英勇的工作和出色的工作。总而言之,这可能是WordPress的一个很好的补充。

您是如此接近,但是您有大约5到10个小小的失败假设或代码,看起来像是您开始但由于无法正常工作而无法恢复。我仅根据需要对您的功能进行了重做。解决方案如下,我将并排比较一下您或其他精疲力竭的人。:)

function update_attachment() {
  global $post;
  wp_update_attachment_metadata( $post->ID, $_POST['a_image'] );
  if( !empty( $_FILES['a_image']['name'] )) { //New upload
    require_once( ABSPATH . 'wp-admin/includes/file.php' );

    $override['action'] = 'editpost';
    $file = wp_handle_upload( $_FILES['a_image'], $override );

    if ( isset( $file['error'] )) {
      return new WP_Error( 'upload_error', $file['error'] );
    }

    $file_type = wp_check_filetype($_FILES['a_image']['name'], array(
      'jpg|jpeg' => 'image/jpeg',
      'gif' => 'image/gif',
      'png' => 'image/png',
    ));
    if ($file_type['type']) {
      $name_parts = pathinfo( $file['file'] );
      $name = $file['filename'];
      $type = $file['type'];
      $title = $_POST['a_title'] ? $_POST['a_title'] : $name;
      $content = $_POST['a_desc'];

      $post_id = $post->ID;
      $attachment = array(
        'post_title' => $title,
        'post_type' => 'attachment',
        'post_content' => $content,
        'post_parent' => $post_id,
        'post_mime_type' => $type,
        'guid' => $file['url'],
      );

      foreach( get_intermediate_image_sizes() as $s ) {
        $sizes[$s] = array( 'width' => '', 'height' => '', 'crop' => true );
        $sizes[$s]['width'] = get_option( "{$s}_size_w" ); // For default sizes set in options
        $sizes[$s]['height'] = get_option( "{$s}_size_h" ); // For default sizes set in options
        $sizes[$s]['crop'] = get_option( "{$s}_crop" ); // For default sizes set in options
      }

      $sizes = apply_filters( 'intermediate_image_sizes_advanced', $sizes );

      foreach( $sizes as $size => $size_data ) {
        $resized = image_make_intermediate_size( $file['file'], $size_data['width'], $size_data['height'], $size_data['crop'] );
        if ( $resized )
          $metadata['sizes'][$size] = $resized;
      }

      $attach_id = wp_insert_attachment( $attachment, $file['file'] /*, $post_id - for post_thumbnails*/);

      if ( !is_wp_error( $id )) {
        $attach_meta = wp_generate_attachment_metadata( $attach_id, $file['file'] );
        wp_update_attachment_metadata( $attach_id, $attach_meta );
      }
      update_post_meta( $post->ID, 'a_image', $file['url'] );
    }
  }
}

嘿,为什么不挥霍自己,让自己获得PhpStorm的副本?如果您像我现在一样可以通过代码进行跟踪,那么您自己很容易解决了这个问题,您太接近了。如果这样做,请不要在非常麻烦的XDEBUG上浪费时间,而应该下载Zend Debugger

PS:这是我以前的回答。我在意识到贾里德到底在问什么之前就发布了这个。是正确的,但与他的问题无关。:)


我认为您正在寻找的是add_image_size()

add_image_size( $size_id, $width, $height, $crop );

例如:

add_image_size('headshot', 130, 150);
add_image_size('large-headshot', 260, 300);

通过设置此WordPress将自动创建这些尺寸。那你需要什么?


我不确定,他要求创建默认的介质尺寸。
Bainternet 2011年

wp_generate_attachment_metadata()如果add_image_size()设置了该功能。也许他只是不尝试使用add_image_size()设置图像大小?
MikeSchinkel 2011年

是的,但是jaredwilli表示未创建默认的WordPress内置尺寸(大,中,缩略图),因此使用add_image_size()所创建的额外添加尺寸也不会创建。
Bainternet '01

也许我根本没有收到这个问题:)
Bainternet 2011年

@בנייתאתרים-我现在也感到困惑。我认为我们需要等待@jaredwilli的澄清。
MikeSchinkel 2011年

0

如果我了解您的问题,您首先需要获取尺寸列表,如下所示:

$image_sizes = get_intermediate_image_sizes();

这将返回一个已注册所有图像尺寸的数组(默认值:大,中,缩略图,使用“ add_image_size()”注册的任何自定义尺寸),然后您要做的就是遍历每个尺寸并为该尺寸创建一个图像,例如这个:

$foreach ($image_sizes as $size){
    images[] = image_make_intermediate_size($file, $size['width'], $size['height'], $crop); 
}

如果要将图像裁切为新尺寸,则将$ file替换为上载的文件路径,将$ crop替换为true或false,或者将false调整大小。


@בנייתאתרים-如果您查看其中的代码wp_generate_attachment_metadata()/wp-admin/includes/image.php您会发现它与您在上面发布的内容完全一样,并且他已经被称为。因此,如果未创建这些插件,那么也许他有一个使用'intermediate_image_sizes_advanced'钩子过滤它们的插件?
MikeSchinkel '01

我实际上没有尝试过使用get_intermediate_image_sizes(); 我不知道它拥有所有已注册的尺寸。现在很高兴知道。我仍然不太了解生成的图像大小如何与特定附件相关联,例如,如果我要查看媒体库,您会看到3个大小选项,当选择其中一个时,它知道要抓取哪个图像。Idk,那并不重要。除非是。在执行完foreach循环后,我将使用哪个变量来添加附件?$ images ['thumb']之类的东西(无论我想要什么大小)?
jaredwilli 2011年

@בנייתאתרים-我们俩最初都错过了真正的问题。真正的问题是在原始示例中大约有7或8个代码错误。看到我更新的答案。
MikeSchinkel'1

是的,这里来晚了,我脑子死了。
Bainternet,2011年

@בנייתאתרים-一样。:)
MikeSchinkel 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.