WordPress.org

Make WordPress Core

Changeset 11090


Ignore:
Timestamp:
04/26/09 20:09:08 (5 years ago)
Author:
azaozz
Message:

Move recent comments widget to WP_Widget, extend is_active_widget() to use $id_base, see #8441

Location:
trunk/wp-includes
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/wp-includes/default-widgets.php

    r11088 r11090  
    505505 
    506506    function widget($args, $instance) { 
    507         if ( $output = wp_cache_get('widget_recent_posts' . $args['widget_id'], 'widget') ) 
    508             return print($output); 
     507        $cache = wp_cache_get('widget_recent_posts', 'widget'); 
     508         
     509        if ( !is_array($cache) ) 
     510            $cache = array(); 
     511         
     512        if ( isset($cache[$args['widget_id']]) ) 
     513            return $cache[$args['widget_id']]; 
    509514 
    510515        ob_start(); 
     
    534539        endif; 
    535540 
    536         wp_cache_add('widget_recent_posts' . $args['widget_id'], ob_get_flush(), 'widget'); 
     541        $cache[$args['widget_id']] = ob_get_flush(); 
     542        wp_cache_add('widget_recent_posts', $cache, 'widget'); 
    537543    } 
    538544 
     
    551557 
    552558    function flush_widget_cache() { 
    553         wp_cache_delete('widget_recent_entries', 'widget'); 
     559        wp_cache_delete('widget_recent_posts', 'widget'); 
    554560    } 
    555561 
     
    559565            $number = 5; 
    560566?> 
    561         <p> 
    562             <label for="<?php echo $this->get_field_id('title'); ?>"> 
    563                 <?php _e('Title:'); ?> 
    564                 <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; ?>" /> 
    565             </label> 
    566         </p> 
    567         <p> 
    568             <label for="<?php echo $this->get_field_id('number'); ?>"> 
    569                 <?php _e('Number of posts to show:'); ?> 
    570                 <input id="<?php echo $this->get_field_id('number'); ?>" name="<?php echo $this->get_field_name('number'); ?>" type="text" value="<?php echo $number; ?>" /> 
    571             </label><br /> 
    572             <small><?php _e('(at most 15)'); ?></small> 
    573         </p> 
    574 <?php 
    575     } 
    576 } 
    577  
    578 /** 
    579  * Display recent comments widget. 
    580  * 
    581  * @since 2.2.0 
    582  * 
    583  * @param array $args Widget arguments. 
    584  */ 
    585 function wp_widget_recent_comments($args) { 
    586     global $wpdb, $comments, $comment; 
    587     extract($args, EXTR_SKIP); 
    588     $options = get_option('widget_recent_comments'); 
    589     $title = empty($options['title']) ? __('Recent Comments') : apply_filters('widget_title', $options['title']); 
    590     if ( !$number = (int) $options['number'] ) 
    591         $number = 5; 
    592     else if ( $number < 1 ) 
    593         $number = 1; 
    594     else if ( $number > 15 ) 
    595         $number = 15; 
    596  
    597     if ( !$comments = wp_cache_get( 'recent_comments', 'widget' ) ) { 
    598         $comments = $wpdb->get_results("SELECT * FROM $wpdb->comments WHERE comment_approved = '1' ORDER BY comment_date_gmt DESC LIMIT $number"); 
    599         wp_cache_add( 'recent_comments', $comments, 'widget' ); 
    600     } 
    601 ?> 
    602  
     567    <p><label for="<?php echo $this->get_field_id('title'); ?>"> 
     568    <?php _e('Title:'); ?> 
     569    <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; ?>" /></label></p> 
     570 
     571    <p><label for="<?php echo $this->get_field_id('number'); ?>"> 
     572    <?php _e('Number of posts to show:'); ?> 
     573    <input id="<?php echo $this->get_field_id('number'); ?>" name="<?php echo $this->get_field_name('number'); ?>" type="text" value="<?php echo $number; ?>" /></label> 
     574    <br /><small><?php _e('(at most 15)'); ?></small></p> 
     575<?php 
     576    } 
     577} 
     578 
     579/** 
     580 * Recent_Comments widget class 
     581 * 
     582 * @since 2.8.0 
     583 */ 
     584class WP_Widget_Recent_Comments extends WP_Widget { 
     585 
     586    function WP_Widget_Recent_Comments() { 
     587        $widget_ops = array('classname' => 'widget_recent_comments', 'description' => __( 'The most recent comments' ) ); 
     588        $this->WP_Widget('recent-comments', __('Recent Comments'), $widget_ops); 
     589        $this->alt_option_name = 'widget_recent_comments'; 
     590 
     591        if ( is_active_widget(false, false, $this->id_base) ) 
     592            add_action( 'wp_head', array(&$this, 'recent_comments_style') ); 
     593 
     594        add_action( 'comment_post', array(&$this, 'flush_widget_cache') ); 
     595        add_action( 'wp_set_comment_status', array(&$this, 'flush_widget_cache') ); 
     596    } 
     597     
     598    function recent_comments_style() { ?> 
     599    <style type="text/css">.recentcomments a{display:inline !important;padding:0 !important;margin:0 !important;}</style> 
     600<?php 
     601    } 
     602 
     603    function flush_widget_cache() { 
     604        wp_cache_delete('recent_comments', 'widget'); 
     605    } 
     606 
     607    function widget( $args, $instance ) { 
     608        global $wpdb, $comments, $comment; 
     609         
     610        extract($args, EXTR_SKIP); 
     611        $title = empty($instance['title']) ? __('Recent Comments') : apply_filters('widget_title', $instance['title']); 
     612        if ( !$number = (int) $instance['number'] ) 
     613            $number = 5; 
     614        else if ( $number < 1 ) 
     615            $number = 1; 
     616        else if ( $number > 15 ) 
     617            $number = 15; 
     618     
     619        if ( !$comments = wp_cache_get( 'recent_comments', 'widget' ) ) { 
     620            $comments = $wpdb->get_results("SELECT * FROM $wpdb->comments WHERE comment_approved = '1' ORDER BY comment_date_gmt DESC LIMIT 15"); 
     621            wp_cache_add( 'recent_comments', $comments, 'widget' ); 
     622        } 
     623         
     624        $comments = array_slice( (array) $comments, 0, $number ); 
     625?> 
    603626        <?php echo $before_widget; ?> 
    604627            <?php echo $before_title . $title . $after_title; ?> 
     
    609632        <?php echo $after_widget; ?> 
    610633<?php 
    611 } 
    612  
    613 /** 
    614  * Remove the cache for recent comments widget. 
    615  * 
    616  * @since 2.2.0 
    617  */ 
    618 function wp_delete_recent_comments_cache() { 
    619     wp_cache_delete( 'recent_comments', 'widget' ); 
    620 } 
    621 add_action( 'comment_post', 'wp_delete_recent_comments_cache' ); 
    622 add_action( 'wp_set_comment_status', 'wp_delete_recent_comments_cache' ); 
    623  
    624 /** 
    625  * Display and process recent comments widget options form. 
    626  * 
    627  * @since 2.2.0 
    628  */ 
    629 function wp_widget_recent_comments_control() { 
    630     $options = $newoptions = get_option('widget_recent_comments'); 
    631     if ( isset($_POST["recent-comments-submit"]) ) { 
    632         $newoptions['title'] = strip_tags(stripslashes($_POST["recent-comments-title"])); 
    633         $newoptions['number'] = (int) $_POST["recent-comments-number"]; 
    634     } 
    635     if ( $options != $newoptions ) { 
    636         $options = $newoptions; 
    637         update_option('widget_recent_comments', $options); 
    638         wp_delete_recent_comments_cache(); 
    639     } 
    640     $title = attribute_escape($options['title']); 
    641     if ( !$number = (int) $options['number'] ) 
    642         $number = 5; 
    643 ?> 
    644             <p><label for="recent-comments-title"><?php _e('Title:'); ?> <input class="widefat" id="recent-comments-title" name="recent-comments-title" type="text" value="<?php echo $title; ?>" /></label></p> 
    645             <p> 
    646                 <label for="recent-comments-number"><?php _e('Number of comments to show:'); ?> <input style="width: 25px; text-align: center;" id="recent-comments-number" name="recent-comments-number" type="text" value="<?php echo $number; ?>" /></label> 
    647                 <br /> 
    648                 <small><?php _e('(at most 15)'); ?></small> 
    649             </p> 
    650             <input type="hidden" id="recent-comments-submit" name="recent-comments-submit" value="1" /> 
    651 <?php 
    652 } 
    653  
    654 /** 
    655  * Display the style for recent comments widget. 
    656  * 
    657  * @since 2.2.0 
    658  */ 
    659 function wp_widget_recent_comments_style() { 
    660 ?> 
    661 <style type="text/css">.recentcomments a{display:inline !important;padding: 0 !important;margin: 0 !important;}</style> 
    662 <?php 
    663 } 
    664  
    665 /** 
    666  * Register recent comments with control and hook for 'wp_head' action. 
    667  * 
    668  * @since 2.2.0 
    669  */ 
    670 function wp_widget_recent_comments_register() { 
    671     $widget_ops = array('classname' => 'widget_recent_comments', 'description' => __( 'The most recent comments' ) ); 
    672     wp_register_sidebar_widget('recent-comments', __('Recent Comments'), 'wp_widget_recent_comments', $widget_ops); 
    673     wp_register_widget_control('recent-comments', __('Recent Comments'), 'wp_widget_recent_comments_control'); 
    674  
    675     if ( is_active_widget('wp_widget_recent_comments') ) 
    676         add_action('wp_head', 'wp_widget_recent_comments_style'); 
     634    } 
     635 
     636    function update( $new_instance, $old_instance ) { 
     637        $instance = $old_instance; 
     638        $instance['title'] = strip_tags($new_instance['title']); 
     639        $instance['number'] = (int) $new_instance['number']; 
     640        $this->flush_widget_cache(); 
     641 
     642        $alloptions = wp_cache_get( 'alloptions', 'options' ); 
     643        if ( isset($alloptions['widget_recent_comments']) ) 
     644            delete_option('widget_recent_comments'); 
     645 
     646        return $instance; 
     647    } 
     648 
     649    function form( $instance ) { 
     650        $title = attribute_escape($instance['title']); 
     651        if ( !$number = (int) $instance['number'] ) 
     652            $number = 5; 
     653?> 
     654    <p><label for="<?php echo $this->get_field_id('title'); ?>"> 
     655    <?php _e('Title:'); ?> 
     656    <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; ?>" /></label></p> 
     657 
     658    <p><label for="<?php echo $this->get_field_id('number'); ?>"> 
     659    <?php _e('Number of comments to show:'); ?> 
     660    <input id="<?php echo $this->get_field_id('number'); ?>" name="<?php echo $this->get_field_name('number'); ?>" type="text" value="<?php echo $number; ?>" /></label> 
     661    <br /><small><?php _e('(at most 15)'); ?></small></p> 
     662<?php 
     663    } 
    677664} 
    678665 
     
    11391126 
    11401127    register_widget('WP_Widget_Recent_Posts'); 
     1128     
     1129    register_widget('WP_Widget_Recent_Comments'); 
    11411130 
    11421131    $widget_ops = array('classname' => 'widget_tag_cloud', 'description' => __( "Your most used tags in cloud format") ); 
     
    11451134 
    11461135    wp_widget_rss_register(); 
    1147     wp_widget_recent_comments_register(); 
    11481136 
    11491137    do_action('widgets_init'); 
  • trunk/wp-includes/widgets.php

    r11088 r11090  
    784784 
    785785/** 
    786  * Whether widget is registered using callback with widget ID. 
    787  * 
    788  * Without the optional $widget_id parameter, returns the ID of the first sidebar in which the first instance of the widget with the given callback is found. 
    789  * With the $widget_id parameter, returns the ID of the sidebar in which the widget with that callback AND that ID is found. 
    790  * 
    791  * @since 2.2.0 
    792  * 
    793  * @param callback $callback Widget callback to check. 
     786 * Whether widget is displayied on the front-end. 
     787 * 
     788 * Either $callback or $id_base can be used 
     789 * $id_base is the first argument when extending WP_Widget class 
     790 * Without the optional $widget_id parameter, returns the ID of the first sidebar 
     791 * in which the first instance of the widget with the given callback or $id_base is found. 
     792 * With the $widget_id parameter, returns the ID of the sidebar where 
     793 * the widget with that callback/$id_base AND that ID is found. 
     794 *  
     795 * NOTE: $widget_id and $id_base are the same for single widgets. To be effective 
     796 * this function has to run after widgets have initialized, at action 'init' or later. 
     797 * 
     798 * @since 2.2.0 
     799 * 
     800 * @param callback Optional, Widget callback to check. 
    794801 * @param int $widget_id Optional, but needed for checking. Widget ID. 
    795 /* @return mixed false if widget is not active or id of sidebar in which the widget is active. 
    796  */ 
    797 function is_active_widget($callback, $widget_id = false) { 
     802 * @param string $id_base Optional, the base ID of a widget created by extending WP_Widget. 
     803 * @return mixed false if widget is not active or id of sidebar in which the widget is active. 
     804 */ 
     805function is_active_widget($callback = false, $widget_id = false, $id_base = false) { 
    798806    global $wp_registered_widgets; 
    799807 
     
    801809 
    802810    if ( is_array($sidebars_widgets) ) foreach ( $sidebars_widgets as $sidebar => $widgets ) 
     811        if ( 'wp_inactive_widgets' == $sidebar ) 
     812            continue; 
     813 
    803814        if ( is_array($widgets) ) foreach ( $widgets as $widget ) 
    804             if ( isset($wp_registered_widgets[$widget]['callback']) && $wp_registered_widgets[$widget]['callback'] == $callback ) 
     815            if ( ( $callback && isset($wp_registered_widgets[$widget]['callback']) && $wp_registered_widgets[$widget]['callback'] == $callback ) || ( $id_base && preg_replace( '/-[0-9]+$/', '', $widget ) == $id_base ) ) { 
    805816                if ( !$widget_id || $widget_id == $wp_registered_widgets[$widget]['id'] ) 
    806817                    return $sidebar; 
    807  
     818            } 
    808819 
    809820    return false; 
Note: See TracChangeset for help on using the changeset viewer.