ডব্লিউপি.মিডিয়া.ভিউ.এমিজিডিটেলস - এইচটিএমএল 5 ডেটা হিসাবে সেটিংস সংরক্ষণ করুন- * চিত্রের জন্য বৈশিষ্ট্যগুলি


19

আমি অবশেষে যা অর্জন করতে চাই তা হ'ল চিত্রের বিবরণ বাক্সে অতিরিক্ত সেটিংস যুক্ত করা হবে <img>যা data-*বৈশিষ্ট্য হিসাবে চিত্র ট্যাগে সঞ্চিত হবে

উদাহরণ: <img src="..." data-my_setting="...">


আমার কোড

আমি একটি প্লাগইন তৈরি করছি এবং আপনি যখন ছবিগুলি সম্পাদনা করেন তখন আমার আরও সেটিংস তৈরি করতে হবে। এখন পর্যন্ত আমার কাছে নিম্নলিখিত কোড রয়েছে:

jQuery(function($) {

    var imageDetails = wp.media.view.ImageDetails

    wp.media.view.ImageDetails = wp.media.view.ImageDetails.extend({
        // Initialize - Call function to add settings when rendered
        initialize: function() {
            this.on('post-render', this.add_settings);
        },
        // To add the Settings
        add_settings: function() {
            $('.advanced-section').prepend('\
                <h2>My Settings</h2>\
                <input type="text" class="my_setting">\
            ');

            // Set Options
            this.controller.image.set({"data-settings": 'setting-value-here'})
        }
    });

}) // End of jQuery(function($))

আমি একটি নতুন পোস্ট তৈরি করেছি এবং একটি চিত্র যুক্ত করেছি, তারপরে এটি ক্লিক করে সম্পাদনা টিপুন (সরঞ্জামদণ্ডের পেন্সিল আইকনটি পপ আপ হয়েছে)। আমি চিত্র বিশদ পৃষ্ঠায় শেষ করেছি এবং এটি দেখতে এটির মতো দেখাচ্ছে:

এখানে চিত্র বর্ণনা লিখুন

এ পর্যন্ত সব ঠিকই. এই লাইনে:

this.controller.image.set({"data-settings": 'setting-value-here'})

আমি ইনপুটটির মান পেতে সাধারণত jQuery ব্যবহার করতাম, তবে পরীক্ষার উদ্দেশ্যে আমি এটিকে একটি স্ট্যাটিক মান হিসাবে পরিবর্তন করেছি 'setting-value-here'। আমি চিত্র বিবরণ বাক্সের নীচে-ডানদিকে 'আপডেট' টিপলাম।


সমস্যাটি

পাঠ্য সম্পাদকটিতে এটি এইচটিএমএল কোডটি দেখায়:

এখানে চিত্র বর্ণনা লিখুন

এই না একটি আছে data-settings="setting-value-here"কীভাবে আসবেন?

আমি যদি এর সাথে লাইনটি প্রতিস্থাপন করি:

 this.controller.image.set({alt: 'setting-value-here'})

এটা তোলে করেন পরিবর্তন এবং ALT করার ট্যাগ alt="setting-value-here"। সুতরাং আমি ডেটা- অ্যাট্রিবিউট সেট করার চেষ্টা করে কী ভুল করছি?


সমাধান

ধন্যবাদ @bonger (যিনি 50 সম্মাননার পূর্ণ খয়রাত পেয়েছিলাম), আমি নিম্নলিখিত কোড আছে:

পিএইচপি:

function add_my_settings() {
    ob_start();
    wp_print_media_templates();
    $tpl = ob_get_clean();
    if ( ( $idx = strpos( $tpl, 'tmpl-image-details' ) ) !== false
            && ( $before_idx = strpos( $tpl, '<div class="advanced-section">', $idx ) ) !== false ) {
        ob_start();
        ?>
        <div class="my_setting-section">
            <h2><?php _e( 'My Settings' ); ?></h2>
            <div class="my_setting">
                <label class="setting my_setting">
                    <span><?php _e( 'My Setting' ); ?></span>
                        <input type="text" data-setting="my_setting" value="{{ data.model.my_setting }}" />
                    </label>
                </div>
            </div>
        <?php
        $my_section = ob_get_clean();
        $tpl = substr_replace( $tpl, $my_section, $before_idx, 0 );
    }
    echo $tpl;
};

// Hack the output of wp_print_media_templates()
add_action('wp_enqueue_media', $func =
    function() {
        remove_action('admin_footer', 'wp_print_media_templates');
        add_action('admin_footer',  'add_my_settings');
    }
);

জাভাস্ক্রিপ্ট: (ব্যবহার করে সারিবদ্ধ করা প্রয়োজন wp_enqueue_script())

// When Image is Edited
wp.media.events.on('editor:image-edit', function(data) {
    data.metadata.my_setting = data.editor.dom.getAttrib( data.image, 'data-my_setting' );
});

// When Image is Updated
wp.media.events.on('editor:image-update', function(data) {
    data.editor.dom.setAttrib( data.image, 'data-my_setting', data.metadata.my_setting );
});

3
আমি আশা করি আমি +2 করতে পারি - সুস্পষ্ট, সংক্ষিপ্ত, ভাল গবেষণা, সুতরাং বিষয়টিতে এটি ব্যাথা করে। এ জাতীয় প্রশ্নগুলি একটি বিরল জাতের are
TheDeadMedic

2
ধন্যবাদ! আমি সবসময় চেষ্টা করি এবং জিজ্ঞাসা করার আগে আমার সমস্যাগুলি যতটা সম্ভব গবেষণা (এবং ব্যাপকভাবে ডিবাগ করা) করি। (আপনি যখন খুব সহজ প্রশ্ন খুঁজে পান তখন আমি এটি ঘৃণা করি এবং ওপি গুগলিংয়ের চেষ্টাও করেনি)
কাস্পার লি

উত্তর:


14

এটি করার একটি উপায় হ'ল (খুব সুবিধাজনক) editor:image-editএবং editor:image-updateইভেন্টটি ডিনকে wpeditimageসরাসরি / সেট করার জন্য টিনিমস প্লাগইন দ্বারা চালিত ইভেন্টগুলি ( ক্রিয়াতে মোড়কে আপডেট করা wp_enqueue_media):

add_action( 'wp_enqueue_media', function () {
    add_action( 'admin_footer', function () {
        ?>
        <script type="text/javascript">
        jQuery(function ($) {
            if (wp && wp.media && wp.media.events) {
                wp.media.events.on( 'editor:image-edit', function (data) {
                    data.metadata.my_setting = data.editor.dom.getAttrib( data.image, 'data-my_setting' );
                } );
                wp.media.events.on( 'editor:image-update', function (data) {
                    data.editor.dom.setAttrib( data.image, 'data-my_setting', data.metadata.my_setting );
                } );
            }
        });
        </script>
        <?php
    }, 11 );
} );

যোগ এবং সেটিংস ক্ষেত্র পূরণ করার জন্য, এটা আউটপুট হ্যাক সম্ভবত groovier এর wp_print_media_templates()বদলে ওভাররাইড ImageDetails.initialize()( আপডেট মধ্যে মোড়ানো wp_enqueue_mediaকর্ম):

add_action( 'wp_enqueue_media', function () {
    remove_action( 'admin_footer', 'wp_print_media_templates' );
    add_action( 'admin_footer', $func = function () {
        ob_start();
        wp_print_media_templates();
        $tpl = ob_get_clean();
        // To future-proof a bit, search first for the template and then for the section.
        if ( ( $idx = strpos( $tpl, 'tmpl-image-details' ) ) !== false
                && ( $before_idx = strpos( $tpl, '<div class="advanced-section">', $idx ) ) !== false ) {
            ob_start();
            ?>
    <div class="my_setting-section">
        <h2><?php _e( 'My Settings' ); ?></h2>
        <div class="my_setting">
            <label class="setting my_setting">
                <span><?php _e( 'My Setting' ); ?></span>
                <input type="text" data-setting="my_setting" value="{{ data.model.my_setting }}" />
            </label>
        </div>
    </div>
            <?php
            $my_section = ob_get_clean();
            $tpl = substr_replace( $tpl, $my_section, $before_idx, 0 );
        }
        echo $tpl;
    } );
} );

2
তোমাকে অনেক ধন্যবাদ! এটি খুব দরকারী (যদিও আপনার মাথা ঘুরে আসতে কয়েক মিনিট সময় নেয়)। আমি উত্তরটি স্বীকার করব এবং এটি শেষ হওয়ার ঠিক আগে আপনাকে বরদানটি দেব (কেউ আমার আরও ভাল / সহজ উত্তর নিয়ে হাজির হবে)
কাস্পার লি

হুম, এটি আগে চালানো হলে ঘটবে wp_enqueue_media()। সম্ভবত একটি দুর্দান্ত উপায় হ'ল wp_enqueue_mediaযে কর্মটি শেষের দিকে চালিত হয় সেগুলি ব্যবহার করা wp_enqueue_media(), অর্থাত্ সমস্ত add_action( 'wp_enqueue_media', function () { /*the code*/ } );
কোডকে

না, তদ্বিপরীত!

আমি উত্তরটি আপডেট করব ...

1
এটা তোলে আন্ডারস্কোর টেম্পলেট স্টাফ ডাব্লু এর ওভাররাইড এর underscorejs.org/#template (দেখুন wp.template.... আমার মনে হয় "WP-includes / JS / WP-util.js" এ)
Bonger
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.