Acciones masivas en wp_list_tables

17 dic 2012, 15:38:54
Vistas: 20.4K
Votos: 6

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']
        );    

}
0
Todas las respuestas a la pregunta 3
3
11

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).

5 abr 2013 01:03:03
Comentarios

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.

Ryan Bayne Ryan Bayne
11 abr 2017 16:30:12

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

Ryan Bayne Ryan Bayne
11 abr 2017 16:32:19

Muchas gracias Ralf912

Ritchie Ritchie
15 feb 2021 07:30:12
0

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!

8 may 2019 11:07:24
0

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)!');
    }

}
6 ene 2013 12:59:53