webentwicklung-frage-antwort-db.com.de

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

Ich habe ein Plugin geschrieben, das alle Produkte in einem Woocommerce-Shop in den Admin-Einstellungen 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?

7
Yekhezkel Yovel

Verweisen Sie die URL nicht auf admin.php, sondern verwenden Sie stattdessen admin-post.php:

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

In Ihrem Plugin registrieren Sie 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.

23
fuxia