问题描述

我终于得到这件事我已经尝试了 12 次制作和 12 种不同的方法,但终于得到它的工作,… 有一些。

我做了一个自定义的 metabox 上传和附加图像到帖子,它不需要你使用内置在 WP 中的可怕的 thickbox 媒体上传器。我讨厌那件事不,我所做的只是一组输入 (标题,描述,文件),您也可以复制这些输入,以便添加附加附件。所以你填写字段,选择要上传的图像,并保存草稿或发布帖子。一旦将附件添加到帖子中,metabox 将显示输入字段,以及您添加的每个附件的附件图像的预览图像。标题和描述字段用于生成文件元数据,没有什么可以保存为我知道的 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 的拇指,并使一个像 500 像素 max-width 的图像的大小版本,并保存为上传的新文件。

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'] );
  }
}

任何人能够帮助我终于解决这个问题,所以它的工作正常将被爱。我花了这么多可笑的无数小时多次不同的时间试图开发这个东西,文件很烂,而且没有任何关于如何做的好帖子。

谢谢

最佳解决方案

你好 @jaredwilli:

好家伙!伟大的努力,和好的工作。 All-in-all 它可能是 WordPress 的一个很好的补充。

你是如此接近,但是你有 5 到 10 个小失败的假设或代码,看起来像你开始,但没有回到它,因为它不工作。我修改了你的功能,只要我需要纠正它。解决方案如下,我将把 side-by-side 与您或更少的 burned-out 进行比较。 🙂

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

附:这是我以前的答案。我发现这一点,我才意识到 Jared 正在问什么。这是正确的,但与他的问题无关。 🙂


我想你正在寻找的是 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 将自动创建这些大小。你需要什么?

参考文献

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