Azioni bulk in wp_list_tables

17 dic 2012, 15:38:54
Visualizzazioni: 20.4K
Voti: 6

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

}
0
Tutte le risposte alla domanda 3
3
11

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

5 apr 2013 01:03:03
Commenti

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.

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

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

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

Grazie mille Ralf912

Ritchie Ritchie
15 feb 2021 07:30:12
0

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!

8 mag 2019 11:07:24
0

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

}
6 gen 2013 12:59:53