Skip to content

Instantly share code, notes, and snippets.

@tamarazuk
Last active August 31, 2018 04:42
Show Gist options
  • Star 8 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save tamarazuk/46e66064a40c4a611397 to your computer and use it in GitHub Desktop.
Save tamarazuk/46e66064a40c4a611397 to your computer and use it in GitHub Desktop.
Customer/Order CSV Export: Separate item meta into multiple columns in the Default – One Row per Item format
<?php // only copy this line if needed
/**
* The use of this snippet requires at least WooCommerce 3.2
*/
/**
* Alter the column headers for the orders CSV to split item_meta into separate columns
*
* Note that this change is only applied to the Default - One Row per Item format
*
* @param array $column_headers {
* column headers in key => name format
* to modify the column headers, ensure the keys match these and set your own values
* }
* @param WC_Customer_Order_CSV_Export_Generator $csv_generator, generator instance
* @return array column headers in column_key => column_name format
*/
function sv_wc_csv_export_order_headers_split_item_meta( $column_headers, $csv_generator ) {
if ( sv_wc_csv_export_is_one_row( $csv_generator ) ) {
// remove item_meta column
unset( $column_headers['item_meta'] );
$item_meta_headers = array();
// loop over order ids
foreach ( $csv_generator->ids as $order_id ) {
$order = wc_get_order( $order_id );
// get line items
foreach ( $order->get_items() as $item ) {
// get item meta
foreach ( $item->get_formatted_meta_data() as $meta_id => $meta ) {
$item_meta_headers[ $meta->key ] = 'item_meta: ' . $meta->key;
}
}
}
$column_headers = sv_wc_array_insert_after( $column_headers, 'item_total', $item_meta_headers );
}
return $column_headers;
}
add_filter( 'wc_customer_order_csv_export_order_headers', 'sv_wc_csv_export_order_headers_split_item_meta', 10, 2 );
/**
* CSV Order Export Row for One Row per Item.
*
* Filter the individual row data for the order export to add data for each item meta key
*
* @param array $order_data {
* order data in key => value format
* to modify the row data, ensure the key matches any of the header keys and set your own value
* }
* @return array the modified order data
*/
function sv_wc_csv_export_order_row_one_row_per_item_split_item_meta( $order_data ) {
$item = new WC_Order_Item_Product( $order_data['item_id'] );
foreach ( $item->get_formatted_meta_data() as $meta_id => $meta ) {
$order_data[ $meta->key ] = $meta->value;
}
return $order_data;
}
add_filter( 'wc_customer_order_csv_export_order_row_one_row_per_item', 'sv_wc_csv_export_order_row_one_row_per_item_split_item_meta', 10 );
/** Helper Functions **********************************************************/
if ( ! function_exists( 'sv_wc_array_insert_after' ) ) :
/**
* Insert the given element after the given key in the array
*
* @param array $array array to insert the given element into
* @param string $insert_key key to insert given element after
* @param array $element element to insert into array
* @return array
*/
function sv_wc_array_insert_after( Array $array, $insert_key, Array $element ) {
$new_array = array();
foreach ( $array as $key => $value ) {
$new_array[ $key ] = $value;
if ( $insert_key == $key ) {
foreach ( $element as $k => $v ) {
$new_array[ $k ] = $v;
}
}
}
return $new_array;
}
endif;
if ( ! function_exists( 'sv_wc_csv_export_is_one_row' ) ) :
/**
* Helper function to check the export format
*
* @param \WC_Customer_Order_CSV_Export_Generator $csv_generator the generator instance
* @return bool - true if this is a one row per item format
*/
function sv_wc_csv_export_is_one_row( $csv_generator ) {
$one_row_per_item = false;
if ( version_compare( wc_customer_order_csv_export()->get_version(), '4.0.0', '<' ) ) {
// pre 4.0 compatibility
$one_row_per_item = ( 'default_one_row_per_item' === $csv_generator->order_format || 'legacy_one_row_per_item' === $csv_generator->order_format );
} elseif ( isset( $csv_generator->format_definition ) ) {
// post 4.0 (requires 4.0.3+)
$one_row_per_item = 'item' === $csv_generator->format_definition['row_type'];
}
return $one_row_per_item;
}
endif;
@plastisound
Copy link

almost all my fields are empty!!! but I have a lot of attributes!!! any reason?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment