Acciones masivas en wp_list_tables
Cómo ejecutar acciones masivas dentro de una tabla WP_List_Table extendida.
He estado agregando las siguientes acciones masivas al cuadro de selección de mi tabla pero al hacer clic en Aplicar no sucede nada realmente
así es como agregué mis acciones masivas
function get_bulk_actions() {
$actions = array(
'delete' => 'Eliminar',
'parsing' => 'Analizar'
);
return $actions;
}
y aquí está la columna del checkbox
function column_cb($item) {
return sprintf(
'<input type="checkbox" name="record[]" value="%d" />', $item['Round']
);
}

Si agregas una acción masiva (bulk-action), entonces debes reaccionar ante esta acción. Simplemente agregar una función no hace nada, tienes que llamarla:
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" />', // esto es todo lo que necesitas para el checkbox de acciones masivas
'id' => 'ID',
'date' => __( 'Fecha', 'your-textdomain' ),
'title' => __( 'Título', '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' => __( 'Eliminar', 'your-textdomain' ),
'save' => __( 'Guardar', 'your-textdomain' ),
);
}
public function process_bulk_action() {
// ¡verificación de seguridad!
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( '¡No! ¡Falló la verificación de seguridad!' );
}
$action = $this->current_action();
switch ( $action ) {
case 'delete':
wp_die( 'Eliminar algo' );
break;
case 'save':
wp_die( 'Guardar algo' );
break;
default:
// no hacer nada o hacer otra cosa
return;
break;
}
return;
}
}
En prepare_items()
llamamos a process_bulk_action()
. Así que en tu página de backend tendrás algo como esto:
$table = new WPSE_List_Table();
printf( '<div class="wrap" id="wpse-list-table"><h2>%s</h2>', __( 'Tu Tabla de Listado', '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(); // esto preparará los items Y procesará las acciones masivas
$table->display();
echo '</form>';
echo '</div>';
Primero creas una instancia de tu clase list-table. Luego creas un formulario y llamas a prepare_items()
. Con esta llamada, las acciones masivas serán procesadas porque llamamos al método process_bulk_action()
dentro de prepare_items()
.
En el ejemplo anterior, usamos post
como método para enviar los datos. Así podemos obtener la acción masiva del array post si no queremos procesar las acciones masivas dentro de la clase (o por otras razones).
// ¡esta es la acción masiva superior!
$action = ( isset( $_POST['action'] ) ) ?
filter_input( INPUT_POST, 'action', FILTER_SANITIZE_STRIPPED ) : 'default_top_bulk_action';
// ¡esta es la acción masiva inferior!
$action2 = ( isset( $_POST['action2'] ) ) ?
filter_input( INPUT_POST, 'action2', FILTER_SANITIZE_STRIPPED ) : 'default_bottom_bulk_action';
switch ( $action ) {}
switch ( $action2 ) {}
Puedes obtener la acción masiva desde cualquier lugar que desees del array post/get (dependiendo del método utilizado para enviar los datos).

Gracias Ralf912, estoy usando tu enfoque en mi plugin WPSeed y agregué un enlace a tu perfil en el código. Lo he hecho antes pero quiero asegurarme de que estoy usando el enfoque más actual. Tengo curiosidad por saber por qué no lo has escrito para que requiera un nonce y en su lugar se omite la seguridad adicional. Voy a forzar un nonce pero quería tu opinión.

Esta respuesta a la misma pregunta también permite que el nonce no exista. http://wordpress.stackexchange.com/questions/194450/bulk-action-hook-for-admin-pages-which-uses-wp-list-table

Lista de WP con acciones masivas usando datos en "Array"
https://wpengineer.com/2426/wp_list_table-a-step-by-step-guide/ (Convertirlo en un plugin) https://gist.github.com/Latz/7f923479a4ed135e35b2 (para functions.php)
Lista de WP con acciones masivas usando datos "SQL"
https://www.smashingmagazine.com/2011/11/native-admin-tables-wordpress/ (para functions.php)
¡Saludos!

esto es lo que he encontrado en varios sitios web. Aún no funciona para mí, pero solía funcionar cuando aún tenía los datos de muestra en mi tabla de lista personalizada.
function process_bulk_action() {
//Detecta cuando se está activando una acción masiva...
if( 'delete'===$this->current_action() ) {
wp_die('¡Elementos eliminados (o lo serían si tuviéramos elementos para eliminar)!');
}
}
