So I am literally a newborn here when it comes to php. I have been working on editing someone elses open code from github as practice, but can't seem to get what
I'd like done. The code takes information from a plugin from WordPress, and spits it out in raw form for people to see publicly. What I am trying to figure out, is how
to take the same information, and wrap it inside an index table so it doesn't look like just plain text. Was hoping someone could help me out and explain how
they done it so I can practice myself. The code is below.
/**
* 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' );
}