फिलिप, कुछ भी संभव है यदि आप अपना दिमाग इसमें लगाते हैं। आप वर्डप्रेस इमेज एडिटर क्लास को बढ़ाकर अपनी समस्या को हल कर सकते हैं।
नोट मैं वर्डप्रेस 3.7 का उपयोग कर रहा हूं - मैंने पहले संस्करणों में और नवीनतम 3.8 रिलीज में नीचे दिए गए किसी भी कोड की जांच नहीं की है।
छवि संपादक मूल बातें
वर्डप्रेस में दो अंतर्निहित वर्ग हैं जो छवि हेरफेर को संभालते हैं:
WP_Image_Editor_GD
( /wp-includes/class-wp-image-editor-gd.php
)
WP_Image_Editor_Imagick
( /wp-includes/class-wp-image-editor-imagick.php
)
ये दो वर्ग विस्तारित होते हैं WP_Image_Editor
क्योंकि वे दोनों छवियों को लोड, आकार बदलने, संपीड़ित करने और सहेजने के लिए एक अलग छवि इंजन (क्रमशः जीडी और इमेजमैजिक) का उपयोग करते हैं।
डिफ़ॉल्ट रूप से WordPress सबसे पहले ImageMagick इंजन का उपयोग करने की कोशिश करेगा, जिसे PHP एक्सटेंशन की आवश्यकता होती है, क्योंकि यह आमतौर पर PHP के डिफ़ॉल्ट JD इंजन पर पसंद किया जाता है। अधिकांश साझा किए गए सर्वर में हालांकि ImageMagick एक्सटेंशन सक्षम नहीं है।
एक छवि संपादक जोड़ें
यह तय करने के लिए कि किस इंजन का उपयोग करना है, वर्डप्रेस एक आंतरिक फ़ंक्शन __wp_image_editor_choose()
(स्थित /wp-includes/media.php
) को कॉल करता है । यह फ़ंक्शन सभी इंजनों के माध्यम से देखता है कि कौन सा इंजन अनुरोध को संभाल सकता है।
फ़ंक्शन में एक फ़िल्टर भी होता है जो wp_image_editors
आपको अधिक छवि संपादकों को जोड़ने की अनुमति देता है जैसे:
add_filter("wp_image_editors", "my_wp_image_editors");
function my_wp_image_editors($editors) {
array_unshift($editors, "WP_Image_Editor_Custom");
return $editors;
}
ध्यान दें कि हम अपने कस्टम इमेज एडिटर क्लास को प्रिपेंड कर रहे हैं WP_Image_Editor_Custom
ताकि वर्डप्रेस चेक करेगा कि क्या हमारा इंजन अन्य इंजनों के परीक्षण से पहले रिसाइज़िंग को हैंडल कर सकता है।
हमारी छवि संपादक बनाना
अब हम अपना स्वयं का छवि संपादक लिखने जा रहे हैं ताकि हम अपने लिए फ़ाइल नाम पर निर्णय ले सकें। फाइलिंग को विधि द्वारा नियंत्रित किया जाता है WP_Image_Editor::generate_filename()
(दोनों इंजन इस विधि को विरासत में लेते हैं), इसलिए हमें अपने कस्टम वर्ग में इसे लिखना चाहिए।
चूंकि हम केवल फ़ाइल नाम बदलने की योजना बनाते हैं, इसलिए हमें मौजूदा इंजनों में से एक का विस्तार करना चाहिए, ताकि हमें पहिया को सुदृढ़ करना न पड़े। मैं WP_Image_Editor_GD
अपने उदाहरण में विस्तार करूँगा, क्योंकि आपके पास शायद ImageMagick एक्सटेंशन सक्षम नहीं है। हालांकि कोड एक इमेजमैजिक सेटअप के लिए विनिमेय है। यदि आप अलग-अलग सेटअप पर थीम का उपयोग करने की योजना बना रहे हैं, तो आप दोनों को जोड़ सकते हैं।
// Include the existing classes first in order to extend them.
require_once ABSPATH.WPINC."/class-wp-image-editor.php";
require_once ABSPATH.WPINC."/class-wp-image-editor-gd.php";
class WP_Image_Editor_Custom extends WP_Image_Editor_GD {
public function generate_filename($prefix = NULL, $dest_path = NULL, $extension = NULL) {
// If empty, generate a prefix with the parent method get_suffix().
if(!$prefix)
$prefix = $this->get_suffix();
// Determine extension and directory based on file path.
$info = pathinfo($this->file);
$dir = $info['dirname'];
$ext = $info['extension'];
// Determine image name.
$name = wp_basename($this->file, ".$ext");
// Allow extension to be changed via method argument.
$new_ext = strtolower($extension ? $extension : $ext);
// Default to $_dest_path if method argument is not set or invalid.
if(!is_null($dest_path) && $_dest_path = realpath($dest_path))
$dir = $_dest_path;
// Return our new prefixed filename.
return trailingslashit($dir)."{$prefix}/{$name}.{$new_ext}";
}
}
ऊपर दिए गए अधिकांश कोड को सीधे WP_Image_Editor
वर्ग से कॉपी किया गया और आपकी सुविधा के लिए टिप्पणी की गई। केवल वास्तविक परिवर्तन यह है कि प्रत्यय अब एक उपसर्ग है।
वैकल्पिक रूप से, आप प्रत्यय को एक उपसर्ग में बदलने के लिए कॉल parent::generate_filename()
और उपयोग कर सकते हैं mb_str_replace()
, लेकिन मुझे लगा कि गलत होने के लिए अधिक इच्छुक होगा।
मेटाडेटा के लिए नए रास्तों को सहेजना
अपलोड करने के बाद image.jpg
, अपलोड फ़ोल्डर इस तरह दिखता है:
2013/12/150x150/image.jpg
2013/12/300x300/image.jpg
2013/12/image.jpg
अब तक सब ठीक है। हालाँकि, जब मूलभूत फ़ंक्शन को कॉल किया जाता है wp_get_attachment_image_src()
, तो हम देखेंगे कि सभी छवि आकार image.jpg
नए निर्देशिका पथ के बिना संग्रहीत किए जाते हैं ।
हम छवि मेटाडेटा (जहाँ फ़ाइल नाम संग्रहीत हैं) में नए फ़ोल्डर संरचना को सहेजकर इस समस्या को हल कर सकते हैं। wp_generate_attachment_metadata
डेटाबेस में डाले जाने से पहले डेटा विभिन्न फिल्टर ( दूसरों के बीच) से चलता है, लेकिन चूंकि हम पहले से ही एक कस्टम छवि संपादक को लागू कर रहे हैं, इसलिए हम छवि के आकार मेटाडेटा के स्रोत पर वापस जा सकते हैं WP_Image_Editor::multi_resize()
:। यह इस तरह से सरणियाँ उत्पन्न करता है:
Array (
[thumbnail] => Array (
[file] => image.jpg
[width] => 150
[height] => 150
[mime-type] => image/jpeg
)
[medium] => Array (
[file] => image.jpg
[width] => 300
[height] => 300
[mime-type] => image/jpeg
)
)
हम multi_resize()
अपने कस्टम वर्ग में इस विधि को लिख देंगे :
function multi_resize($sizes) {
$sizes = parent::multi_resize($sizes);
foreach($sizes as $slug => $data)
$sizes[$slug]['file'] = $data['width']."x".$data['height']."/".$data['file'];
return $sizes;
}
जैसा कि आप देख सकते हैं, मैंने किसी भी कोड को बदलने की जहमत नहीं उठाई। मैं सिर्फ मूल विधि को कॉल करता हूं और इसे मेटाडेटा उत्पन्न करने देता हूं। फिर मैं परिणामस्वरूप सरणी के माध्यम से लूप करता हूं और file
प्रत्येक आकार के लिए मूल्य समायोजित करता हूं ।
अब wp_get_attachment_image_src($att_id, array(300, 300))
लौटता है 2013/12/300x300/image.jpg
। हुर्रे!
अंतिम विचार
मुझे उम्मीद है कि इसने आपके लिए एक अच्छा आधार प्रदान किया है। हालांकि, कृपया ध्यान दें कि यदि कोई चित्र निर्दिष्ट आकार (जैसे 280x300) से छोटा है, तो उत्पन्न प्रत्यय (हमारे मामले में उपसर्ग) और छवि का आकार 280x300 है, न कि 300x300। यदि आप बहुत से छोटे चित्र अपलोड करते हैं, तो आपको बहुत सारे अलग-अलग फ़ोल्डर मिलेंगे।
एक अच्छा समाधान यह होगा कि या तो एक फ़ोल्डर नाम ( small
,, medium
वगैरह) के रूप में आकार के स्लग का उपयोग करें या कोड को गोल आकार में निकटतम पसंदीदा छवि आकार तक विस्तारित करें।
आपने नोट किया कि आप निर्देशिका नाम के रूप में सिर्फ चौड़ाई का उपयोग करना चाहते हैं। हालांकि चेतावनी दी जा सकती है - प्लगइन्स या थीम एक ही चौड़ाई के साथ दो अलग-अलग आकार उत्पन्न कर सकते हैं लेकिन अलग-अलग ऊंचाइयां।
इसके अलावा, आप सेटिंग्स> मीडिया के तहत 'या मेरे अपलोड को महीने में व्यवस्थित करें' और वर्ष आधारित फ़ोल्डरों को अक्षम करके या generate_filename
आगे भी हेरफेर करके वर्ष / माह फ़ोल्डर को हटा सकते हैं ।
उम्मीद है की यह मदद करेगा। सौभाग्य!