Exportar datos como CSV en el backend con los encabezados HTTP adecuados

10 jun 2013, 02:25:01
Vistas: 15.2K
Votos: 8

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>' .
        '&nbsp;&nbsp;&nbsp;' .
        '<a href="' . admin_url('admin.php?page=download_csv.php') . '">' . __('Exportar a CSV') . '</a>';
    }
}

¿Cómo puedo solucionar esos permisos?

0
Todas las respuestas a la pregunta 1
3
26

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.

10 jun 2013 02:32:12
Comentarios

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 eballeste
29 jun 2017 10:09:49

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

fuxia fuxia
29 jun 2017 10:11:54

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

eballeste eballeste
29 jun 2017 10:28:48