Skip to content

Instantly share code, notes, and snippets.

@gabrielmerovingi
Last active December 15, 2016 13:50
Show Gist options
  • Save gabrielmerovingi/3a4e491e0ca7ac5a89fd to your computer and use it in GitHub Desktop.
Save gabrielmerovingi/3a4e491e0ca7ac5a89fd to your computer and use it in GitHub Desktop.
A quick example of how to create a custom WordPress widget that will show the current months leaderboard based on myCRED Points. Requires myCRED 1.4 or higher.
/**
* Custom myCRED Widget: This months leaderboard
* This widget will show this months 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 plugin.
* @author Gabriel S Merovingi
* @version 1.1.1
*/
add_action( 'mycred_widgets_init', 'mycred_load_this_months_leaderboard_widget' );
function mycred_load_this_months_leaderboard_widget() {
if ( ! class_exists( 'myCRED_Widget_This_Months_Leaderboard' ) ) {
class myCRED_Widget_This_Months_Leaderboard extends WP_Widget {
// Constructor
public function __construct() {
parent::__construct(
'mycred_widget_this_months_leaderboard',
sprintf( __( '(%s) This Months Leaderboard', 'mycred' ), mycred_label() ),
array(
'classname' => 'widget-mycred-this-months-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'] == 0 && ! 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-months-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 if ( isset( $this->id ) && $this->id !== false ) : ?>
<p class="myCRED-widget-field">
<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" />
<label for="<?php echo esc_attr( $this->get_field_id( 'reset_leaderboard' ) ); ?>"><?php _e( 'Reset Leaderboard', 'mycred' ); ?></label>
</p>
<?php
endif;
}
// 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;
if ( isset( $new_instance['reset_leaderboard'] ) && $this->id !== false ) {
delete_transient( 'mycred_tml_' . $this->id );
}
return $instance;
}
// Grabs the leaderboard
public function get_leaderboard( $number = 5, $widget_id = '' ) {
// Get transient
$leaderboard = get_transient( 'mycred_tml_' . $widget_id );
// If transient does not exist or a new number is set, do a new DB Query
if ( $leaderboard === false || $number != 5 ) {
// Load the wpdb class
global $wpdb;
$mycred = mycred();
$now = current_time( 'timestamp' );
$start_of_month = strtotime( "first day of this month" );
$leaderboard = $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_month, $now, $number ) );
// Save results till end of month
$lifespan = (int) strtotime( "last day of this month" ) - $now;
set_transient( 'mycred_tml_' . $widget_id, $leaderboard, $lifespan );
}
return $leaderboard;
}
}
}
register_widget( 'myCRED_Widget_This_Months_Leaderboard' );
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment