বড় চিত্রের আকারের সাথে স্বয়ংক্রিয়ভাবে আসল আপলোড করা চিত্রটি প্রতিস্থাপন করুন


13

যেহেতু আমাদের ব্যবহারকারীরা নিয়মিত ওয়েবসাইটে to 6 এমবি চিত্র ব্যবহার করতে চান (এবং প্রথমে সেগুলি পুনরায় আকার দেওয়ার পদ্ধতি সম্পর্কে খুব বেশি পরিচিত নন), ওয়ার্ডপ্রেস মূলগুলি সংরক্ষণ করে পাশাপাশি বিভিন্ন আকারে তাদের আকার পরিবর্তন করে।

আমি এমন একটি ফাংশন বা প্লাগইন চাই যা আপলোড করা চিত্রটি গ্রহণ করে, এটিকে আরও পরিচালনাযোগ্য কিছুতে পরিবর্তন করে এবং তারপরে আসলটি প্রতিস্থাপন করে।

আমি এমন কিছু ফাংশন দেখেছি যা আসলটি মুছে ফেলে তবে এটি প্রতিস্থাপন করে না, মানে পরবর্তী তারিখে থাম্বনেলগুলি পুনরায় তৈরি করা অসম্ভব। আমার এটি প্রতিস্থাপন করা দরকার যাতে ব্যবহারকারী একটি বৃহত চিত্র আপলোড করতে পারে এবং এটি স্বয়ংক্রিয়ভাবে পুনরায় আকার দেওয়া হয় এবং প্রয়োজনে ভবিষ্যতে পুনরায় আকার দেওয়ার জন্য সংরক্ষণ করা হয়।

উত্তর:


10

থিম ফোল্ডারে ফাংশন.এফপি ফাইলটিতে এটি যুক্ত করুন। এটি সেটিংসে বড় চিত্র সেট করে মূল চিত্রটি প্রতিস্থাপন করে। আপনি একটি নতুন চিত্র ফর্ম্যাট সেটআপ করতে এবং এটি নতুন মূল আকার হিসাবে ব্যবহার করতে পারেন।

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 ছিল (আমার প্রয়োজনের চেয়ে দ্বিগুণ বড়) এবং এখন এটি সব কাজ করছে, মূল চিত্রগুলি কেবল দ্বিগুণ হয়ে সংরক্ষিত হয়েছে বড় হিসাবে আমি তাদের প্রয়োজন (যা আমি ভবিষ্যতের জন্য রাখতে চাই) পরিবর্তে বহুবার। ধন্যবাদ!
শান

দুর্দান্ত জিনিস, খুশি যে এটি আপনার জন্য কাজ করেছে!
পল ফিলিপস

এই কোডটি আমার ফাংশন.এফপি ফাইল থেকে সমস্ত কিছু মুছে ফেলেছে। আমি ডাব্লুপি সম্পাদক এবং এফটিপিতে পরীক্ষা করেছিলাম এবং ফাইলটি খালি ছিল। ব্যাকআপ থেকে ফাইলটি পুনরুদ্ধার করতে হয়েছিল। :(
jlg

1
@ সিপরিয়ান আপনাকে সেগুলির মাধ্যমে পুনরাবৃত্তি করতে একটি স্ক্রিপ্ট সেট আপ করতে হবে। আমি নিশ্চিত যে সমস্ত সংযুক্তি তথ্য পাওয়ার একটি ওয়ার্ডপ্রেস উপায় আছে তবে $ wpdb-> get_col ('wp_posts থেকে আইডি নির্বাচন করুন যেখানে পোস্ট_ টাইপ = "সংযুক্তি" দ্বারা "অর্ডার"); ইমেজগুলির জন্য পোস্ট আইডির একটি তালিকা পেতে কাজ করবে। হতে পারে যুক্ত করুন: এবং পোস্ট_মাইম_ টাইপ = "ইমেজ / জেপেইগ" কেবল জেপিগুলিতে সীমাবদ্ধ নেই। প্রতিটি চিত্রের আসল অবস্থানটি 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

আমি কি উপরের উত্তরের কোডটিতে আপডেটের পরামর্শ দিতে পারি? দুর্ভাগ্যক্রমে ওয়ার্ডপ্রেসের নতুন সংস্করণগুলিতে ফাইলের আকারগুলির জন্য কী 'পাথ' আর সরবরাহ করা হবে না। সুতরাং এটি পুরানো পোস্ট আপলোডগুলিতে কাজ করার জন্য, আমাদের প্রথমে আসল সাবডিরটি মূল চিত্র থেকে পাওয়া উচিত এবং এটি বৃহত চিত্রের জন্য অবস্থানের পথ তৈরি করতে ব্যবহার করা উচিত।

সুতরাং এই লাইনটি প্রতিস্থাপন করুন:

$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";
    }

আমি আমার পূর্ণ কোড এবং আরও ব্যাখ্যা এখানে পোস্ট করেছি: আসল চিত্রটি মুছুন - থাম্বনেইল রাখবেন?

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