WordPress.org

Make WordPress Core

Ticket #6108: widget-titles-ob.diff

File widget-titles-ob.diff, 8.2 KB (added by mdawaffe, 10 years ago)

PHP Patch

  • wp-admin/includes/widgets.php

     
    4747                                continue;
    4848
    4949                        ob_start();
    50                                 wp_widget_control( 'no-key', $widget['id'], 'template' );
     50                                $args = wp_list_widget_controls_dynamic_sidebar( array( 0 => array( 'widget_id' => $widget['id'], 'widget_name' => $widget['name'], '_display' => 'template' ) ) );
     51                                call_user_func_array( 'wp_widget_control', $args );
    5152                        $widget_control_template = ob_get_contents();
    5253                        ob_end_clean();
    5354
     
    122123<?php
    123124}
    124125
    125 function wp_list_widget_controls( $widgets, $edit_widget = -1 ) {
    126 ?>
    127126
    128                 <ul class="widget-control-list">
    129                         <li />
    130 <?php
    131         foreach ( $widgets as $key => $widget )
    132                 wp_widget_control( $key, $widget, $key == $edit_widget ? 'edit' : 'display' );
     127
     128function wp_list_widget_controls( $sidebar ) {
     129        add_filter( 'dynamic_sidebar_params', 'wp_list_widget_controls_dynamic_sidebar' );
    133130?>
    134131
    135                 </ul>
     132        <ul class="widget-control-list">
    136133
     134                <?php if ( !dynamic_sidebar( $sidebar ) ) echo "<li />"; ?>
     135
     136        </ul>
     137
    137138<?php
    138139}
    139140
    140141
     142function wp_list_widget_controls_dynamic_sidebar( $params ) {
     143        global $wp_registered_widgets;
     144        static $i = 0;
     145        $i++;
     146
     147        $widget_id = $params[0]['widget_id'];
     148
     149        $params[0]['before_widget'] = "<li id='widget-list-control-item-$i-$widget_id' class='widget-list-control-item widget-sortable'>\n";
     150        $params[0]['after_widget'] = "</li>";
     151        $params[0]['before_title'] = "%BEG_OF_TITLE%";
     152        $params[0]['after_title'] = "%END_OF_TITLE%";
     153        $wp_registered_widgets[$widget_id]['_callback'] = $wp_registered_widgets[$widget_id]['callback'];
     154        $wp_registered_widgets[$widget_id]['callback'] = 'wp_widget_control';
     155        return $params;
     156}
     157
    141158/*
    142  * Displays the control form for widget of type $widget at position $key.
    143  * $display
    144  *  == 'display': Normal, "closed" form.
    145  *  == 'edit': "open" form
    146  *  == 'template': generates a form template to be used by JS
     159 * Meta widget used to display the control form for a widget.  Called from dynamic_sidebar()
    147160 */
    148 function wp_widget_control( $key, $widget, $display = 'display' ) {
    149         static $i = 0;
    150         global $wp_registered_widgets, $wp_registered_widget_controls;
    151         $control = $wp_registered_widget_controls[$widget];
    152         $widget  = $wp_registered_widgets[$widget];
     161function wp_widget_control( $sidebar_args ) {
     162        global $wp_registered_widgets, $wp_registered_widget_controls, $sidebars_widgets, $edit_widget;
     163        $widget_id = $sidebar_args['widget_id'];
     164        $sidebar_id = isset($sidebar_args['id']) ? $sidebar_args['id'] : false;
    153165
     166        $control = $wp_registered_widget_controls[$widget_id];
     167        $widget  = $wp_registered_widgets[$widget_id];
     168
     169        $key = $sidebar_id ? array_search( $widget_id, $sidebars_widgets[$sidebar_id] ) : 'no-key'; // position of widget in sidebar
     170
     171        $edit = $edit_widget > 0 && $key && $edit_widget == $key; // (bool) are we currently editing this widget
     172
    154173        $id_format = $widget['id'];
    155         if ( 'template' == $display && isset($control['params'][0]['number']) ) {
     174        // We aren't showing a widget control, we're outputing a template for a mult-widget control
     175        if ( 'template' == $sidebar_args['_display'] && isset($control['params'][0]['number']) ) {
    156176                // number == -1 implies a template where id numbers are replaced by a generic '%i%'
    157177                $control['params'][0]['number'] = -1;
    158178                // if given, id_base means widget id's should be constructed like {$id_base}-{$id_number}
    159179                if ( isset($control['id_base']) )
    160180                        $id_format = $control['id_base'] . '-%i%';
    161181        }
    162 ?>
    163182
    164                 <li id="widget-list-control-item-<?php echo ++$i; ?>-<?php echo $widget['id']; ?>" class="widget-list-control-item widget-sortable">
    165                         <h4 class="widget-title">
     183        $widget_title = '';
     184        // We grab the normal widget output to find the widget's title
     185        if ( is_callable( $widget['_callback'] ) ) {
     186                ob_start();
     187                $args = func_get_args();
     188                call_user_func_array( $widget['_callback'], $args );
     189                $widget_title = ob_get_clean();
     190                $widget_title = wp_widget_control_ob_filter( $widget_title );
     191        }
     192        $wp_registered_widgets[$widget_id]['callback'] = $wp_registered_widgets[$widget_id]['_callback'];
     193        unset($wp_registered_widgets[$widget_id]['_callback']);
    166194
    167                                 <?php echo $widget['name']; // TODO: Up/Down links for noJS reordering? ?>
     195        if ( $widget_title )
     196                $widget_title = sprintf( _c('%1$s: %2$s|widget_admin_title' ), $sidebar_args['widget_name'], $widget_title );
     197        else
     198                $widget_title = wp_specialchars( strip_tags( $sidebar_args['widget_name'] ) );
    168199
    169                                 <?php if ( 'edit' == $display ) : ?>
    170200
    171                                 <a class="widget-action widget-control-edit" href="<?php echo remove_query_arg( array( 'edit', 'key' ) ); ?>"><?php _e('Cancel'); ?></a>
     201        echo $sidebar_args['before_widget'];
     202?>
     203                <h4 class="widget-title"><?php echo $widget_title ?>
    172204
    173                                 <?php else : ?>
     205                        <?php if ( $edit ) : ?>
    174206
    175                                 <a class="widget-action widget-control-edit" href="<?php echo clean_url( add_query_arg( array( 'edit' => $id_format, 'key' => $key ) ) ); ?>"><?php _e('Edit'); ?></a>
     207                        <a class="widget-action widget-control-edit" href="<?php echo remove_query_arg( array( 'edit', 'key' ) ); ?>"><?php _e('Cancel'); ?></a>
    176208
    177                                 <?php endif; ?>
     209                        <?php else : ?>
    178210
    179                         </h4>
     211                        <a class="widget-action widget-control-edit" href="<?php echo clean_url( add_query_arg( array( 'edit' => $id_format, 'key' => $key ) ) ); ?>"><?php _e('Edit'); ?></a>
    180212
    181                         <div class="widget-control"<?php if ( 'edit' == $display ) echo ' style="display: block;"'; ?>>
     213                        <?php endif; ?>
    182214
    183                                 <?php
    184                                 if ( $control )
    185                                         call_user_func_array( $control['callback'], $control['params'] );
    186                                 else
    187                                         echo '<p>' . __('There are no options for this widget.') . '</p>';
    188                                 ?>
     215                </h4>
    189216
    190                                 <input type="hidden" name="widget-id[]" value="<?php echo $id_format; ?>" />
    191                                 <input type="hidden" class="widget-width" value="<?php echo $control['width']; ?>" />
     217                <div class="widget-control"<?php if ( $edit ) echo ' style="display: block;"'; ?>>
    192218
    193                                 <div class="widget-control-actions">
     219                        <?php
     220                        if ( $control )
     221                                call_user_func_array( $control['callback'], $control['params'] );
     222                        else
     223                                echo '<p>' . __('There are no options for this widget.') . '</p>';
     224                        ?>
    194225
    195                                         <?php if ( $control && 'edit' != $display ) : ?>
     226                        <input type="hidden" name="widget-id[]" value="<?php echo $id_format; ?>" />
     227                        <input type="hidden" class="widget-width" value="<?php echo $control['width']; ?>" />
    196228
    197                                         <a class="widget-action widget-control-save edit alignleft" href="#save:<?php echo $id_format; ?>"><?php _e('Change'); ?></a>
     229                        <div class="widget-control-actions">
    198230
    199                                         <?php endif; ?>
     231                                <?php if ( $control ) : ?>
    200232
    201                                         <a class="widget-action widget-control-remove delete alignright" href="<?php echo clean_url( add_query_arg( array( 'remove' => $id_format, 'key' => $key ), wp_nonce_url( null, "remove-widget_$widget[id]" ) ) ); ?>"><?php _e('Remove'); ?></a>
    202                                         <br class="clear" />
    203                                 </div>
     233                                <a class="widget-action widget-control-save wp-no-js-hidden edit alignleft" href="#save:<?php echo $id_format; ?>"><?php _e('Change'); ?></a>
     234
     235                                <?php endif; ?>
     236
     237                                <a class="widget-action widget-control-remove delete alignright" href="<?php echo clean_url( add_query_arg( array( 'remove' => $id_format, 'key' => $key ), wp_nonce_url( null, "remove-widget_$widget[id]" ) ) ); ?>"><?php _e('Remove'); ?></a>
     238                                <br class="clear" />
    204239                        </div>
    205                 </li>
    206 
     240                </div>
    207241<?php
     242        echo $sidebar_args['after_widget'];
    208243}
    209244
     245function wp_widget_control_ob_filter( $string ) {
     246        if ( false === $beg = strpos( $string, '%BEG_OF_TITLE%' ) )
     247                return '';
     248        if ( false === $end = strpos( $string, '%END_OF_TITLE%' ) )
     249                return '';
     250        $string = substr( $string, $beg + 14 , $end - $beg - 14);
     251        return wp_specialchars( strip_tags( $string ) );
     252}
     253
    210254function widget_css() {
    211255        wp_admin_css( 'css/widgets' );
    212256}
  • wp-admin/widgets.php

     
    247247
    248248                <div id="current-sidebar">
    249249
    250                         <?php wp_list_widget_controls( $sidebars_widgets[$sidebar], $edit_widget ); // Show the control forms for each of the widgets in this sidebar ?>
     250                        <?php wp_list_widget_controls( $sidebar ); // Show the control forms for each of the widgets in this sidebar ?>
    251251
    252252                </div>
    253253        </div>