Xóa tệp đính kèm trong cửa sổ phương thức WP media


15

Tôi đang cố gắng tạo một tùy chọn trong cửa sổ phương thức WP để phát hiện các tệp trùng lặp và xóa một tệp mới hơn nếu tìm thấy bản sao cũ hơn. Tôi có đoạn mã sau hoạt động (kết hợp với bộ lọc 'tệp đính kèm_fields_to_edit') để bỏ chọn một tệp trùng lặp và chọn tệp gốc trong phương thức truyền thông. Những gì tôi muốn làm là, khi người dùng nhấp vào nút, xóa tệp gốc (hoặc ít nhất là ẩn nó trong cửa sổ thư viện phương tiện để tôi có thể xóa nó sau).

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

Giao diện trông giống như hình ảnh đính kèm.

ảnh chụp màn hình kiểm tra phương tiện trùng lặp

Tôi có thể thấy trong media-view.js ở dòng 5873 có chức năng xóaAttachment bị ràng buộc với 'click .delete-file đính kèm'. Làm cách nào tôi có thể truy cập cái này, với thiết lập hiện tại của mình, bằng cách gửi ID hình ảnh hoặc đối tượng đính kèm?


4
Câu hỏi này vẫn còn mở hay bạn đã tìm thấy câu trả lời chưa?
engelen

@engelen câu hỏi này bây giờ có một tiền thưởng mở. Vì vậy, đi cho nó :-)
Pieter Goosen

Câu trả lời:


5

Cố gắng trả lời có phần kinh điển (hoặc ít nhất là bội thu), đây là javascript cho wpse142997.js trong thư mục mẫu con:

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

Đây là 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' );

Các javascript cố gắng làm theo cách WP Media Modal nhiều như tôi hiểu, đây chỉ là một phần. Nó tạo ra một media.view.Attachmentvà sử dụng một wp.templatemẫu. Có một vài bit hacky - đặc biệt là thanh bên thông qua một khoảng cách dài vào đối tượng khung hình có vẻ đáng ngờ (và chỉ được tìm thấy sau khi chọc vào rất nhiều).


Cảm ơn, đây chắc chắn là loại mà tôi đang hướng tới. Về phần kinh điển, không có nhiều lý do để lựa chọn và tôi không thể tự mình tìm ra một văn bản tốt hơn, vì vậy điều này khá gần. Tôi sẽ xem xét kỹ hơn vào tuần tới.
Nicolai

Tôi đã sao chép mã vào 2014 Hàm.php và thiết lập js như được mô tả và vẫn không thể thấy phần thông báo trùng lặp. Tôi nên thực hiện những hành động nào khi có mã để thấy điều này?
KalenGi

Tôi giả sử bạn đã tải lên một hình ảnh trùng lặp ?! ...
bonger

4

Bạn chỉ cần gọi destroy phương thức trên attachmentmô hình. Điều này sẽ loại bỏ tệp đính kèm khỏi chế độ xem Thư viện phương tiện và gửi cuộc gọi ajax đến phụ trợ để xóa tệp đính kèm trong cơ sở dữ liệu và tất cả các tệp được liên kết trong thư mục tải lên.

Bạn không cần phải chuyển đổi tệp đính kèm thành JSON để lấy id: bạn có thể trực tiếp thao tác các mô hình xương sống. Đây selectionlà một bộ sưu tập của một số file đính kèm.

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

Tôi cũng đã thêm một cuộc gọi $ .proxy để có thể sử dụng thisbên trong cuộc gọi lại sự kiện nhấp chuột.


1
Cảm ơn, có vẻ tốt cho tôi. Tất nhiên các kỹ năng và kiến ​​thức về JS của tôi về các phần của WordPress không phải là tuyệt vời. Chắc chắn muốn thử điều này vào tuần tới. Một điều nữa, hãy giả vờ tôi không biết nhiều về WP, làm thế nào tôi có thể sử dụng mã bạn đã đăng?
Nicolai

Khi tôi không tìm thấy thời gian để thử một trong các giải pháp của bạn, tôi đã đưa tiền thưởng cho câu trả lời của @bonger - chỉ vì nó có vẻ đầy đủ hơn, cảm ơn lần nữa vì đã trả lời.
Nicolai
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.