Экспорт данных в CSV или XLSX файл на WordPress

С момента своего появления, WordPress уже давно вырос из блог-платформы в полноценную CMS, которую можно использовать в проектах различной сложности. Вы можете создать практически что угодно: интернет-магазин, или форум с базой участников и много чего интересного.

Когда база разрастается может понадобиться её выгрузка. Сегодня мы рассмотрим, как реализовать экспорт данных в два популярных формата: csv и excel.

Для справки: CSV — обычный текстовый формат с серией значений, разделенных символами, в то время как Excel — двоичный файл, содержащий информацию обо всех листах в рабочей книге. Но их цель одинаковая: представление данных в виде таблицы.

Экспорт данных в csv

Первый шаг: мы просто добавляем синюю кнопку экспорта. При нажатии вызовет функцию codyshop_export_csv(), и затем загрузит .csv файл с указанными нами данными.

Кнопки экспорта над и под списком пользователей

Чтобы разместить её там где вы видите на скриншоте, в WordPress не предусмотрено подходящих хуков. Поэтому делаем через jQuery.

add_action( 'admin_footer', 'codyshop_add_export_button' );
function codyshop_add_export_button() {
	// Только на странице пользователей
	if ( get_current_screen()->id != 'users' ) return;
	?>
	<script type="text/javascript">
		jQuery(document).ready( function($) {
			$('.tablenav.top .clear, .tablenav.bottom .clear')
				.before('<form action="#" method="POST"><input type="hidden" name="mytheme_export_csv" value="1" /><input class="button button-primary" type="submit" value="<?php esc_attr_e( 'Экспорт в CSV', 'mytheme');?>" /></form>');
		});
	</script>
	<?php
}

Обратите внимание на 4 строку. Мы можем контролировать расположение кнопки, указав $screen->id. Вот небольшой список возможных вариантов:

  • users — добавление кнопки на странице редактирования пользователей
  • edit — добавление кнопки на странице редактирования записей
  • edit-page — добавление кнопки на странице редактирования страниц
  • edit-post_type— добавление кнопки на странице редактирования записей произвольного типа, где post_type — это название вашего типа записи

Другими словами, мы можем для разных страниц выводить разные кнопки.

Второй шаг — обработчик формы.

add_action( 'admin_init', 'codyshop_export_csv' );
function codyshop_export_csv() {

	if ( !current_user_can( 'manage_options' ) ) return;

	if ( isset( $_POST['mytheme_export_csv'] ) && !empty( $_POST['mytheme_export_csv'] ) ) {

		header( 'Content-Type: application/force-download' );
		header( 'Content-Type: application/octet-stream' );
		header( 'Content-Type: application/download' );
		header( 'Content-Disposition: inline; filename="users-' . date( 'd-m-Y His' ) . '.csv"' );
		echo "\xEF\xBB\xBF"; // UTF-8 BOM для правильной кодировки кириллицы

		// The User Query
		$blogusers = get_users( [
			'order'   => 'ASC',
			'orderby' => 'display_name',
			'fields'  => 'all',
		] );
		if ( $blogusers ) {
			foreach ( $blogusers as $bloguser ) {
				$user = [
					$bloguser->display_name,
					$bloguser->user_email,
				];
				echo implode( ';', $user )  . "\r\n";
			}
			exit();
		}
	}
}

Прелесть CSV в том, что он легко открывается в Excel, и, как правило, не требует дополнительной обработки.

Универсальность и простота данной технологии имеет свои недостатки. Основной из них — не единый во всех системах специальный символ-разделитель. При экспорте одни системы, работающие с таблицами, могут не воспринять точку с запятой и воспринять просто запятую.

Другой недостаток: в коде csv-файла нельзя использовать текст, разделенный на несколько строк. При преобразовании его, к примеру, в xls-формат, эта ячейка разделится на две строки.

Экспорт данных в таблицы Excel

Чтобы иметь возможность экспорта данные в таблицы Excel, нам понадобится внешняя php библиотека для преобразования в xlsx формат. Одна из таких — PHPExcel. Исходный код этой библиотеки можно скачать здесь. Загрузите библиотеку и распакуйте zip-файл, а затем поместите содержимое папки  темы или плагина. Zip содержит документацию, а также примеры использования класса, поэтому, чтобы увидеть все возможности библиотеки рекомендую вам немного с ней ознакомиться.

В нашем примере мы рассмотрим, как выгрузить список пользователей. Итак, код для экспорта в нашем случае будет выглядеть примерно так:

add_action( 'admin_init', 'codyshop_export_xlsx' );
function codyshop_export_xlsx() {
	
	if ( !current_user_can( 'manage_options' ) ) return;
	
	if ( isset( $_POST['mytheme_export_csv'] ) && !empty( $_POST['mytheme_export_csv'] ) ) {
 
		/** PHPExcel */
		include 'PHPExcel.php';

		/** PHPExcel_Writer_Excel2007 */
		include 'PHPExcel/Writer/Excel2007.php';

		// Create new PHPExcel object
		$objPHPExcel = new PHPExcel();

		// Set properties
		$objPHPExcel->getProperties()->setTitle( esc_html__( 'Test xlsx document', 'mytheme' ) );
		$objPHPExcel->getProperties()->setSubject( esc_html__( 'Test xlsx document', 'mytheme' ) );
		$objPHPExcel->getProperties()->setDescription( esc_html__( 'Test export users document for XLSX, generated using PHP classes.', 'mytheme' ) );

		// WP_User_Query arguments
		$blogusers = get_users( [
			'order'   => 'ASC',
			'orderby' => 'display_name',
			'fields'  => 'all',
		] );
		$cell_counter = 1;

		//Set up the labels of the columns
		$objPHPExcel->getActiveSheet()->SetCellValue( 'A1', esc_html__( 'First Name', 'mytheme' ) );
		$objPHPExcel->getActiveSheet()->SetCellValue( 'B1', esc_html__( 'Last Name', 'mytheme' ) );
		$objPHPExcel->getActiveSheet()->SetCellValue( 'C1', esc_html__( 'Email', 'mytheme' ) );
		$objPHPExcel->getActiveSheet()->SetCellValue( 'D1', esc_html__( 'User Role', 'mytheme' ) );

		foreach( $blogusers as $user ) {
			$cell_counter++;

			$meta  = get_user_meta($user->ID);
			$role  = $user->roles;
			$email = $user->user_email;

			$first_name = ( isset($meta['first_name'][0]) && $meta['first_name'][0] != '' ) ? $meta['first_name'][0] : '' ;
			$last_name  = ( isset($meta['last_name'][0]) && $meta['last_name'][0] != '' ) ? $meta['last_name'][0] : '' ;

			// Add data
			$objPHPExcel->setActiveSheetIndex(0);
			$objPHPExcel->getActiveSheet()->SetCellValue( 'A' . $cell_counter, $first_name );
			$objPHPExcel->getActiveSheet()->SetCellValue( 'B' . $cell_counter , $last_name );
			$objPHPExcel->getActiveSheet()->SetCellValue( 'C' . $cell_counter, $email );
			$objPHPExcel->getActiveSheet()->SetCellValue( 'D' . $cell_counter, ucfirst( $role[0] ) );

		}

		// Set column data auto width
		for( $col = 'A'; $col !== 'E'; $col++ ) {
			$objPHPExcel->getActiveSheet()->getColumnDimension( $col )->setAutoSize( true );
		}

		// Rename sheet
		$objPHPExcel->getActiveSheet()->setTitle( esc_html__( 'Users', 'mytheme' ) );

		header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
		header('Content-Disposition: attachment;filename="users.xlsx"');
		header('Cache-Control: max-age=0');

		// Save Excel file
		$objWriter = new PHPExcel_Writer_Excel2007( $objPHPExcel );
		$objWriter = PHPExcel_IOFactory::createWriter( $objPHPExcel, 'Excel2007' );
		$objWriter->save( 'php://output' );

		exit();
	}
}

Обычно, код не вызывает особых сложностей. Главное, правильно прописать пути к php библиотеке. Если вы зайдете в административную часть на страницу редактирования пользователей, вы увидите в верхней панели кнопку для экспорта.

Теперь, когда нажмете кнопку экспорта, вы загрузите users.xlsx файл со всеми пользователями в соответствующих ячейках. Всё аккуратно и легко редактировать! Такой файл гораздо легче подвергнуть постобработке, чем данные в формате csv, где значения разделяются запятыми.

Готовые альтернативы

Если вы не хотите связываться с программным кодом, у вас всегда есть альтернатива: воспользуйтесь плагином Export WordPress data to XML/CSV, который имеет массу настроек в использования.

Ну, а если вам нужно что-то простое, или если вы хотите реализовать возможность экспорта данных в ваш плагин, приведенный выше код (с некоторыми изменениями) станет отличной основой для ваших разработок.

Категории
0 комментариев
Добавить комментарий

Scroll Down
Fb. — Tw. — Vk.