Acțiuni în masă wp_list_tables
Cum să declanșezi acțiuni în masă în interiorul unei clase WP_List_Table extinse.
Am adăugat următoarele acțiuni în masă în caseta de selectare a tabelului meu, dar la apăsarea butonului Aplică nu se întâmplă nimic
Iată cum am adăugat acțiunile în masă
function get_bulk_actions() {
$actions = array(
// Șterge
'delete' => 'Delete',
// Parsare
'parsing' => 'Parsen'
);
return $actions;
}
și aici este coloana cu caseta de bifare
function column_cb($item) {
return sprintf(
'<input type="checkbox" name="record[]" value="%d" />', $item['Round']
);
}

Dacă adaugi o acțiune în masă (bulk-action), atunci trebuie să reacționezi la această acțiune. Simpla adăugare a unei funcții nu face nimic, trebuie să o apelezi:
class WPSE_List_Table extends WP_List_Table
{
public function __construct() {
parent::__construct(
array(
'singular' => 'singular_form',
'plural' => 'plural_form',
'ajax' => false
)
);
}
public function prepare_items() {
$columns = $this->get_columns();
$sortable = $this->get_sortable_columns();
$hidden = array( 'id' );
$this->_column_headers = array( $columns, $hidden, $sortable );
$this->process_bulk_action();
}
public function get_columns() {
return array(
'cb' => '<input type="checkbox" />', // este tot ce ai nevoie pentru checkbox-ul de acțiuni în masă
'id' => 'ID',
'date' => __( 'Data', 'your-textdomain' ),
'title' => __( 'Titlu', 'your-textdomain' ),
);
}
public function get_sortable_columns() {
return array(
'date' => array( 'date', false ),
'title' => array( 'title', false ),
);
}
public function get_bulk_actions() {
return array(
'delete' => __( 'Șterge', 'your-textdomain' ),
'save' => __( 'Salvează', 'your-textdomain' ),
);
}
public function process_bulk_action() {
// verificare securitate!
if ( isset( $_POST['_wpnonce'] ) && ! empty( $_POST['_wpnonce'] ) ) {
$nonce = filter_input( INPUT_POST, '_wpnonce', FILTER_SANITIZE_STRING );
$action = 'bulk-' . $this->_args['plural'];
if ( ! wp_verify_nonce( $nonce, $action ) )
wp_die( 'Nu! Verificarea de securitate a eșuat!' );
}
$action = $this->current_action();
switch ( $action ) {
case 'delete':
wp_die( 'Șterge ceva' );
break;
case 'save':
wp_die( 'Salvează ceva' );
break;
default:
// nu face nimic sau altceva
return;
break;
}
return;
}
}
În prepare_items()
apelăm process_bulk_action()
. Deci, pe pagina ta de backend vei avea ceva de genul:
$table = new WPSE_List_Table();
printf( '<div class="wrap" id="wpse-list-table"><h2>%s</h2>', __( 'Tabelul tău de listă', 'your-textdomain' ) );
echo '<form id="wpse-list-table-form" method="post">';
$page = filter_input( INPUT_GET, 'page', FILTER_SANITIZE_STRIPPED );
$paged = filter_input( INPUT_GET, 'paged', FILTER_SANITIZE_NUMBER_INT );
printf( '<input type="hidden" name="page" value="%s" />', $page );
printf( '<input type="hidden" name="paged" value="%d" />', $paged );
$table->prepare_items(); // aceasta va pregăti elementele ȘI va procesa acțiunile în masă
$table->display();
echo '</form>';
echo '</div>';
Mai întâi creezi o instanță a clasei tale de list-table. Apoi creezi un formular și apelezi prepare_items()
. Cu acest apel, acțiunile în masă vor fi procesate pentru că apelăm metoda process_bulk_action()
în interiorul lui prepare_items()
.
În exemplul de mai sus, folosim post
ca metodă pentru a trimite datele. Astfel, putem prelua acțiunea în masă din array-ul post dacă nu am vrut să procesăm acțiunile în masă în interiorul clasei (sau din alte motive).
// aceasta este acțiunea în masă de sus!!
$action = ( isset( $_POST['action'] ) ) ?
filter_input( INPUT_POST, 'action', FILTER_SANITIZE_STRIPPED ) : 'default_top_bulk_action';
// aceasta este acțiunea în masă de jos!!
$action2 = ( isset( $_POST['action2'] ) ) ?
filter_input( INPUT_POST, 'action2', FILTER_SANITIZE_STRIPPED ) : 'default_bottom_bulk_action';
switch ( $action ) {}
switch ( $action2 ) {}
Poți prelua acțiunea în masă de oriunde dorești din array-ul post/get (în funcție de ce metodă a fost folosită pentru a trimite datele).

Mulțumesc Ralf912, folosesc abordarea ta în plugin-ul meu WPSeed și am adăugat un link către profilul tău în cod. Am făcut asta și înainte, dar vreau să mă asigur că folosesc cea mai recentă abordare. Sunt curios de ce nu ai scris codul să necesite un nonce și în schimb se ocolește securitatea suplimentară? Am de gând să forțez un nonce, dar voiam să-ți aud părerea.

Acest răspuns la aceeași întrebare permite și el ca nonce-ul să nu existe. http://wordpress.stackexchange.com/questions/194450/bulk-action-hook-for-admin-pages-which-uses-wp-list-table

Listă WP cu acțiuni în masă folosind date de tip "Array"
https://wpengineer.com/2426/wp_list_table-a-step-by-step-guide/ (Implementare ca plugin) https://gist.github.com/Latz/7f923479a4ed135e35b2 (pentru functions.php)
Listă WP cu acțiuni în masă folosind date de tip "SQL"
https://www.smashingmagazine.com/2011/11/native-admin-tables-wordpress/ (pentru functions.php)
Noroc!

acesta este ceea ce am găsit pe mai multe site-uri web. Încă nu funcționează pentru mine, dar funcționa când aveam datele demo în tabelul meu personalizat.
function process_bulk_action() {
//Detectează când o acțiune în masă este declanșată...
if( 'delete'===$this->current_action() ) {
wp_die('Elementele au fost șterse (sau ar fi fost dacă am fi avut elemente de șters)!');
}
}
