web-dev-qa-db-fra.com

wp_redirect émet un avertissement: impossible de modifier les informations d'en-tête - plugin personnalisé

J'essaie de faire une action de suppression dans un plugin personnalisé qui utilise une table personnalisée et étend wp_list_table pour afficher les données. Le problème est que, chaque fois que j'essaie de supprimer les données, je ne peux pas modifier les informations d'en-tête et je ne sais pas comment les résoudre. Le code:

    function process_bulk_action() {

    //Detect when a bulk action is being triggered
    if ('delete' === $this->current_action() ) {
        // In our file that handles the request, verify the nonce.
        $nonce = $_REQUEST['_wpnonce'];

        if ( !wp_verify_nonce( $nonce, 'bsp_delete_student' ) ) {
            die( 'Invalid security check!' );
        }
        else {
            self::delete_student( absint( $_GET['student'] ) );

            wp_redirect( esc_url( add_query_arg() ) );
            exit;
        }
    }

    // If the delete bulk action is triggered
    if ( ( isset( $_POST['action'] ) && $_POST['action'] == 'delete' )
         || ( isset( $_POST['action2'] ) && $_POST['action2'] == 'delete' )
    ) {

        $delete_ids = esc_sql( $_POST['delete'] );

        // loop over the array of record IDs and delete them
        foreach ($delete_ids as $id ) {
            self::delete_student( $id );

        }
        wp_redirect( esc_url( add_query_arg() ) );
        exit;
    }
}

J'ai alors une fonction pour supprimer:

    function delete_student($id){
    global $wpdb;
    $wpdb->delete("{$wpdb->prefix}students",
        [ 'students_id' => $id ],
        [ '%d' ]
    );
}

Lorsque je commente le contrôle de nonce (qui ne fonctionne pas, me donne toujours le "contrôle de sécurité non valide!") Et tente de supprimer un élève, les informations d'en-tête ne peuvent pas être modifiées et la ligne sélectionnée n'est pas supprimée. Aucune suggestion?

1
dea

Vous ne pouvez pas rediriger à l'intérieur de l'appel process_bulk_actions (), au moment où Wordpress traite que les en-têtes de fichier ont déjà été envoyés (je ne sais pas exactement pourquoi). Vous devriez simplement écrire un message et utiliser wp_die ($ message) au lieu de die ().

Lorsque vous utilisez des actions en bloc, Wordpress redirige cette action vers le fichier contenant la liste. Ce fichier ne montrera votre message que si vous utilisez wp_die () dans process_bulk_actions ().

De plus, si vous souhaitez utiliser les actions normales (pas en bloc) comme Éditer | Supprimez, vous pouvez utiliser quelque chose comme ceci avant de créer l'objet liste et d'appeler prepare_items ():

[Notez que ce code ne se trouve pas dans le fichier de classe de liste, mais dans le fichier l'utilisant, le fichier qui montre la table]

// modify yourslug to fit what you defined in construct 'singular' item
// modify my-edit-file.php with the name of the file which is going to handle
// your edit or delete action.
// $itemId will be received and used by my-edit-file.php

    if(isset($_REQUEST['action']) && $_REQUEST['action'] === 'edit'){
        $itemId = filter_input(INPUT_GET, 'yourslug', FILTER_VALIDATE_INT);

        require_once(plugin_dir_path(__FILE__) . 'my-edit-file.php');
        wp_die();
    }
$table = new MyObjectListTable();
$table->prepare_items();
1
appartisan