কাস্টম আপলোড ডিরেক্টরিতে প্রতিটি কাস্টম চিত্রের আকার?


11

আমি কাস্টম ফোল্ডারে আমার কাস্টম চিত্রের আকারগুলি আপলোড করতে চাই। ফোল্ডারে নির্বাচিত প্রস্থের নাম থাকা উচিত। উদাহরণ স্বরূপ:

আমি যদি এই কাস্টম আকারগুলি যুক্ত করি ...

add_image_size('custom-1', 300, 9999);
add_image_size('custom-2', 400, 9999);

এটি ভালো লাগবে যে আপলোড করা চিত্রগুলি এভাবে আপলোড করা হয়:

http://www.my-site.com/wp-content/uploads/300/my-image.jpg
http://www.my-site.com/wp-content/uploads/400/my-image.jpg

এটা কি সম্ভব? আমি কেবলমাত্র খুঁজে পেয়েছি যে আমি আপলোড_ডায়ার ফিল্টারটি দিয়ে বিশ্বব্যাপী আপলোড ফোল্ডারটি পরিবর্তন করতে পারি ।

উত্তর:


21

ফিলিপ, আপনি যদি নিজের মন এতে সেট করেন তবে কিছু সম্ভব। আপনি ওয়ার্ডপ্রেস ইমেজ সম্পাদক শ্রেণীর বাড়িয়ে আপনার সমস্যাটি সমাধান করতে পারেন।

দ্রষ্টব্য আমি ওয়ার্ডপ্রেস ৩.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কারণ তারা উভয়ই চিত্র লোড, পুনরায় আকার, সংকোচন এবং সংরক্ষণ করতে একটি পৃথক চিত্র ইঞ্জিন (যথাক্রমে জিডি এবং চিত্রম্যাগিক) ব্যবহার করে।

ডিফল্টরূপে ওয়ার্ডপ্রেস প্রথমে চিত্রম্যাগিক ইঞ্জিনটি ব্যবহার করার চেষ্টা করবে, যার পিএইচপি এক্সটেনশন প্রয়োজন, কারণ এটি সাধারণত পিএইচপি'র ডিফল্ট জিডি ইঞ্জিনের চেয়ে বেশি পছন্দ করা হয়। সর্বাধিক ভাগ করা সার্ভারগুলিতে চিত্রম্যাগিক এক্সটেনশন সক্ষম করা নেই।


একটি চিত্র সম্পাদক যুক্ত করুন

কোন ইঞ্জিনটি ব্যবহার করবেন তা স্থির করার জন্য, ওয়ার্ডপ্রেস একটি অভ্যন্তরীণ ফাংশন কল করে __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আমার উদাহরণটিতে প্রসারিত করব, কারণ আপনার সম্ভবত চিত্রম্যাগিক এক্সটেনশন সক্ষম নেই। কোডটি ইমেজম্যাগিক সেটআপের জন্য হলেও বিনিময়যোগ্য। আপনি যদি বিভিন্ন সেটআপে থিমটি ব্যবহার করার পরিকল্পনা করছেন তবে আপনি উভয়ই যুক্ত করতে পারেন।

// 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), উত্পন্ন প্রত্যয় (আমাদের ক্ষেত্রে উপসর্গ) এবং চিত্রের আকারগুলি 300x300 নয় 280x300 হয়। আপনি যদি অনেক ছোট ছবি আপলোড করেন তবে আপনি প্রচুর আলাদা ফোল্ডার পাবেন।

একটি ভাল সমাধান হয় যেমন একটি ফোল্ডার নাম (আকার স্লাগ্ ব্যবহার করতে হবে small, medium, ইত্যাদি) অথবা নিকটতম পছন্দের ছবির আকার বৃত্তাকার মাপ কোড আপ প্রসারিত।

আপনি উল্লেখ করেছেন যে আপনি কেবলমাত্র প্রশস্তিকে ডিরেক্টরি নাম হিসাবে ব্যবহার করতে চান। যদিও সতর্কতা অবলম্বন করুন - প্লাগইন বা থিমগুলি একই প্রস্থের সাথে ভিন্ন ভিন্ন উচ্চতা সহ দুটি পৃথক আকারের উত্পাদন করতে পারে।

এছাড়াও, আপনি সেটিংস> মিডিয়া এর অধীনে 'আমার আপলোডগুলি মাসে- এবং বছর-ভিত্তিক ফোল্ডারগুলিকে সংগঠিত করুন' অক্ষম করে বা আরও কিছু চালিয়ে যাওয়ার মাধ্যমে বছর / মাসের ফোল্ডারগুলি সরাতে পারেন generate_filename

আশাকরি এটা সাহায্য করবে. শুভকামনা!


3
কি উত্তর! : ডি ভাল মানুষ!
ফিলিপ কাহন

1
আপনাকে স্বাগতম! আমি ধরে নিচ্ছিলাম যে আপনার কাছে কমপক্ষে ওওপি এবং ডাব্লুপি ফিল্টার অভিজ্ঞতা রয়েছে তবে আপনি যদি এখনও বুঝতে পারেন না এমন কিছু থাকে তবে নির্দ্বিধায় জিজ্ঞাসা করুন। অনুগ্রহ করার জন্য আপনাকে ধন্যবাদ!
রবার্ট

2
@ রবার্ট ফ্র্যাঙ্কলি, এটি দুর্দান্ত। মিডিয়া আপলোড সিস্টেমে অ্যাকশন এবং ফিল্টার হুকের অভাবে আমি আমার চুল ছিঁড়ে ফেলছিলাম। এটি পূর্বসূচীতে স্পষ্ট বলে মনে হয়, তবে চিত্র সম্পাদকদের সম্পূর্ণরূপে ওভাররাইড করার বিষয়টি আমার কাছে ঘটেছিল না। এমনটি করলে একের মধ্যে অনেক সমস্যার সমাধান হয়।
জোনাথন ফিঙ্গল্যান্ড

1
@ জোনাথানফিংল্যান্ড্যান্ড হা, আমি স্বীকার করি আমাকে এর জন্য খরগোশের গর্ত থেকে অনেক নিচে যেতে হয়েছিল। সাহায্য করতে পেরে খুশি!
রবার্ট

ছোট নোট - কোডের সর্বশেষ শান্তিতে (পাবলিক ফাংশন মাল্টি_রেসাইজ (izes আকার)) কীওয়ার্ড "পাবলিক" ওয়েবসাইটকে ডাউন করে দেয়। কেবল এটি সরিয়ে ফেলুন এবং এটি আবার শেষ। 2 কে 17 এবং আপনার উত্তরটি এখনও দুর্দান্ত, আপনাকে ধন্যবাদ !!
প্যারাডাক্সেশন

3

@ রবার্টের উত্তরটি ওয়ার্ডপ্রেস দ্বারা উত্পাদিত বিকল্প আকারগুলি পৃথক ডিরেক্টরিতে সঞ্চয় করার আমার প্রচেষ্টাতে একটি divineশিক সম্পদ ছিল। আমার কোডও আপলোড ডিরেক্টরিটিকে ./media এ পরিবর্তন করে তাই আপনি যদি না চান তবে এই লাইনগুলি সম্পাদনা করতে ভুলবেন না। এটি প্রথম পোস্টারের প্রশ্নের সঠিক উত্তর নয়, তবে একই সমস্যার বিকল্প সমাধান দেয়:

if ( !is_multisite() ) {
    update_option( 'upload_path', 'media' ); //to-do: add to options page
    define( 'UPLOADS', 'media' ); //define UPLOADS dir - REQUIRED
}
//don't “Organize my uploads into month- and year-based folders”
update_option( 'uploads_use_yearmonth_folders', '0' ); // to-do: add to options page

//create a custom WP_Image_Editor that handles the naming of files
function tect_image_editors($editors) {
    array_unshift( $editors, 'WP_Image_Editor_tect' );

    return $editors;
}

add_filter( 'wp_image_editors', 'tect_image_editors' );

require_once ABSPATH . WPINC . '/class-wp-image-editor.php';
require_once ABSPATH . WPINC . '/class-wp-image-editor-gd.php';

class WP_Image_Editor_tect extends WP_Image_Editor_GD {
    public function multi_resize($sizes) {
        $sizes = parent::multi_resize($sizes);

        $media_dir = trailingslashit( ABSPATH . UPLOADS );

        foreach($sizes as $slug => $data) {
            $default_name = $sizes[ $slug ]['file'];
            $new_name = $slug . '/' . preg_replace( '#-\d+x\d+\.#', '.', $data['file'] );

            if ( !is_dir( $media_dir . $slug ) ) {
                mkdir( $media_dir . $slug );
            }
            //move the thumbnail - perhaps not the smartest way to do it...
            rename ( $media_dir . $default_name, $media_dir . $new_name );

            $sizes[$slug]['file'] = $new_name;
        }

        return $sizes;
    }
}

আমার পরীক্ষাগুলি অনুসারে কোনও সমস্যা ছাড়াই কাজ করে, যদিও আমি জনপ্রিয় গ্যালারী / মিডিয়া প্লাগিনগুলির সাথে এটি কীভাবে ভাড়া নেয় তা খতিয়ে দেখার চেষ্টা করি নি।

সংশ্লিষ্ট বোনাস: সব ওয়ার্ডপ্রেস উত্পন্ন থাম্বনেল মুছে দেওয়ার একটি কাঁচা ইউটিলিটি delete_deprecated_thumbs.php


1

আমি ওয়ার্ডপ্রেস কোডের এই অংশগুলি দেখেছি এবং আমি ভয় করি যে আমার কোনও ভাল খবর নেই।

এখানে 2 টি শ্রেণি রয়েছে:

  • WP_Image_Editor_GD
  • WP_Image_Editor_Imagick,

উভয় বিমূর্ত বিস্তৃত WP_Image_Editor

এই ক্লাসগুলি multi_resizeপদ্ধতি প্রয়োগ করছে , যা আপলোডকৃত একাধিক চিত্র তৈরি করতে ব্যবহৃত হয়।

সত্যিই খারাপ খবরটি হ'ল সেখানে কোনও ফিল্টার হুক নেই, যা আমরা সদ্য নির্মিত ফাইলগুলির জন্য গন্তব্য পথটি পরিবর্তন করতে ব্যবহার করতে পারি।


এটা লজ্জার. আমি সুন্দর ইমেজার.জেগুলি বাস্তবায়িত করতে চেয়েছিলাম তবে এটি সম্ভবত এটি ছাড়া কার্যকর হবে না।
ফিলিপ Kühn

দেখে মনে হচ্ছে ইমেজার.জেস ছবিগুলিকে বটগুলিতে অদৃশ্য করে তোলে (গুগল, ফেসবুক, ইত্যাদি), সুতরাং আমি এটি ব্যবহার করার বিরুদ্ধে পরামর্শ দিই (যদি আপনি নিজে নিজে কোনও noscriptট্যাগও যোগ না করেন )
fregante

হুম না আমি তাই মনে করি না। আপনি সাধারণত কোনও চিত্রের এসআরসি-র সাথে ইমগ-ট্যাগ ব্যবহার করেন। আর তুমি অতিরিক্ত অন্যান্য ইমেজ-আকারের একটি বাক্য গঠন সঙ্গে একটি ডেটা-ট্যাগ যোগ করুন: <img src="http://placehold.it/260" data-src="http://placehold.it/{width}" />। এবং তারপরে স্ক্রিপ্টটি পরীক্ষা করে থাকে যে কোন আকারে ইম্জি রয়েছে এবং এটির জন্য সেরা চিত্রের আকার লোড করে।
ফিলিপ কাহন

@ ফিলিপাহ্ন আমিও হতাশ। আপনার পরিকল্পনা বেশ ঝরঝরে ছিল এবং আমি (পরে থিম পরিবর্তন করুন ... ব্যথা হয় মোছার অব্যবহৃত থাম্বনেল) এটি ব্যবহার করতে আপলোড ডিরেক্টরির আপ পরিপাটি চেয়েছিলেন
Krzysiek Dróżdż

@ KrzysiekDróżdż আরে আমি মনে করি এটি পেয়েছি। নীচে আমার উত্তর তাকান। এই সমাধানের সাহায্যে আপনি ফাইলের নাম অনুসারে চিত্রগুলি এফটিপি দিয়ে বাছাই করতে পারেন এবং অব্যবহৃত চিত্রের আকারগুলি সহজেই সরিয়ে ফেলতে পারেন।
ফিলিপ Kühn

1

ঠিক আছে, আমার মনে হয় আমি পেয়েছি! নিখুঁত নয় তবে ঠিক আছে এর জন্য আমি এটি চেয়েছিলাম। আমার জন্য কেবল একটি চিত্রের প্রস্থই গুরুত্বপূর্ণ। উচ্চতা আমার পক্ষে অকেজো। বিশেষত Imager.js বাস্তবায়নের জন্য চিত্র url এ উচ্চতা বিঘ্নিত হয়।

add_filter('image_make_intermediate_size', 'custom_rename_images');

function custom_rename_images($image) {
    // Split the $image path
    $info = pathinfo($image);
    $dir = $info['dirname'] . '/';
    $ext = '.' . $info['extension'];
    $name = wp_basename($image, '$ext');

    // New Name
    $name_prefix = substr($name, 0, strrpos($name, '-'));
    $size_extension = substr($name, strrpos($name, '-') + 1);
    $image_sizes = explode('x', $size_extension);
    $image_width = $image_sizes[0];
    $new_name = $dir . $image_width . '-' . $name_prefix . $ext;

    // Rename the intermediate size
    $did_it = rename($image, $new_name);

    // Return if successful
    if ($did_it) return $new_name;

    // Return on fail
    return $image;
}

এই কোডের সাথে ফাইলের নামগুলি হ'ল:

http://www.my-site.com/wp-content/uploads/300-my-image.jpg
http://www.my-site.com/wp-content/uploads/400-my-image.jpg

এটা না , ফাইলের নাম করার জন্য একটি subfolder যোগ করার জন্য যদি আমি সবসময় মূল উৎস একটি পোস্ট / পৃষ্ঠা থেকে ইমেজ যোগ পরিবর্তে ব্যবহৃত কারণ সম্ভব। এবং মুছে ফেলার ক্ষেত্রে এই চিত্রগুলি সরানোও কাজ করবে না। আমি নিশ্চিত না কেন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.