WordPress.org

Make WordPress Core

Ticket #22607: 22607.3.diff

File 22607.3.diff, 7.4 KB (added by koopersmith, 5 years ago)
  • wp-admin/admin-ajax.php

     
    5656        'save-widget', 'set-post-thumbnail', 'date_format', 'time_format', 'wp-fullscreen-save-post',
    5757        'wp-remove-post-lock', 'dismiss-wp-pointer', 'upload-attachment', 'get-attachment',
    5858        'query-attachments', 'save-attachment', 'save-attachment-compat', 'send-link-to-editor',
    59         'send-attachment-to-editor',
     59        'send-attachment-to-editor', 'save-attachment-order',
    6060);
    6161
    6262// Register core Ajax calls.
  • wp-admin/includes/ajax-actions.php

     
    19271927        wp_send_json_success( $attachment );
    19281928}
    19291929
     1930function wp_ajax_save_attachment_order() {
     1931        if ( ! isset( $_REQUEST['post_id'] ) )
     1932                wp_send_json_error();
     1933
     1934        if ( ! $post_id = absint( $_REQUEST['post_id'] ) )
     1935                wp_send_json_error();
     1936
     1937        if ( empty( $_REQUEST['attachments'] ) )
     1938                wp_send_json_error();
     1939
     1940        check_ajax_referer( 'update-post_' . $post_id, 'nonce' );
     1941
     1942        $attachments = $_REQUEST['attachments'];
     1943
     1944        if ( ! current_user_can( 'edit_post', $post_id ) )
     1945                wp_send_json_error();
     1946
     1947        $post = get_post( $post_id, ARRAY_A );
     1948
     1949        foreach ( $attachments as $attachment_id => $menu_order ) {
     1950                if ( ! current_user_can( 'edit_post', $attachment_id ) )
     1951                        continue;
     1952                if ( ! $attachment = get_post( $attachment_id ) )
     1953                        continue;
     1954                if ( 'attachment' != $attachment->post_type )
     1955                        continue;
     1956
     1957                wp_update_post( array( 'ID' => $attachment_id, 'menu_order' => $menu_order ) );
     1958        }
     1959
     1960        wp_send_json_success();
     1961}
     1962
    19301963/**
    19311964 * Generates the HTML to send an attachment to the editor.
    19321965 * Backwards compatible with the media_send_to_editor filter and the chain
  • wp-includes/js/media-models.js

     
    523523                _requery: function() {
    524524                        if ( this.props.get('query') )
    525525                                this.mirror( Query.get( this.props.toJSON() ) );
     526                },
     527
     528                // If this collection is sorted by `menuOrder`, recalculates and saves
     529                // the menu order to the database.
     530                saveMenuOrder: function() {
     531                        if ( 'menuOrder' !== this.props.get('orderby') )
     532                                return;
     533
     534                        // Removes any uploading attachments, updates each attachment's
     535                        // menu order, and returns an object with an { id: menuOrder }
     536                        // mapping to pass to the request.
     537                        var attachments = this.chain().filter( function( attachment ) {
     538                                return ! _.isUndefined( attachment.id );
     539                        }).map( function( attachment, index ) {
     540                                // Indices start at 1.
     541                                index = index + 1;
     542                                attachment.set( 'menuOrder', index );
     543                                return [ attachment.id, index ];
     544                        }).object().value();
     545
     546                        if ( _.isEmpty( attachments ) )
     547                                return;
     548
     549                        return media.post( 'save-attachment-order', {
     550                                nonce:       media.model.settings.updatePostNonce,
     551                                post_id:     media.model.settings.postId,
     552                                attachments: attachments
     553                        });
    526554                }
    527555        }, {
    528556                comparator: function( a, b, options ) {
  • wp-includes/js/media-views.js

     
    1414
    1515        // Copy the `postId` setting over to the model settings.
    1616        media.model.settings.postId = media.view.settings.postId;
     17        media.model.settings.updatePostNonce = media.view.settings.nonce.updatePost;
    1718
    1819        // Check if the browser supports CSS 3.0 transitions
    1920        $.support.transition = (function(){
     
    267268                        content:    'browse',
    268269                        searchable: true,
    269270                        filterable: false,
    270                         uploads:    true
     271                        uploads:    true,
     272                        sortable:   true
    271273                },
    272274
    273275                initialize: function() {
     
    26902692                        this.scroll = _.chain( this.scroll ).bind( this ).throttle( this.options.refreshSensitivity ).value();
    26912693
    26922694                        this.initSortable();
    2693                         this.collection.props.on( 'change:orderby', this.refreshSortable, this );
    26942695
    26952696                        _.bindAll( this, 'css' );
    26962697                        this.model.on( 'change:edge change:gutter', this.css, this );
     
    27342735                },
    27352736
    27362737                initSortable: function() {
    2737                         var collection = this.collection,
     2738                        var view = this,
     2739                                collection = this.collection,
    27382740                                from;
    27392741
    27402742                        if ( ! this.options.sortable || ! $.fn.sortable )
     
    27602762                                // Update the model's index in the collection.
    27612763                                // Do so silently, as the view is already accurate.
    27622764                                update: function( event, ui ) {
    2763                                         var model = collection.at( from );
     2765                                        var model = collection.at( from ),
     2766                                                comparator = collection.comparator;
    27642767
     2768                                        // Temporarily disable the comparator to prevent `add`
     2769                                        // from re-sorting.
     2770                                        delete collection.comparator;
     2771
     2772                                        // Silently shift the model to its new index.
    27652773                                        collection.remove( model, {
    27662774                                                silent: true
    27672775                                        }).add( model, {
    27682776                                                at:     ui.item.index(),
    27692777                                                silent: true
    27702778                                        });
     2779
     2780                                        // Restore the comparator.
     2781                                        collection.comparator = comparator;
     2782
     2783                                        // If the collection is sorted by menu order,
     2784                                        // update the menu order.
     2785                                        view.saveMenuOrder();
     2786
     2787                                        // Make sure any menu-order-related callbacks are bound.
     2788                                        view.refreshSortable();
    27712789                                }
    27722790                        });
    27732791
     
    27762794                        collection.props.on( 'change:orderby', function() {
    27772795                                this.$el.sortable( 'option', 'disabled', !! collection.comparator );
    27782796                        }, this );
     2797
     2798                        this.collection.props.on( 'change:orderby', this.refreshSortable, this );
     2799                        this.refreshSortable();
    27792800                },
    27802801
    27812802                refreshSortable: function() {
     
    27832804                                return;
    27842805
    27852806                        // If the `collection` has a `comparator`, disable sorting.
    2786                         this.$el.sortable( 'option', 'disabled', !! this.collection.comparator );
     2807                        var collection = this.collection,
     2808                                orderby = collection.props.get('orderby'),
     2809                                enabled = 'menuOrder' === orderby || ! collection.comparator,
     2810                                hasMenuOrder;
     2811
     2812                        this.$el.sortable( 'option', 'disabled', ! enabled );
     2813
     2814                        // Check if any attachments have a specified menu order.
     2815                        hasMenuOrder = this.collection.any( function( attachment ) {
     2816                                return attachment.get('menuOrder');
     2817                        });
     2818
     2819                        // Always unbind the `saveMenuOrder` callback to prevent multiple
     2820                        // callbacks stacking up.
     2821                        this.collection.off( 'change:uploading', this.saveMenuOrder, this );
     2822
     2823                        if ( hasMenuOrder )
     2824                                this.collection.on( 'change:uploading', this.saveMenuOrder, this );
     2825
    27872826                },
    27882827
     2828                saveMenuOrder: function() {
     2829                        this.collection.saveMenuOrder();
     2830                },
     2831
    27892832                createAttachmentView: function( attachment ) {
    27902833                        var view = new this.options.AttachmentView({
    27912834                                controller: this.controller,
     
    30493092                                }).render() );
    30503093                        }
    30513094
    3052                         if ( this.options.sortable ) {
     3095                        if ( this.options.sortable && ! this.options.filters ) {
    30533096                                this.toolbar.set( 'dragInfo', new media.View({
    30543097                                        el: $( '<div class="instructions">' + l10n.dragInfo + '</div>' )[0],
    30553098                                        priority: -40
  • wp-includes/media.php

     
    14331433        if ( isset( $args['post'] ) ) {
    14341434                $post = get_post( $args['post'] );
    14351435                $settings['postId'] = $post->ID;
     1436                $settings['nonce']['updatePost'] = wp_create_nonce( 'update-post_' . $post->ID );
    14361437        }
    14371438
    14381439        $hier = $post && is_post_type_hierarchical( $post->post_type );