Esportare dati come CSV nel backend con gli header HTTP corretti
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>' .
' ' .
'<a href="' . admin_url('admin.php?page=download_csv.php') . '">' . __('Esporta in CSV') . '</a>';
}
}
Come posso risolvere questi problemi di permessi?

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.

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 Analizza $_GET
, non $_REQUEST
. Usa sempre solo i dati provenienti dalle fonti previste. $_REQUEST
include dati POST e COOKIE.

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
