Экспорт данных в CSV в админке с правильными HTTP-заголовками

10 июн. 2013 г., 02:25:01
Просмотры: 15.2K
Голосов: 8

Я написал плагин, который отображает все товары в магазине WooCommerce в настройках админки, и теперь хочу добавить ссылку для скачивания товаров в CSV файл.

Проблема в том, что при клике на ссылку я получаю ошибку о недостатке прав для просмотра страницы.

Вот мой код:

function extra_tablenav($which) {
    if ($which == "top") {
        echo '<h3 style="display:inline">'
        . __('Эти товары сейчас в базе данных:')
        . '</h3>' .
        '&nbsp;&nbsp;&nbsp;' .
        '<a href="' . admin_url('admin.php?page=download_csv.php') . '">' . __('Экспорт в CSV') . '</a>';
    }
}

Как исправить проблему с правами доступа?

0
Все ответы на вопрос 1
3
26

Не указывайте 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' );

… и удалите проверку прав из функции.

10 июн. 2013 г. 02:32:12
Комментарии

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

eballeste eballeste
29 июн. 2017 г. 10:09:49

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

fuxia fuxia
29 июн. 2017 г. 10:11:54

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

eballeste eballeste
29 июн. 2017 г. 10:28:48