ডাব্লুপি মিডিয়া মডেল উইন্ডোতে একটি সংযুক্তি মুছুন


15

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

( function( $ ) {

    var _AttachmentDisplay = wp.media.view.Settings.AttachmentDisplay;
    wp.media.view.Settings.AttachmentDisplay = _AttachmentDisplay.extend({
        render: function() {
            _AttachmentDisplay.prototype.render.apply(this, arguments);
            currentselection = this.controller.state().get('selection').first().toJSON();
            selection = this.controller.state().get('selection');

            $('button.dmc').on('click', function(e){

                e.preventDefault();

                var id = $(e.currentTarget).data("id");
                if(currentselection.id == id) {

                    currentattachment = wp.media.attachment(id);
                    selection.remove(currentattachment);

                    console.dir(wp.media.view.Attachment);

                    newattachment = wp.media.attachment($(e.currentTarget).data("original"));
                    selection.add(newattachment);

                }
            });
        }
    });

} )( jQuery );

ইন্টারফেসটি সংযুক্ত চিত্রের মতো দেখাচ্ছে।

সদৃশ মিডিয়া চেক এর স্ক্রিনশট

আমি 5873 লাইনে মিডিয়া-ভিউজেজেজে দেখতে পাচ্ছি যে '.delet-সংযুক্তি' ক্লিক করতে বাধ্য একটি ডিলিটএটচমেন্ট ফাংশন রয়েছে। কোনও চিত্র আইডি বা সংযুক্তি অবজেক্টে পাস করে আমার বর্তমান সেটআপটি দিয়ে আমি কীভাবে এটি অ্যাক্সেস করতে পারি?


4
এই প্রশ্নটি এখনও খোলা আছে বা আপনি এখনও একটি উত্তর খুঁজে পেয়েছেন?
এজেলেন

@ এজেনেল এই প্রশ্নের এখন একটি খোলা অনুগ্রহ আছে। সুতরাং এর জন্য যান :-)
পিটার গুসেন

উত্তর:


5

কিছুটা ক্যানোনিকাল (বা কমপক্ষে প্রচুর পরিমাণে) উত্তর দেওয়ার চেষ্টা করা, wpse142997.jsএটি শিশু টেম্পলেট ডিরেক্টরিতে জাভাস্ক্রিপ্ট :

jQuery( document ).ready(function() {
    ( function( $ ) {
        var media = wp.media,
            l10n = media.view.l10n = typeof _wpMediaViewsL10n === 'undefined' ? {} : _wpMediaViewsL10n,
            attachments = media.model.Attachments.all,
            attachments_uploaded = [];

        if ( typeof wp.Uploaded === 'undefined') return;

        // Keep track of files uploaded.
        wp.Uploader.queue.on( 'add', function ( attachment ) {
            attachments_uploaded.push( attachment );
        });

        // The Uploader (in wp-includes/js/plupload/wp-plupload.js) resets the queue when all uploads are complete.
        wp.Uploader.queue.on( 'reset', function () {
            var idx, uploaded = attachments_uploaded.slice(0); // Clone
            attachments_uploaded = [];
            for ( idx = 0; idx < uploaded.length; idx++ ) {
                if ( uploaded[idx].get('name').match(/-[0-9]+$/) ) {
                    $.post( ajaxurl, {
                            action: 'wpse142997_is_dup',
                            dup_id: uploaded[idx].id,
                            nonce: wpse142997_params.is_dup_nonce
                        }, function( response ) {
                            var original, dup, dup_view, sidebar, selection;
                            if ( response && !response.error && response.original_id && response.dup_id ) {
                                original = attachments.get( response.original_id );
                                dup = attachments.get( response.dup_id );
                                if ( original && dup ) {
                                    dup.set( 'dup_original', original ); // May be ungood - mostly doing it so can use wp.templates.
                                    dup_view = media.view.Attachment.extend({
                                        tagName:   'div',
                                        className: 'attachment-dmc',
                                        template: media.template('attachment-dmc'),
                                        events: {
                                            'click button.dmc': 'removeDupSelectOriginal'
                                        },
                                        initialize: function() {
                                            this.focusManager = new media.view.FocusManager({
                                                el: this.el
                                            });
                                            media.view.Attachment.prototype.initialize.apply( this, arguments );
                                        },
                                        render: function() {
                                            if ( this.get_dup_original() ) {
                                                media.view.Attachment.prototype.render.apply( this, arguments );
                                                this.focusManager.focus();
                                            }
                                            return this;
                                        },
                                        removeDupSelectOriginal: function( event ) {
                                            var dup_original = this.get_dup_original();
                                            event.preventDefault();

                                            if ( dup_original && confirm( l10n.warnDelete ) ) {
                                                this.model.destroy();
                                                this.controller.state().get('selection').add( dup_original );
                                                this.remove();
                                            }
                                        },
                                        get_dup_original: function () {
                                            var dup_original = this.model.get('dup_original');
                                            return dup_original && attachments.get( dup_original.id ) ? dup_original : null;
                                        }
                                    });
                                    // A hacky way to get the sidebar.
                                    sidebar = media.frame.content.view.views.get('.media-frame-content')[0].sidebar;
                                    selection = sidebar.controller.state().get('selection');
                                    // The sidebar boxes get deleted and recreated on each select - hack into this to do the same.
                                    selection.on( 'selection:single', function ( event ) {
                                        if ( selection.single().get('dup_original') ) {
                                            sidebar.set( 'dmc', new dup_view({
                                                controller: sidebar.controller,
                                                model: selection.single(),
                                                priority: 100
                                            }) );
                                        }
                                    } );
                                    selection.on( 'selection:unsingle', function ( event ) {
                                        sidebar.unset('dmc');
                                    } );
                                    // Refire the select as we missed it (could/should just do the view create code here again).
                                    selection.trigger('selection:single');
                                }
                            }
                        }, 'json'
                    );
                }
            }
        });
    } )( jQuery );
});

এটি হ'ল functions.php:

function wpse142997_wp_enqueue_scripts() {
    wp_enqueue_script( 'wpse142997', get_stylesheet_directory_uri() . '/wpse142997.js', array( 'jquery', 'media-views' ), '1.0' );
    $params = array(
        'is_dup_nonce' => wp_create_nonce( 'wpse142997_is_dup_submit_' ),
    );
    wp_localize_script( 'wpse142997', 'wpse142997_params', $params );
    ob_start();
    ?>
<style>
.attachment-dmc { float:left; overflow:hidden; position:relative; }
.attachment-dmc div { background-color:#FFEBE7; border:1px solid #CB9495; border-radius:5px; margin-top:16px; padding:6px; }
.attachment-dmc div h3 { margin-top:0; }
.attachment-dmc div h3 span { background-color:#E70000; border-radius:5px; color:white; margin-top:0; padding:0 6px; }
</style>
    <?php
    wp_add_inline_style( 'media-views', str_replace( array( '<style>', '</style>' ), '', ob_get_clean() ) );
}

function wpse142997_print_media_templates() {
?>
<script type="text/html" id="tmpl-attachment-dmc">
    <# if ( data.dup_original ) { #>
        <div>
            <h3><span><?php _e( 'Duplicate file detected' ); ?></span></h3>
            <p>
                <?php _e( 'This file appears to be a duplicate of <a href="{{ data.dup_original.attributes.editLink }}&amp;image-editor" target="_blank">{{ data.dup_original.attributes.filename }}</a> uploaded on {{ data.dup_original.attributes.dateFormatted }}' ); ?>
            </p>
            <button id="run_dmc" class="dmc" name="dmc"><?php _e( 'Remove duplicate and select original' ); ?></button>
        </div>
    <# } #>
</script>
<?php
}

function wpse142997_is_dup() {
    $ret = array( 'error' => false );

    if ( ! check_ajax_referer( 'wpse142997_is_dup_submit_', 'nonce', false /*die*/ ) ) {
        $ret['error'] = __( 'Permission error' );
    } else {
        $dup_id = isset( $_POST['dup_id'] ) ? $_POST['dup_id'] : '';
        if ( ! $dup_id || ! ( $post = get_post( $dup_id ) ) ) {
            $ret['error'] = __( 'Bad dup_id' );
        } else {
            $post_name = preg_replace( '/-[0-9]+$/', '', $post->post_name ); 
            global $wpdb;
            $sql = $wpdb->prepare( 'SELECT ID FROM ' . $wpdb->posts . ' WHERE'
                . ' post_title = %s AND post_type = %s AND post_mime_type = %s AND post_status = %s AND post_name = %s ORDER BY post_date ASC LIMIT 1',
                $post->post_title, $post->post_type, $post->post_mime_type, $post->post_status, $post_name
            );
            if ( $original_id = $wpdb->get_var( $sql ) ) {
                $ret['original_id'] = $original_id;
                $ret['dup_id'] = $dup_id;
            }
        }
    }

    wp_send_json( $ret );
}

add_action( 'admin_enqueue_scripts', 'wpse142997_wp_enqueue_scripts' );
add_action( 'print_media_templates', 'wpse142997_print_media_templates' );
add_action( 'wp_ajax_wpse142997_is_dup', 'wpse142997_is_dup' );

জাভাস্ক্রিপ্ট ডাব্লুপি মিডিয়া মডেলকে যতটা বুঝতে পেরেছি অনুসরণ করার চেষ্টা করে, যা কেবল আংশিক। এটি একটি তৈরি করে media.view.Attachmentএবং একটি wp.templateটেম্পলেট ব্যবহার করে । কয়েকটি হ্যাক বিট রয়েছে - বিশেষত ফ্রেম অবজেক্টে দীর্ঘ পৌঁছনোর মাধ্যমে সাইডবারটি পাওয়া সন্দেহজনক বলে মনে হয় (এবং কেবল প্রচুর পোকার পরে পাওয়া গেছে)।


ধন্যবাদ, এটি অবশ্যই আমি যে উদ্দেশ্যে লক্ষ্য করেছিলাম সেই ধরণের। ক্যানোনিকাল অংশ সম্পর্কে, বেছে নেওয়ার অনেক কারণ নেই এবং আমি নিজে থেকে আরও ভাল পাঠ্য বের করতে পারি না, সুতরাং এটি বেশ কাছাকাছি। আমি পরের সপ্তাহে আরও ঘুরে দেখব।
নিকোলাই

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

আমি ধরে নিয়েছি আপনি একটি সদৃশ চিত্র আপলোড করেছেন
?!

4

আপনি শুধু ফোন করতে হবে destroyউপর পদ্ধতি attachmentমডেল। এটি উভয়ই মিডিয়া লাইব্রেরি ভিউ থেকে সংযুক্তিটি সরিয়ে ফেলবে, এবং ডাটাবেসে সংযুক্তি এবং আপলোড ডিরেক্টরিতে সমস্ত সংযুক্ত ফাইলগুলি মুছতে ব্যাকএন্ডে একটি এজাক্স কল প্রেরণ করবে।

আইডি পেতে আপনাকে সংযুক্তিটি JSON এ রূপান্তর করতে হবে না: আপনি ব্যাকবোন মডেলগুলি সরাসরি পরিচালনা করতে পারেন। selectionবিভিন্ন সংযুক্তি একটি সংগ্রহ।

( function( $ ) {

    var _AttachmentDisplay = wp.media.view.Settings.AttachmentDisplay;
    wp.media.view.Settings.AttachmentDisplay = _AttachmentDisplay.extend({
        render: function() {
            _AttachmentDisplay.prototype.render.apply(this, arguments);

            $('button.dmc').on('click', $.proxy(function(e){

                e.preventDefault();
                selection = this.controller.state().get('selection');
                firstAttachment = selection.first();

                var id = $(e.currentTarget).data("id");
                if(currentselection.id == id) {

                    selection.remove(firstAttachment);
                    firstAttachment.destroy();

                    console.dir(wp.media.view.Attachment);

                    newattachment = wp.media.attachment($(e.currentTarget).data("original"));
                    selection.add(newattachment);

                }
            }, this));
        }
    });

} )( jQuery );

ক্লিক ইভেন্ট কলব্যাকের ভিতরে ব্যবহার করতে সক্ষম হতে আমি একটি pro .প্রক্সি কলও যুক্ত করেছি this


1
ধন্যবাদ, আমার কাছে ভাল লাগছে অবশ্যই আমার জেএস দক্ষতা এবং ওয়ার্ডপ্রেসের those অংশগুলির জ্ঞান এত দুর্দান্ত নয়। অবশ্যই পরের সপ্তাহে চেষ্টা করে দেখতে চাই। আরেকটি জিনিস, ভান করা যাক আমি ডাব্লুপিপি সম্পর্কে অনেক কিছু জানি না, আপনার পোস্ট করা কোডটি আমি কীভাবে ব্যবহার করতে পারি?
নিকোলাই

যেহেতু আমি আপনার কোনও সমাধানের চেষ্টা করার সময় পাইনি আমি @ ব্রোজারের উত্তরে অনুগ্রহটি দিয়েছি - কারণ এটি সম্পূর্ণ বলে মনে হচ্ছে, যদিও উত্তর দেওয়ার জন্য আবার ধন্যবাদ।
নিকোলাই
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.