मूल अपलोड की गई छवि को बड़ी छवि के आकार के साथ स्वचालित रूप से बदलें


13

जैसा कि हमारे उपयोगकर्ता नियमित रूप से वेबसाइट पर उपयोग करने के लिए ~ 6MB छवियां अपलोड करते हैं (और पहले उनका आकार बदलने के तरीके से भी परिचित नहीं हैं), वर्डप्रेस मूल और साथ ही साथ कई अलग-अलग आकारों में उनका संग्रह करता है।

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

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

जवाबों:


10

इसे थीम फ़ोल्डर में functions.php फाइल में जोड़ें। यह सेटिंग्स में बड़ी छवि के साथ मूल छवि को बदल देता है। आप एक नया छवि प्रारूप सेटअप कर सकते हैं और नए मूल आकार के रूप में उपयोग करना चाहते हैं।

function replace_uploaded_image($image_data) {
      // if there is no large image : return
  if (!isset($image_data['sizes']['large'])) return $image_data;

  // paths to the uploaded image and the large image
  $upload_dir = wp_upload_dir();
  $uploaded_image_location = $upload_dir['basedir'] . '/' .$image_data['file'];
  // $large_image_location = $upload_dir['path'] . '/'.$image_data['sizes']['large']['file']; // ** This only works for new image uploads - fixed for older images below.
  $current_subdir = substr($image_data['file'],0,strrpos($image_data['file'],"/"));
  $large_image_location = $upload_dir['basedir'] . '/'.$current_subdir.'/'.$image_data['sizes']['large']['file'];

  // delete the uploaded image
  unlink($uploaded_image_location);

  // rename the large image
  rename($large_image_location,$uploaded_image_location);

  // update image metadata and return them
  $image_data['width'] = $image_data['sizes']['large']['width'];
  $image_data['height'] = $image_data['sizes']['large']['height'];
  unset($image_data['sizes']['large']);

  return $image_data;
}

add_filter('wp_generate_attachment_metadata','replace_uploaded_image');

1
यदि यह समाधान काम करता है, तो एक प्लगइन बनाना बहुत उपयोगी होगा।
अलेक्सई

मैंने अभी इसे फिर से आजमाया है, लेकिन पहले मैंने एक नया आकार जोड़ा (जिसे 'फुलसाइज़' कहा जाता है) जो कि 2048x1536 था (जितना मुझे इसकी आवश्यकता है उससे दोगुना बड़ा) और अब यह सब काम कर रहा है, मूल चित्र सिर्फ दो बार ही सहेजे गए हैं कई बार मुझे उनकी ज़रूरत होती है (जो मैं भविष्य के लिए रखना चाहता हूं) कई बार के बजाय। धन्यवाद!
शॉन

महान सामान, खुशी है कि यह आपके लिए काम करता है!
पॉल फिलिप्स

इस कोड ने मेरे functions.php फ़ाइल से सब कुछ हटा दिया। मैंने WP संपादक में और एफ़टीपी में जाँच की और फ़ाइल खाली थी। फ़ाइल को बैकअप से पुनर्स्थापित करना था। :(
jlg

1
@Ciprian आप उन सभी के माध्यम से पुनरावृति करने के लिए एक स्क्रिप्ट स्थापित करना होगा। मुझे यकीन है कि सभी अनुलग्नक जानकारी प्राप्त करने का एक वर्डप्रेस तरीका है, लेकिन $ wpdb-> get_col ('wp_posts से आईडी का चयन करें जहां पोस्ट_टाइप = "अनुलग्नक" आईडी द्वारा आदेश "); छवियों के लिए पोस्ट Ids की सूची प्राप्त करने के लिए काम करेगा। हो सकता है कि जोड़: और post_mime_type = "image / jpeg" भी केवल jpegs तक सीमित करने के लिए। प्रत्येक छवि का वास्तविक स्थान wp_postmeta में आयोजित किया जाता है।
पॉल फिलिप्स

3

ऊपर के घोल में एक बुरा बग है। समाधान नई छवियों के लिए एक आकर्षण के रूप में काम करता है, लेकिन पुरानी छवियों के लिए, आपको कभी भी तुलना नहीं करनी चाहिए $upload_dir['path']क्योंकि यह वर्तमान महीने का वर्तमान अपलोड फ़ोल्डर है।

निम्नलिखित को बदलें:

//$large_image_location = $upload_dir['path'] . '/'.$image_data['sizes']['large']['file'];
$large_image_location = $upload_dir['basedir'] . '/'.$image_data['sizes']['large']['path'];

2

क्या मैं उपरोक्त उत्तर के कोड को अपडेट करने का सुझाव दे सकता हूं? दुर्भाग्य से Wordpress के नए संस्करणों में कुंजी 'पथ' अब फ़ाइल आकारों के लिए प्रदान नहीं की गई है। इसलिए इसे पुराने पोस्ट अपलोड पर काम करने के लिए, हमें पहले मूल छवि से वर्तमान सबडिर प्राप्त करना चाहिए और बड़ी छवि के लिए स्थान पथ बनाने के लिए इसका उपयोग करना चाहिए।

इसलिए इस लाइन को बदलें:

$large_image_location = $upload_dir['basedir'] . '/'.$image_data['sizes']['large']['path'];

इन 2 पंक्तियों द्वारा:

$current_subdir = substr($image_data['file'],0,strrpos($image_data['file'],"/"));
$large_image_location = $upload_dir['basedir'] . '/'.$current_subdir.'/'.$image_data['sizes']['large']['file'];

0

मैंने इसे इसी तरह के एक और सवाल पर पोस्ट किया है, लेकिन सोचा कि यह रीपोस्टिंग के लायक है।

मेरे पास ऊपर दिए गए कोड के साथ समस्याएं थीं और मेरे लिए जो काम किया गया था, वह इन पंक्तियों को अनिवार्य रूप से बदल रहा था।

unlink($uploaded_image_location);
rename($large_image_location, $uploaded_image_location);

साथ में:

    $file_to_be_copied = $large_image_location; 
    $copied_file_name = $uploaded_image_location;
  //make a copy of the large image and name that the title of the original image
    if (!copy($file_to_be_copied, $copied_file_name)) {
        echo "failed to copy $file...\n";
    }

मैंने अपना पूर्ण कोड और अधिक स्पष्टीकरण यहां पोस्ट किया है: मूल छवि हटाएं - थंबनेल रखें?

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