Azioni bulk in wp_list_tables
Come eseguire azioni bulk all'interno di una WP_List_Table estesa.
Ho aggiunto le seguenti azioni bulk al menu a tendina della mia tabella ma quando clicco su Applica non succede nulla
ecco come ho aggiunto le mie azioni bulk
function get_bulk_actions() {
$actions = array(
'delete' => 'Elimina',
'parsing' => 'Analizza'
);
return $actions;
}
e questa è la colonna della checkbox
function column_cb($item) {
return sprintf(
'<input type="checkbox" name="record[]" value="%d" />', $item['Round']
);
}

Se aggiungi un'azione in blocco, devi reagire a questa azione. Semplicemente aggiungere una funzione non fa nulla, devi chiamarla:
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" />', // tutto ciò che serve per la checkbox delle azioni in blocco
'id' => 'ID',
'date' => __( 'Data', 'your-textdomain' ),
'title' => __( 'Titolo', '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' => __( 'Elimina', 'your-textdomain' ),
'save' => __( 'Salva', 'your-textdomain' ),
);
}
public function process_bulk_action() {
// controllo di sicurezza!
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( 'Errore! Controllo di sicurezza fallito!' );
}
$action = $this->current_action();
switch ( $action ) {
case 'delete':
wp_die( 'Elimina qualcosa' );
break;
case 'save':
wp_die( 'Salva qualcosa' );
break;
default:
// non fare nulla o fare qualcos'altro
return;
break;
}
return;
}
}
In prepare_items()
chiamiamo process_bulk_action()
. Quindi nella tua pagina backend avrai qualcosa come questo:
$table = new WPSE_List_Table();
printf( '<div class="wrap" id="wpse-list-table"><h2>%s</h2>', __( 'La tua Tabella Lista', '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(); // questo preparerà gli elementi E elaborerà le azioni in blocco
$table->display();
echo '</form>';
echo '</div>';
Per prima cosa crei un'istanza della tua classe list-table. Poi crei un form e chiami prepare_items()
. Con questa chiamata, le azioni in blocco verranno elaborate perché chiamiamo il metodo process_bulk_action()
all'interno di prepare_items()
.
Nell'esempio sopra, usiamo post
come metodo per inviare i dati. Quindi possiamo recuperare l'azione in blocco dall'array post se non volessimo elaborare le azioni in blocco all'interno della classe (o per altri motivi).
// questa è l'azione in blocco in alto!!
$action = ( isset( $_POST['action'] ) ) ?
filter_input( INPUT_POST, 'action', FILTER_SANITIZE_STRIPPED ) : 'default_top_bulk_action';
// questa è l'azione in blocco in basso!!
$action2 = ( isset( $_POST['action2'] ) ) ?
filter_input( INPUT_POST, 'action2', FILTER_SANITIZE_STRIPPED ) : 'default_bottom_bulk_action';
switch ( $action ) {}
switch ( $action2 ) {}
Puoi recuperare l'azione in blocco da qualsiasi punto desideri dall'array post/get (a seconda del metodo utilizzato per inviare i dati).

Grazie Ralf912, sto utilizzando il tuo approccio nel mio plugin WPSeed e ho aggiunto un link al tuo profilo nel codice. L'ho fatto già in passato ma voglio assicurarmi di seguire l'approccio più recente. Mi chiedo perché non hai scritto il codice per richiedere un nonce e invece la sicurezza aggiuntiva viene bypassata? Ho intenzione di forzare un nonce ma vorrei conoscere la tua opinione.

Anche questa risposta alla stessa domanda permette che il nonce non esista. http://wordpress.stackexchange.com/questions/194450/bulk-action-hook-for-admin-pages-which-uses-wp-list-table

Lista WP con azioni di massa utilizzando dati in formato "Array"
https://wpengineer.com/2426/wp_list_table-a-step-by-step-guide/ (Creala come plugin) https://gist.github.com/Latz/7f923479a4ed135e35b2 (per functions.php)
Lista WP con azioni di massa utilizzando dati "SQL"
https://www.smashingmagazine.com/2011/11/native-admin-tables-wordpress/ (per functions.php)
Saluti!

Questo è quello che ho trovato su diversi siti web. Ancora non funziona per me, ma funzionava quando avevo ancora i dati di esempio nella mia tabella personalizzata.
function process_bulk_action() {
//Rileva quando viene attivata un'azione bulk...
if( 'delete'===$this->current_action() ) {
wp_die('Elementi eliminati (o lo sarebbero se avessimo elementi da eliminare)!');
}
}
