৪.১ (ডাব্লুপি টিকিট # 18532) এ চিত্র স্কেলিং (রাউন্ডিং) পরিবর্তনের সাথে সমস্যাগুলি পরিচালনা করুন


17

আমি বর্তমানে একটি পুরানো প্রাক 4.1 সাইট থেকে একটি নতুন সেটআপে সাইটের সামগ্রী স্থানান্তর এবং # 18532 এর রাউন্ডিং ত্রুটি ইস্যু এবং এটি সম্পর্কিত সংশোধন সহ একটি সমস্যা হিট করার পথে রয়েছি

এই সংক্ষিপ্ত বিবরণ ওয়ার্ডপ্রেস পক্ষের দীর্ঘ স্থায়ী গোলাকার দুর্ব্যবহার:

কল্পনা করুন আমরা 693x173 সহ একটি চিত্র আপলোড করেছি এবং এটি 300 প্রস্থে স্কেল করব:

  • প্রাক 4.1: 300x74
  • পোস্ট 4.1: 300x75

সমস্যাটি

সাধারণত এটি কোনও সমস্যা সৃষ্টি করে না কারণ বিদ্যমান ফাইলগুলিকে <img>স্পর্শ করা হয়নি।

কিন্তু আপনি যখন একটি WXR ফাইল থেকে অঙ্গুষ্ঠ বা আমদানি সংযুক্তি ঘটার সম্ভবনা তারা ফাইলসিস্টেম সব যাব মধ্যে ভিন্নভাবে উত্পন্ন পেতে <img>মধ্যে post_contentমারা গেছে।

একটি সমাধান খোঁজা

আমি বিভিন্ন সমাধানের কথা ভাবছি:

খারাপ পুরানো সময় ফিরে

চেঞ্জসেট 30660 একটি নতুন ফিল্টার প্রবর্তন করেছে wp_constrain_dimensionsযা কেবলমাত্র 4.1 এর আগে থেকে পুরানো আচরণটি প্লাগ করতে ব্যবহার করা যেতে পারে This এটি সমস্যার সমাধান করে না। তবে আমি ভাবছি যে এটি পরে সমস্যাগুলির কারণ হতে পারে এবং সাধারণত আমি ঠিক করতে চাই তাই যদিও এটি কাজ করে আমি এটি আদর্শ হিসাবে মনে করি না।

দ্য টাইমস ওরা আ-চানগিন '

সুতরাং এটি আমাদের আরও একটি লক্ষ্য রেখে দেয়: ডিবি পরিষ্কার করুন এবং পুরানো ফাইলগুলির সমস্ত রেফারেন্সগুলিকে নতুন ফাইলগুলির উল্লেখ সহ প্রতিস্থাপন করুন। আমি এখন এখানে যে প্রশ্নটি করছি তা হ'ল এটি কীভাবে করা যায়। আমি কার্যকর এবং সাধারণভাবে প্রয়োগযোগ্য সমাধানের সন্ধান করছি কারণ আমি সন্দেহ করি যে এই সমস্যাটি করেছে এবং অনেক লোককে প্রভাবিত করবে

আমার বর্তমান ধারণাটি হ'ল:

  1. আমদানি করুন, পুনরায় জেনারেট করুন বা যা কিছু আমাদের নতুন ফাইল এবং ভাঙা ট্যাগ সহ ফেলে দেয়।
  2. ফাইল সিস্টেমের সমস্ত আকার পরিবর্তনকৃত ফাইলগুলি থেকে একটি তালিকা তৈরি করুন বা ডাটাবেস থেকে বিকল্পভাবে এই তথ্যটি পান
  3. এই তালিকাকে পার্স করুন এবং ৪.১ এর আগে দেখতে যেমন ফাইল প্লে হবে তার সমস্ত পিক্সেল দ্বারা অফসেটের সাথে একটি দ্বিতীয় তালিকা বি তৈরি করুন
  4. A এর সাথে সম্পর্কিত এন্ট্রি সহ বি এর সমস্ত উপস্থিতি প্রতিস্থাপন করে পুরো ডাটাবেসের উপর একটি অনুসন্ধান করুন এবং প্রতিস্থাপন করুন

এই পরিস্থিতিটি পরিচালনা করার জন্য এটি সবচেয়ে স্মার্ট এবং দক্ষ উপায় কিনা তা আমি নিশ্চিত নই way এটি কিছুটা নিষ্ঠুরতাও বোধ করে। সুতরাং এটি বাস্তবায়নের আগে আমি কেবল ডাব্লুপিএসই জনতার অসীম জ্ঞান দিয়ে পরীক্ষা করতে চেয়েছিলাম;)

[সম্পাদনা] সিকে-মাকিলোডের উত্তর পড়ার পরে (ধন্যবাদ!) আমি মনে করি কোনও স্থির সমাধান হওয়া উচিত এটি একবার এবং সর্বোপরি আপনার এই সমস্যাটি আপনার মাথার পিছনে নিয়মিত রাখার দরকার নেই। [/ সম্পাদনা]

[edit2] আমি সবেমাত্র ট্রাকে একটি সম্পর্কিত টিকিট পেয়েছি । রেফারেন্সের জন্য যুক্ত করা হচ্ছে। [/ edit2]


তুমি কোথায় error issue of #13852বলতে চাচ্ছো #18532? :)
আরাভোনা

2
উফ, হ্যাঁ, স্থির :)
kraftner

উত্তর:


4

এটি অন্য উত্তরের চেয়ে অন্য একটি পদ্ধতির যা আমদানিকারকের সাথে সামগ্রী আমদানি করার সময় কাজ করে এবং একবার এবং সকলের জন্য URL গুলি স্থির করে। আবার: এটি যুদ্ধ-পরীক্ষিত নয়, তবে সমাধানটি আমি স্থির করেছি এবং এটি কার্যকর হয়েছে work

আমি এটি পছন্দ করি কারণ এটি সমস্যাটি একবার এবং সকলের জন্য সমাধান করে এবং যদি এটি কাজ করে তবে তা কার্যকর হয় it যেহেতু আপনি ডিবিতে ভাঙ্গা জিনিস রেখে যাচ্ছেন না এবং এটি ডিসপ্লেতে ঠিক করে দিচ্ছেন আপনার পরে স্টাফ ভাঙার বিষয়ে চিন্তা করার দরকার নেই।

/*
Plugin Name:  Bugfix Ticket 31581 for WP_Importer
Plugin URI:   /wordpress//a/206992/47733
Description:  Fixes image references after post WP 4.1 image scaling change in post content when using the WP_Importer  (see https://core.trac.wordpress.org/ticket/31581)
Version:      0.0.1
*/

class Bugfix31581WPImporter {

    protected $remaps;

    /**
     * Initialize class, mainly setting up hooks
     */
    public function init(){

        if (WP_IMPORTING === true){

            $this->remaps = array();

            //This hook is chosen because it is pretty close to where the actual attachment import is happening.
            //TODO: May be reconsidered.
            add_filter('wp_update_attachment_metadata', array($this, 'collectRemaps'), 10 , 2);

            add_action('import_end', array($this, 'remap'));
            add_action('import_end', array($this, 'importEnded'));
        }

    }

    /**
     * Cleans up hooks after the import has ended.
     */
    public function importEnded(){
        remove_filter('wp_update_attachment_metadata', array($this, 'collectRemaps'), 10);

        remove_action('import_end', array($this, 'remap'), 10);
        remove_action('import_end', array($this, 'importEnded'), 10);
    }

    /**
     * When an attachment is added compare the resulting sizes with the sizes from the legacy algorithm and setup remap.
     *
     * @param $data
     * @param $post_id
     *
     * @return mixed
     */
    public function collectRemaps($data, $post_id ){

        $intermediate_sizes = $this->getIntermediateSizes();

        if(empty($data) || !array_key_exists('sizes', $data)){
            return $data;
        }

        foreach($data['sizes'] as $key => $size){

            $size_new_algorithm = array($size['width'], $size['height']);

            $dest_w = $intermediate_sizes[$key]['width'];
            $dest_h = $intermediate_sizes[$key]['height'];
            $crop = $intermediate_sizes[$key]['crop'];

            add_filter('wp_constrain_dimensions', array($this, 'legacy_wp_constrain_dimensions'), 10, 5);

            $size_old_algorithm = image_resize_dimensions($data['width'], $data['height'], $dest_w, $dest_h, $crop);

            //Bail out in the rare case of `image_resize_dimensions` returning false
            if($size_old_algorithm===false){
                continue;
            }

            $size_old_algorithm = array($size_old_algorithm[4], $size_old_algorithm[5]);

            remove_filter('wp_constrain_dimensions', array($this, 'legacy_wp_constrain_dimensions'), 10);

            // Compare the current size with the calculation of the old algorithm...
            $diff = array_diff($size_new_algorithm, $size_old_algorithm);

            // ...to detect any mismatches
            if(!empty($diff)){

                $oldFilename = $this->getOldFilename($size['file'], $size_old_algorithm);

                // If getting the old filename didn't work for some reason (probably other filename-structure) bail out.
                if($oldFilename===false){
                    continue;
                }

                if(!array_key_exists($post_id, $this->remaps)){
                    $this->remaps[$post_id] = array();
                }

                $this->remaps[$post_id][$size['file']] = array(
                    'file' => $oldFilename,
                    'size' => $key
                );
            }

        }

        return $data;
    }

    /**
     * Get resize settings for all image sizes
     *
     * Taken from wp_generate_attachment_metadata() in includes/image.php
     *
     * @return array
     */
    public function getIntermediateSizes(){

        global $_wp_additional_image_sizes;

        $sizes = array();
        foreach ( get_intermediate_image_sizes() as $s ) {
            $sizes[$s] = array( 'width' => '', 'height' => '', 'crop' => false );
            if ( isset( $_wp_additional_image_sizes[$s]['width'] ) )
                $sizes[$s]['width'] = intval( $_wp_additional_image_sizes[$s]['width'] ); // For theme-added sizes
            else
                $sizes[$s]['width'] = get_option( "{$s}_size_w" ); // For default sizes set in options
            if ( isset( $_wp_additional_image_sizes[$s]['height'] ) )
                $sizes[$s]['height'] = intval( $_wp_additional_image_sizes[$s]['height'] ); // For theme-added sizes
            else
                $sizes[$s]['height'] = get_option( "{$s}_size_h" ); // For default sizes set in options
            if ( isset( $_wp_additional_image_sizes[$s]['crop'] ) )
                $sizes[$s]['crop'] = $_wp_additional_image_sizes[$s]['crop']; // For theme-added sizes
            else
                $sizes[$s]['crop'] = get_option( "{$s}_crop" ); // For default sizes set in options
        }

        return $sizes;
    }

    /**
     * Turn the new filename into the old filename reducing the height by one
     *
     * @param $newFilename
     * @param $size
     *
     * @return mixed
     */
    public function getOldFilename($newFilename, $size){

        $dimensions = array();

        $filetypes = $this->getAllowedImageExtentions();

        // TODO: This pattern can be different. See `image_make_intermediate_size` in image editor implementation.
        $matchFiles = '/([0-9]{1,5})x([0-9]{1,5}).(' . $filetypes . ')$/';

        // Extract the dimensions
        preg_match($matchFiles,$newFilename,$dimensions);

        // If the file URL doesn't allow guessing the dimensions bail out.
        if(empty($dimensions)){
            return $newFilename;
        }

        $newStub = $dimensions[1] . 'x' . $dimensions[2] . '.' . $dimensions[3];

        $oldStub = $size[0] . 'x' . $size[1] . '.' . $dimensions[3];

        $oldFilename = str_replace($newStub,$oldStub,$newFilename);

        return $oldFilename;
    }

    /**
     * Extract all file extensions that match an image/* mime type
     *
     * @return string
     */
    protected function getAllowedImageExtentions(){
        $allowed_filetypes = get_allowed_mime_types();

        $allowed_images = array();

        foreach($allowed_filetypes as $extensions => $mimetype){
            if( substr($mimetype,0,6) == 'image/' ){
                $allowed_images[] = $extensions;
            }
        }

        return implode('|',$allowed_images);
    }


    /**
     * This is the heart of this class. Based on the collected remaps from earlier it does a S&R on the DB.
     */
    public function remap(){

        global $wpdb;

        foreach($this->remaps as $attachment_id => $replaces){

            foreach($replaces as $new_url => $old_data){

                $to_url = wp_get_attachment_image_src($attachment_id,$old_data['size']);
                $to_url = $to_url[0];

                $from_url = str_replace($new_url, $old_data['file'], $to_url);

                // remap urls in post_content
                $wpdb->query( $wpdb->prepare("UPDATE {$wpdb->posts} SET post_content = REPLACE(post_content, %s, %s)", $from_url, $to_url) );

                //TODO: This is disabled as enclosures can't be images, right?
                // remap enclosure urls
                //$result = $wpdb->query( $wpdb->prepare("UPDATE {$wpdb->postmeta} SET meta_value = REPLACE(meta_value, %s, %s) WHERE meta_key='enclosure'", $from_url, $to_url) );

            }

        }

    }

    /**
     * This is a copy of the legacy pre 4.1 wp_constrain_dimensions()
     *
     * @param $dimensions
     * @param $current_width
     * @param $current_height
     * @param $max_width
     * @param $max_height
     *
     * @return array
     */
    public function legacy_wp_constrain_dimensions($dimensions, $current_width, $current_height, $max_width, $max_height){
        if ( !$max_width and !$max_height )
            return array( $current_width, $current_height );

        $width_ratio = $height_ratio = 1.0;
        $did_width = $did_height = false;

        if ( $max_width > 0 && $current_width > 0 && $current_width > $max_width ) {
            $width_ratio = $max_width / $current_width;
            $did_width = true;
        }

        if ( $max_height > 0 && $current_height > 0 && $current_height > $max_height ) {
            $height_ratio = $max_height / $current_height;
            $did_height = true;
        }

        // Calculate the larger/smaller ratios
        $smaller_ratio = min( $width_ratio, $height_ratio );
        $larger_ratio  = max( $width_ratio, $height_ratio );

        if ( intval( $current_width * $larger_ratio ) > $max_width || intval( $current_height * $larger_ratio ) > $max_height )
            // The larger ratio is too big. It would result in an overflow.
            $ratio = $smaller_ratio;
        else
            // The larger ratio fits, and is likely to be a more "snug" fit.
            $ratio = $larger_ratio;

        // Very small dimensions may result in 0, 1 should be the minimum.
        $w = max ( 1, intval( $current_width  * $ratio ) );
        $h = max ( 1, intval( $current_height * $ratio ) );

        // Sometimes, due to rounding, we'll end up with a result like this: 465x700 in a 177x177 box is 117x176... a pixel short
        // We also have issues with recursive calls resulting in an ever-changing result. Constraining to the result of a constraint should yield the original result.
        // Thus we look for dimensions that are one pixel shy of the max value and bump them up
        if ( $did_width && $w == $max_width - 1 )
            $w = $max_width; // Round it up
        if ( $did_height && $h == $max_height - 1 )
            $h = $max_height; // Round it up

        return array( $w, $h );
    }

}

add_filter('import_start',array(new Bugfix31581WPImporter(),'init'));

ভাল কাজ একটি +1।
গাজাজ্যাপ

1

একটি বৃহত সাইটে সমস্ত চিত্র ফাইল (এবং লিঙ্ক) - এর জন্য বিশ্বব্যাপী এবং নিখুঁতভাবে সমস্যার সমাধান করা, সম্ভাব্যতার ভিত্তিতে, ব্যক্তিরা মাঝে মাঝে ডাব্লুপি স্টাইলে ম্যানুয়ালি ইমেজ ফাইলটির নামকরণ করতে পারে - এবং অন্যান্য বিজোড় প্রকরণ - অসুবিধা হতে পারে। ডাটাবেস অনুসন্ধান এবং প্রতিস্থাপন অপারেশনগুলিও জটিলতা (এবং ঝুঁকি!) জড়িত রয়েছে।

আমি ধারণা করতে পারি - ভাঙ্গা চিত্র এবং ভাঙা চিত্রের লিঙ্কগুলি - আপনি ত্রুটিগুলির বিশাল সংখ্যাটি হ্যান্ডেল করতে পারেন এবং নিম্নলিখিত পদ্ধতিটি দ্বারা পছন্দসই শেষ ফলাফল বা যুক্তিসঙ্গত ফ্যাসিমিল অর্জন করতে পারেন?

  1. নতুন "রাউন্ড" পদ্ধতির পরিবর্তে পুরানো "অন্তর্নিহিত" পদ্ধতি দ্বারা পুনরায় আকার দেওয়া সমস্ত চিত্রের পুনঃনির্মাণের তারিখটি সনাক্ত করুন। (আলাদা ধরণের কাট-অফও তৈরি করা যেতে পারে তবে তারিখটি সবচেয়ে সহজ বলে মনে হচ্ছে))

  2. প্রকাশিত সমস্ত পোস্টের জন্য <= কাট-অফ-ডেট, লোড / রেন্ডার সময় প্রিগ_রেপ্লেসটি দ্য_ কনটেন্ট () এ চালান, সমস্যার চিত্র বা নিদর্শন সহ সমস্ত চিত্র ফাইলগুলি ক্যাপচার করুন এবং তাদের পছন্দসই প্যাটার্নের সাথে প্রতিস্থাপন করুন। ডাটাবেস অপরিবর্তিত থাকবে, তবে আউটপুটটি বেশিরভাগ ক্ষেত্রে ত্রুটিমুক্ত থাকবে। আমি নিশ্চিত নই যে সমাধানটির "একবাক্য" পৃষ্ঠা পোস্টের সামগ্রীতে এবং সংরক্ষণাগার পৃষ্ঠাগুলি এবং অন্যান্য প্রক্রিয়াগুলিতেও উভয় প্রয়োগ করা দরকার।

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

আমি ইতিমধ্যে একটি সহজ ফাংশন লিখেছি যা আমি ব্যবহার করি (এবং আমি একটি প্লাগ-ইন রূপান্তর করার প্রক্রিয়াতে আছি), যা বিশ্বব্যাপী একটি নির্দিষ্ট তারিখ অবধি নির্ধারিত ডিরেক্টরিতে সমস্ত চিত্র ফাইলগুলি একটি ডিফল্ট চিত্র বা চিত্র-লিঙ্ক সহ প্রতিস্থাপন করে, উপরের বর্ণিত পদ্ধতি অনুসারে এটি এমন একটি সাইটের জন্য যেখানে কপিরাইটের অতিরিক্ত সতর্কতার সাথে অপারেটররা কেবল তাদের সমস্ত চিত্র মুছে ফেলেছিল, এ সম্পর্কে অবগত নয় যে, পুরানো পৃষ্ঠাগুলিতে কুৎসিত ফলাফল তৈরি করার পাশাপাশি, তারা হাজার হাজার ত্রুটিও ঘুরিয়ে দিচ্ছে, প্রত্যেকটির জন্য দুটি করে চিত্র।

আপনি যদি সমস্যাটির প্যাটার্নটিকে আরও সুনির্দিষ্টভাবে সংকুচিত করতে পারেন এবং উদাহরণস্বরূপ যেখানে আউটপুটটি পরিবর্তন করা দরকার, তবে আমি এটি আমার ফর্ম্যাটে প্লাগিংয়ের বিষয়ে দেখতে পেলাম - যা খুব জটিল নয় এবং যা আমার চেয়ে আরও ভাল রেজিএক্সারের জন্য এমনকি সহজ হতে। অন্যদিকে, যদি এই পদ্ধতিটি আপনার পক্ষে সমস্যার উত্তর না দেয় তবে আমি আপনার বা আমার সময় নষ্ট করতে চাই না।


আপনার এই গ্রহণের জন্য ধন্যবাদ! কিছু কিছু চিন্তাভাবনা: আমি মনে করি ডিবিতে ভুল তথ্য রয়েছে এবং এটি প্রদর্শনীতে বানর-প্যাচ করা খুব পরিষ্কার এবং টেকসই সমাধান নয়। এটি যে কোনও সময় ভঙ্গ করতে পারে এবং প্রতিটি দৃশ্যে পারফরম্যান্সের ক্ষতি করে। এটিতে অপ্রত্যাশিত পার্শ্ব প্রতিক্রিয়াও থাকতে পারে যেমন অন্যান্য প্লাগইনগুলির জন্য যা সামগ্রী অন্য কোনও উপায়ে পার্স করে বা পরিবর্তন করে। এটি কীভাবে করা হয় তার উপর নির্ভর করে চিত্রগুলি এখনও ব্যাকএন্ডে ভাঙা। সেক্ষেত্রে আমি মনে করি wp_constrain_dimensionsআমদানি করার সময় প্রশ্নে উল্লিখিত মাধ্যমে স্কেলিংটি পুনরায় সেট করা এবং থাম্বগুলি পুনর্নির্মাণ থেকে বিরত রাখা আরও পরিষ্কার হবে।
kraftner

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

আপনি সম্ভবত সঠিক যে এটির জন্য এক-আকারের-ফিট-সব সমাধান হবে না। আমি বর্তমানে এটি পরিচালনা করার বিভিন্ন উপায় অন্বেষণ করছি যার মধ্যে আপনার অনুরূপ একটি অন-রেন্ডার পদ্ধতির এবং একটি অন-আমদানি পদ্ধতির যা আমি এটি পছন্দ করি কারণ এটি একবার এবং সকলের জন্য সমাধান হয়। আমরা দেখতে পাব যেখানে এটি বাড়ে। :)
ক্রাফ্টনার

1

ঠিক আছে ফ্লাইতে ভাঙা চিত্র প্রতিস্থাপনের জন্য এটি একটি প্রাথমিক পদ্ধতির। সচেতন থাকুন যে এটি যুদ্ধ-পরীক্ষিত সমাধানের চেয়ে ধারণার প্রমাণ of এটি কেবলমাত্র the_contentফিল্টারটিতে রয়েছে যা কিছু পরিস্থিতিতে অযাচিত পার্শ্ব-প্রতিক্রিয়া (সম্ভবত) থাকতে পারে। যত্নের সাথে সামলানো. :)

যদিও এটি কোডেও তাই বলে আমিও আমার কোডটিতে ব্যবহৃত এই উত্তরটির জন্য @ রারস্টকে ক্রেডিট করতে চাই ।

/*
Plugin Name:  Bugfix 31581 Live
Plugin URI:   /wordpress//a/206986/47733
Description:  Fixes image references in post content after post 4.1 image scaling change (see https://core.trac.wordpress.org/ticket/31581)
Version:      0.0.1
*/

class Bugfix31581Live {

    protected $matchURLs;
    protected $matchFiles;

    protected $remaps;

    public function init(){

        $filetypes = $this->get_allowed_image_extentions();

        $baseurl = wp_upload_dir();
        $baseurl = preg_quote($baseurl['baseurl'], '/');

        $this->matchURLs = '/' . $baseurl . '\/.??([a-zA-Z0-9_-]*?\.(?:' . $filetypes . '))/';

        //TODO: This pattern can be different. See `image_make_intermediate_size` in image editor implementation
        $this->matchFiles = '/([0-9]{1,4})x([0-9]{1,4}).(' . $filetypes . ')$/';

        add_filter('the_content', array($this, 'update_urls') );
    }

    public function update_urls($content){

        $urls = array();

        preg_match_all($this->matchURLs,$content,$urls);

        // Bail out early if we don't have any match.
        if($urls === false || empty($urls[0])){
            return $content;
        }

        // Loop through all matches
        foreach($urls[0] as $url){

            // Try to resolve this URL to an attachment ID
            $id = $this->get_attachment_id($url);

            // If not  let's see if this might be a URL that has been broken by our beloved Changeset 30660
            if( $id === false ){

                $dimensions = array();

                // Extract the dimensions
                preg_match($this->matchFiles,$url,$dimensions);

                // If the file URL doesn't allow guessing the dimensions bail out.
                if(empty($dimensions)){
                    continue;
                }

                // Old filename
                $old = $dimensions[1] . 'x' . $dimensions[2] . '.' . $dimensions[3];

                // New filename (not sure if this exists yet)
                $new = $dimensions[1] . 'x' . ($dimensions[2]+1) . '.' . $dimensions[3];

                // Build the new URL (not sure if this exists yet)
                $new_url = str_replace($old,$new,$url);

                // Try to get the attachment with the new url
                $id = $this->get_attachment_id($new_url);

                // Bad luck. This also doesn't exist.
                if( $id === false ) {
                    continue;
                }

                // Just to be sure everything is in sync we get the URL built from id and size.
                $db_url = wp_get_attachment_image_src($id,array($dimensions[1], $dimensions[2]+1));

                // Check if the URL we created and the one wp_get_attachment_image_src builds are the same.
                if($new_url === $db_url[0]){

                    // Awesome let's replace the broken URL.
                    $content = str_replace($url,$new_url,$content);
                }

            }

        }

        return $content;
    }

    /**
     * Get the Attachment ID for a given image URL.
     *
     * @link   /wordpress//a/7094
     *
     * @param  string $url
     *
     * @return boolean|integer
     */
    protected function get_attachment_id( $url ) {

        $dir = wp_upload_dir();

        // baseurl never has a trailing slash
        if ( false === strpos( $url, $dir['baseurl'] . '/' ) ) {
            // URL points to a place outside of upload directory
            return false;
        }

        $file  = basename( $url );
        $query = array(
            'post_type'  => 'attachment',
            'fields'     => 'ids',
            'meta_query' => array(
                array(
                    'value'   => $file,
                    'compare' => 'LIKE',
                ),
            )
        );

        $query['meta_query'][0]['key'] = '_wp_attached_file';

        // query attachments
        $ids = get_posts( $query );

        if ( ! empty( $ids ) ) {

            foreach ( $ids as $id ) {

                $tmp = wp_get_attachment_image_src( $id, 'full' );

                // first entry of returned array is the URL
                if ( $url === array_shift( $tmp ) )
                    return $id;
            }
        }

        $query['meta_query'][0]['key'] = '_wp_attachment_metadata';

        // query attachments again
        $ids = get_posts( $query );

        if ( empty( $ids) )
            return false;

        foreach ( $ids as $id ) {

            $meta = wp_get_attachment_metadata( $id );

            foreach ( $meta['sizes'] as $size => $values ) {

                $tmp = wp_get_attachment_image_src( $id, $size );

                if ( $values['file'] === $file && $url === array_shift( $tmp ) )
                    return $id;
            }
        }

        return false;
    }

    protected function get_allowed_image_extentions(){
        $allowed_filetypes = get_allowed_mime_types();

        $allowed_images = array();

        foreach($allowed_filetypes as $extensions => $mimetype){
            if( substr($mimetype,0,6) == 'image/' ){
                $allowed_images[] = $extensions;
            }
        }

        return implode('|',$allowed_images);
    }

}

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