Created
October 5, 2018 04:25
-
-
Save wichaksono/a3e69269ff2dbedd32553de8ca10ed6f to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
if ( ! class_exists('WP_List_Table') ) { | |
require_once( ABSPATH . 'wp-admin/includes/class-wp-list-table.php' ); | |
} | |
/** | |
* Class memberLists Handle Table Lists | |
*/ | |
class memberLists extends WP_List_Table | |
{ | |
public function __construct() | |
{ | |
parent::__construct( [ | |
'singular' => 'Member', | |
'plural' => 'Members', | |
'ajax' => false //should this table support ajax? | |
]); | |
} | |
/** | |
* Retrieve customers data from the database | |
* | |
* @param int $per_page | |
* @param int $page_number | |
* | |
* @return mixed | |
*/ | |
public static function get_customers( $per_page = 5, $page_number = 1 ) { | |
global $wpdb; | |
$sql = "SELECT * FROM {$wpdb->users}"; | |
if ( ! empty( $_REQUEST['orderby'] ) ) { | |
$sql .= ' ORDER BY ' . esc_sql( $_REQUEST['orderby'] ); | |
$sql .= ! empty( $_REQUEST['order'] ) ? ' ' . esc_sql( $_REQUEST['order'] ) : ' ASC'; | |
} | |
$sql .= " LIMIT $per_page"; | |
$sql .= ' OFFSET ' . ( $page_number - 1 ) * $per_page; | |
$result = $wpdb->get_results( $sql, 'ARRAY_A' ); | |
return $result; | |
} | |
/** | |
* Delete a customer record. | |
* | |
* @param int $id customer ID | |
*/ | |
public static function delete_customer( $id ) { | |
global $wpdb; | |
$wpdb->delete( | |
"{$wpdb->users}", | |
[ 'ID' => $id ], | |
[ '%d' ] | |
); | |
} | |
/** | |
* Returns the count of records in the database. | |
* | |
* @return null|string | |
*/ | |
public static function record_count() { | |
global $wpdb; | |
$sql = "SELECT COUNT(*) FROM {$wpdb->users}"; | |
return $wpdb->get_var( $sql ); | |
} | |
/** Text displayed when no customer data is available */ | |
public function no_items() { | |
_e( 'No customers avaliable.', 'sp' ); | |
} | |
/** | |
* Render a column when no column specific method exist. | |
* | |
* @param array $item | |
* @param string $column_name | |
* | |
* @return mixed | |
*/ | |
public function column_default( $item, $column_name ) { | |
return $item[ $column_name ]; | |
} | |
/** | |
* Render the bulk edit checkbox | |
* | |
* @param array $item | |
* | |
* @return string | |
*/ | |
function column_cb( $item ) { | |
return sprintf( | |
'<input type="checkbox" name="bulk-delete[]" value="%s" />', $item['ID'] | |
); | |
} | |
/** | |
* Method for name column | |
* | |
* @param array $item an array of DB data | |
* | |
* @return string | |
*/ | |
function column_name( $item ) { | |
$delete_nonce = wp_create_nonce( 'sp_delete_customer' ); | |
$title = '<strong>' . $item['name'] . '</strong>'; | |
$actions = [ | |
'delete' => sprintf( '<a href="?page=%s&action=%s&customer=%s&_wpnonce=%s">Delete</a>', esc_attr( $_REQUEST['page'] ), 'delete', absint( $item['ID'] ), $delete_nonce ) | |
]; | |
return $title . $this->row_actions( $actions ); | |
} | |
/** | |
* Associative array of columns | |
* | |
* @return array | |
*/ | |
function get_columns() { | |
$columns = [ | |
'cb' => '<input type="checkbox" />', | |
'user_login' => __( 'Name', 'sp' ), | |
'user_email' => __( 'Address', 'sp' ), | |
]; | |
return $columns; | |
} | |
/** | |
* Columns to make sortable. | |
* | |
* @return array | |
*/ | |
public function get_sortable_columns() { | |
$sortable_columns = array(); | |
return $sortable_columns; | |
} | |
/** | |
* Returns an associative array containing the bulk action | |
* | |
* @return array | |
*/ | |
public function get_bulk_actions() { | |
$actions = [ | |
'bulk-delete' => 'Delete' | |
]; | |
return $actions; | |
} | |
/** | |
* Handles data query and filter, sorting, and pagination. | |
*/ | |
public function prepare_items() { | |
$this->_column_headers = $this->get_column_info(); | |
/** Process bulk action */ | |
$this->process_bulk_action(); | |
$per_page = $this->get_items_per_page( 'customers_per_page', 5 ); | |
$current_page = $this->get_pagenum(); | |
$total_items = self::record_count(); | |
$this->set_pagination_args( [ | |
'total_items' => $total_items, //WE have to calculate the total number of items | |
'per_page' => $per_page //WE have to determine how many items to show on a page | |
] ); | |
$this->items = self::get_customers( $per_page, $current_page ); | |
} | |
public function process_bulk_action() { | |
//Detect when a bulk action is being triggered... | |
if ( 'delete' === $this->current_action() ) { | |
// In our file that handles the request, verify the nonce. | |
$nonce = esc_attr( $_REQUEST['_wpnonce'] ); | |
if ( ! wp_verify_nonce( $nonce, 'sp_delete_customer' ) ) { | |
die( 'Go get a life script kiddies' ); | |
} | |
else { | |
self::delete_customer( absint( $_GET['customer'] ) ); | |
// esc_url_raw() is used to prevent converting ampersand in url to "#038;" | |
// add_query_arg() return the current url | |
wp_redirect( esc_url_raw(add_query_arg()) ); | |
exit; | |
} | |
} | |
// If the delete bulk action is triggered | |
if ( ( isset( $_POST['action'] ) && $_POST['action'] == 'bulk-delete' ) | |
|| ( isset( $_POST['action2'] ) && $_POST['action2'] == 'bulk-delete' ) | |
) { | |
$delete_ids = esc_sql( $_POST['bulk-delete'] ); | |
// loop over the array of record IDs and delete them | |
foreach ( $delete_ids as $id ) { | |
self::delete_customer( $id ); | |
} | |
// esc_url_raw() is used to prevent converting ampersand in url to "#038;" | |
// add_query_arg() return the current url | |
wp_redirect( esc_url_raw(add_query_arg()) ); | |
exit; | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment