Cum să creezi opțiuni de filtrare personalizate în wp_list_table?
Am folosit clasa wp_list_table
pentru a crea tabelul meu personalizat în backend. Funcționează bine.
Acum, vreau să adaug filtre ca în imaginea de mai jos.
Aici este codul meu existent pentru a afișa tabelul admin cu informațiile mele personalizate.
if( ! class_exists( 'WP_List_Table' ) ) {
require_once( ABSPATH . 'wp-admin/includes/class-wp-list-table.php' );
}
class Kv_subscribers_list extends WP_List_Table {
function __construct(){
global $status, $page;
parent::__construct( array(
'singular' => 'notification', // numele singular al elementului
'plural' => 'notifications', // numele plural al elementului
'ajax' => false
) );
}
function column_default($item, $column_name){
switch($column_name){
case 'email':
case 'date':
case 'common':
case 'unit_id':
return $item[$column_name];
default:
return print_r($item,true); // Afișează întregul array pentru depanare
}
}
function column_email($item){
$actions = array(
'email' => sprintf('<a href="?page=%s&action=%s&email_id=%s">E-mail</a>',$_REQUEST['page'],'email',$item['id']),
'delete' => sprintf('<a href="?page=%s&action=%s&delete_id=%s">Șterge</a>',$_REQUEST['page'],'delete',$item['id']),
);
// Returnează conținutul titlului
return sprintf('%1$s %2$s',
/*$1%s*/ $item['email'],
/*$2%s*/ $this->row_actions($actions)
);
}
function column_cb($item){
return sprintf(
'<input type="checkbox" name="%1$s[]" value="%2$s" />',
/*$1%s*/ $this->_args['singular'],
/*$2%s*/ $item['id']
);
}
function get_columns(){
$columns = array(
'cb' => '<input type="checkbox" />', // Afișează o casetă de selectare în loc de text
'email'=>__('Dată'),
'date'=>__('Dată'),
'common'=>__('Alertă Comună'),
'unit_id'=>__('ID Unic')
);
return $columns;
}
public function get_sortable_columns() {
$sortable_columns = array(
'email' => array('wp_user_id',false), // true înseamnă că este deja sortat
'date' => array('date',false),
'common' => array('common',false)
);
return $sortable_columns;
}
public function get_bulk_actions() {
$actions = array(
'delete' => 'Șterge',
'email' => 'Email'
);
return $actions;
}
public function process_bulk_action() {
global $wpdb;
$notifications_tbl = $wpdb->prefix.'newsletter';
if( 'delete'===$this->current_action() ) {
foreach($_POST['notification'] as $single_val){
$wpdb->delete( $notifications_tbl, array( 'id' => (int)$single_val ) );
}
$redirect_url = get_admin_url( null, 'admin.php?page=subscribers' );
wp_safe_redirect($redirect_url);
wp_die('Elementele au fost șterse!');
}
if( 'email'===$this->current_action() ) {
$result_email_ar = implode("-",$_POST['notification']);
$redirect_url = get_admin_url( null, 'admin.php?page=kvcodes&ids='.$result_email_ar );
wp_safe_redirect($redirect_url);
wp_die(' ');
}
}
function prepare_items() {
global $wpdb; // Folosit doar pentru interogări în baza de date
$database_name = $wpdb->prefix.'newsletter' ;
$per_page = 10;
$query = "SELECT * FROM $database_name ORDER BY id DESC";
$columns = $this->get_columns();
$hidden = array();
$sortable = $this->get_sortable_columns();
$this->_column_headers = array($columns, $hidden, $sortable);
$this->process_bulk_action();
$data = $wpdb->get_results($query, ARRAY_A );
function usort_reorder($a,$b){
$orderby = (!empty($_REQUEST['orderby'])) ? $_REQUEST['orderby'] : 'title'; // Dacă nu există sortare, implicit după titlu
$order = (!empty($_REQUEST['order'])) ? $_REQUEST['order'] : 'asc'; // Dacă nu există ordine, implicit ascendent
$result = strcmp($a[$orderby], $b[$orderby]); // Determină ordinea de sortare
return ($order==='asc') ? $result : -$result; // Trimite direcția finală de sortare către usort
}
// usort($data, 'usort_reorder');
$current_page = $this->get_pagenum();
$total_items = count($data);
$data = array_slice($data,(($current_page-1)*$per_page),$per_page);
$this->items = $data;
$this->set_pagination_args( array(
'total_items' => $total_items, // Trebuie să calculăm numărul total de elemente
'per_page' => $per_page, // Trebuie să determinăm câte elemente să afișăm pe pagină
'total_pages' => ceil($total_items/$per_page) // Trebuie să calculăm numărul total de pagini
) );
}
}//class
și
echo '<form method="post">';
$mydownloads = new Kv_subscribers_list();
echo '</pre><div class="wrap"><h2>Abonați<a href="'."http://".$_SERVER["SERVER_NAME"].$_SERVER['REQUEST_URI'].'&add_new=true" class="add-new-h2">Adaugă Nou</a></h2>';
$mydownloads->prepare_items();
$mydownloads->display();
echo '</div></form>';
Acum, vreau să fac filtrele ca
Toate || Publicat || Coș de gunoi
Am nevoie să creez un filtru personalizat ca acesta.

Cod
class Kv_subscribers_list extends WP_List_Table {
function __construct(){
global $status, $page;
parent::__construct( array(
'singular' => 'notification',
'plural' => 'notifications',
'ajax' => false
) );
}
protected function get_views() {
$status_links = array(
"all" => __("<a href='#'>Toate</a>",'my-plugin-slug'),
"published" => __("<a href='#'>Publicate</a>",'my-plugin-slug'),
"trashed" => __("<a href='#'>Șterse</a>",'my-plugin-slug')
);
return $status_links;
}
function column_default($item, $column_name){
switch($column_name){
case 'email':
case 'date':
case 'common':
case 'unit_id':
return $item[$column_name];
default:
return print_r($item,true); //Arată întregul array pentru depanare
}
}
function column_email($item){
$actions = array(
'email' => sprintf('<a href="?page=%s&action=%s&email_id=%s">E-mail</a>',$_REQUEST['page'],'email',$item['id']),
'delete' => sprintf('<a href="?page=%s&action=%s&delete_id=%s">Șterge</a>',$_REQUEST['page'],'delete',$item['id']),
);
//Returnează conținutul titlului
return sprintf('%1$s %2$s',
/*$1%s*/ $item['email'],
/*$2%s*/ $this->row_actions($actions)
);
}
function column_cb($item){
return sprintf(
'<input type="checkbox" name="%1$s[]" value="%2$s" />',
/*$1%s*/ $this->_args['singular'],
/*$2%s*/ $item['id']
);
}
function get_columns(){
$columns = array(
'cb' => '<input type="checkbox" />',
'email'=>__('Email'),
'date'=>__('Dată'),
'common'=>__('Alertă Comună'),
'unit_id'=>__('ID Unic')
);
return $columns;
}
public function get_sortable_columns() {
$sortable_columns = array(
'email' => array('wp_user_id',false), //true înseamnă că este deja sortat
'date' => array('date',false),
'common' => array('common',false)
);
return $sortable_columns;
}
public function get_bulk_actions() {
$actions = array(
'delete' => 'Șterge',
'email' => 'E-mail'
);
return $actions;
}
public function process_bulk_action() {
global $wpdb;
$notifications_tbl = $wpdb->prefix.'newsletter';
if( 'delete'===$this->current_action() ) {
foreach($_POST['notification'] as $single_val){
$wpdb->delete( $notifications_tbl, array( 'id' => (int)$single_val ) );
}
$redirect_url = get_admin_url( null, 'admin.php?page=subscribers' );
wp_safe_redirect($redirect_url);
wp_die('Elemente șterse (sau ar fi fost dacă aveam elemente de șters)!');
}
if( 'email'===$this->current_action() ) {
$result_email_ar = implode("-",$_POST['notification']);
$redirect_url = get_admin_url( null, 'admin.php?page=kvcodes&ids='.$result_email_ar );
wp_safe_redirect($redirect_url);
wp_die(' ');
}
}
function prepare_items() {
global $wpdb; //Folosit doar dacă se fac interogări la baza de date
$database_name = $wpdb->prefix.'newsletter' ;
$per_page = 10;
$query = "SELECT * FROM $database_name ORDER BY id DESC";
$columns = $this->get_columns();
$hidden = array();
$sortable = $this->get_sortable_columns();
$this->_column_headers = array($columns, $hidden, $sortable);
$this->process_bulk_action();
$data = $wpdb->get_results($query, ARRAY_A );
function usort_reorder($a,$b){
$orderby = (!empty($_REQUEST['orderby'])) ? $_REQUEST['orderby'] : 'title'; //Dacă nu există sortare, implicit este 'title'
$order = (!empty($_REQUEST['order'])) ? $_REQUEST['order'] : 'asc'; //Dacă nu există ordine, implicit este 'asc'
$result = strcmp($a[$orderby], $b[$orderby]); //Determină ordinea de sortare
return ($order==='asc') ? $result : -$result; //Trimite direcția finală de sortare către usort
}
// usort($data, 'usort_reorder');
$current_page = $this->get_pagenum();
$total_items = count($data);
$data = array_slice($data,(($current_page-1)*$per_page),$per_page);
$this->items = $data;
$this->set_pagination_args( array(
'total_items' => $total_items, //Trebuie să calculăm numărul total de elemente
'per_page' => $per_page, //Trebuie să determinăm câte elemente să afișăm pe pagină
'total_pages' => ceil($total_items/$per_page) //Trebuie să calculăm numărul total de pagini
) );
}
}//class
Pagină Admin & Exemplu de Randare
function o_add_menu_items(){
add_menu_page('Listă Plugin', 'Abonați', 'activate_plugins', 'subscribers', 'o_render_list_page');
}
add_action('admin_menu', 'o_add_menu_items');
function o_render_list_page() {
$mydownloads = new Kv_subscribers_list();
$title = __("Abonați","my_plugin_slug");
?>
<div class="wrap">
<h1>
<?php echo esc_html( $title );?>
<!-- Verifică permisiunile de editare -->
<a href="<?php echo admin_url( 'admin.php?page=subscribers&add_new=true' ); ?>" class="page-title-action">
<?php echo esc_html_x('Adaugă Nou', 'my-plugin-slug'); ?>
</a>
<?php
?>
</h1>
</div>
<?php $mydownloads->views(); ?>
<form method="post">
<?php
$mydownloads->prepare_items();
$mydownloads->display();
?>
</form>
<?php
}
Explicație
Trebuie să suprascriem metoda clasei WP_List_Table
get_views pentru a obține link-urile de stare în partea de sus. Implicit, acesta este un array gol.
Metoda views a clasei WP_List_Table
folosește get_views pentru a afișa lista acelor link-uri pe care le returnăm în get_views ca un array asociativ cu separatorul |
.
Putem, de asemenea, să suprascriem metoda views pentru a avea mai mult control, de exemplu dacă dorim să schimbăm separatorul.
Uită-te cum folosesc altele tabele de listă acest lucru. De exemplu, verifică WP_Posts_List_Table.
După ce ai suprascris metoda, plasează $mydownloads->views();
. Asigură-te că escapi toate și internaționalizezi șirurile.
Folosirea Filtrelor
Putem folosi filtrul views_{$this->screen->id}
odată ce am adăugat metoda get_views.
Presupunând că toplevel_page_subscribers
este ID-ul ecranului
add_filter('views_toplevel_page_subscribers','my_plugin_slug_status_links',10, 1);
function my_plugin_slug_status_links($views) {
$views['scheduled'] = "<a href='#'>Programate</a>";
return $views;
}

Bine, știu că este destul de târziu, dar deoarece acesta este primul rezultat în Google atunci când cauți filtrare WP_List_Table, trebuie să vă spun că există funcția extra_tablenav
disponibilă pentru a fi suprascrisă în extensia clasei dumneavoastră:
class Kv_subscribers_list extends WP_List_Table {
function extra_tablenav( $which )
{
switch ( $which )
{
case 'top':
// Codul HTML pentru afișare în partea de sus
break;
case 'bottom':
// Codul HTML pentru afișare în partea de jos
break;
}
}
}
Dacă doriți să afișați în ambele secțiuni, ignorați instrucțiunea switch și plasați codul HTML direct la începutul funcției.

Puteți folosi
<?php
class Kv_subscribers_list extends WP_List_Table {
function extra_tablenav( $which )
{
switch ( $which )
{
case 'top':
// Codul tău HTML pentru output
global $wpdb, $wp_locale;
$extra_checks = "AND status != 'auto-draft'";
if ( ! isset( $_GET['status'] ) || 'trash' !== $_GET['status'] ) {
$extra_checks .= " AND status != 'trash'";
} elseif ( isset( $_GET['status'] ) ) {
$extra_checks = $wpdb->prepare( ' AND status = %s', $_GET['status'] );
}
$sql = "
SELECT DISTINCT YEAR( create_date ) AS year, MONTH( create_date ) AS month
FROM ".$wpdb->prefix."audio_record
WHERE 1 = 1
$extra_checks
ORDER BY create_date DESC";
$months = $wpdb->get_results(
$wpdb->prepare(
$sql
)
);
$month_count = count( $months );
if ( ! $month_count || ( 1 == $month_count && 0 == $months[0]->month ) ) {
return;
}
$m = isset( $_GET['m'] ) ? (int) $_GET['m'] : 0;
$wp_query = add_query_arg();
$wp_query = remove_query_arg('m');
$link = esc_url_raw($wp_query);
?>
<div class="alignleft actions">
<select name="m" id="filter-by-date">
<option<?php selected( $m, 0 ); ?> value="0" data-rc="<?php _e($link); ?>"><?php _e( 'Toate datele' ); ?></option>
<?php
foreach ( $months as $arc_row ) {
if ( 0 == $arc_row->year ) {
continue;
}
$month = zeroise( $arc_row->month, 2 );
$year = $arc_row->year;
$wp_query = add_query_arg('m', $arc_row->year . $month);
$link = esc_url_raw($wp_query);
printf(
"<option %s value='%s' data-rc='%s'>%s</option>\n",
selected( $m, $year . $month, false ),
esc_attr( $arc_row->year . $month ),
esc_attr( $link),
/* translators: 1: Numele lunii, 2: Anul cu 4 cifre. */
sprintf( __( '%1$s %2$d' ), $wp_locale->get_month( $month ), $year )
);
}
?>
</select>
<a href="javascript:void(0)" class="button" onclick="window.location.href = jQuery('#filter-by-date option:selected').data('rc');">Filtrează</a>
</div>
<?php
break;
break;
case 'bottom':
// Codul tău HTML pentru output
break;
}
}
}
și pentru acțiunea de interogare, puteți adăuga cod în
public function prepare_items()
sau funcția get_customers
$this->items = self::get_customers($per_page, $current_page);
<?php
//public static function get_customers($per_page = 20, $page_number = 1)
if (!empty($_REQUEST['m'])) {
$search = $_REQUEST['m'];
$year = substr($search,0,4);
$month = substr($search,4,5);
if(!empty($year)){
$sql .= ' And YEAR(create_date)="' . $year . '"';
}
if(!empty($month)){
$sql .= ' And MONTH(create_date)="' . $month . '"';
}
}
Acesta este un exemplu pentru a obține din baza mea de date
Când dați click pe butonul Filtrează, veți merge la URL-ul din data-rc
