WordPress.org

Make WordPress Core

Ticket #12722: 12722.diff

File 12722.diff, 6.5 KB (added by wonderboymusic, 5 years ago)
  • wp-includes/widgets.php

     
    901901                do_action( 'dynamic_sidebar', $wp_registered_widgets[$id] );
    902902
    903903                if ( is_callable($callback) ) {
     904
     905                        if ( wp_check_widget_lock( $id ) )
     906                                _admin_notice_widget_locked( $wp_registered_widgets[$id] );
     907
    904908                        call_user_func_array($callback, $params);
    905909                        $did_one = true;
    906910                }
     
    12681272
    12691273        return $sidebars_widgets;
    12701274}
     1275
     1276/**
     1277 * Check to see if the post is currently being edited by another user.
     1278 *
     1279 * @since 3.6.0
     1280 *
     1281 * @param int $id Widget id
     1282 * @return bool|int False: not locked or locked by current user. Int: user ID of user with lock.
     1283 */
     1284function wp_check_widget_lock( $id ) {
     1285        $locks = get_option( '_widgets_lock' );
     1286        if ( empty( $locks[$id] ) )
     1287                return;
     1288
     1289        $lasts = get_option( '_widgets_last' );
     1290        $last = $lasts[$id];
     1291
     1292        $lock = explode( ':', $locks[$id] );
     1293        $time = $lock[0];
     1294        $user = isset( $lock[1] ) ? $lock[1] : $last;
     1295
     1296        $time_window = apply_filters( 'wp_check_widget_lock_window', AUTOSAVE_INTERVAL * 2 );
     1297
     1298        if ( $time && $time > time() - $time_window && $user != get_current_user_id() )
     1299                return $user;
     1300
     1301        return false;
     1302}
     1303
     1304/**
     1305 * Mark the widget as currently being edited by the current user
     1306 *
     1307 * @since 3.6.0
     1308 *
     1309 * @param int $id ID of the widget to be locked
     1310 * @return bool|array Returns false if there is no current user, or an array of the lock time and the user ID.
     1311 */
     1312function wp_set_widget_lock( $id ) {
     1313        if ( 0 == ( $user_id = get_current_user_id() ) )
     1314                return false;
     1315
     1316        $now = time();
     1317        $lock = "$now:$user_id";
     1318
     1319        $locks = get_option( '_widgets_lock' );
     1320        $locks[$id] = $lock;
     1321
     1322        update_option( '_widgets_lock', $locks );
     1323        return array( $now, $user_id );
     1324}
     1325
     1326/**
     1327 * Mark the widget's last editor as the current user
     1328 *
     1329 * @since 3.6.0
     1330 *
     1331 * @param string $id ID of the widget to being edited
     1332 * @return bool|array Returns false if is no current user
     1333 */
     1334function wp_set_widget_last( $id ) {
     1335        if ( 0 == ( $user_id = get_current_user_id() ) )
     1336                return;
     1337
     1338        $lasts = get_option( '_widget_lasts' );
     1339
     1340        if ( ! empty( $lasts[$id] ) && $lasts[$id] == get_current_user_id() )
     1341                return $lasts[$id];
     1342
     1343        $lasts[$id] = $user_id;
     1344        update_option( '_widget_lasts', $lasts );
     1345
     1346        return $user_id;
     1347}
     1348
     1349/**
     1350 * Outputs the notice message to say that someone else is editing this post at the moment.
     1351 *
     1352 * @since 3.6.0
     1353 * @return none
     1354 */
     1355function _admin_notice_widget_locked( $widget ) {
     1356        $locks = get_option( '_widgets_lock' );
     1357        $lasts = get_option( '_widgets_last' );
     1358
     1359        $last = 0;
     1360        if ( ! empty( $lasts ) )
     1361                $last = $lasts[$widget['id']];
     1362
     1363        $lock = explode( ':', $locks[$widget['id']] );
     1364        $user = isset( $lock[1] ) ? $lock[1] : $last;
     1365        if ( ! empty( $user ) ) {
     1366                $last_user = get_userdata( $user );
     1367                $last_user_name = $last_user->display_name;
     1368        } else {
     1369                $last_user_name = __( 'Somebody' );
     1370        }
     1371
     1372        $message = sprintf( __( 'Warning: %s is currently editing the <strong>%s</strong> widget.' ),
     1373                esc_html( $last_user_name ),
     1374                esc_html( $widget['name'] )
     1375        );
     1376        printf( '<div class="widget-error" data-id="%s"><p>%s</p></div>', $widget['id'], $message );
     1377}
     1378 No newline at end of file
  • wp-admin/includes/ajax-actions.php

     
    15661566                }
    15671567        }
    15681568
     1569        wp_set_widget_lock( $widget_id );
     1570        wp_set_widget_last( $widget_id );
     1571
    15691572        if ( isset($_POST['delete_widget']) && $_POST['delete_widget'] ) {
    15701573                $sidebars[$sidebar_id] = $sidebar;
    15711574                wp_set_sidebars_widgets($sidebars);
  • wp-admin/js/widgets.js

     
    103103                                ui.item.css({margin:'', 'width':''});
    104104                        },
    105105                        stop: function(e,ui) {
     106                                wpWidgets.fixErrors(ui.item.parent());
     107
    106108                                if ( ui.item.hasClass('ui-draggable') && ui.item.data('draggable') )
    107109                                        ui.item.draggable('destroy');
    108110
     
    174176                });
    175177        },
    176178
     179        fixErrors : function (sb, del) {
     180                sb.find('div.widget-error').hide().each(function (i, error) {
     181                        error = $(error);
     182
     183                        var node = error.clone(), wdgt = error.parent().find('[id$="' + error.data('id') + '"]');
     184                        if ( error.remove() && wdgt.length && ( !del || ( del.prop('id') != wdgt.prop('id') ) ) )
     185                                wdgt.before(node.show());
     186
     187                });
     188        },
     189
    177190        saveOrder : function(sb) {
    178191                if ( sb )
    179192                        $('#' + sb).closest('div.widgets-holder-wrap').find('.spinner').css('display', 'inline-block');
     
    197210        },
    198211
    199212        save : function(widget, del, animate, order) {
    200                 var sb = widget.closest('div.widgets-sortables').attr('id'), data = widget.find('form').serialize(), a;
     213                var sortables = widget.closest('div.widgets-sortables'),
     214                sb = sortables.attr('id'),
     215                data = widget.find('form').serialize(), a;
    201216                widget = $(widget);
    202217                $('.spinner', widget).show();
    203218
     
    234249                                        widget.remove();
    235250                                        wpWidgets.resize();
    236251                                }
     252
     253                                wpWidgets.fixErrors(sortables, widget);
    237254                        } else {
    238255                                $('.spinner').hide();
    239256                                if ( r && r.length > 2 ) {
     
    241258                                        wpWidgets.appendTitle(widget);
    242259                                        wpWidgets.fixLabels(widget);
    243260                                }
     261                                wpWidgets.fixErrors(sortables);
    244262                        }
    245263                        if ( order )
    246264                                wpWidgets.saveOrder();
  • wp-admin/css/colors-fresh.css

     
    275275}
    276276
    277277div.error,
     278div.widget-error,
    278279.login #login_error {
    279280        background-color: #ffebe8;
    280281        border-color: #c00;
    281282}
    282283
    283 div.error a {
     284div.error a,
     285div.widget-error a {
    284286        color: #c00;
    285287}
    286288
  • wp-admin/css/wp-admin.css

     
    498498.widefat,
    499499div.updated,
    500500div.error,
     501div.widget-error,
    501502.wrap .add-new-h2,
    502503textarea,
    503504input[type="text"],
     
    651652}
    652653
    653654div.updated,
    654 div.error {
     655div.error,
     656div.widget-error {
    655657        padding: 0 0.6em;
    656658        margin: 5px 15px 2px;
    657659}
    658660
    659661div.updated p,
    660 div.error p {
     662div.error p,
     663div.widget-error p {
    661664        margin: 0.5em 0;
    662665        padding: 2px;
    663666}
     
    80718074        padding: 15px 0 0;
    80728075}
    80738076
     8077div.widget-error {
     8078        margin-bottom: 15px;
     8079}
     8080
    80748081#available-widgets .widget-holder {
    80758082        padding: 7px 5px 0;
    80768083}