web-dev-qa-db-fra.com

wp_list_table actions en bloc

Comment déclencher des actions en bloc à l'intérieur d'un WP_List_Table étendu.

J'ai ajouté les actions en bloc suivantes à la boîte de sélection de may table mais sur Apply, rien ne se passe vraiment.

voici comment j'ai ajouté mes actions en vrac

function get_bulk_actions() {
  $actions = array(

        'delete'    => 'Delete',

        'parsing'    => 'Parsen'
  );

  return $actions;
}

et voici la colonne case à cocher

function column_cb($item) {

    return sprintf(

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

}
2
fefe

Si vous ajoutez une action en bloc, vous devez réagir à cette action. Ajouter une fonction ne fait rien, vous devez l'appeler:

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" />', // this is all you need for the bulk-action checkbox
            'id'    => 'ID',
            'date'  => __( 'Date', 'your-textdomain' ),
            'title' => __( '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' => __( 'Delete', 'your-textdomain' ),
                'save'   => __( 'Save', 'your-textdomain' ),
        );

    }

    public function process_bulk_action() {

        // security check!
        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( 'Nope! Security check failed!' );

        }

        $action = $this->current_action();

        switch ( $action ) {

            case 'delete':
                wp_die( 'Delete something' );
                break;

            case 'save':
                wp_die( 'Save something' );
                break;

            default:
                // do nothing or something else
                return;
                break;
        }

        return;
    }

}

Dans prepare_items()nous appelons process_bulk_action(). Donc, sur votre page principale, vous aurez quelque chose comme ça:

$table = new WPSE_List_Table();

printf( '<div class="wrap" id="wpse-list-table"><h2>%s</h2>', __( 'Your List Table', '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(); // this will prepare the items AND process the bulk actions
$table->display();

echo '</form>';

echo '</div>';

Au début, vous créez une instance de votre classe list-table. Ensuite, vous créez un formulaire et appelez prepare_items(). Avec cet appel, les actions en bloc seront traitées car nous appelons la méthode process_bulk_action() dans prepare_items().

Dans l'exemple ci-dessus, nous utilisons post comme méthode d'envoi des données. Ainsi, nous pouvons récupérer l'action en bloc du tableau post si nous ne voulons pas traiter les actions en bloc dans la classe (ou pour d'autres raisons).

// this is the top bulk action!!
$action = ( isset( $_POST['action'] ) ) ?
    filter_input( INPUT_POST, 'action', FILTER_SANITIZE_STRIPPED ) : 'default_top_bulk_action';

// this is the bottom bulk action!!
$action2 = ( isset( $_POST['action2'] ) ) ? 
    filter_input( INPUT_POST, 'action2', FILTER_SANITIZE_STRIPPED ) : 'default_bottom_bulk_action';

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

Vous pouvez récupérer l'action en bloc n'importe où dans le tableau post/get (selon la méthode utilisée pour envoyer les données).

6
Ralf912

c'est ce que j'ai trouvé sur plusieurs sites. Cela ne fonctionne toujours pas pour moi, mais cela fonctionnait quand j'avais toujours les exemples de données dans ma table de liste personnalisée.

  function process_bulk_action() {

    //Detect when a bulk action is being triggered...
    if( 'delete'===$this->current_action() ) {
        wp_die('Items deleted (or they would be if we had items to delete)!');
    }

}
0
Jan