Make WordPress Core

Ticket #11387: walker_widget.2.patch

File walker_widget.2.patch, 38.8 KB (added by ShaneF, 15 years ago)

cleaned up the walker a bit. removed some stuff from the default theme files, still working on update the archives widget with more options as well.

  • wp-content/themes/classic/functions.php

     
    77automatic_feed_links();
    88
    99if ( function_exists('register_sidebar') )
    10         register_sidebar(array(
    11                 'before_widget' => '<li id="%1$s" class="widget %2$s">',
    12                 'after_widget' => '</li>',
    13                 'before_title' => '',
    14                 'after_title' => '',
    15         ));
     10        register_sidebar();
    1611
    1712?>
  • wp-content/themes/default/functions.php

     
    99automatic_feed_links();
    1010
    1111if ( function_exists('register_sidebar') ) {
    12         register_sidebar(array(
    13                 'before_widget' => '<li id="%1$s" class="widget %2$s">',
    14                 'after_widget' => '</li>',
    15                 'before_title' => '<h2 class="widgettitle">',
    16                 'after_title' => '</h2>',
    17         ));
     12        register_sidebar();
    1813}
    1914
    2015/** @ignore */
  • wp-includes/bookmark-template.php

     
    251251        echo $output;
    252252}
    253253
     254/**
     255 *
     256 * @param $args
     257 * @return unknown_type
     258 */
     259function wp_list_bookmarks_widget($args = '') {
     260        $defaults = array(
     261                'orderby' => 'name', 'order' => 'ASC',
     262                'limit' => -1, 'category' => '', 'exclude_category' => '',
     263                'category_name' => '', 'hide_invisible' => 1,
     264                'show_updated' => 0, 'echo' => 1,
     265                'categorize' => 1, 'title_li' => __('Bookmarks'),
     266                'title_before' => '<h2>', 'title_after' => '</h2>',
     267                'category_orderby' => 'name', 'category_order' => 'ASC',
     268                'class' => 'linkcat', 'category_before' => '<li id="%id" class="%class">',
     269                'category_after' => '</li>'
     270        );
     271
     272        $r = wp_parse_args( $args, $defaults );
     273        extract( $r, EXTR_SKIP );
     274
     275        $output = '';
     276
     277        if ( $categorize ) {
     278                $cats = get_terms('link_category', array('name__like' => $category_name, 'include' => $category, 'exclude' => $exclude_category, 'orderby' => $category_orderby, 'order' => $category_order, 'hierarchical' => 0));
     279
     280                foreach ( (array) $cats as $cat ) {
     281                        $params = array_merge($r, array('category' => $cat->term_id));
     282                        $bookmarks = get_bookmarks($params);
     283                        if ( empty($bookmarks) )
     284                                continue;
     285                       
     286                        $bookmarks_output[] = array(
     287                                'title' => apply_filters( "link_category", $cat->name ),
     288                                'output' => _walk_bookmarks($bookmarks, $r)
     289                        );
     290                       
     291                }
     292               
     293        } else {
     294                $bookmarks = get_bookmarks($r);
     295                if ( !empty($bookmarks) ) {
     296                        $bookmarks_output[] = array(
     297                                'title' => apply_filters( "link_category", $cat->name ),
     298                                'output' => _walk_bookmarks($bookmarks, $r)
     299                        );
     300                }
     301        }
     302       
     303        return $bookmarks_output;
     304}
     305
    254306?>
  • wp-includes/default-widgets.php

     
    2424
    2525                $title = apply_filters('widget_title', empty( $instance['title'] ) ? __( 'Pages' ) : $instance['title']);
    2626                $sortby = empty( $instance['sortby'] ) ? 'menu_order' : $instance['sortby'];
     27                $walker = empty( $instance['walker'] ) ? '' : $instance['walker'];
    2728                $exclude = empty( $instance['exclude'] ) ? '' : $instance['exclude'];
    2829
    2930                if ( $sortby == 'menu_order' )
    3031                        $sortby = 'menu_order, post_title';
    31 
    32                 $out = wp_list_pages( apply_filters('widget_pages_args', array('title_li' => '', 'echo' => 0, 'sort_column' => $sortby, 'exclude' => $exclude) ) );
    33 
    34                 if ( !empty( $out ) ) {
    35                         echo $before_widget;
    36                         if ( $title)
    37                                 echo $before_title . $title . $after_title;
    38                 ?>
    39                 <ul>
    40                         <?php echo $out; ?>
    41                 </ul>
    42                 <?php
    43                         echo $after_widget;
    44                 }
     32               
     33                if (  !empty( $walker ) )
     34                        $page_walker = new $walker;
     35                       
     36                $pages_array = array('title_li' => '', 'echo' => 0, 'sort_column' => $sortby, 'exclude' => $exclude, 'walker' => $page_walker);
     37                $output = wp_list_pages( apply_filters('widget_pages_args', $pages_array ) );
     38               
     39                $widget_design = apply_filters( 'widget_design', new Widget_Basic, $args);
     40                $widget_array = array(
     41                        'title'                 => apply_filters('widget_title', $title, $args),
     42                        'before_output' => "<ul>",
     43                        'output'                => $output,
     44                        'after_output'  => "</ul>",
     45                        'style'                 => "li"
     46                );
     47                $widget_args = array(array_merge($args, $widget_array));
     48               
     49                echo call_user_func_array( array(&$widget_design, 'display'), $widget_args );   
     50               
    4551        }
    4652
    4753        function update( $new_instance, $old_instance ) {
     
    5258                } else {
    5359                        $instance['sortby'] = 'menu_order';
    5460                }
    55 
     61               
     62                $instance['walker'] = strip_tags( $new_instance['walker'] );
    5663                $instance['exclude'] = strip_tags( $new_instance['exclude'] );
    5764
    5865                return $instance;
     
    6067
    6168        function form( $instance ) {
    6269                //Defaults
    63                 $instance = wp_parse_args( (array) $instance, array( 'sortby' => 'post_title', 'title' => '', 'exclude' => '') );
     70                $instance = wp_parse_args( (array) $instance, array( 'sortby' => 'post_title', 'title' => '', 'walker' => '', 'exclude' => '') );
    6471                $title = esc_attr( $instance['title'] );
     72                $walker = esc_attr( $instance['walker'] );
    6573                $exclude = esc_attr( $instance['exclude'] );
    6674        ?>
    6775                <p><label for="<?php echo $this->get_field_id('title'); ?>"><?php _e('Title:'); ?></label> <input class="widefat" id="<?php echo $this->get_field_id('title'); ?>" name="<?php echo $this->get_field_name('title'); ?>" type="text" value="<?php echo $title; ?>" /></p>
     
    7482                        </select>
    7583                </p>
    7684                <p>
     85                        <label for="<?php echo $this->get_field_id('walker'); ?>"><?php _e( 'Walker:' ); ?></label> <input type="text" value="<?php echo $walker; ?>" name="<?php echo $this->get_field_name('walker'); ?>" id="<?php echo $this->get_field_id('walker'); ?>" class="widefat" />
     86                        <br />
     87                        <small><?php _e( 'Customer Walker' ); ?></small>
    7788                        <label for="<?php echo $this->get_field_id('exclude'); ?>"><?php _e( 'Exclude:' ); ?></label> <input type="text" value="<?php echo $exclude; ?>" name="<?php echo $this->get_field_name('exclude'); ?>" id="<?php echo $this->get_field_id('exclude'); ?>" class="widefat" />
    7889                        <br />
    7990                        <small><?php _e( 'Page IDs, separated by commas.' ); ?></small>
     
    109120                        echo $before_widget . $before_title. __('All Links') . $after_title . $after_widget;
    110121                        return;
    111122                }
    112 
    113                 $before_widget = preg_replace('/id="[^"]*"/','id="%id"', $before_widget);
    114                 wp_list_bookmarks(apply_filters('widget_links_args', array(
    115                         'title_before' => $before_title, 'title_after' => $after_title,
    116                         'category_before' => $before_widget, 'category_after' => $after_widget,
     123               
     124                $links_data = wp_list_bookmarks_widget(apply_filters('widget_links_args', array(
     125                        'title_before' => '', 'title_after' => '', 'category_before' => '', 'category_after' => '',
    117126                        'show_images' => $show_images, 'show_description' => $show_description,
    118127                        'show_name' => $show_name, 'show_rating' => $show_rating,
    119128                        'category' => $category, 'class' => 'linkcat widget'
    120129                )));
     130                $widget_design = apply_filters( 'widget_design', new Widget_Basic, $args);
     131                $widget_default_array = array('style' => 'li', 'before_output' => '<ul class="xoxo blogroll">', 'after_output' => '</ul>');
     132               
     133                foreach ($links_data as $links) {
     134                        $widget_array[] = array_merge($links, $widget_default_array);
     135                }
     136               
     137                foreach ($widget_array as $widget_display) {
     138                        echo call_user_func_array( array(&$widget_design, 'display'), array(array_merge($args, $widget_display)) );
     139                }
     140               
    121141        }
    122142
    123143        function update( $new_instance, $old_instance ) {
     
    178198
    179199        function widget( $args, $instance ) {
    180200                extract($args);
    181                 $title = apply_filters('widget_title', $instance['title']);
     201                $title = apply_filters( 'widget_title', $instance['title'], $args);
    182202
    183                 echo $before_widget;
    184                 if ( $title )
    185                         echo $before_title . $title . $after_title;
     203                $widget_design = apply_filters( 'widget_design', new Widget_Search, $args);
     204                $widget_array = array(
     205                        'title'                 => $title,
     206                        'output'                => get_search_form(false),
     207                        'style'                 => "none"
     208                );
     209                $widget_args = array(array_merge($args, $widget_array));
     210               
     211                echo call_user_func_array( array(&$widget_design, 'display'), $widget_args );
    186212
    187                 // Use current theme search form if it exists
    188                 get_search_form();
    189 
    190                 echo $after_widget;
    191213        }
    192214
    193215        function form( $instance ) {
     
    213235 * @since 2.8.0
    214236 */
    215237class WP_Widget_Archives extends WP_Widget {
    216 
     238       
     239        // @todo Add other options, day(s), month,
     240       
    217241        function WP_Widget_Archives() {
    218242                $widget_ops = array('classname' => 'widget_archive', 'description' => __( 'A monthly archive of your blog&#8217;s posts') );
    219243                $this->WP_Widget('archives', __('Archives'), $widget_ops);
     
    223247                extract($args);
    224248                $c = $instance['count'] ? '1' : '0';
    225249                $d = $instance['dropdown'] ? '1' : '0';
    226                 $title = apply_filters('widget_title', empty($instance['title']) ? __('Archives') : $instance['title']);
    227 
    228                 echo $before_widget;
    229                 if ( $title )
    230                         echo $before_title . $title . $after_title;
    231 
     250                $title = apply_filters('widget_title', empty($instance['title']) ? __('Archives') : $instance['title'], $args);
     251               
    232252                if ( $d ) {
    233 ?>
    234                 <select name="archive-dropdown" onchange='document.location.href=this.options[this.selectedIndex].value;'> <option value=""><?php echo esc_attr(__('Select Month')); ?></option> <?php wp_get_archives(apply_filters('widget_archives_dropdown_args', array('type' => 'monthly', 'format' => 'option', 'show_post_count' => $c))); ?> </select>
    235 <?php
     253                        $output = "<select name=\"archive-dropdown\" onchange='document.location.href=this.options[this.selectedIndex].value;'> <option value=\"\">". esc_attr(__('Select Month')) . "</option>" . wp_get_archives(apply_filters('widget_archives_dropdown_args', array('echo' => 0, 'type' => 'monthly', 'format' => 'option', 'show_post_count' => $c))) . "</select>";
    236254                } else {
    237 ?>
    238                 <ul>
    239                 <?php wp_get_archives(apply_filters('widget_archives_args', array('type' => 'monthly', 'show_post_count' => $c))); ?>
    240                 </ul>
    241 <?php
     255                        $output = wp_get_archives(apply_filters('widget_archives_args', array('echo' => 0, 'type' => 'monthly', 'show_post_count' => $c)));
    242256                }
    243 
    244                 echo $after_widget;
     257               
     258                $widget_design = apply_filters( 'widget_design', new Widget_Basic, $args);
     259                $widget_array = array(
     260                        'title'                 => $title,
     261                        'before_output' => "<ul>",
     262                        'output'                => $output,
     263                        'after_output'  => "</ul>",
     264                        'style'                 => "li"
     265                );
     266                $widget_args = array(array_merge($args, $widget_array));
     267               
     268                echo call_user_func_array( array(&$widget_design, 'display'), $widget_args );
     269               
    245270        }
    246271
    247272        function update( $new_instance, $old_instance ) {
     
    286311
    287312        function widget( $args, $instance ) {
    288313                extract($args);
    289                 $title = apply_filters('widget_title', empty($instance['title']) ? __('Meta') : $instance['title']);
    290 
    291                 echo $before_widget;
    292                 if ( $title )
    293                         echo $before_title . $title . $after_title;
    294 ?>
    295                         <ul>
    296                         <?php wp_register(); ?>
    297                         <li><?php wp_loginout(); ?></li>
    298                         <li><a href="<?php bloginfo('rss2_url'); ?>" title="<?php echo esc_attr(__('Syndicate this site using RSS 2.0')); ?>"><?php _e('Entries <abbr title="Really Simple Syndication">RSS</abbr>'); ?></a></li>
    299                         <li><a href="<?php bloginfo('comments_rss2_url'); ?>" title="<?php echo esc_attr(__('The latest comments to all posts in RSS')); ?>"><?php _e('Comments <abbr title="Really Simple Syndication">RSS</abbr>'); ?></a></li>
    300                         <li><a href="http://wordpress.org/" title="<?php echo esc_attr(__('Powered by WordPress, state-of-the-art semantic personal publishing platform.')); ?>">WordPress.org</a></li>
    301                         <?php wp_meta(); ?>
    302                         </ul>
    303 <?php
    304                 echo $after_widget;
     314                $title = apply_filters('widget_title', empty($instance['title']) ? __('Meta') : $instance['title'], $args);
     315               
     316                $widget_design = apply_filters( 'widget_design', new Widget_Basic, $args);
     317                $widget_array = array(
     318                        'title'                 => $title,
     319                        'before_output' => "<ul>",
     320                        'output'                => "<li>" . wp_register('', '', false) . "</li><li>" . wp_loginout('', false) . "</li><li><a href='". get_bloginfo('rss2_url') . "' title='". __('Syndicate this site using RSS 2.0') . "'>" . __('Entries <abbr title="Really Simple Syndication">RSS</abbr>') . "</a></li><li><a href='" . get_bloginfo('comments_rss2_url') . "' title='" . __('The latest comments to all posts in RSS') . "'>" . __('Comments <abbr title="Really Simple Syndication">RSS</abbr>') . "</a></li><li><a href='http://wordpress.org/' title='" . __('Powered by WordPress, state-of-the-art semantic personal publishing platform.') . "'>WordPress.org</a></li>" . wp_meta(),
     321                        'after_output'  => "</ul>",
     322                );
     323                $widget_args = array(array_merge($args, $widget_array));
     324               
     325                echo call_user_func_array( array(&$widget_design, 'display'), $widget_args );
     326               
    305327        }
    306328
    307329        function update( $new_instance, $old_instance ) {
     
    334356
    335357        function widget( $args, $instance ) {
    336358                extract($args);
    337                 $title = apply_filters('widget_title', empty($instance['title']) ? '&nbsp;' : $instance['title']);
    338                 echo $before_widget;
    339                 if ( $title )
    340                         echo $before_title . $title . $after_title;
    341                 echo '<div id="calendar_wrap">';
    342                 get_calendar();
    343                 echo '</div>';
    344                 echo $after_widget;
     359                $title = apply_filters('widget_title', empty($instance['title']) ? __('Calendar') : $instance['title'], $args);
     360               
     361                $widget_design = apply_filters( 'widget_design', new Widget_Basic, $args);
     362                $widget_array = array(
     363                        'title'                 => $title,
     364                        'before_output' => "<div id='calendar_wrap'>",
     365                        'output'                => get_calendar(true, false),
     366                        'after_output'  => "</div>",
     367                        'style'                 => "none"
     368                );
     369                $widget_args = array(array_merge($args, $widget_array));
     370               
     371                echo call_user_func_array( array(&$widget_design, 'display'), $widget_args );
     372
    345373        }
    346374
    347375        function update( $new_instance, $old_instance ) {
     
    378406                extract($args);
    379407                $title = apply_filters( 'widget_title', empty($instance['title']) ? '' : $instance['title'], $instance );
    380408                $text = apply_filters( 'widget_text', $instance['text'], $instance );
    381                 echo $before_widget;
    382                 if ( !empty( $title ) ) { echo $before_title . $title . $after_title; } ?>
    383                         <div class="textwidget"><?php echo $instance['filter'] ? wpautop($text) : $text; ?></div>
    384                 <?php
    385                 echo $after_widget;
     409               
     410                $widget_design = apply_filters( 'widget_design', new Widget_Basic, $args);
     411                $widget_array = array(
     412                        'title'                 => $title,
     413                        'before_output' => "<div class='textwidget'>",
     414                        'output'                => $instance['filter'] ? wpautop($text) : $text,
     415                        'after_output'  => "</div>",
     416                        'style'                 => "none"
     417                );
     418                $widget_args = array(array_merge($args, $widget_array));
     419               
     420                echo call_user_func_array( array(&$widget_design, 'display'), $widget_args );
     421
    386422        }
    387423
    388424        function update( $new_instance, $old_instance ) {
     
    426462        function widget( $args, $instance ) {
    427463                extract( $args );
    428464
    429                 $title = apply_filters('widget_title', empty( $instance['title'] ) ? __( 'Categories' ) : $instance['title']);
     465                $title = apply_filters('widget_title', empty( $instance['title'] ) ? __( 'Categories' ) : $instance['title'], $args);
    430466                $c = $instance['count'] ? '1' : '0';
    431467                $h = $instance['hierarchical'] ? '1' : '0';
    432468                $d = $instance['dropdown'] ? '1' : '0';
     469                $walker = empty( $instance['walker'] ) ? '' : $instance['walker'];
     470               
     471                if (  !empty( $walker ) )
     472                        $cat_walker = new $walker;
     473               
     474                $cat_args = array('echo' => 0, 'orderby' => 'name', 'show_count' => $c, 'hierarchical' => $h, 'walker' => $cat_walker);
    433475
    434                 echo $before_widget;
    435                 if ( $title )
    436                         echo $before_title . $title . $after_title;
    437 
    438                 $cat_args = array('orderby' => 'name', 'show_count' => $c, 'hierarchical' => $h);
    439 
    440476                if ( $d ) {
    441477                        $cat_args['show_option_none'] = __('Select Category');
    442                         wp_dropdown_categories(apply_filters('widget_categories_dropdown_args', $cat_args));
    443 ?>
     478                        $widget_opt_array = array('style' => "none");
     479                        $output .= wp_dropdown_categories(apply_filters('widget_categories_dropdown_args', $cat_args));
     480                        $output .= "<script type='text/javascript'>
     481                        /* <![CDATA[ */
     482                                var dropdown = document.getElementById(\"cat\");
     483                                function onCatChange() {
     484                                        if ( dropdown.options[dropdown.selectedIndex].value > 0 ) {
     485                                                location.href = \"" . get_option('home') . "/?cat=\"+dropdown.options[dropdown.selectedIndex].value;
     486                                        }
     487                                }
     488                                dropdown.onchange = onCatChange;
     489                        /* ]]> */
     490                        </script>";
    444491
    445 <script type='text/javascript'>
    446 /* <![CDATA[ */
    447         var dropdown = document.getElementById("cat");
    448         function onCatChange() {
    449                 if ( dropdown.options[dropdown.selectedIndex].value > 0 ) {
    450                         location.href = "<?php echo get_option('home'); ?>/?cat="+dropdown.options[dropdown.selectedIndex].value;
    451                 }
    452         }
    453         dropdown.onchange = onCatChange;
    454 /* ]]> */
    455 </script>
    456 
    457 <?php
    458492                } else {
    459 ?>
    460                 <ul>
    461 <?php
    462                 $cat_args['title_li'] = '';
    463                 wp_list_categories(apply_filters('widget_categories_args', $cat_args));
    464 ?>
    465                 </ul>
    466 <?php
     493                               
     494                        $cat_args['title_li'] = '';
     495                        $widget_opt_array = array('before_output' => "<ul>", 'after_output' => "</ul>", 'style' => "li");
     496                        $output = wp_list_categories(apply_filters('widget_categories_args', $cat_args));
     497                       
    467498                }
    468499
    469                 echo $after_widget;
     500                $widget_design = apply_filters( 'widget_design', new Widget_Basic, $args);
     501                $widget_array = array(
     502                        'title'                 => $title,
     503                        'output'                => $output
     504                );
     505                $widget_args = array(array_merge($args, array_merge($widget_array, $widget_opt_array)));
     506               
     507                echo call_user_func_array( array(&$widget_design, 'display'), $widget_args );
     508               
    470509        }
    471510
    472511        function update( $new_instance, $old_instance ) {
     
    475514                $instance['count'] = $new_instance['count'] ? 1 : 0;
    476515                $instance['hierarchical'] = $new_instance['hierarchical'] ? 1 : 0;
    477516                $instance['dropdown'] = $new_instance['dropdown'] ? 1 : 0;
     517                $instance['walker'] = strip_tags( $new_instance['walker'] );
    478518
    479519                return $instance;
    480520        }
    481521
    482522        function form( $instance ) {
    483523                //Defaults
    484                 $instance = wp_parse_args( (array) $instance, array( 'title' => '') );
     524                $instance = wp_parse_args( (array) $instance, array( 'title' => '', 'walker' => '') );
    485525                $title = esc_attr( $instance['title'] );
    486526                $count = isset($instance['count']) ? (bool) $instance['count'] :false;
    487527                $hierarchical = isset( $instance['hierarchical'] ) ? (bool) $instance['hierarchical'] : false;
    488528                $dropdown = isset( $instance['dropdown'] ) ? (bool) $instance['dropdown'] : false;
     529                $walker = esc_attr( $instance['walker'] );
    489530?>
    490531                <p><label for="<?php echo $this->get_field_id('title'); ?>"><?php _e( 'Title:' ); ?></label>
    491532                <input class="widefat" id="<?php echo $this->get_field_id('title'); ?>" name="<?php echo $this->get_field_name('title'); ?>" type="text" value="<?php echo $title; ?>" /></p>
     
    497538                <label for="<?php echo $this->get_field_id('count'); ?>"><?php _e( 'Show post counts' ); ?></label><br />
    498539
    499540                <input type="checkbox" class="checkbox" id="<?php echo $this->get_field_id('hierarchical'); ?>" name="<?php echo $this->get_field_name('hierarchical'); ?>"<?php checked( $hierarchical ); ?> />
    500                 <label for="<?php echo $this->get_field_id('hierarchical'); ?>"><?php _e( 'Show hierarchy' ); ?></label></p>
     541                <label for="<?php echo $this->get_field_id('hierarchical'); ?>"><?php _e( 'Show hierarchy' ); ?></label>
     542               
     543                <br /><br />
     544                <label for="<?php echo $this->get_field_id('walker'); ?>"><?php _e( 'Walker:' ); ?></label> <input type="text" value="<?php echo $walker; ?>" name="<?php echo $this->get_field_name('walker'); ?>" id="<?php echo $this->get_field_id('walker'); ?>" class="widefat" />
     545                <br />
     546                <small><?php _e( 'Customer Walker' ); ?></small></p>
    501547<?php
    502548        }
    503549
     
    534580                ob_start();
    535581                extract($args);
    536582
    537                 $title = apply_filters('widget_title', empty($instance['title']) ? __('Recent Posts') : $instance['title']);
     583                $title = apply_filters('widget_title', empty($instance['title']) ? __('Recent Posts') : $instance['title'], $args);
    538584                if ( !$number = (int) $instance['number'] )
    539585                        $number = 10;
    540586                else if ( $number < 1 )
     
    543589                        $number = 15;
    544590
    545591                $r = new WP_Query(array('showposts' => $number, 'nopaging' => 0, 'post_status' => 'publish', 'caller_get_posts' => 1));
     592               
    546593                if ($r->have_posts()) :
    547 ?>
    548                 <?php echo $before_widget; ?>
    549                 <?php if ( $title ) echo $before_title . $title . $after_title; ?>
    550                 <ul>
    551                 <?php  while ($r->have_posts()) : $r->the_post(); ?>
    552                 <li><a href="<?php the_permalink() ?>" title="<?php echo esc_attr(get_the_title() ? get_the_title() : get_the_ID()); ?>"><?php if ( get_the_title() ) the_title(); else the_ID(); ?> </a></li>
    553                 <?php endwhile; ?>
    554                 </ul>
    555                 <?php echo $after_widget; ?>
    556 <?php
     594               
     595                        while ($r->have_posts()) {
     596                                $r->the_post();
     597                                $posts_output .= "<li><a href='" . get_permalink() . "' title='" . esc_attr(get_the_title() ? get_the_title() : get_the_ID()) . "'>" .  ( ( get_the_title() ) ? get_the_title() : the_ID() ) . "</a></li>";
     598                        }
     599                       
    557600                        wp_reset_query();  // Restore global post data stomped by the_post().
     601               
    558602                endif;
    559603
     604                $widget_design = apply_filters( 'widget_design', new Widget_Recent_Posts, $args);
     605                $widget_array = array(
     606                        'title'                 => $title,
     607                        'before_output' => "<ul>",
     608                        'output'                => $posts_output,
     609                        'after_output'  => "</ul>",
     610                        'style'                 => "li"
     611                );
     612                $widget_args = array(array_merge($args, $widget_array));
     613               
     614                echo call_user_func_array( array(&$widget_design, 'display'), $widget_args );
     615               
    560616                $cache[$args['widget_id']] = ob_get_flush();
    561617                wp_cache_add('widget_recent_posts', $cache, 'widget');
     618               
    562619        }
    563620
    564621        function update( $new_instance, $old_instance ) {
     
    625682                global $wpdb, $comments, $comment;
    626683
    627684                extract($args, EXTR_SKIP);
    628                 $title = apply_filters('widget_title', empty($instance['title']) ? __('Recent Comments') : $instance['title']);
     685                $title = apply_filters('widget_title', empty($instance['title']) ? __('Recent Comments') : $instance['title'], $args);
    629686                if ( !$number = (int) $instance['number'] )
    630687                        $number = 5;
    631688                else if ( $number < 1 )
     
    639696                }
    640697
    641698                $comments = array_slice( (array) $comments, 0, $number );
    642 ?>
    643                 <?php echo $before_widget; ?>
    644                         <?php if ( $title ) echo $before_title . $title . $after_title; ?>
    645                         <ul id="recentcomments"><?php
    646                         if ( $comments ) : foreach ( (array) $comments as $comment) :
    647                         echo  '<li class="recentcomments">' . /* translators: comments widget: 1: comment author, 2: post link */ sprintf(_x('%1$s on %2$s', 'widgets'), get_comment_author_link(), '<a href="' . esc_url( get_comment_link($comment->comment_ID) ) . '">' . get_the_title($comment->comment_post_ID) . '</a>') . '</li>';
    648                         endforeach; endif;?></ul>
    649                 <?php echo $after_widget; ?>
    650 <?php
     699               
     700                if ( $comments ) : foreach ( (array) $comments as $comment) :
     701                        $comments_output .=  '<li class="recentcomments">' . /* translators: comments widget: 1: comment author, 2: post link */ sprintf(_x('%1$s on %2$s', 'widgets'), get_comment_author_link(), '<a href="' . esc_url( get_comment_link($comment->comment_ID) ) . '">' . get_the_title($comment->comment_post_ID) . '</a>') . '</li>';
     702                endforeach; endif;
     703               
     704                $widget_design = apply_filters( 'widget_design', new Widget_Basic, $args);
     705                $widget_array = array(
     706                        'title'                 => $title,
     707                        'before_output' => "<ul id='recentcomments'>",
     708                        'output'                => $comments_output,
     709                        'after_output'  => "</ul>",
     710                        'style'                 => "li"
     711                );
     712                $widget_args = array(array_merge($args, $widget_array));
     713               
     714                echo call_user_func_array( array(&$widget_design, 'display'), $widget_args );
     715               
    651716        }
    652717
    653718        function update( $new_instance, $old_instance ) {
     
    720785
    721786                if ( empty($title) )
    722787                        $title = empty($desc) ? __('Unknown Feed') : $desc;
    723 
    724                 $title = apply_filters('widget_title', $title );
     788               
     789                $title = apply_filters('widget_title', $title, $args );
    725790                $url = esc_url(strip_tags($url));
    726791                $icon = includes_url('images/rss.png');
    727792                if ( $title )
    728793                        $title = "<a class='rsswidget' href='$url' title='" . esc_attr(__('Syndicate this content')) ."'><img style='background:orange;color:white;border:none;' width='14' height='14' src='$icon' alt='RSS' /></a> <a class='rsswidget' href='$link' title='$desc'>$title</a>";
    729 
    730                 echo $before_widget;
    731                 if ( $title )
    732                         echo $before_title . $title . $after_title;
    733                 wp_widget_rss_output( $rss, $instance );
    734                 echo $after_widget;
     794               
     795                $widget_design = apply_filters( 'widget_design', new Widget_Basic, $args);
     796                $widget_func_array = array_merge($instance, array('echo' => 0));
     797                $widget_array = array(
     798                        'title'                 => $title,
     799                        'before_output' => "<ul>",
     800                        'output'                => wp_widget_rss_output( $rss, $widget_func_array ),
     801                        'after_output'  => "</ul>",
     802                        'style'                 => "li"
     803                );
     804                $widget_args = array(array_merge($args, $widget_array));
     805               
     806                echo call_user_func_array( array(&$widget_design, 'display'), $widget_args );
     807               
    735808                $rss->__destruct();
    736809                unset($rss);
    737810        }
     
    760833 * @param array $args Widget arguments.
    761834 */
    762835function wp_widget_rss_output( $rss, $args = array() ) {
     836       
     837        $rss_items = '';
     838       
    763839        if ( is_string( $rss ) ) {
    764840                $rss = fetch_feed($rss);
    765841        } elseif ( is_array($rss) && isset($rss['url']) ) {
     
    771847
    772848        if ( is_wp_error($rss) ) {
    773849                if ( is_admin() || current_user_can('manage_options') )
    774                         echo '<p>' . sprintf( __('<strong>RSS Error</strong>: %s'), $rss->get_error_message() ) . '</p>';
     850                        $rss_items .= '<p>' . sprintf( __('<strong>RSS Error</strong>: %s'), $rss->get_error_message() ) . '</p>';
    775851                return;
    776852        }
    777853
    778         $default_args = array( 'show_author' => 0, 'show_date' => 0, 'show_summary' => 0 );
     854        $default_args = array( 'show_author' => 0, 'show_date' => 0, 'show_summary' => 0, 'echo' => 1 );
    779855        $args = wp_parse_args( $args, $default_args );
    780856        extract( $args, EXTR_SKIP );
    781857
     
    787863        $show_date     = (int) $show_date;
    788864
    789865        if ( !$rss->get_item_quantity() ) {
    790                 echo '<ul><li>' . __( 'An error has occurred; the feed is probably down. Try again later.' ) . '</li></ul>';
     866                $rss_items .= '<li>' . __( 'An error has occurred; the feed is probably down. Try again later.' ) . '</li>';
    791867                $rss->__destruct();
    792868                unset($rss);
    793869                return;
    794870        }
    795871
    796         echo '<ul>';
    797872        foreach ( $rss->get_items(0, $items) as $item ) {
    798873                $link = $item->get_link();
    799874                while ( stristr($link, 'http') != $link )
     
    835910                }
    836911
    837912                if ( $link == '' ) {
    838                         echo "<li>$title{$date}{$summary}{$author}</li>";
     913                        $rss_items .= "<li>$title{$date}{$summary}{$author}</li>";
    839914                } else {
    840                         echo "<li><a class='rsswidget' href='$link' title='$desc'>$title</a>{$date}{$summary}{$author}</li>";
     915                        $rss_items .= "<li><a class='rsswidget' href='$link' title='$desc'>$title</a>{$date}{$summary}{$author}</li>";
    841916                }
    842917        }
    843         echo '</ul>';
     918       
     919        if ( $echo )
     920                echo $rss_items;
     921        else
     922                return $rss_items;
     923       
    844924        $rss->__destruct();
    845925        unset($rss);
    846926}
     
    9741054
    9751055        function widget( $args, $instance ) {
    9761056                extract($args);
    977                 $title = apply_filters('widget_title', empty($instance['title']) ? __('Tags') : $instance['title']);
     1057                $title = apply_filters('widget_title', empty($instance['title']) ? __('Tags') : $instance['title'], $args);
    9781058
    979                 echo $before_widget;
    980                 if ( $title )
    981                         echo $before_title . $title . $after_title;
    982                 echo '<div>';
    983                 wp_tag_cloud(apply_filters('widget_tag_cloud_args', array()));
    984                 echo "</div>\n";
    985                 echo $after_widget;
     1059                $widget_design = apply_filters( 'widget_design', new Widget_Basic, $args);
     1060                $widget_array = array(
     1061                        'title'                 => $title,
     1062                        'before_output' => "<div>",
     1063                        'output'                => wp_tag_cloud(apply_filters('widget_tag_cloud_args', array('echo' => 0))),
     1064                        'after_output'  => "</div>",
     1065                        'style'                 => "none"
     1066                );
     1067                $widget_args = array(array_merge($args, $widget_array));
     1068               
     1069                echo call_user_func_array( array(&$widget_design, 'display'), $widget_args );
     1070               
    9861071        }
    9871072
    9881073        function update( $new_instance, $old_instance ) {
     
    9981083        }
    9991084}
    10001085
     1086class Walker_Widget {
     1087       
     1088        function start_widget($args, &$output)  {}
     1089       
     1090        function end_widget($args, &$output)            {}
     1091       
     1092        function title_widget($args, &$output)  {}
     1093       
     1094        function content_widget($args, &$output)        {}
     1095
     1096        function display( $args = array() ) {
     1097                $output = '';
     1098                call_user_func_array( array(&$this, 'start_widget'),    array($args, &$output) );
     1099                call_user_func_array( array(&$this, 'title_widget'),    array($args, &$output) );
     1100                call_user_func_array( array(&$this, 'content_widget'),  array($args, &$output) );
     1101                call_user_func_array( array(&$this, 'end_widget'),              array($args, &$output) );
     1102                return $output;
     1103        }
     1104       
     1105}
     1106
     1107class Widget_Basic extends Walker_Widget {
     1108       
     1109        function start_widget($args, &$output) {
     1110                $output .= sprintf( __("<li id='%s' class='widget %s'>"), $args['widget_id'], $args['classname'] );     
     1111        }
     1112       
     1113        function title_widget($args, &$output) {
     1114                $output .= "<h2>" . $args['title'] . "</h2>";
     1115        }
     1116               
     1117        function content_widget($args, &$output) {
     1118                $output .= $args['before_output'] . $args['output'] . $args['after_output'];
     1119        }
     1120       
     1121        function end_widget($args, &$output) {
     1122                $output .= "</li>";
     1123        }
     1124       
     1125}
     1126
     1127class Widget_Tag_Cloud extends Walker_Widget {
     1128       
     1129        function title_widget($args, &$output) {
     1130                $output .= "<h2>" . $args['title'] . "</h2>";
     1131        }
     1132               
     1133        function content_widget($args, &$output) {
     1134                $output .= $args['before_output'] . $args['output'] . $args['after_output'];
     1135        }
     1136       
     1137}
     1138
     1139class Widget_Search extends Walker_Widget {
     1140
     1141        function title_widget($args, &$output) {
     1142                $output .= $args['title'];
     1143        }
     1144               
     1145        function content_widget($args, &$output) {
     1146                $output .= $args['output'];
     1147        }
     1148       
     1149}
     1150
     1151class Widget_Recent_Posts extends Walker_Widget {
     1152       
     1153        function start_widget($args, &$output) {
     1154                $output .= sprintf( __("<li id='%s' class='widget %s'>"), $args['widget_id'], $args['classname'] );
     1155        }
     1156       
     1157        function title_widget($args, &$output) {
     1158                $output .= "<h2>" . $args['title'] . "</h2>";
     1159        }
     1160               
     1161        function content_widget($args, &$output) {
     1162                $output .= $args['before_output'] . $args['output'] . $args['after_output'];
     1163        }
     1164       
     1165        function end_widget($args, &$output) {
     1166                $output .= "</li>";
     1167        }
     1168       
     1169}
     1170
    10011171/**
    10021172 * Register all of the default WordPress widgets on startup.
    10031173 *
  • wp-includes/general-template.php

     
    112112 *
    113113 * @since 2.7.0
    114114 */
    115 function get_search_form() {
     115function get_search_form($echo = true) {
    116116        do_action( 'get_search_form' );
    117117
    118118        $search_form_template = locate_template(array('searchform.php'));
     
    128128        </div>
    129129        </form>';
    130130
    131         echo apply_filters('get_search_form', $form);
     131        if ( $echo )
     132                echo apply_filters('get_search_form', $form);
     133        else
     134                return apply_filters('get_search_form', $form);
    132135}
    133136
    134137/**
     
    141144 * @uses apply_filters() Calls 'loginout' hook on HTML link content.
    142145 *
    143146 * @param string $redirect Optional path to redirect to on login/logout.
     147 * @param boolean $echo Default to echo and not return the link.
    144148 */
    145 function wp_loginout($redirect = '') {
     149function wp_loginout($redirect = '', $echo = true) {
    146150        if ( ! is_user_logged_in() )
    147151                $link = '<a href="' . esc_url( wp_login_url($redirect) ) . '">' . __('Log in') . '</a>';
    148152        else
    149153                $link = '<a href="' . esc_url( wp_logout_url($redirect) ) . '">' . __('Log out') . '</a>';
    150 
    151         echo apply_filters('loginout', $link);
     154       
     155        if ( $echo )
     156                echo apply_filters('loginout', $link);
     157        else
     158                return apply_filters('loginout', $link);
    152159}
    153160
    154161/**
     
    228235 *
    229236 * @param string $before Text to output before the link (defaults to <li>).
    230237 * @param string $after Text to output after the link (defaults to </li>).
     238 * @param boolean $echo Default to echo and not return the link.
    231239 */
    232 function wp_register( $before = '<li>', $after = '</li>' ) {
     240function wp_register( $before = '<li>', $after = '</li>', $echo = true ) {
    233241
    234242        if ( ! is_user_logged_in() ) {
    235243                if ( get_option('users_can_register') )
     
    239247        } else {
    240248                $link = $before . '<a href="' . admin_url() . '">' . __('Site Admin') . '</a>' . $after;
    241249        }
    242 
    243         echo apply_filters('register', $link);
     250       
     251        if ( $echo )
     252                echo apply_filters('register', $link);
     253        else
     254                return apply_filters('register', $link);
    244255}
    245256
    246257/**
     
    952963 * @since 1.0.0
    953964 *
    954965 * @param bool $initial Optional, default is true. Use initial calendar names.
     966 * @param bool $echo Optional, default is true. Set to false for return.
    955967 */
    956 function get_calendar($initial = true) {
     968function get_calendar($initial = true, $echo = true) {
    957969        global $wpdb, $m, $monthnum, $year, $wp_locale, $posts;
    958970
    959971        $cache = array();
     
    10241036
    10251037        /* translators: Calendar caption: 1: month name, 2: 4-digit year */
    10261038        $calendar_caption = _x('%1$s %2$s', 'calendar caption');
    1027         echo '<table id="wp-calendar" summary="' . esc_attr__('Calendar') . '">
     1039        $calendar_output .= '<table id="wp-calendar" summary="' . esc_attr__('Calendar') . '">
    10281040        <caption>' . sprintf($calendar_caption, $wp_locale->get_month($thismonth), date('Y', $unixmonth)) . '</caption>
    10291041        <thead>
    10301042        <tr>';
     
    10381050        foreach ( $myweek as $wd ) {
    10391051                $day_name = (true == $initial) ? $wp_locale->get_weekday_initial($wd) : $wp_locale->get_weekday_abbrev($wd);
    10401052                $wd = esc_attr($wd);
    1041                 echo "\n\t\t<th abbr=\"$wd\" scope=\"col\" title=\"$wd\">$day_name</th>";
     1053                $calendar_output .= "\n\t\t<th abbr=\"$wd\" scope=\"col\" title=\"$wd\">$day_name</th>";
    10421054        }
    10431055
    1044         echo '
     1056        $calendar_output .= '
    10451057        </tr>
    10461058        </thead>
    10471059
     
    10491061        <tr>';
    10501062
    10511063        if ( $previous ) {
    1052                 echo "\n\t\t".'<td abbr="' . $wp_locale->get_month($previous->month) . '" colspan="3" id="prev"><a href="' .
     1064                $calendar_output .= "\n\t\t".'<td abbr="' . $wp_locale->get_month($previous->month) . '" colspan="3" id="prev"><a href="' .
    10531065                get_month_link($previous->year, $previous->month) . '" title="' . sprintf(__('View posts for %1$s %2$s'), $wp_locale->get_month($previous->month),
    10541066                        date('Y', mktime(0, 0 , 0, $previous->month, 1, $previous->year))) . '">&laquo; ' . $wp_locale->get_month_abbrev($wp_locale->get_month($previous->month)) . '</a></td>';
    10551067        } else {
    1056                 echo "\n\t\t".'<td colspan="3" id="prev" class="pad">&nbsp;</td>';
     1068                $calendar_output .= "\n\t\t".'<td colspan="3" id="prev" class="pad">&nbsp;</td>';
    10571069        }
    10581070
    1059         echo "\n\t\t".'<td class="pad">&nbsp;</td>';
     1071        $calendar_output .= "\n\t\t".'<td class="pad">&nbsp;</td>';
    10601072
    10611073        if ( $next ) {
    1062                 echo "\n\t\t".'<td abbr="' . $wp_locale->get_month($next->month) . '" colspan="3" id="next"><a href="' .
     1074                $calendar_output .= "\n\t\t".'<td abbr="' . $wp_locale->get_month($next->month) . '" colspan="3" id="next"><a href="' .
    10631075                get_month_link($next->year, $next->month) . '" title="' . esc_attr( sprintf(__('View posts for %1$s %2$s'), $wp_locale->get_month($next->month) ,
    10641076                        date('Y', mktime(0, 0 , 0, $next->month, 1, $next->year))) ) . '">' . $wp_locale->get_month_abbrev($wp_locale->get_month($next->month)) . ' &raquo;</a></td>';
    10651077        } else {
    1066                 echo "\n\t\t".'<td colspan="3" id="next" class="pad">&nbsp;</td>';
     1078                $calendar_output .= "\n\t\t".'<td colspan="3" id="next" class="pad">&nbsp;</td>';
    10671079        }
    10681080
    1069         echo '
     1081        $calendar_output .= '
    10701082        </tr>
    10711083        </tfoot>
    10721084
     
    11181130        // See how much we should pad in the beginning
    11191131        $pad = calendar_week_mod(date('w', $unixmonth)-$week_begins);
    11201132        if ( 0 != $pad )
    1121                 echo "\n\t\t".'<td colspan="'. esc_attr($pad) .'" class="pad">&nbsp;</td>';
     1133                $calendar_output .= "\n\t\t".'<td colspan="'. esc_attr($pad) .'" class="pad">&nbsp;</td>';
    11221134
    11231135        $daysinmonth = intval(date('t', $unixmonth));
    11241136        for ( $day = 1; $day <= $daysinmonth; ++$day ) {
    11251137                if ( isset($newrow) && $newrow )
    1126                         echo "\n\t</tr>\n\t<tr>\n\t\t";
     1138                        $calendar_output .= "\n\t</tr>\n\t<tr>\n\t\t";
    11271139                $newrow = false;
    11281140
    11291141                if ( $day == gmdate('j', (time() + (get_option('gmt_offset') * 3600))) && $thismonth == gmdate('m', time()+(get_option('gmt_offset') * 3600)) && $thisyear == gmdate('Y', time()+(get_option('gmt_offset') * 3600)) )
    1130                         echo '<td id="today">';
     1142                        $calendar_output .= '<td id="today">';
    11311143                else
    1132                         echo '<td>';
     1144                        $calendar_output .= '<td>';
    11331145
    11341146                if ( in_array($day, $daywithpost) ) // any posts today?
    1135                                 echo '<a href="' . get_day_link($thisyear, $thismonth, $day) . "\" title=\"" . esc_attr($ak_titles_for_day[$day]) . "\">$day</a>";
     1147                                $calendar_output .= '<a href="' . get_day_link($thisyear, $thismonth, $day) . "\" title=\"" . esc_attr($ak_titles_for_day[$day]) . "\">$day</a>";
    11361148                else
    1137                         echo $day;
    1138                 echo '</td>';
     1149                        $calendar_output .= $day;
     1150                $calendar_output .= '</td>';
    11391151
    11401152                if ( 6 == calendar_week_mod(date('w', mktime(0, 0 , 0, $thismonth, $day, $thisyear))-$week_begins) )
    11411153                        $newrow = true;
     
    11431155
    11441156        $pad = 7 - calendar_week_mod(date('w', mktime(0, 0 , 0, $thismonth, $day, $thisyear))-$week_begins);
    11451157        if ( $pad != 0 && $pad != 7 )
    1146                 echo "\n\t\t".'<td class="pad" colspan="'. esc_attr($pad) .'">&nbsp;</td>';
     1158                $calendar_output .= "\n\t\t".'<td class="pad" colspan="'. esc_attr($pad) .'">&nbsp;</td>';
    11471159
    1148         echo "\n\t</tr>\n\t</tbody>\n\t</table>";
     1160        $calendar_output .= "\n\t</tr>\n\t</tbody>\n\t</table>";
    11491161
    11501162        $output = ob_get_contents();
    11511163        ob_end_clean();
    1152         echo $output;
    11531164        $cache[ $key ] = $output;
    11541165        wp_cache_set( 'get_calendar', $cache, 'calendar' );
     1166
     1167        if ( $echo )
     1168                echo $calendar_output;
     1169        else
     1170                return $calendar_output;
     1171
    11551172}
    11561173
    11571174/**
  • wp-includes/widgets.php

     
    519519 * name - The name of the sidebar, which presumably the title which will be
    520520 *     displayed.
    521521 * id - The unique identifier by which the sidebar will be called by.
    522  * before_widget - The content that will prepended to the widgets when they are
    523  *     displayed.
    524  * after_widget - The content that will be appended to the widgets when they are
    525  *     displayed.
    526  * before_title - The content that will be prepended to the title when displayed.
    527  * after_title - the content that will be appended to the title when displayed.
    528522 *
    529523 * <em>Content</em> is assumed to be HTML and should be formatted as such, but
    530524 * doesn't have to be.
     
    548542        $defaults = array(
    549543                'name' => sprintf(__('Sidebar %d'), $i ),
    550544                'id' => "sidebar-$i",
    551                 'description' => '',
    552                 'before_widget' => '<li id="%1$s" class="widget %2$s">',
    553                 'after_widget' => "</li>\n",
    554                 'before_title' => '<h2 class="widgettitle">',
    555                 'after_title' => "</h2>\n",
     545                'description' => ''
    556546        );
    557547
    558548        $sidebar = array_merge($defaults, (array) $args);
     
    873863                                $classname_ .= '_' . get_class($cn);
    874864                }
    875865                $classname_ = ltrim($classname_, '_');
    876                 $params[0]['before_widget'] = sprintf($params[0]['before_widget'], $id, $classname_);
     866                $params[0]['classname'] = $classname_;
    877867
    878868                $params = apply_filters( 'dynamic_sidebar_params', $params );
    879869
     
    12911281        $widget_obj = $wp_widget_factory->widgets[$widget];
    12921282        if ( !is_a($widget_obj, 'WP_Widget') )
    12931283                return;
    1294 
    1295         $before_widget = sprintf('<div class="widget %s">', $widget_obj->widget_options['classname']);
    1296         $default_args = array('before_widget' => $before_widget, 'after_widget' => "</div>", 'before_title' => '<h2 class="widgettitle">', 'after_title' => '</h2>');
    1297 
    1298         $args = wp_parse_args($args, $default_args);
     1284       
     1285        echo "when do we run?";
     1286               
    12991287        $instance = wp_parse_args($instance);
    13001288
    13011289        $widget_obj->_set(-1);