| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150 |
- <?php
- /**
- * Handles Batch CSV export.
- *
- * Based on https://pippinsplugins.com/batch-processing-for-big-data/
- *
- * @package WooCommerce/Export
- * @version 3.1.0
- */
- if ( ! defined( 'ABSPATH' ) ) {
- exit;
- }
- /**
- * Include dependencies.
- */
- if ( ! class_exists( 'WC_CSV_Exporter', false ) ) {
- require_once WC_ABSPATH . 'includes/export/abstract-wc-csv-exporter.php';
- }
- /**
- * WC_CSV_Exporter Class.
- */
- abstract class WC_CSV_Batch_Exporter extends WC_CSV_Exporter {
- /**
- * Page being exported
- *
- * @var integer
- */
- protected $page = 1;
- /**
- * Constructor.
- */
- public function __construct() {
- $this->column_names = $this->get_default_column_names();
- }
- /**
- * Get file path to export to.
- *
- * @return string
- */
- protected function get_file_path() {
- $upload_dir = wp_upload_dir();
- return trailingslashit( $upload_dir['basedir'] ) . $this->get_filename();
- }
- /**
- * Get the file contents.
- *
- * @since 3.1.0
- * @return string
- */
- public function get_file() {
- $file = '';
- if ( @file_exists( $this->get_file_path() ) ) { // phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged
- $file = @file_get_contents( $this->get_file_path() ); // phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged, WordPress.WP.AlternativeFunctions.file_get_contents_file_get_contents, WordPress.WP.AlternativeFunctions.file_system_read_file_get_contents
- } else {
- @file_put_contents( $this->get_file_path(), '' ); // phpcs:ignore WordPress.VIP.FileSystemWritesDisallow.file_ops_file_put_contents, Generic.PHP.NoSilencedErrors.Discouraged, WordPress.WP.AlternativeFunctions.file_system_read_file_put_contents
- @chmod( $this->get_file_path(), 0664 ); // phpcs:ignore WordPress.VIP.FileSystemWritesDisallow.chmod_chmod, WordPress.WP.AlternativeFunctions.file_system_read_file_put_contents, Generic.PHP.NoSilencedErrors.Discouraged
- }
- return $file;
- }
- /**
- * Serve the file and remove once sent to the client.
- *
- * @since 3.1.0
- */
- public function export() {
- $this->send_headers();
- $this->send_content( $this->get_file() );
- @unlink( $this->get_file_path() ); // phpcs:ignore WordPress.VIP.FileSystemWritesDisallow.file_ops_unlink, Generic.PHP.NoSilencedErrors.Discouraged
- die();
- }
- /**
- * Generate the CSV file.
- *
- * @since 3.1.0
- */
- public function generate_file() {
- if ( 1 === $this->get_page() ) {
- @unlink( $this->get_file_path() ); // phpcs:ignore WordPress.VIP.FileSystemWritesDisallow.file_ops_unlink, Generic.PHP.NoSilencedErrors.Discouraged,
- }
- $this->prepare_data_to_export();
- $this->write_csv_data( $this->get_csv_data() );
- }
- /**
- * Write data to the file.
- *
- * @since 3.1.0
- * @param string $data Data.
- */
- protected function write_csv_data( $data ) {
- $file = $this->get_file();
- // Add columns when finished.
- if ( 100 === $this->get_percent_complete() ) {
- $file = chr( 239 ) . chr( 187 ) . chr( 191 ) . $this->export_column_headers() . $file;
- }
- $file .= $data;
- @file_put_contents( $this->get_file_path(), $file ); // phpcs:ignore WordPress.VIP.FileSystemWritesDisallow.file_ops_file_put_contents, Generic.PHP.NoSilencedErrors.Discouraged, WordPress.WP.AlternativeFunctions.file_system_read_file_put_contents
- }
- /**
- * Get page.
- *
- * @since 3.1.0
- * @return int
- */
- public function get_page() {
- return $this->page;
- }
- /**
- * Set page.
- *
- * @since 3.1.0
- * @param int $page Page Nr.
- */
- public function set_page( $page ) {
- $this->page = absint( $page );
- }
- /**
- * Get count of records exported.
- *
- * @since 3.1.0
- * @return int
- */
- public function get_total_exported() {
- return ( ( $this->get_page() - 1 ) * $this->get_limit() ) + $this->exported_row_count;
- }
- /**
- * Get total % complete.
- *
- * @since 3.1.0
- * @return int
- */
- public function get_percent_complete() {
- return $this->total_rows ? floor( ( $this->get_total_exported() / $this->total_rows ) * 100 ) : 100;
- }
- }
|