WordPress.org

Make WordPress Core

Ticket #6820: detach_media.diff

File detach_media.diff, 5.8 KB (added by dphiffer, 4 years ago)

AJAX-style media detaching with bulk option

  • wp-admin/admin-ajax.php

     
    14671467case 'time_format' : 
    14681468        die( date_i18n( sanitize_option( 'time_format', $_POST['date'] ) ) ); 
    14691469        break; 
     1470case 'detach_media' : 
     1471        $post_id = intval( $_POST['post_id'] ); 
     1472        if ( !current_user_can( 'edit_post', $post_id ) ) 
     1473                die( '-1' ); 
     1474        $detached = $wpdb->update( $wpdb->posts, array( 'post_parent' => 0 ), array( 'post_type' => 'attachment', 'ID' => $post_id ) ); 
     1475        $html = _( '(Unattached)' ) . "<br />\n" . 
     1476                                        "<a class=\"hide-if-no-js\" onclick=\"findPosts.open( 'media[]','$post_id' );return false;\" href=\"#the-list\">" . _( 'Attach' ) . "</a>"; 
     1477        $x = new WP_Ajax_Response(); 
     1478        $x->add( array( 
     1479                'id' => $post_id, 
     1480                'data' => $html 
     1481        )); 
     1482        $x->send(); 
     1483        break; 
    14701484default : 
    14711485        do_action( 'wp_ajax_' . $_POST['action'] ); 
    14721486        die('0'); 
  • wp-admin/includes/class-wp-media-list-table.php

     
    7979                $actions['delete'] = __( 'Delete Permanently' ); 
    8080                if ( $this->detached ) 
    8181                        $actions['attach'] = __( 'Attach to a post' ); 
    82  
     82                else 
     83                        $actions['detach'] = __( 'Detach media' ); 
    8384                return $actions; 
    8485        } 
    8586 
     
    289290?> 
    290291                        <td <?php echo $attributes ?>> 
    291292                                <strong><a href="<?php echo get_edit_post_link( $post->post_parent ); ?>"><?php echo $title ?></a></strong>, 
    292                                 <?php echo get_the_time( __( 'Y/m/d' ) ); ?> 
     293                                <?php echo get_the_time( __( 'Y/m/d' ) ); ?><br /> 
     294                                <a class="hide-if-no-js" onclick="detachMedia.detach(<?php echo $post->ID; ?>);return false;" href="#the-list"><?php _e( 'Detach' ); ?></a> 
    293295                        </td> 
    294296<?php 
    295297                } else { 
  • wp-admin/js/media.dev.js

     
    11 
    2 var findPosts; 
     2var findPosts, detachMedia; 
    33(function($){ 
    44        findPosts = { 
    55                open : function(af_name, af_val) { 
     
    7272                } 
    7373        }; 
    7474 
     75        detachMedia = { 
     76                detach : function(id) { 
     77                        var post = { 
     78                                post_id: id, 
     79                                action: 'detach_media', 
     80                                _ajax_nonce: $('#_ajax_nonce').val() 
     81                        }; 
     82                        $.ajax({ 
     83                                type : 'POST', 
     84                                url : ajaxurl, 
     85                                data : post, 
     86                                success : function(x) { detachMedia.show(x); }, 
     87                                error : function(r) { detachMedia.error(r); } 
     88                        }); 
     89                }, 
     90 
     91                show : function(x) { 
     92 
     93                        if ( typeof(x) == 'string' ) { 
     94                                this.error({'responseText': x}); 
     95                                return; 
     96                        } 
     97 
     98                        var r = wpAjax.parseAjaxResponse(x); 
     99                        if ( r.errors ) { 
     100                                this.error({'responseText': wpAjax.broken}); 
     101                        } 
     102                        r = r.responses[0]; 
     103                        $('#post-' + r.id + ' td.parent').html(r.data); 
     104 
     105                        var count = $('.subsubsub .detached .count').html(); 
     106                        count = parseInt(count.substr(1, count.length - 2), 10); 
     107                        $('.subsubsub .detached .count').html('(' + (count + 1) + ')'); 
     108                         
     109                        if ($('#message').length > 0) { 
     110                                $('#message').html('<p>Detached 1 media file.</p>'); 
     111                        } else { 
     112                                $('h2').after('<div id="message" class="updated below-h2"><p>Detached 1 media file.</p></div>'); 
     113                        } 
     114                }, 
     115 
     116          error : function(r) { 
     117                        var er = r.statusText; 
     118 
     119                        if ( r.responseText ) { 
     120                                er = r.responseText.replace( /<.[^<>]*?>/g, '' ); 
     121                        } 
     122                        if ( er ) { 
     123                                $('#find-posts-response').html(er); 
     124                        } 
     125                } 
     126        }; 
     127 
    75128        $(document).ready(function() { 
    76129                $('#find-posts-submit').click(function(e) { 
    77130                        if ( '' == $('#find-posts-response').html() ) 
  • wp-admin/upload.php

     
    8989                                exit; 
    9090                        } 
    9191                        break; 
     92                case 'detach': 
     93                        $detach = array(); 
     94                        foreach ( (array) $_REQUEST['media'] as $att_id ) { 
     95                                $att_id = (int) $att_id; 
     96 
     97                                if ( !current_user_can( 'edit_post', $att_id ) ) 
     98                                        continue; 
     99 
     100                                $detach[] = $att_id; 
     101                                clean_attachment_cache( $att_id ); 
     102                        } 
     103 
     104                        if ( ! empty( $detach ) ) { 
     105                                $parent_ids = $wpdb->get_col( $wpdb->prepare( "SELECT post_parent FROM $wpdb->posts WHERE post_type = 'attachment' AND ID IN ( $detach )" ) ); 
     106                                foreach ( $parent_ids as $parent_id ) { 
     107                                        if ( !current_user_can( 'edit_post', $parent_id ) ) 
     108                                                wp_die( __( 'You are not allowed to edit this post.' ) ); 
     109                                } 
     110                                 
     111                                $detach = implode( ',', $detach ); 
     112                                $detached = $wpdb->query( $wpdb->prepare( "UPDATE $wpdb->posts SET post_parent = 0 WHERE post_type = 'attachment' AND ID IN ( $detach )" ) ); 
     113                        } 
     114 
     115                        if ( isset( $detached ) ) { 
     116                                $location = 'upload.php'; 
     117                                if ( $referer = wp_get_referer() ) { 
     118                                        if ( false !== strpos( $referer, 'upload.php' ) ) 
     119                                                $location = $referer; 
     120                                } 
     121 
     122                                $location = add_query_arg( array( 'detached_media' => $detached ) , $location ); 
     123                                wp_redirect( $location ); 
     124                                exit; 
     125                        } 
     126                        break; 
    92127                case 'trash': 
    93128                        foreach ( (array) $post_ids as $post_id ) { 
    94129                                if ( !current_user_can( 'delete_post', $post_id ) ) 
     
    178213        $_SERVER['REQUEST_URI'] = remove_query_arg(array('attached'), $_SERVER['REQUEST_URI']); 
    179214} 
    180215 
     216if ( isset($_GET['detached_media']) && (int) $_GET['detached_media'] ) { 
     217        $detached = (int) $_GET['detached_media']; 
     218        $message = sprintf( _n('Detached %d media file.', 'Detached %d media files.', $detached), $detached ); 
     219        $_SERVER['REQUEST_URI'] = remove_query_arg(array('detached_media'), $_SERVER['REQUEST_URI']); 
     220} 
     221 
    181222if ( isset($_GET['deleted']) && (int) $_GET['deleted'] ) { 
    182223        $message = sprintf( _n( 'Media attachment permanently deleted.', '%d media attachments permanently deleted.', $_GET['deleted'] ), number_format_i18n( $_GET['deleted'] ) ); 
    183224        $_SERVER['REQUEST_URI'] = remove_query_arg(array('deleted'), $_SERVER['REQUEST_URI']);