Массовые действия wp_list_tables

17 дек. 2012 г., 15:38:54
Просмотры: 20.4K
Голосов: 6

Как обрабатывать массовые действия внутри расширенного класса WP_List_Table.

Я добавил следующие массовые действия в выпадающий список таблицы, но при нажатии кнопки "Применить" ничего не происходит

вот как я добавил массовые действия

function get_bulk_actions() {
  $actions = array(

        'delete'    => 'Удалить',

        'parsing'    => 'Парсинг'
  );

  return $actions;
}

а вот колонка с чекбоксами

function column_cb($item) {

    return sprintf(

            '<input type="checkbox" name="record[]" value="%d" />', $item['Round']
        );    

}
0
Все ответы на вопрос 3
3
11

Если вы добавляете массовое действие (bulk-action), то вам нужно обработать это действие. Простое добавление функции ничего не даёт — её необходимо вызвать:

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" />', // этого достаточно для чекбокса массового действия
            'id'    => 'ID',
            'date'  => __( 'Дата', 'your-textdomain' ),
            'title' => __( 'Заголовок', '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' => __( 'Удалить', 'your-textdomain' ),
                'save'   => __( 'Сохранить', 'your-textdomain' ),
        );

    }

    public function process_bulk_action() {

        // проверка безопасности!
        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( 'Ошибка! Проверка безопасности не пройдена!' );

        }

        $action = $this->current_action();

        switch ( $action ) {

            case 'delete':
                wp_die( 'Удалить что-то' );
                break;

            case 'save':
                wp_die( 'Сохранить что-то' );
                break;

            default:
                // ничего не делать или что-то другое
                return;
                break;
        }

        return;
    }

}

В методе prepare_items() мы вызываем process_bulk_action(). Таким образом, на вашей странице админки у вас будет что-то вроде этого:

$table = new WPSE_List_Table();

printf( '<div class="wrap" id="wpse-list-table"><h2>%s</h2>', __( 'Ваша таблица списка', '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(); // это подготовит элементы И обработает массовые действия
$table->display();

echo '</form>';

echo '</div>';

Сначала вы создаёте экземпляр вашего класса таблицы. Затем создаёте форму и вызываете prepare_items(). При этом вызове будут обработаны массовые действия, так как мы вызываем метод process_bulk_action() внутри prepare_items().

В примере выше мы используем метод post для отправки данных. Таким образом, мы можем получить массовое действие из массива post, если не хотим обрабатывать массовые действия внутри класса (или по другим причинам).

// это верхнее массовое действие!!
$action = ( isset( $_POST['action'] ) ) ?
    filter_input( INPUT_POST, 'action', FILTER_SANITIZE_STRIPPED ) : 'default_top_bulk_action';

// это нижнее массовое действие!!
$action2 = ( isset( $_POST['action2'] ) ) ? 
    filter_input( INPUT_POST, 'action2', FILTER_SANITIZE_STRIPPED ) : 'default_bottom_bulk_action';

switch ( $action ) {}
switch ( $action2 ) {}

Вы можете получить массовое действие в любом месте из массива post/get (в зависимости от того, какой метод был использован для отправки данных).

5 апр. 2013 г. 01:03:03
Комментарии

Спасибо, Ralf912. Я использую ваш подход в своем плагине WPSeed и добавил ссылку на ваш профиль в коде. Я делал это и раньше, но хочу убедиться, что использую самый актуальный подход. Мне интересно, почему вы не добавили проверку nonce, а вместо этого пропустили дополнительную безопасность? Я собираюсь принудительно добавить nonce, но хотел бы узнать ваше мнение.

Ryan Bayne Ryan Bayne
11 апр. 2017 г. 16:30:12

Этот ответ на тот же вопрос также допускает отсутствие nonce. http://wordpress.stackexchange.com/questions/194450/bulk-action-hook-for-admin-pages-which-uses-wp-list-table

Ryan Bayne Ryan Bayne
11 апр. 2017 г. 16:32:19

Большое спасибо, Ralf912

Ritchie Ritchie
15 февр. 2021 г. 07:30:12
0

WP List с массовыми действиями, использующими данные в формате "Array"

https://wpengineer.com/2426/wp_list_table-a-step-by-step-guide/ (Сделать в виде плагина) https://gist.github.com/Latz/7f923479a4ed135e35b2 (для functions.php)

WP List с массовыми действиями, использующими данные из "SQL"

https://www.smashingmagazine.com/2011/11/native-admin-tables-wordpress/ (для functions.php)

Удачи!

8 мая 2019 г. 11:07:24
0

Вот что я нашел на нескольких сайтах. У меня это до сих пор не работает, хотя раньше работало, когда у меня были тестовые данные в моей пользовательской таблице.

  function process_bulk_action() {

    //Определяем, когда запускается групповое действие...
    if( 'delete'===$this->current_action() ) {
        wp_die('Элементы удалены (или были бы удалены, если бы у нас были элементы для удаления)!');
    }

}
6 янв. 2013 г. 12:59:53