Acțiuni în masă wp_list_tables

17 dec. 2012, 15:38:54
Vizualizări: 20.4K
Voturi: 6

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']
        );    
}
0
Toate răspunsurile la întrebare 3
3
11

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

5 apr. 2013 01:03:03
Comentarii

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.

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

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

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

Îți mulțumesc foarte mult Ralf912

Ritchie Ritchie
15 feb. 2021 07:30:12
0

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!

8 mai 2019 11:07:24
0

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

}
6 ian. 2013 12:59:53