¿Cómo se manejan las acciones masivas en las clases de tabla de lista personalizada?

9

Estoy trabajando en una tabla de datos personalizada para mostrar en el panel de WordPress. La tabla se completa a partir de una tabla de base de datos que construí en un complemento.

He estado utilizando el ejemplo de la tabla de listas personalizadas de WordPress para la mayoría de mis preguntas de codificación en esta área, pero el ejemplo no tiene nada para manejar acciones masivas. Aquí está el enlace para el ejemplo documentado: http://wordpress.org/extend/plugins/custom-list-table-example/

Para procesar las acciones masivas, el ejemplo solo proporciona esto:

    function process_bulk_action() {

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

        wp_die('Items deleted!');
    }

}

Quiero saber cómo extraer los elementos seleccionados para la acción para poder eliminarlos o editar sus entradas de la base de datos en consecuencia.

Chiubaka
fuente

Respuestas:

11

Suponiendo que está utilizando la función column_cb () estándar, la tabla de lista pasará los ID de las filas seleccionadas en una matriz en $ _GET, etiquetadas como lo que haya asignado a 'singular' en el constructor de la tabla de lista.

Aquí hay un 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 ejemplo, supongamos que tengo una tabla de lista que muestra videos. El constructor se vería así:

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

    }

Entonces, si marca tres filas en la tabla de la lista, selecciona "Eliminar" de la lista de acciones masivas y presiona aplicar, puede acceder a las filas seleccionadas 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
fuente
¡Gracias! ¿Alguna idea sobre cómo implementar una acción masiva de "edición" que funcione de la misma manera que otras tablas de WordPress?
Chiubaka
Podría manejarlo de manera similar, excepto que la IU estaría mucho más involucrada. Probablemente no usaría el método predeterminado process_bulk_actions () en un caso como este, porque la interfaz más útil probablemente sería una que cambie las filas de la cuadrícula a campos editables. En ese caso, aún obtiene los elementos seleccionados en la matriz $ _GET, pero tendría que anular la forma en que se genera el HTML en la clase de tabla de lista. Es un escenario mucho más complejo, pero la forma de acceder a los ID es la misma.
Nate Dudek