-
-
Save tamarazuk/46e66064a40c4a611397 to your computer and use it in GitHub Desktop.
<?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; |
Sorry everyone, GitHub doesn't notify people about comments on gists. I have updated this to work with the latest Customer/Order/Coupon CSV Export version and WooCommerce 3.2
THANK YOU THANK YOU THANK YOU!
This only sort of works for me. It does separate the item_meta into separate columns but it creates a whole new set of columns for every order instead of just using one set of item_meta columns for all the orders. This results in so many columns that my spreadsheet software can't even create enough columns to import the CSV (Apple Numbers seems to be limited to 255 columns)
Replying to my post above... Tamara fixed this an updated the GIST. The issue was that the array keys being generated for the injected data were just too specific. Removing the meta_id from lines 37 and 67 fixed it!
almost all my fields are empty!!! but I have a lot of attributes!!! any reason?
really need this has anyone got this working