Вопрос или проблема
Всем привет, у меня есть код ниже, но когда я кликаю по сгенерированной ссылке, открывается новая страница с нулевым отображением.
Что я делаю не так?
function list_reservation_to_csv() {
global $wpdb;
$table_name = $wpdb->prefix . 'prenotazione_eventi';
$file="email_csv"; // ?? не определен в оригинальном коде
$results = $wpdb->get_results("SELECT * FROM $table_name",ARRAY_A);
if (empty($results)) {
return;
}
$csv_output=""".implode('";"',array_keys($results[0])).'";'."\n";;
foreach ($results as $row) {
$csv_output .= '"'.implode('";"',$row).'";'."\n";
}
$csv_output .= "\n";
$filename = $file."_".date("Y-m-d_H-i",time());
header("Content-type: application/vnd.ms-excel");
header("Content-disposition: csv" . date("Y-m-d") . ".csv");
header( "Content-disposition: filename=".$filename.".csv");
print $csv_output;
exit;
}
add_action('wp_ajax_csv_pull','list_reservation_to_csv');
$ajax_url = admin_url('admin-ajax.php?action=csv_pull');
<a href="https://wordpress.stackexchange.com/questions/301946/<?php echo $ajax_url; ?>"><button>Скачать csv</button></a>
Попробуйте добавить nopriv hook
add_action('wp_ajax_nopriv_csv_pull','list_reservation_to_csv');
Это добавляет возможность запускать функцию без входа в систему как зарегистрированный пользователь.
Я рекомендую использовать плагин WPAllExport; он очень настраиваемый и выполняет большую часть тяжелой работы. Я успешно использовал его для управления экспортом данных о мероприятиях в очень сложных ситуациях, и я знаю, что он справится с этим отлично. (Я ни в коем случае не связан с ним; я просто довольный клиент.)
Я обычно пытаюсь выяснить, пытался ли кто-то уже решить проблему, с которой я столкнулся. В среде WordPress большинство вещей уже решены.
Ответ или решение
Экспорт данных пользовательской базы данных в файл Excel является распространенной задачей для многих разработчиков и бизнесов, работающих с WordPress. Ваше текущее решение на основе PHP имеет некоторые недочёты, которые могут вызывать проблемы при попытке открыть сгенерированный CSV-файл. В этой статье мы рассмотрим основные ошибки и исправления, а также предоставим общее руководство по правильному экспорту данных.
Основные ошибки в вашем коде
-
Неверная настройка заголовков: Заголовки для ответа не полностью соответствуют формату CSV. Следует правильно указать
Content-Type
иContent-Disposition
. -
Проблема с Ajax: Вы не добавляете Ajax-обработчик для незарегистрированных пользователей, что может быть причиной отсутствия данных при попытке доступа к вашему ресурсу.
-
Использование запроса на получение данных: Убедитесь, что данные корректно извлекаются из базы данных. Лучше явно обрабатывать случай, когда данных нет.
Исправленный пример кода
Вот исправленный код вашей функции, включая все необходимые изменения:
function list_reservation_to_csv() {
global $wpdb;
$table_name = $wpdb->prefix . 'prenotazione_eventi';
$filename = "email_csv_" . date("Y-m-d_H-i") . ".csv";
$results = $wpdb->get_results("SELECT * FROM $table_name", ARRAY_A);
if (empty($results)) {
// Если данных нет, возвращаем пустой ответ
wp_die("Нет данных для экспорта.");
}
// Создаем заголовки для CSV
header("Content-type: text/csv");
header("Content-Disposition: attachment; filename=$filename");
// Вывод заголовков CSV
echo implode(",", array_keys($results[0])) . "\n";
// Вывод данных
foreach ($results as $row) {
echo implode(",", $row) . "\n";
}
exit;
}
add_action('wp_ajax_csv_pull', 'list_reservation_to_csv');
add_action('wp_ajax_nopriv_csv_pull', 'list_reservation_to_csv'); // Добавляем доступ для незарегистрированных пользователей
$ajax_url = admin_url('admin-ajax.php?action=csv_pull'); // Создаем ссылку для скачивания
echo '<a href="' . esc_url($ajax_url) . '"><button>Скачать CSV</button></a>';
Комментарии к изменениям
-
Заголовки: Исправлены заголовки для передачи файла CSV клиенту. Теперь они правильно формируют файл, который будет сразу предложен пользователю для скачивания.
-
Проверка наличия данных: Если данных нет, выполнится завершение с сообщением об этом, вместо того, чтобы выдавать пустой файл.
-
Ajax доступ: Включен дополнительный обработчик
nopriv
, чтобы аудитория, не зарегистрированная в системе, также могла получить доступ к функции.
Использование плагина WP All Export
Если ваш проект требует более сложного экспорта данных, стоит рассмотреть возможность использования сторонних инструментов, например, плагина WP All Export. Этот плагин предлагает более гибкие возможности для настройки экспорта, что делает его отличным выбором для управляемых проектов. Большинство задач, связанных с экспортом данных, уже успешно решены с его помощью.
Заключение
Экспорт данных из базы данных в файл Excel может быть реализован с помощью простого кода, но для сложных решений часто лучше использовать готовые библиотеки или плагины. Следуя приведённым выше рекомендациям, вы сможете наладить эффективный и надежный процесс экспорта данных в Excel в вашей системе на WordPress.