Skip to content

Instantly share code, notes, and snippets.

@gabrielmerovingi
Last active June 21, 2016 15:19
Show Gist options
  • Save gabrielmerovingi/8699905 to your computer and use it in GitHub Desktop.
Save gabrielmerovingi/8699905 to your computer and use it in GitHub Desktop.
Custom WordPress widget to show this weeks leaderboard for myCRED points.
/**
* Custom myCRED Widget: This weeks leaderboard
* This widget will show this weeks leaderbaord with the option to set
* a title, the number of users to include and if it should be visible for
* non-members.
* @install Paste into your theme or child-themes functions.php file or custom plguin.
* @author Gabriel S Merovingi
* @version 1.3
*/
add_action( 'mycred_widgets_init', 'mycred_load_this_weeks_leaderboard_widget' );
function mycred_load_this_weeks_leaderboard_widget() {
if ( ! class_exists( 'myCRED_Widget_This_Weeks_Leaderboard' ) ) {
class myCRED_Widget_This_Weeks_Leaderboard extends WP_Widget {
// Constructor
public function __construct() {
parent::__construct(
'mycred_widget_this_weeks_leaderboard',
sprintf( __( '(%s) This weeks Leaderboard', 'mycred' ), mycred_label() ),
array(
'classname' => 'widget-mycred-this-weeks-leaderboard',
'description' => __( 'Show the leaderboard for a given timeframe.', 'mycred' )
)
);
}
// Widget Output (what users see)
public function widget( $args, $instance ) {
extract( $args, EXTR_SKIP );
// Check if we want to show this to visitors
if ( ! $instance['show_visitors'] && ! is_user_logged_in() ) return;
// Get the leaderboard
$leaderboard = $this->get_leaderboard( $instance['number'], $widget_id );
// Load myCRED
$mycred = mycred();
// Start constructing Widget
echo $before_widget;
// Title (if not empty)
if ( ! empty( $instance['title'] ) ) {
echo $before_title;
// Allow general tempalte tags in the title
echo $mycred->template_tags_general( $instance['title'] );
echo $after_title;
}
// Construct unorganized list for each row
echo '<ul class="mycred-this-weeks-leaderboard">';
foreach ( $leaderboard as $position => $data ) {
$avatar = get_avatar( $data->user_id, 32 );
echo '<li>' . $avatar . $data->display_name . ' with ' . $mycred->format_creds( $data->total ) . '</li>';
}
echo '</ul>';
echo $after_widget;
}
// Widget Settings (when editing / setting up widget)
public function form( $instance ) {
$title = isset( $instance['title'] ) ? esc_attr( $instance['title'] ) : __( 'This Months Leaderboard', 'mycred' );
$number = isset( $instance['number'] ) ? abs( $instance['number'] ) : 5;
$show_visitors = isset( $instance['show_visitors'] ) ? 1 : 0;
?>
<p class="myCRED-widget-field">
<label for="<?php echo esc_attr( $this->get_field_id( 'title' ) ); ?>"><?php _e( 'Title', 'mycred' ); ?>:</label>
<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 ); ?>" />
</p>
<p class="myCRED-widget-field">
<label for="<?php echo esc_attr( $this->get_field_id( 'number' ) ); ?>"><?php _e( 'Number of users', 'mycred' ); ?>:</label>
<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" />
</p>
<p class="myCRED-widget-field">
<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" />
<label for="<?php echo esc_attr( $this->get_field_id( 'show_visitors' ) ); ?>"><?php _e( 'Visible to non-members', 'mycred' ); ?></label>
</p>
<?php
}
// Save Widget Settings
public function update( $new_instance, $old_instance ) {
$instance = $old_instance;
$instance['number'] = absint( $new_instance['number'] );
$instance['title'] = sanitize_text_field( $new_instance['title'] );
$instance['show_visitors'] = ( isset( $new_instance['show_visitors'] ) ) ? $new_instance['show_visitors'] : 0;
return $instance;
}
// Grabs the leaderboard
public function get_leaderboard( $number = 5, $widget_id = '' ) {
// Get transient
$leaderboard = get_transient( 'mycred_twl_' . $widget_id );
$now = current_time( 'timestamp' );
$this_week = date( 'W', $now );
// If a transient is set, check if it is time for an update
if ( $leaderboard !== false ) {
reset( $leaderboard );
$saved_week = key( $leaderboard );
// Compare the first array key (which holds the week number) to this weeks
// If they do not match, it is a new week and we need to make a new query.
// Same goes for empty results (new sites)
if ( $this_week != $saved_week || empty( $leaderboard[ $saved_week ] ) )
$leaderboard = false;
// Else return the results
else
$leaderboard = $leaderboard[ $this_week ];
}
// If transient does not exist or a new number is set, do a new DB Query
if ( $leaderboard === false || $number != 5 ) {
$leaderboard = array();
// Load the wpdb class
global $wpdb;
$mycred = mycred();
$start_of_week = strtotime( "-1 week" );
$leaderboard[ $this_week ] = $wpdb->get_results( $wpdb->prepare( "
SELECT m.user_id, u.display_name, sum( m.creds ) AS total
FROM {$mycred->log_table} m
LEFT JOIN {$wpdb->users} u
ON u.ID = m.user_id
WHERE ( m.time >= %d AND m.time <= %d AND m.creds > 0 )
GROUP BY m.user_id
ORDER BY total DESC LIMIT 0,%d;", $start_of_week, $now, $number ) );
// Save results for a week
set_transient( 'mycred_twl_' . $widget_id, $leaderboard, WEEK_IN_SECONDS );
$leaderboard = $leaderboard[ $this_week ];
}
return $leaderboard;
}
}
}
register_widget( 'myCRED_Widget_This_Weeks_Leaderboard' );
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment