Como as ações em massa são tratadas nas classes da tabela de lista personalizada?

9

Estou trabalhando em uma tabela de dados personalizada para exibição no painel do WordPress. A tabela é preenchida a partir de uma tabela de banco de dados que eu construí em um plug-in.

Eu tenho usado o exemplo fornecido da Tabela de lista personalizada do WordPress para a maioria das minhas perguntas de codificação nesta área, mas o exemplo não tem nada para lidar com ações em massa. Aqui está o link para o exemplo documentado: http://wordpress.org/extend/plugins/custom-list-table-example/

Para processar as ações em massa, o exemplo fornece apenas isso:

    function process_bulk_action() {

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

        wp_die('Items deleted!');
    }

}

Quero saber como extrair os itens selecionados para a ação para que eu possa excluí-los ou editar suas entradas do banco de dados de acordo.

Chiubaka
fonte

Respostas:

11

Supondo que você esteja usando a função column_cb () padrão, a tabela de lista passará os IDs das linhas selecionadas em uma matriz em $ _GET, rotulados como o que você atribuiu a 'singular' no construtor da tabela de lista.

Aqui está um column_cb () típico:

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

Por exemplo, digamos que eu tenha uma tabela de lista que exibe vídeos. O construtor ficaria assim:

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?
        ) );

    }

Portanto, se você marcar três linhas na tabela de lista, selecionar "Excluir" na lista de ações em massa e clicar em Aplicar, poderá acessar as linhas selecionadas usando $ _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);
            }
        }

    }
Nate Dudek
fonte
Obrigado! Alguma idéia de como implementar uma ação em massa "editar" que funciona da mesma maneira que outras tabelas do WordPress?
Chiubaka
Você poderia lidar com isso de maneira semelhante, exceto que a interface do usuário seria muito mais envolvida. Provavelmente eu não usaria o método process_bulk_actions () padrão em um caso como esse, porque a interface mais utilizável provavelmente seria aquela que altera as linhas da grade para campos editáveis. Nesse caso, você ainda obtém os itens selecionados na matriz $ _GET, mas precisaria substituir a maneira como o HTML é gerado na classe da tabela de lista. Um cenário muito mais complexo, mas a maneira como você acessa os IDs é a mesma.
Nate Dudek