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?

Yekhezkel Yovel
quelle

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.

Fuxia
quelle
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