เครื่องมืออัปโหลดสื่อ WP จะสร้างภาพขนาดแตกต่างกัน 3 ขนาดได้อย่างไรและฉันจะทำซ้ำได้อย่างไร


17

ในที่สุดฉันก็มี !! ได้สิ่งนี้ฉันได้ลองทำประมาณ 12 ครั้งเพื่อทำและ 12 วิธีที่แตกต่างกัน แต่ในที่สุดก็สามารถใช้งานได้ ...

ฉันสร้างเมท็อกซ์ที่กำหนดเองสำหรับการอัปโหลดและแนบรูปภาพกับโพสต์และคุณไม่จำเป็นต้องใช้เครื่องมืออัพโหลดไฟล์มีเดียแบบหนาที่น่ากลัวในตัว WP ฉันเกลียดสิ่งนั้น ไม่สิ่งที่ฉันทำคือกลุ่มอินพุต (ชื่อคำอธิบายไฟล์) ซึ่งคุณสามารถทำซ้ำเพื่อเพิ่มสิ่งที่แนบเพิ่มเติมได้ถ้าต้องการ ดังนั้นคุณกรอกข้อมูลในฟิลด์เลือกภาพที่จะอัปโหลดและบันทึกร่างหรือเผยแพร่โพสต์ เมื่อมีสิ่งที่แนบเพิ่มลงในโพสต์ metabox จะแสดงช่องใส่พร้อมกับภาพตัวอย่างของภาพที่แนบมาสำหรับแต่ละสิ่งที่แนบมาที่คุณเพิ่ม ฟิลด์หัวเรื่องและคำอธิบายใช้เพื่อสร้างข้อมูลเมตาไฟล์ไม่มีอะไรถูกบันทึกเป็น post_meta ที่ฉันรู้ นั่นคือทั้งหมดที่ฉันได้ทำงานมาจนถึงตอนนี้

ฉันต้องทำให้มันเพื่อที่เมื่อคุณบันทึก / เผยแพร่โพสต์, inturn อัปโหลด / สร้างไฟล์แนบมันจะสร้างสามขนาดภาพตามที่ผู้อัปโหลด 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-include / 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

มีใครแก้ไขปัญหานี้หรือไม่? มีปัญหาที่คล้ายกันได้รับการ scowering เว็บสำหรับทุกเพศทุกวัยในนี้

คำตอบ:


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แทน

ป.ล. นี่คือคำตอบเดิมของฉัน ฉันโพสต์สิ่งนี้ก่อนที่ฉันจะรู้ว่า 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 นี้จะสร้างขนาดเหล่านั้นโดยอัตโนมัติ คุณต้องการอะไร


ฉันไม่แน่ใจเกี่ยวกับสิ่งนั้นเขากำลังขอให้สร้างขนาดสื่อเริ่มต้น
Bainternet

อืมมม ฟังก์ชั่นwp_generate_attachment_metadata()ทำอย่างนั้นถ้าadd_image_size()ตั้งไว้ บางทีเขาอาจไม่ได้ลองใช้add_image_size()เพื่อตั้งค่าขนาดภาพ?
MikeSchinkel

ใช่แล้ว jaredwilli กำลังบอกว่าขนาด WordPress เริ่มต้น (ขนาดใหญ่, ขนาดกลาง, ขนาดย่อ) ไม่ได้ถูกสร้างขึ้นจากนั้นขนาดเพิ่มพิเศษจะเพิ่มขึ้นโดยใช้ add_image_size ()
Bainternet

หรือบางทีฉันอาจจะไม่ได้รับคำถามเลย :)
Bainternet

@ בנייתאתרים - ตอนนี้ฉันก็สับสนเช่นกัน ฉันคิดว่าเราต้องรอที่นี่เพื่อชี้แจงจาก @jaredwilli
MikeSchinkel

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 ด้วยพา ธ ไฟล์ที่อัพโหลดและ $ ครอบตัดด้วย true หรือ false หากคุณต้องการครอบตัดรูปภาพเป็นขนาดใหม่หรือ false เพื่อปรับขนาด


@ בנייתאתרים - ถ้าคุณดูรหัสสำหรับwp_generate_attachment_metadata()ใน/wp-admin/includes/image.phpคุณจะเห็นว่ามันทำสิ่งที่คุณโพสต์ข้างต้นและเขาเรียกว่า ดังนั้นหากสิ่งเหล่านั้นไม่ได้ถูกสร้างขึ้นบางทีเขาอาจมีปลั๊กอินที่กรองพวกเขาโดยใช้'intermediate_image_sizes_advanced'เบ็ด?
MikeSchinkel

ที่จริงฉันไม่ได้ลองใช้ get_intermediate_image_sizes (); ฉันไม่ทราบว่ามันมีขนาดที่ลงทะเบียนทั้งหมด สิ่งไหนดีที่รู้ตอนนี้ ฉันยังไม่เข้าใจเลยว่าขนาดของรูปภาพที่สร้างขึ้นนั้นเกี่ยวข้องกับสิ่งที่แนบมาอย่างไรเช่นถ้าฉันดูในไลบรารีสื่อคุณเห็นตัวเลือกขนาด 3 เมื่อเลือกหนึ่งในนั้นมันรู้ว่าภาพไหนที่จะคว้า . IDK นั่นไม่ใช่สิ่งสำคัญ นอกเสียจากว่าจะเป็น หลังจากทำแบบนั้น foreach ลูปฉันจะใช้ตัวแปรอะไรเพื่อเพิ่มไฟล์แนบ? $ images ['thumb'] หรืออะไรบางอย่าง (ขนาดใดก็ได้ที่ฉันต้องการ)
jaredwilli

@ בנייתאתרים - เราทั้งคู่พลาดปัญหาที่แท้จริงในตอนแรก ปัญหาที่แท้จริงคือข้อผิดพลาดเกี่ยวกับโค้ดประมาณ 7 หรือ 8 ตัวในตัวอย่างดั้งเดิม ดูคำตอบที่อัปเดตของฉัน
MikeSchinkel

ใช่มันสายไปแล้วและฉันก็สมองตาย
Bainternet

@ בנייתאתרים - เหมือนกัน :)
MikeSchinkel
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.