* @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'); } class RUA_Level_List_Table extends WP_List_Table { /** * Trash view * @var boolean */ private $is_trash; /** * Extended access levels * @var array */ private $extended_levels = array(); public function __construct($args = array()) { parent::__construct(array( 'singular' => 'level', 'plural' => 'levels', 'ajax' => false, 'screen' => isset($args['screen']) ? $args['screen'] : null )); } /** * Load filtered levels for current query * * @since 0.15 * @return void */ public function prepare_items() { global $avail_post_stati, $wp_query; $this->_column_headers = $this->get_column_info(); $avail_post_stati = get_available_post_statuses(RUA_App::TYPE_RESTRICT); $per_page = $this->get_items_per_page('rua_levels_per_page', 20); $current_page = $this->get_pagenum(); $args = array( 'post_type' => RUA_App::TYPE_RESTRICT, 'post_status' => array( 'publish', 'draft', 'future', 'private' ), 'posts_per_page' => $per_page, 'paged' => $current_page, 'orderby' => 'title', 'order' => 'asc', 'update_post_term_cache' => false ); if (isset($_REQUEST['s']) && strlen($_REQUEST['s'])) { $args['s'] = $_REQUEST['s']; } //Make sure post_status!=all if present to avoid auto-drafts if (isset($_REQUEST['post_status']) && $_REQUEST['post_status'] != 'all') { $args['post_status'] = $_REQUEST['post_status']; } if (isset($_REQUEST['orderby'])) { $meta = str_replace('meta_', '', $_REQUEST['orderby']); if ($meta != $_REQUEST['orderby']) { $args['orderby'] = 'meta_value'; $args['meta_key'] = RUA_App::META_PREFIX . $meta; } else { $args['orderby'] = $_REQUEST['orderby']; } } if (isset($_REQUEST['order'])) { $args['order'] = $_REQUEST['order'] == 'asc' ? 'asc' : 'desc'; } $wp_query = new WP_Query($args); if ($wp_query->found_posts || $current_page === 1) { $total_items = $wp_query->found_posts; } else { $post_counts = (array) wp_count_posts(RUA_App::TYPE_RESTRICT); if (isset($_REQUEST['post_status']) && in_array($_REQUEST['post_status'], $avail_post_stati)) { $total_items = $post_counts[ $_REQUEST['post_status'] ]; } else { $total_items = array_sum($post_counts); // Subtract post types that are not included in the admin all list. foreach (get_post_stati(array( 'show_in_admin_all_list' => false )) as $state) { $total_items -= $post_counts[ $state ]; } } } $this->items = $wp_query->posts; //get extended levels $post_parents = array(); foreach ($this->items as $post) { if ($post->post_parent) { $post_parents[] = $post->post_parent; } } if ($post_parents) { $args = array( 'post_type' => RUA_App::TYPE_RESTRICT, 'post_status' => array( 'publish', 'draft', 'future', 'private' ), 'post__in' => $post_parents, 'posts_per_page' => -1, 'update_post_term_cache' => false, 'update_post_meta_cache' => false ); $extend_query = new WP_Query($args); foreach ($extend_query->posts as $post) { $this->extended_levels[$post->ID] = $post; } } $this->is_trash = isset($_REQUEST['post_status']) && $_REQUEST['post_status'] == 'trash'; $this->set_pagination_args(array( 'total_items' => $total_items, 'total_pages' => ceil($total_items / $per_page), 'per_page' => $per_page )); //Make sure filter is run RUA_App::instance()->level_manager->populate_metadata(); } /** * Render on no items * * @since 0.15 * @return void */ public function no_items() { if ($this->is_trash) { echo get_post_type_object(RUA_App::TYPE_RESTRICT)->labels->not_found_in_trash; } else { //todo show more text to get started echo get_post_type_object(RUA_App::TYPE_RESTRICT)->labels->not_found; } } /** * Get link to view * * @since 0.15 * @param array $args * @param string $label * @param string $class * @return string */ public function get_view_link($args, $label, $class = '') { $screen = get_current_screen(); $args['page'] = $screen->parent_base; $url = add_query_arg($args, 'admin.php'); $class_html = ''; if (! empty($class)) { $class_html = sprintf( ' class="%s"', esc_attr($class) ); } return sprintf( '%s', esc_url($url), $class_html, $label ); } /** * Get views (level statuses) * * @since 0.15 * @return array */ public function get_views() { global $locked_post_status, $avail_post_stati; if (!empty($locked_post_status)) { return array(); } $status_links = array(); $num_posts = wp_count_posts(RUA_App::TYPE_RESTRICT); //do not include private $total_posts = array_sum((array) $num_posts); $class = ''; // Subtract post types that are not included in the admin all list. foreach (get_post_stati(array( 'show_in_admin_all_list' => false )) as $state) { $total_posts -= $num_posts->$state; } if (empty($class) && (!isset($_REQUEST['post_status']) || isset($_REQUEST['all_posts']))) { $class = 'current'; } $all_inner_html = sprintf( _nx( 'All (%s)', 'All (%s)', $total_posts, 'levels', 'restrict-user-access' ), number_format_i18n($total_posts) ); $status_links['all'] = $this->get_view_link(array(), $all_inner_html, $class); //no way to change post status per post type, replace here instead $label_replacement = array( 'publish' => _n_noop('Active (%s)', 'Active (%s)', 'restrict-user-access'), 'draft' => _n_noop('Inactive (%s)', 'Inactive (%s)', 'restrict-user-access') ); foreach (get_post_stati(array('show_in_admin_status_list' => true), 'objects') as $status) { $class = ''; $status_name = $status->name; if (! in_array($status_name, $avail_post_stati) || empty($num_posts->$status_name)) { continue; } if (isset($_REQUEST['post_status']) && $status_name == $_REQUEST['post_status']) { $class = 'current'; } $status_args = array( 'post_status' => $status_name ); $label_count = $status->label_count; if (isset($label_replacement[$status->name])) { $label_count = $label_replacement[$status->name]; } $status_label = sprintf( translate_nooped_plural($label_count, $num_posts->$status_name), number_format_i18n($num_posts->$status_name) ); $status_links[ $status_name ] = $this->get_view_link($status_args, $status_label, $class); } return $status_links; } /** * Get bulk actions * * @since 0.15 * @return array */ public function get_bulk_actions() { $actions = array(); $post_type_obj = get_post_type_object(RUA_App::TYPE_RESTRICT); if (current_user_can($post_type_obj->cap->edit_posts)) { if ($this->is_trash) { $actions['untrash'] = __('Restore'); } } if (current_user_can($post_type_obj->cap->delete_posts)) { if ($this->is_trash || ! EMPTY_TRASH_DAYS) { $actions['delete'] = __('Delete Permanently'); } else { $actions['trash'] = __('Move to Trash'); } } //todo: add filter return $actions; } /** * Render extra table navigation and actions * * @since 0.15 * @param string $which * @return void */ public function extra_tablenav($which) { echo '
'.$post->post_name.'';
}
/**
* Display role column
*
* @since 0.5
* @param string $column_name
* @param int $post_id
* @return string
*/
/**
* Render role column
*
* @since 0.15
* @param WP_Post $post
* @return void
*/
public function column_role($post)
{
$metadata = RUA_App::instance()->level_manager->metadata()->get('role');
$retval = '';
if ($metadata) {
$data = $metadata->get_data($post->ID);
if ($data === '') {
$users = get_users(array(
'meta_key' => RUA_App::META_PREFIX.'level',
'meta_value' => $post->ID,
'fields' => 'ID'
));
$retval = ''.count($users).'';
} else {
$retval = $metadata->get_list_data($post->ID, false);
}
}
echo $retval;
}
/**
* Render handle column
*
* @since 0.15
* @param WP_Post $post
* @return void
*/
public function column_handle($post)
{
$metadata = RUA_App::instance()->level_manager->metadata()->get('handle');
$retval = '';
if ($metadata) {
$data = $metadata->get_data($post->ID);
$retval = $metadata->get_list_data($post->ID);
// if ($data != 2) {
// $page = RUA_App::instance()->level_manager->metadata()->get('page')->get_data($post->ID);
// if(is_numeric($page)) {
// $page = get_post($page);
// $page = $page->post_title;
// }
// $retval .= ": " . ($page ? $page : '' . __('Please update Page', 'restrict-user-access') . '');
// }
}
echo $retval;
}
/**
* Render duration column
*
* @since 0.15
* @param WP_Post $post
* @return void
*/
protected function column_duration($post)
{
$metadata = RUA_App::instance()->level_manager->metadata()->get('duration');
$retval = '';
if ($metadata) {
$data = $metadata->get_data($post->ID);
if (isset($data['count'],$data['unit']) && $data['count']) {
$retval = $this->_get_duration_text($data['count'], $data['unit']);
} else {
$retval = __('Lifetime', 'restrict-user-access');
}
}
echo esc_html($retval);
}
/**
* Render capabilities column
*
* @since 0.15
* @param WP_Post $post
* @return void
*/
public function column_caps($post)
{
$counts = array(
0 => 0,
1 => 0
);
$metadata = RUA_App::instance()->level_manager->metadata()->get('caps');
$level_ids = array($post->ID);
$level_ids = array_merge($level_ids, get_post_ancestors($post->ID));
$caps = RUA_App::instance()->level_manager->get_levels_caps(array_reverse($level_ids));
if ($caps) {
foreach ($caps as $cap) {
$counts[$cap]++;
}
}
echo __('Permit:').' '.$counts[1].'