WP媒体上传器如何创建3种不同大小的图像,以及如何复制它

时间:2011-01-29 作者:jaredwilli

我终于有了!!这个东西我试了12次,用了12种不同的方法,但最终还是成功了,。。。差不多吧。

我制作了一个自定义元盒,用于上传图像并将其附加到帖子中,它不需要您使用WP中内置的可怕的thickbox媒体上传器。我讨厌那东西。不,我所做的只是一组输入(标题、描述、文件),您也可以复制这些输入,以便在需要时添加其他附件。因此,您可以填写字段,选择要上载的图像,保存草稿或发布帖子。将附件添加到帖子后,元数据库将显示输入字段,以及添加的每个附件的附加图像的预览图像。title和description字段用于生成文件元数据,据我所知,没有任何内容保存为post\\u 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中包括/介质。phpimage_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\'] );
  }
}
任何能够帮助我最终解决这个问题,使其正常工作的人都会受到爱戴。我花了这么多荒谬的无数个小时,无数次尝试开发这个东西,而文档很糟糕,而且没有任何关于如何做的好帖子。

谢谢

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

你好@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.

P、 这是我以前的回答。在我意识到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将自动创建这些尺寸。你需要什么?

SO网友:Bainternet

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

$image_sizes = get_intermediate_image_sizes();
这将返回一个包含所有已注册图像大小的数组(默认值:大、中、缩略图,以及使用“add\\u image\\u size()”注册的任何自定义大小),然后只需循环遍历每个大小并为该大小创建图像,如下所示:

$foreach ($image_sizes as $size){
    images[] = image_make_intermediate_size($file, $size[\'width\'], $size[\'height\'], $crop); 
}
如果要将图像裁剪为新尺寸,请使用上载的文件路径替换$file,如果要将图像裁剪为新尺寸,请使用true或false替换$crop。

结束

相关推荐

404从wp-Content/Uploads/获取图像时

我在获取图像时获得404状态,http仍然包含该图像。图像显示在浏览器中,但404代码中断了一些应用程序。对wp内容/上载/的调用被重定向到。htaccess:<IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteRule ^index\\.php$ - [L] RewriteRule (.*) /index.php?getfile=$1 [L] </IfModule>&