web-dev-qa-db-fra.com

Exportez des données au format CSV dans le back-end avec les en-têtes HTTP appropriés

J'ai écrit un plugin qui affiche tous les produits d'une boutique woocommerce dans l'option de configuration de l'administrateur. Je souhaite maintenant ajouter un lien pour télécharger les produits au format CSV.

Le problème est que, lorsque je clique sur le lien, une erreur de permission s’affiche, indiquant que je n’ai pas la permission de voir cette page.

Voici mon code:

function extra_tablenav($which) {
    if ($which == "top") {
        echo '<h3 style="display:inline">'
        . __('These products are currently in the database:')
        . '</h3>' .
        '&nbsp;&nbsp;&nbsp;' .
        '<a href="' . admin_url('admin.php?page=download_csv.php') . '">' . __('Export to CSV') . '</a>';
    }
}

Comment puis-je réparer ces autorisations?

7
Yekhezkel Yovel

Ne pointez pas l'URL sur admin.php, utilisez plutôt admin-post.php:

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

Dans votre plugin, inscrivez un rappel pour cette action:

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 the CSV data
}

Si vous souhaitez rendre les données disponibles pour les utilisateurs anonymes (non connectés), enregistrez à nouveau le rappel avec:

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

… Et supprimez le contrôle de capacité de la fonction.

23
fuxia