Löschen Sie einen Anhang im modalen WP-Medienfenster

Ich versuche, eine Option im WP-Modus Medienfenster zu erstellen, doppelte Dateien zu erkennen und eine neuere Datei zu löschen, wenn ein älteres Duplikat gefunden wird. Ich habe den folgenden Code, der funktioniert (in Verbindung mit dem ‘attachment_fields_to_edit’-Filter), um eine doppelte Datei abzuwählen und die ursprüngliche Datei im Medienmodus auszuwählen. Wenn ein Benutzer auf die Schaltfläche klickt, lösche ich die Originaldatei (oder verstecke sie zumindest im Medienbibliotheksfenster, damit ich sie später löschen kann).

( 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 ); 

Die Benutzeroberfläche sieht wie das angehängte Bild aus.

Screenshot der doppelten Medienprüfung

Ich kann in Media-views.js in Zeile 5873 sehen, dass es eine deleteAttachment-function gibt, die an ‘click .delete-attachment’ gebunden ist. Wie kann ich bei meiner aktuellen Einrichtung auf diese zugreifen, indem ich eine Bild-ID oder ein Anhangsobjekt übergebe?

Solutions Collecting From Web of "Löschen Sie einen Anhang im modalen WP-Medienfenster"

Sie müssen nur die Methode destroy im attachment aufrufen. Dadurch wird der Anhang aus der Medienbibliotheksansicht entfernt und ein Ajax-Aufruf an das Back-End gesendet, um den Anhang in der database und alle verknüpften Dateien im Upload-Verzeichnis zu löschen.

Sie müssen den Anhang nicht in JSON konvertieren, um die ID zu erhalten: Sie können die Backbone-Modelle direkt bearbeiten. Die selection ist eine Sammlung mehrerer Anhänge.

 ( 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 ); 

Ich habe auch einen $ .proxy- Aufruf hinzugefügt, um this innerhalb des Click-Ereignis-Callbacks verwenden zu können.

Wenn Sie eine etwas kanonische (oder zumindest großzügige) Antwort wpse142997.js , ist dies das Javascript für wpse142997.js im wpse142997.js Vorlagenverzeichnis:

 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 ); }); 

Das ist die 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(); ?>  < ?php wp_add_inline_style( 'media-views', str_replace( array( '