Esportare dati come CSV nel backend con gli header HTTP corretti

10 giu 2013, 02:25:01
Visualizzazioni: 15.2K
Voti: 8

Ho scritto un plugin che mostra tutti i prodotti di un negozio WooCommerce nelle opzioni di amministrazione, ora voglio aggiungere un link per scaricare i prodotti come file CSV.

Il problema è che quando clicco sul link ottengo un errore di permesso che dice che non ho l'autorizzazione per visualizzare questa pagina.

Ecco il mio codice:

function extra_tablenav($which) {
    if ($which == "top") {
        echo '<h3 style="display:inline">'
        . __('Questi prodotti sono attualmente nel database:') 
        . '</h3>' .
        '&nbsp;&nbsp;&nbsp;' .
        '<a href="' . admin_url('admin.php?page=download_csv.php') . '">' . __('Esporta in CSV') . '</a>';
    }
}

Come posso risolvere questi problemi di permessi?

0
Tutte le risposte alla domanda 1
3
26

Non puntare l'URL a admin.php, usa invece admin-post.php:

'<a href="' . admin_url( 'admin-post.php?action=print.csv' ) . '">'

Nel tuo plugin registra una callback per quell'azione:

add_action( 'admin_post_print.csv', 'print_csv' );

function print_csv()
{
    if ( ! current_user_can( 'manage_options' ) )
        return;

    header('Content-Type: application/csv');
    header('Content-Disposition: attachment; filename=example.csv');
    header('Pragma: no-cache');

    // output dei dati CSV
}

Se vuoi rendere i dati disponibili per utenti anonimi (non loggati), registra nuovamente la callback con:

add_action( 'admin_post_nopriv_print.csv', 'print_csv' );

... e rimuovi il controllo delle capacità dalla funzione.

10 giu 2013 02:32:12
Commenti

Volevo solo aggiungere per riferimento futuro che i parametri extra aggiunti all'URL possono essere accessibili nella funzione di callback analizzando la variabile $_REQUEST.

eballeste eballeste
29 giu 2017 10:09:49

@eballeste Analizza $_GET, non $_REQUEST. Usa sempre solo i dati provenienti dalle fonti previste. $_REQUEST include dati POST e COOKIE.

fuxia fuxia
29 giu 2017 10:11:54

Aggiungo solo per maggiore chiarezza che, sebbene sia vero che analizzare la variabile $_GET per elaborare i parametri dell'URL sia preferibile rispetto all'uso della variabile $_REQUEST, per motivi di sicurezza dovresti anche utilizzare i nonce. Ecco un link utile: https://www.tipsandtricks-hq.com/introduction-to-wordpress-nonces-5357

eballeste eballeste
29 giu 2017 10:28:48