Wie werden Massenaktionen in benutzerdefinierten Listentabellenklassen behandelt?

9

Ich arbeite an einer benutzerdefinierten Datentabelle, die im WordPress-Dashboard angezeigt werden soll. Die Tabelle wird aus einer Datenbanktabelle gefüllt, die ich in einem Plugin erstellt habe.

Ich habe das bereitgestellte Beispiel für eine benutzerdefinierte WordPress-Listentabelle für die meisten meiner Codierungsfragen in diesem Bereich verwendet, aber das Beispiel enthält nichts für die Behandlung von Massenaktionen. Hier ist der Link für das dokumentierte Beispiel: http://wordpress.org/extend/plugins/custom-list-table-example/

Für die Verarbeitung der Massenaktionen bietet das Beispiel nur Folgendes:

    function process_bulk_action() {

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

        wp_die('Items deleted!');
    }

}

Ich möchte wissen, wie die für die Aktion ausgewählten Elemente abgerufen werden, damit ich sie löschen oder ihre Datenbankeinträge entsprechend bearbeiten kann.

Chiubaka
quelle

Antworten:

11

Angenommen, Sie verwenden die Standardfunktion column_cb (), übergibt die Listentabelle die IDs der ausgewählten Zeilen in einem Array in $ _GET, das im Konstruktor der Listentabelle als alles gekennzeichnet ist, was Sie 'Singular' zugewiesen haben.

Hier ist eine typische 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
        );
    }

Angenommen, ich habe eine Listentabelle, in der Videos angezeigt werden. Der Konstruktor würde folgendermaßen aussehen:

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

    }

Wenn Sie also drei Zeilen in der Listentabelle aktivieren, "Löschen" aus der Liste der Massenaktionen auswählen und auf "Anwenden" klicken, können Sie mit $ _GET ['video'] auf die ausgewählten Zeilen zugreifen.

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
quelle
Vielen Dank! Irgendwelche Ideen, wie man eine Massenaktion "Bearbeiten" implementiert, die genauso funktioniert wie andere WordPress-Tabellen?
Chiubaka
Sie könnten auf ähnliche Weise damit umgehen, außer dass die Benutzeroberfläche viel komplizierter wäre. In einem solchen Fall würde ich wahrscheinlich nicht die Standardmethode process_bulk_actions () verwenden, da die am besten verwendbare Schnittstelle wahrscheinlich eine ist, die die Rasterzeilen in bearbeitbare Felder ändert. In diesem Fall erhalten Sie die ausgewählten Elemente weiterhin im Array $ _GET, müssen jedoch die Art und Weise überschreiben, in der der HTML-Code in der Listentabellenklasse ausgegeben wird. Ein Szenario ist viel komplexer, aber die Art und Weise, wie Sie auf die IDs zugreifen, ist dieselbe.
Nate Dudek