Как массовые действия обрабатываются в классах пользовательских таблиц списков?

9

Я работаю над пользовательской таблицей данных для отображения на панели инструментов WordPress. Таблица заполняется из таблицы базы данных, которую я построил в плагине.

Я использовал предоставленный пример WordPress Custom List Table для большинства моих вопросов по кодированию в этой области, но в этом примере нет ничего для обработки массовых действий. Вот ссылка на задокументированный пример: http://wordpress.org/extend/plugins/custom-list-table-example/

Для обработки массовых действий, пример предоставляет только это:

    function process_bulk_action() {

    //Detect when a bulk action is being triggered...
    if( 'delete'===$this->current_action() ) {

        wp_die('Items deleted!');
    }

}

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

Chiubaka
источник

Ответы:

11

Предполагая, что вы используете стандартную функцию column_cb (), таблица списка будет передавать идентификаторы выбранных строк в массиве в $ _GET, помеченные как все, что вы назначили для «единственного числа» в конструкторе таблицы списка.

Вот типичный column_cb ():

function column_cb($item){
        return sprintf(
            '<input type="checkbox" name="%1$s[]" value="%2$s" />',
            /*$1%s*/ $this->_args['singular'],  //Let's simply repurpose the table's singular label ("video")
            /*$2%s*/ $item->id             //The value of the checkbox should be the record's id
        );
    }

Например, допустим, у меня есть таблица списка, в которой отображаются видео. Конструктор будет выглядеть так:

function __construct(){
        global $status, $page;

        //Set parent defaults
        parent::__construct( array(
            'singular'  => 'video',     //singular name of the listed records
            'plural'    => 'videos',    //plural name of the listed records
            'ajax'      => false        //does this table support ajax?
        ) );

    }

Итак, если вы проверите три строки в таблице списка, выберите «Удалить» из списка массовых действий и нажмете «Применить», вы можете получить доступ к выбранным строкам, используя $ _GET ['video'].

function process_bulk_action() {

        //Detect when a bulk action is being triggered...
        if( 'delete'===$this->current_action() ) {
            foreach($_GET['video'] as $video) {
                //$video will be a string containing the ID of the video
                //i.e. $video = "123";
                //so you can process the id however you need to.
                delete_this_video($video);
            }
        }

    }
Нейт Дудек
источник
Спасибо! Любые идеи о том, как реализовать массовое действие "изменить", которое работает так же, как другие таблицы WordPress?
Чубака
Вы можете справиться с этим аналогичным образом, за исключением того, что пользовательский интерфейс будет гораздо более сложным. Вероятно, я бы не стал использовать метод process_bulk_actions () по умолчанию в таком случае, как этот, потому что наиболее удобным интерфейсом, вероятно, будет тот, который изменяет строки сетки на редактируемые поля. В этом случае вы по-прежнему получаете выбранные элементы в массиве $ _GET, но вам придется переопределить способ вывода HTML в классе таблицы списка. Гораздо более сложный сценарий, но способ доступа к идентификаторам тот же.
Нейт Дудек