AnsPress_Leaderboard_Widget()
Description #
Class for AnsPress question leaderboard widget.
Source #
File: widgets/leaderboard.php
class AnsPress_Leaderboard_Widget extends WP_Widget {
/**
* Initialize the class
*/
public function __construct() {
parent::__construct(
'ap_leaderboard_widget',
__( '(AnsPress) User Leaderboard', 'anspress-question-answer' ),
array( 'description' => __( 'Shows users leaderboard.', 'anspress-question-answer' ) )
);
}
/**
* Get top users from database.
*
* @param int $interval Interval in days.
* @param int $limit Limit of users.
* @return object
*/
private function get_top_users( $interval, $limit ) {
global $wpdb;
$interval = absint( $interval );
$limit = absint( $limit );
$cap_key = $wpdb->prefix . 'capabilities';
return $wpdb->get_results( // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery,WordPress.DB.DirectDatabaseQuery.NoCaching
$wpdb->prepare(
"SELECT users.ID, users.display_name, sum(rep_ev.points) AS aggregated FROM $wpdb->ap_reputations rep
INNER JOIN $wpdb->ap_reputation_events rep_ev ON rep.rep_event = rep_ev.slug
INNER JOIN $wpdb->users users ON users.ID = rep.rep_user_id
INNER JOIN $wpdb->usermeta meta ON meta.user_id = users.ID AND meta.meta_key = %s AND meta_value NOT LIKE %s
WHERE rep.rep_date > current_date - interval %d day
GROUP BY rep.rep_user_id
ORDER BY aggregated DESC, users.ID ASC
LIMIT %d",
$cap_key,
"%{$wpdb->esc_like('administrator')}%",
$interval,
$limit
)
);
}
/**
* Widget render method.
*
* @param array $args Widget arguments.
* @param array $instance Widget instance.
* @return void
*/
public function widget( $args, $instance ) {
$title = ! empty( $instance['title'] ) ? $instance['title'] : '';
$avatar_size = ! empty( $instance['avatar_size'] ) ? $instance['avatar_size'] : 40;
$show_users = ! empty( $instance['show_users'] ) ? $instance['show_users'] : 12;
$users_per_row = ! empty( $instance['users_per_row'] ) ? $instance['users_per_row'] : 4;
$interval = ! empty( $instance['interval'] ) ? $instance['interval'] : 30;
/**
* Filters the widget title.
*
* @param string $title Widget title.
* @since 1.0.0
*/
$title = apply_filters( 'widget_title', $title );
echo wp_kses_post( $args['before_widget'] );
if ( ! empty( $title ) ) {
echo wp_kses_post( $args['before_title'] . $title . $args['after_title'] );
}
echo '<div class="ap-widget-inner">';
if ( ap_is_addon_active( 'reputation.php' ) ) {
echo '<div class="ap-leaderbaord-widget">';
$users = $this->get_top_users( $interval, $show_users );
if ( empty( $users ) ) {
esc_attr_e( 'No users found with reputation.', 'anspress-question-answer' );
} else {
foreach ( $users as $user ) {
echo '<a href="' . esc_url( ap_user_link( $user->ID ) ) . '" class="ap-leaderbaord-user" style="width: ' . absint( 100 / $users_per_row ) . '%">';
echo '<div class="ap-leaderbaord-user-img">';
echo get_avatar( $user->ID, $avatar_size );
echo '</div>';
echo '<div class="ap-leaderbaord-user-name">';
echo esc_html( $user->display_name );
echo '<span class="ap-leaderbaord-point"><b>' . (int) $user->aggregated . '</b> ' . esc_attr__( 'Points', 'anspress-question-answer' ) . '</span>';
echo '</div>';
echo '</a>';
}
}
echo '</div>';
} else {
esc_attr_e( 'Reputation add-on is not active.', 'anspress-question-answer' );
}
echo '</div>';
echo wp_kses_post( $args['after_widget'] );
}
/**
* Widget form.
*
* @param array $instance Instance of widget.
* @return string
*/
public function form( $instance ) {
if ( isset( $instance['title'] ) ) {
$title = $instance['title'];
} else {
$title = __( 'AnsPress Leader board', 'anspress-question-answer' );
}
$avatar_size = ! empty( $instance['avatar_size'] ) ? absint( $instance['avatar_size'] ) : 40;
$show_users = ! empty( $instance['show_users'] ) ? absint( $instance['show_users'] ) : 12;
$users_per_row = ! empty( $instance['users_per_row'] ) ? absint( $instance['users_per_row'] ) : 4;
$interval = ! empty( $instance['interval'] ) ? absint( $instance['interval'] ) : 30;
?>
<p>
<label for="<?php echo esc_attr( $this->get_field_id( 'title' ) ); ?>"><?php esc_attr_e( 'Title:', 'anspress-question-answer' ); ?></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>
<label for="<?php echo esc_attr( $this->get_field_id( 'interval' ) ); ?>"><?php esc_attr_e( 'Interval (in days):', 'anspress-question-answer' ); ?></label>
<input class="widefat" id="<?php echo esc_attr( $this->get_field_id( 'interval' ) ); ?>" name="<?php echo esc_attr( $this->get_field_name( 'interval' ) ); ?>" type="number" value="<?php echo esc_attr( $interval ); ?>">
</p>
<p>
<label for="<?php echo esc_attr( $this->get_field_id( 'avatar_size' ) ); ?>"><?php esc_attr_e( 'Avatar size:', 'anspress-question-answer' ); ?></label>
<input class="widefat" id="<?php echo esc_attr( $this->get_field_id( 'avatar_size' ) ); ?>" name="<?php echo esc_attr( $this->get_field_name( 'avatar_size' ) ); ?>" type="number" value="<?php echo esc_attr( $avatar_size ); ?>">
</p>
<p>
<label for="<?php echo esc_attr( $this->get_field_id( 'show_users' ) ); ?>"><?php esc_attr_e( 'Show users:', 'anspress-question-answer' ); ?></label>
<input class="widefat" id="<?php echo esc_attr( $this->get_field_id( 'show_users' ) ); ?>" name="<?php echo esc_attr( $this->get_field_name( 'show_users' ) ); ?>" type="number" value="<?php echo esc_attr( $show_users ); ?>">
</p>
<p>
<label for="<?php echo esc_attr( $this->get_field_id( 'users_per_row' ) ); ?>"><?php esc_attr_e( 'Users per row:', 'anspress-question-answer' ); ?></label>
<input class="widefat" id="<?php echo esc_attr( $this->get_field_id( 'users_per_row' ) ); ?>" name="<?php echo esc_attr( $this->get_field_name( 'users_per_row' ) ); ?>" type="number" value="<?php echo esc_attr( $users_per_row ); ?>">
</p>
<?php
return 'noform';
}
/**
* Sanitize widget form values as they are saved.
*
* @see WP_Widget::update()
*
* @param array $new_instance Values just sent to be saved.
* @param array $old_instance Previously saved values from database.
*
* @return array Updated safe values to be saved.
*/
public function update( $new_instance, $old_instance ) {
$instance = array();
$instance['title'] = ( ! empty( $new_instance['title'] ) ) ? wp_strip_all_tags( $new_instance['title'] ) : '';
$instance['avatar_size'] = ( ! empty( $new_instance['avatar_size'] ) ) ? absint( $new_instance['avatar_size'] ) : 40;
$instance['show_users'] = ( ! empty( $new_instance['show_users'] ) ) ? absint( $new_instance['show_users'] ) : 12;
$instance['users_per_row'] = ( ! empty( $new_instance['users_per_row'] ) ) ? absint( $new_instance['users_per_row'] ) : 4;
$instance['interval'] = ( ! empty( $new_instance['interval'] ) ) ? absint( $new_instance['interval'] ) : 30;
return $instance;
}
}
Expand full source code Collapse full source code View on GitHub: widgets/leaderboard.php:24
Add your comment