299 lines
7.9 KiB
PHP
299 lines
7.9 KiB
PHP
<?php
|
|
/**
|
|
* @package Restrict User Access
|
|
* @author Joachim Jensen <joachim@dev.institute>
|
|
* @license GPLv3
|
|
* @copyright 2020 by Joachim Jensen
|
|
*/
|
|
|
|
defined('ABSPATH') || exit;
|
|
|
|
if (! class_exists('WP_List_Table')) {
|
|
require_once(ABSPATH . 'wp-admin/includes/class-wp-list-table.php');
|
|
}
|
|
|
|
final class RUA_Members_List extends WP_List_Table
|
|
{
|
|
/**
|
|
* @var int
|
|
*/
|
|
private $level_id;
|
|
|
|
public function __construct()
|
|
{
|
|
parent::__construct(array(
|
|
'singular' => __('Member', 'restrict-user-access'),
|
|
'plural' => __('Members', 'restrict-user-access'),
|
|
'ajax' => false,
|
|
'screen' => RUA_App::TYPE_RESTRICT.'_members'
|
|
));
|
|
//adds suffix to bulk name to avoid clash
|
|
$this->_actions = $this->get_bulk_actions();
|
|
$this->level_id = get_the_ID();
|
|
}
|
|
|
|
/**
|
|
* Text for no members
|
|
*
|
|
* @since 0.4
|
|
* @return void
|
|
*/
|
|
public function no_items()
|
|
{
|
|
_e('No members found.', 'restrict-user-access');
|
|
}
|
|
|
|
/**
|
|
* Table columns with titles
|
|
*
|
|
* @since 0.4
|
|
* @return array
|
|
*/
|
|
public function get_columns()
|
|
{
|
|
return array(
|
|
'cb' => '<input type="checkbox" />',
|
|
'user_login' => __('Username'),
|
|
'user_email' => __('E-mail'),
|
|
'status' => __('Status', 'restrict-user-access'),
|
|
'member_start' => __('Member Since'),
|
|
'member_end' => __('Expiration'),
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Columns to make sortable.
|
|
*
|
|
* @return array
|
|
*/
|
|
public function get_sortable_columns()
|
|
{
|
|
return array();
|
|
}
|
|
|
|
/**
|
|
* Primary column used for responsive view
|
|
*
|
|
* @since 0.4
|
|
* @return string
|
|
*/
|
|
protected function get_default_primary_column_name()
|
|
{
|
|
return 'user_login';
|
|
}
|
|
|
|
/**
|
|
* Default fallback for column render
|
|
*
|
|
* @since 0.4
|
|
* @param WP_Level_Membership_Interface $membership
|
|
* @param string $column_name
|
|
* @return mixed
|
|
*/
|
|
protected function column_default($membership, $column_name)
|
|
{
|
|
$attribute = $membership->user()->get_attribute($column_name);
|
|
echo '<a href="mailto:'.$attribute.'">'.$attribute.'</a>';
|
|
}
|
|
|
|
/**
|
|
* Render checkbox column
|
|
*
|
|
* @since 0.4
|
|
* @param RUA_User_Level_Interface $membership
|
|
* @return string
|
|
*/
|
|
protected function column_cb($membership)
|
|
{
|
|
printf(
|
|
'<input type="checkbox" name="user[]" value="%s" />',
|
|
$membership->get_user_id()
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Render user_login column
|
|
*
|
|
* @since 0.4
|
|
* @param RUA_User_Level_Interface $membership
|
|
* @return string
|
|
*/
|
|
protected function column_user_login(RUA_User_Level_Interface $membership)
|
|
{
|
|
$title = '<strong>' . $membership->user()->get_attribute('user_login') . '</strong>';
|
|
$admin_url = admin_url(sprintf(
|
|
'admin.php?page=wprua-edit&level_id=%s&user=%s',
|
|
$_REQUEST['level_id'],
|
|
$membership->get_user_id()
|
|
));
|
|
$actions = array(
|
|
'delete' => '<a href="'.wp_nonce_url($admin_url.'&action=remove_user', 'update-post_'.$_REQUEST['level_id']).'">'.__('Remove').'</a>'
|
|
);
|
|
$actions = apply_filters('rua/member-list/actions', $actions, $membership);
|
|
echo $title . $this->row_actions($actions);
|
|
}
|
|
|
|
/**
|
|
* Render expiry date column
|
|
*
|
|
* @since 0.5
|
|
* @param RUA_User_Level_Interface $membership
|
|
* @return string
|
|
*/
|
|
protected function column_status(RUA_User_Level_Interface $membership)
|
|
{
|
|
$status = $membership->get_status();
|
|
switch ($status) {
|
|
case RUA_User_Level::STATUS_ACTIVE:
|
|
_e('Active');
|
|
break;
|
|
case RUA_User_Level::STATUS_EXPIRED:
|
|
_e('Expired');
|
|
break;
|
|
default:
|
|
echo $status;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @since 1.2
|
|
* @param RUA_User_Level_Interface $membership
|
|
*
|
|
* @return void
|
|
*/
|
|
protected function column_member_start(RUA_User_Level_Interface $membership)
|
|
{
|
|
$time = $membership->get_start();
|
|
if ($time) {
|
|
$m_time = date_i18n('Y-m-d', $time);
|
|
|
|
$t_time = date_i18n('Y-m-d H:i:s T', $time);
|
|
|
|
$time_diff = time() - $time;
|
|
|
|
if ($time_diff >= 0 && $time_diff <= MONTH_IN_SECONDS) {
|
|
$h_time = sprintf(__('%s ago'), human_time_diff($time));
|
|
} else {
|
|
$h_time = $m_time;
|
|
}
|
|
|
|
echo '<abbr title="' . $t_time . '">'.$h_time. '</abbr>';
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @since 1.2
|
|
* @param RUA_User_Level_Interface $membership
|
|
*
|
|
* @return void
|
|
*/
|
|
protected function column_member_end(RUA_User_Level_Interface $membership)
|
|
{
|
|
$expiry = $membership->get_expiry();
|
|
if ($expiry == 0) {
|
|
echo __('Lifetime', 'restrict-user-access');
|
|
} else {
|
|
$t_time = date_i18n('Y-m-d H:i:s T', $expiry);
|
|
echo '<abbr title="' . $t_time . '">'.sprintf(__('%s from now', 'restrict-user-access'), human_time_diff($expiry)). '</abbr>';
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
* Bulk actions
|
|
*
|
|
* @since 0.4
|
|
* @return array
|
|
*/
|
|
public function get_bulk_actions()
|
|
{
|
|
return array(
|
|
'remove_user' => __('Remove', 'restrict-user-access')
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Generate the table navigation above or below the table
|
|
*
|
|
* @since 0.4
|
|
* @param string $which
|
|
*/
|
|
public function display_tablenav($which)
|
|
{
|
|
?>
|
|
<div class="tablenav <?php echo esc_attr($which); ?>">
|
|
|
|
<?php if ($this->has_items() && $which == 'top'): ?>
|
|
<div class="alignleft actions bulkactions">
|
|
<?php $this->bulk_actions($which); ?>
|
|
</div>
|
|
<?php endif;
|
|
$this->extra_tablenav($which);
|
|
$this->pagination($which); ?>
|
|
|
|
<br class="clear" />
|
|
</div>
|
|
<?php
|
|
}
|
|
|
|
/**
|
|
* Get data and set pagination
|
|
*
|
|
* @since 0.4
|
|
* @return void
|
|
*/
|
|
public function prepare_items()
|
|
{
|
|
$this->_column_headers = $this->get_column_info();
|
|
|
|
$per_page = $this->get_items_per_page('members_per_page', 20);
|
|
$current_page = $this->get_pagenum();
|
|
$user_query = new WP_User_Query(array(
|
|
'meta_key' => RUA_App::META_PREFIX.'level',
|
|
'meta_value' => $this->level_id,
|
|
'number' => $per_page,
|
|
'offset' => ($current_page - 1) * $per_page
|
|
));
|
|
$total_items = (int)$user_query->get_total();
|
|
|
|
$this->set_pagination_args(array(
|
|
'total_items' => $total_items,
|
|
'total_pages' => ceil($total_items / $per_page),
|
|
'per_page' => $per_page
|
|
));
|
|
|
|
$this->items = array();
|
|
foreach ($user_query->get_results() as $user) {
|
|
$this->items[] = rua_get_user_level($this->level_id, $user);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @since 1.3
|
|
* @param string $url
|
|
* @param string $scheme
|
|
* @param string $orig_scheme
|
|
*
|
|
* @return string
|
|
*/
|
|
public function add_url_suffix($url, $scheme, $orig_scheme)
|
|
{
|
|
return $url . '#top#section-members';
|
|
}
|
|
|
|
/**
|
|
* Display pagination
|
|
* Adds hashtag to current url
|
|
*
|
|
* @since 0.6
|
|
* @param string $which
|
|
* @return void
|
|
*/
|
|
public function pagination($which)
|
|
{
|
|
add_filter('set_url_scheme', array($this, 'add_url_suffix'), 10, 3);
|
|
parent::pagination($which);
|
|
remove_filter('set_url_scheme', array($this, 'add_url_suffix'), 10, 3);
|
|
}
|
|
}
|