WP मीडिया अपलोडर कैसे 3 अलग-अलग आकार की छवियां बनाता है, और मैं इसे कैसे डुप्लिकेट कर सकता हूं


17

मेरे पास आखिर है !! इस चीज़ को मैंने बनाने के लिए लगभग 12 बार और 12 अलग-अलग तरीकों से कोशिश की है, लेकिन आखिरकार इसे काम करने के लिए मिला, ... की तरह।

मैंने पोस्ट करने के लिए छवियों को अपलोड करने और संलग्न करने के लिए एक कस्टम मेटाबॉक्स बनाया है, और आपको WP में निर्मित भयानक मोटीबॉक्स मीडिया अपलोडर का उपयोग करने की आवश्यकता नहीं है। मुझे उस चीज से नफरत है। नहीं, मैंने जो कुछ किया है वह केवल इनपुट्स (शीर्षक, विवरण, फ़ाइल) का एक समूह है, जिसे आप चाहें तो अतिरिक्त अनुलग्नकों को जोड़ने के लिए डुप्लिकेट भी कर सकते हैं। इसलिए आप फ़ील्ड भरें, अपलोड करने के लिए एक छवि का चयन करें, और ड्राफ्ट को सहेजें या पोस्ट प्रकाशित करें। एक बार किसी पोस्ट में अटैचमेंट जोड़ दिए जाने के बाद, मेटाबॉक्स आपके द्वारा जोड़े गए प्रत्येक अनुलग्नक के लिए संलग्न छवि की पूर्वावलोकन छवि के साथ-साथ इनपुट फ़ील्ड प्रदर्शित करेगा। शीर्षक और विवरण फ़ील्ड का उपयोग फ़ाइल मेटा डेटा उत्पन्न करने के लिए किया जाता है, कुछ भी पोस्ट_मेटा के रूप में सहेजा नहीं जाता है, जिसे मैं जानता हूं। वर्तमान में यह सब है कि मैंने अब तक काम कर लिया है।

मुझे इसे बनाने की आवश्यकता है ताकि जब आप किसी पोस्ट को सेव / पब्लिश करें, अटैचमेंट फाइल अपलोड / क्रिएट करें, तो यह तीन इमेज साइज बनाएगा क्योंकि डिफॉल्ट 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 में शामिल / 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'] );
  }
}

किसी को भी मेरी मदद करने में सक्षम अंत में यह ठीक है तो यह काम करता है प्यार किया जाएगा। मैं इस बात को विकसित करने की कोशिश में कई अलग-अलग घंटों में कई अलग-अलग घंटे बिता चुका हूं और प्रलेखन बेकार है, और वास्तव में इसे करने के लिए कहीं भी कोई भी अच्छी पोस्ट नहीं है।

धन्यवाद


नीचे दिए गए विभिन्न उत्तरों पर टिप्पणियों की जांच करें और मुझे लगता है कि या तो मैं या @ अंग्रेजी नागरिक या हम दोनों ही भ्रमित हैं कि आपको क्या चाहिए।
माइकस्किंकेल

क्या किसी ने इसका हल निकाला है ?? इसी तरह की समस्या होने के कारण, यह इस युग के लिए वेब को धीमा कर रहा है।

जवाबों:


6

हाय @jaredwilli:

Dude! बहादुर प्रयास, और अच्छा काम। ऑल-इन-ऑल यह वर्डप्रेस के लिए एक बढ़िया अतिरिक्त हो सकता है।

आप इतने करीब थे, लेकिन आपके पास 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);

इस वर्डप्रेस को सेट करने से वे साइज अपने आप बन जाएंगे। आपको क्या चाहिए?


मुझे उस पर यकीन नहीं है, वह डिफ़ॉल्ट मीडिया आकारों के निर्माण के लिए कह रहा है।
बेनटर्नट

हम्म। फ़ंक्शन wp_generate_attachment_metadata()करता है कि यदि add_image_size()सेट है। शायद वह सिर्फ add_image_size()छवि आकार सेट करने का उपयोग करने की कोशिश नहीं की ?
माइकस्किंकेल

हाँ, लेकिन jaredwilli कह रहा है कि डिफ़ॉल्ट वर्डप्रेस अंतर्निहित आकार (बड़े, मध्यम, थंबनेल) नहीं बनाए जा रहे हैं, फिर अतिरिक्त रूप से add_image_size () अभ्यस्त का उपयोग करके अतिरिक्त अतिरिक्त आकार बनाए जाएंगे।
बेनटर्नट

या हो सकता है कि मुझे यह सवाल बिलकुल न
लगे

@ बोस्नियाई सरकार - मैं अब भ्रमित हो रहा हूं। मुझे लगता है कि हमें @jaredwilli से यहां स्पष्टीकरण की प्रतीक्षा करने की आवश्यकता है।
माइकस्किंकेल 1

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

यदि आप छवि को नए आयामों में बदलना चाहते हैं या आकार बदलना चाहते हैं, तो अपलोड की गई फ़ाइल पथ के साथ $ फ़ाइल और सच्चे या गलत के साथ $ फ़सल बदलें।


@ בניית אתרים - आप कोड पर एक नज़र के लिए तो wp_generate_attachment_metadata()में /wp-admin/includes/image.phpआप इसे वास्तव में क्या आप ऊपर तैनात करता है देखेंगे, और वह पहले से ही है कि कहा जाता है। इसलिए यदि वे नहीं बन रहे हैं, तो हो सकता है कि उन्हें एक प्लगइन मिला हो जो 'intermediate_image_sizes_advanced'हुक का उपयोग करके उन्हें फ़िल्टर करता है ?
माइकस्किंकेल 1

मैंने वास्तव में get_intermediate_image_sizes () का उपयोग करने की कोशिश नहीं की थी; मुझे पता नहीं था कि इसे सभी पंजीकृत आकार मिले हैं। जिसे जानकर अब अच्छा लगा। मुझे अभी भी समझ में नहीं आया है कि उत्पन्न छवि आकार एक विशेष लगाव के साथ कैसे जुड़ा हुआ है, जैसे कि अगर मैं मीडिया लाइब्रेरी में देखना चाहता था, तो आप 3 आकार विकल्प देखते हैं, उनमें से एक का चयन करते समय, यह जानता है कि किस छवि को हथियाना है । Idk, यह उतना महत्वपूर्ण नहीं है। जब तक यह नहीं है। उस फ़ॉरेस्ट लूप को करने के बाद मैं अनुलग्नक को जोड़ने के लिए किस चर का उपयोग करूंगा? $ छवियां ['अंगूठे'] या कुछ और (जो भी आकार मुझे चाहिए)?
जारेडविल्ली

@ बोस्नियाई सरकार - हम दोनों ने पहली बार वास्तविक समस्या को याद किया। असली समस्या मूल उदाहरण में लगभग 7 या 8 कोड त्रुटियों के बारे में थी। देखिये मेरा अपडेटेड जवाब।
माइकस्किंकेल 3

हाँ, यहाँ देर हो चुकी थी और मैं ब्रेन डेड हो गया था।
बैनेटर्न

@ תניית אתרים - वही। :)
माइकस्किंकेल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.