Advertisement
designbymerovingi

myCRED: Custom Widget - This weeks leaderboard

Aug 21st, 2013
270
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 6.46 KB | None | 0 0
  1. <?php
  2. /**
  3.  * Custom myCRED Widget: This weeks leaderboard
  4.  * This widget will show this weeks leaderbaord with the option to set
  5.  * a title, the number of users to include and if it should be visible for
  6.  * non-members.
  7.  *
  8.  * @author Gabriel S Merovingi
  9.  * @version 1.2.2
  10.  */
  11. if ( function_exists( 'mycred_label' ) ) :
  12.     /**
  13.      * Step 1: Register Widget
  14.      * @version 1.0
  15.      */
  16.     add_action( 'widgets_init', 'mycred_register_custom_widgets' );
  17.     function mycred_register_custom_widgets()
  18.     {
  19.         register_widget( 'myCRED_Widget_This_Weeks_Leaderboard' );
  20.     }
  21.  
  22.     /**
  23.      * Step 2: Construct Widget
  24.      * @version 1.2
  25.      */
  26.     if ( ! class_exists( 'myCRED_Widget_This_Weeks_Leaderboard' ) ) {
  27.         class myCRED_Widget_This_Weeks_Leaderboard extends WP_Widget {
  28.  
  29.             // Constructor
  30.             public function __construct() {
  31.                 $name = mycred_label();
  32.                 // Basic details about our widget
  33.                 $widget_ops = array(
  34.                     'classname'   => 'widget-mycred-this-weeks-leaderboard',
  35.                     'description' => __( 'Show the leaderboard for a given timeframe.', 'mycred' )
  36.             );
  37.                 $this->WP_Widget( 'mycred_widget_this_weeks_leaderboard', __( 'This weeks Leaderboard', 'mycred' ), $widget_ops );
  38.                 $this->alt_option_name = 'mycred_widget_this_weeks_leaderboard';
  39.             }
  40.  
  41.             // Widget Output (what users see)
  42.             public function widget( $args, $instance ) {
  43.                 extract( $args, EXTR_SKIP );
  44.  
  45.                 // Check if we want to show this to visitors
  46.                 if ( ! $instance['show_visitors'] && ! is_user_logged_in() ) return;
  47.            
  48.                 // Get the leaderboard
  49.                 $leaderboard = $this->get_leaderboard( $instance['number'], $widget_id );
  50.            
  51.                 // Load myCRED
  52.                 $mycred = mycred_get_settings();
  53.  
  54.                 // Start constructing Widget
  55.                 echo $before_widget;
  56.            
  57.                 // Title (if not empty)
  58.                 if ( ! empty( $instance['title'] ) ) {
  59.                     echo $before_title;
  60.                     // Allow general tempalte tags in the title
  61.                     echo $mycred->template_tags_general( $instance['title'] );
  62.                     echo $after_title;
  63.                 }
  64.  
  65.                 // Construct unorganized list for each row
  66.                 echo '<ul class="mycred-this-weeks-leaderboard">';
  67.                 foreach ( $leaderboard as $position => $data ) {
  68.                     echo '<li>' . $data->display_name . ' with ' . $mycred->format_creds( $data->total ) . '</li>';
  69.                 }
  70.                 echo '</ul>';
  71.  
  72.                 echo $after_widget;
  73.             }
  74.  
  75.             // Widget Settings (when editing / setting up widget)
  76.             public function form( $instance ) {
  77.                 $title = isset( $instance['title'] ) ? esc_attr( $instance['title'] ) : __( 'This Weeks Leaderboard', 'mycred' );
  78.                 $number = isset( $instance['number'] ) ? abs( $instance['number'] ) : 5;
  79.                 $show_visitors = isset( $instance['show_visitors'] ) ? 1 : 0; ?>
  80.  
  81. <p class="myCRED-widget-field">
  82.     <label for="<?php echo esc_attr( $this->get_field_id( 'title' ) ); ?>"><?php _e( 'Title', 'mycred' ); ?>:</label>
  83.     <input class="widefat" id="<?php echo esc_attr( $this->get_field_id( 'title' ) ); ?>" name="<?php echo esc_attr( $this->get_field_name( 'title' ) ); ?>" type="text" value="<?php echo esc_attr( $title ); ?>" />
  84. </p>
  85. <p class="myCRED-widget-field">
  86.     <label for="<?php echo esc_attr( $this->get_field_id( 'number' ) ); ?>"><?php _e( 'Number of users', 'mycred' ); ?>:</label>
  87.     <input id="<?php echo esc_attr( $this->get_field_id( 'number' ) ); ?>" name="<?php echo esc_attr( $this->get_field_name( 'number' ) ); ?>" type="text" value="<?php echo $number; ?>" size="3" class="align-right" />
  88. </p>
  89. <p class="myCRED-widget-field">
  90.     <input type="checkbox" name="<?php echo esc_attr( $this->get_field_name( 'show_visitors' ) ); ?>" id="<?php echo esc_attr( $this->get_field_id( 'show_visitors' ) ); ?>" value="1"<?php checked( $show_visitors, 1 ); ?> class="checkbox" />
  91.     <label for="<?php echo esc_attr( $this->get_field_id( 'show_visitors' ) ); ?>"><?php _e( 'Visible to non-members', 'mycred' ); ?></label>
  92. </p>
  93. <?php if ( isset( $this->id ) && $this->id !== false ) : ?>
  94. <p class="myCRED-widget-field">
  95.     <input type="checkbox" name="<?php echo esc_attr( $this->get_field_name( 'reset_leaderboard' ) ); ?>" id="<?php echo esc_attr( $this->get_field_id( 'reset_leaderboard' ) ); ?>" value="1" class="checkbox" />
  96.     <label for="<?php echo esc_attr( $this->get_field_id( 'reset_leaderboard' ) ); ?>"><?php _e( 'Reset Leaderboard', 'mycred' ); ?></label>
  97. </p>
  98. <?php
  99.                 endif;
  100.             }
  101.  
  102.             // Save Widget Settings
  103.             public function update( $new_instance, $old_instance ) {
  104.                 $instance = $old_instance;
  105.                 $instance['number'] = (int) $new_instance['number'];
  106.                 $instance['title'] = trim( $new_instance['title'] );
  107.                 $instance['show_visitors'] = $new_instance['show_visitors'];
  108.            
  109.                 if ( isset( $new_instance['reset_leaderboard'] ) && $this->id !== false ) {
  110.                     delete_transient( 'mycred_twl_' . $this->id );
  111.                 }
  112.  
  113.                 mycred_flush_widget_cache( 'mycred_widget_this_weeks_leaderboard' );
  114.                 return $instance;
  115.             }
  116.  
  117.             // Grabs the leaderboard
  118.             public function get_leaderboard( $number = 5, $widget_id = '' ) {
  119.                 // Get transient
  120.                 $data = get_transient( 'mycred_twl_' . $widget_id );
  121.                 $this_week = date_i18n( 'W' );
  122.            
  123.                 // If a transient is set, check if it is time for an update
  124.                 if ( $data !== false ) {
  125.                     reset( $data );
  126.                     $saved_week = key( $data );
  127.                     // Compare the first array key (which holds the week number) to this weeks
  128.                     // If they do not match, it is a new week and we need to make a new query.
  129.                     // Same goes for empty results (new sites)
  130.                     if ( $this_week != $saved_week || empty( $data[ $saved_week ] ) )
  131.                         $data = false;
  132.                     // Else return the results
  133.                     else
  134.                         $data = $data[ $this_week ];
  135.                 }
  136.  
  137.                 // If transient does not exist or a new number is set, do a new DB Query   
  138.                 if ( $data === false || $number != 5 ) {
  139.                     // Start over
  140.                     $data = array();
  141.                
  142.                     // Load the wpdb class
  143.                     global $wpdb;
  144.                
  145.                     $mycred = $wpdb->prefix . 'myCRED_log';
  146.                     $SQL = "
  147. SELECT m.user_id, u.display_name, sum( m.creds ) AS total
  148. FROM {$mycred} m
  149. LEFT JOIN {$wpdb->users} u
  150.     ON u.ID = m.user_id
  151. WHERE ( m.time >= %d AND m.time <= %d AND m.creds > 0 )
  152. GROUP BY m.user_id
  153. ORDER BY total DESC LIMIT 0,%d;";
  154.                
  155.                     // Save results under this week
  156.                     $now = date_i18n( 'U' );
  157.                     $last_week = strtotime( "-1 week" );
  158.                     $data[ $this_week ] = $wpdb->get_results( $wpdb->prepare( $SQL, $last_week, $now, $number ) );
  159.                     // Save results for a week
  160.                     set_transient( 'mycred_twl_' . $widget_id, $data, WEEK_IN_SECONDS );
  161.                     $data = $data[ $this_week ];
  162.                 }
  163.            
  164.                 return $data;
  165.             }
  166.         }
  167.     }
  168.  
  169. endif; ?>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement