WordPress.org

Make WordPress Core

Ticket #6108: widget-titles-ob.diff

File widget-titles-ob.diff, 8.2 KB (added by mdawaffe, 7 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>