Экспорт данных в CSV в админке с правильными HTTP-заголовками
Я написал плагин, который отображает все товары в магазине WooCommerce в настройках админки, и теперь хочу добавить ссылку для скачивания товаров в CSV файл.
Проблема в том, что при клике на ссылку я получаю ошибку о недостатке прав для просмотра страницы.
Вот мой код:
function extra_tablenav($which) {
if ($which == "top") {
echo '<h3 style="display:inline">'
. __('Эти товары сейчас в базе данных:')
. '</h3>' .
' ' .
'<a href="' . admin_url('admin.php?page=download_csv.php') . '">' . __('Экспорт в CSV') . '</a>';
}
}
Как исправить проблему с правами доступа?

Не указывайте URL на admin.php
, используйте вместо этого admin-post.php
:
'<a href="' . admin_url( 'admin-post.php?action=print.csv' ) . '">'
В вашем плагине зарегистрируйте обработчик для этого действия:
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');
// вывод данных CSV
}
Если вы хотите сделать данные доступными для анонимных пользователей (не авторизованных), тогда зарегистрируйте обработчик ещё раз с:
add_action( 'admin_post_nopriv_print.csv', 'print_csv' );
… и удалите проверку прав из функции.

Хотел добавить для дальнейшего использования, что дополнительные параметры URL можно получить в callback-функции, разбирая переменную $_REQUEST.

@eballeste Разбирайте $_GET
, а не $_REQUEST
. Всегда используйте только данные из ожидаемых источников. $_REQUEST
включает данные POST и COOKIE.

Добавлю для большей ясности: хотя действительно предпочтительнее разбирать переменную $_GET для обработки параметров URL, а не использовать $_REQUEST, в целях безопасности вам также следует использовать nonces. Вот полезная ссылка: https://www.tipsandtricks-hq.com/introduction-to-wordpress-nonces-5357
