Exportar datos como CSV en el backend con los encabezados HTTP adecuados
Escribí un plugin que muestra todos los productos de una tienda WooCommerce en las opciones de configuración del administrador, ahora quiero agregar un enlace para descargar los productos como archivo CSV.
El problema es que cuando hago clic en el enlace obtengo un error de permisos que dice que no tengo permiso para ver esta página.
Aquí está mi código:
function extra_tablenav($which) {
if ($which == "top") {
echo '<h3 style="display:inline">'
. __('Estos productos están actualmente en la base de datos:')
. '</h3>' .
' ' .
'<a href="' . admin_url('admin.php?page=download_csv.php') . '">' . __('Exportar a CSV') . '</a>';
}
}
¿Cómo puedo solucionar esos permisos?

No apuntes la URL a admin.php
, usa admin-post.php
en su lugar:
'<a href="' . admin_url( 'admin-post.php?action=print.csv' ) . '">'
En tu plugin registra una función de retorno (callback) para esa acción:
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');
// generar los datos CSV
}
Si deseas que los datos estén disponibles para usuarios anónimos (no logueados), entonces registra la función de retorno nuevamente con:
add_action( 'admin_post_nopriv_print.csv', 'print_csv' );
... y elimina la verificación de capacidades de la función.

Solo quería añadir como referencia futura que los parámetros adicionales en la URL pueden ser accedidos en la función de callback analizando la variable $_REQUEST
.

@eballeste Analizando $_GET
, no $_REQUEST
. Siempre usa solo los datos de los lugares esperados. $_REQUEST
incluye datos de POST y COOKIE.

Añadiendo para mayor claridad que, aunque es cierto que analizar la variable $_GET
para leer los parámetros de la URL es preferible a usar la variable $_REQUEST
, con fines de seguridad también deberías usar nonces. Aquí un enlace útil: https://www.tipsandtricks-hq.com/introduction-to-wordpress-nonces-5357
