Exportieren Sie Daten als CSV im Backend mit den richtigen HTTP-Headern


7

Ich habe ein Plugin geschrieben, das alle Produkte in einem Woocommerce-Store in der Option "Administratoreinstellungen" anzeigt. Jetzt möchte ich einen Link hinzufügen, um die Produkte als CSV-Datei herunterzuladen.

Das Problem ist, wenn ich auf den Link klicke, wird ein Berechtigungsfehler angezeigt, der besagt, dass ich keine Berechtigung zum Anzeigen dieser Seite habe.

Hier ist mein 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>';
    }
}

Wie kann ich diese Berechtigungen korrigieren?

Antworten:


24

Zeigen Sie nicht auf die URL admin.php, admin-post.phpsondern verwenden Sie stattdessen:

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

Registrieren Sie in Ihrem Plugin einen Rückruf für diese Aktion:

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
}

Wenn Sie die Daten für anonyme Benutzer verfügbar machen möchten (nicht angemeldet), registrieren Sie den Rückruf erneut mit:

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

… Und entfernen Sie die Fähigkeitsprüfung aus der Funktion.


Ich wollte nur als zukünftige Referenz hinzufügen, dass das Hinzufügen zusätzlicher Parameter zur URL in der Rückruffunktion durch Parsen der Variablen $ _REQUEST aufgerufen werden kann.
Eballeste

1
@ Balleste Parsing $_GET, nicht $_REQUEST. Verwenden Sie immer nur die Daten von erwarteten Orten. $_REQUESTEnthält POST- und COOKIE-Daten.
Fuxia

Fügen Sie zur weiteren Klarheit hinzu, dass das Parsen der Variablen $ _GET zum Parsen der URL-Parameter der Verwendung der Variablen $ _REQUEST vorzuziehen ist. Aus Sicherheitsgründen sollten Sie aus Sicherheitsgründen auch Nonces verwenden. Hier ist ein nützlicher Link: tipsandtricks-hq.com/introduction-to-wordpress-nonces-5357
eballeste
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.