为了账号安全,请及时绑定邮箱和手机立即绑定

WooCommerce 订单导出:获取每个行项目的自定义数据

WooCommerce 订单导出:获取每个行项目的自定义数据

PHP
撒科打诨 2023-11-03 15:21:33
我正在使用“WooCommerce 客户/订单/优惠券导出”插件将我的订单导出为 CSV 文件。我正在以每项一行的格式导出订单。这意味着每个订单都有多行。每个订单项目一行。现在我想向每个行项目添加一些额外的数据。例如该项目的作者(在我们的例子中是供应商)。我找到了一种向导出添加额外数据的好方法。它可以在插件的文档中找到:https://docs.woocommerce.com/document/ordercustomer-csv-export-developer-documentation/#section-14它有效,但并不完全是我所需要的。我可以向整个订单添加一些数据。因此每个行项目都会获得相同的数据。所以我尝试更改代码并检查每个行项目。不幸的是,结果相同。每个行项目都获取相同的数据。就我而言,是订单最后一项的数据。以下是我如何更改官方文档中示例的第 2 步:function sv_wc_csv_export_modify_row_data_example( $order_data, $order, $csv_generator ) {        // Example showing how to extract order metadata into it's own column        //$meta_key_example = is_callable( array( $order, 'get_meta' ) ) ? $order->get_meta( 'meta_key_example' ) : $order->meta_key_example;        //$meta_key_example = is_callable( array( $order, 'get_meta' ) ) ? $order->get_meta( 'meta_key_example' ) : $order->meta_key_example;        // Loop through order line items        $allItems = $order->get_items();        foreach( $allItems as $item_line ){            $item_vendor_id     = get_post_field( 'post_author', $item_line->get_product_id() );            $custom_data = array(                // User/Vendor                'item_vendor_id'            => $item_vendor_id,                'vendor_username'           => get_the_author_meta( 'username', $item_vendor_id ),                'vendor_user_email'         => get_the_author_meta( 'user_email', $item_vendor_id ),                );        }        return sv_wc_csv_export_add_custom_order_data( $order_data, $custom_data, $csv_generator );}我猜我在错误的位置添加了数据?!但我无法弄清楚问题出在哪里。
查看完整描述

1 回答

?
鸿蒙传说

TA贡献1865条经验 获得超7个赞

我找到了答案。这是隐藏在官方文档中的一个示例:https ://github.com/skyverge/wc-plugins-snippets/blob/master/woocommerce-customer-order-coupon-export/csv/add-item-meta-to-订单导出.php

/**

 * Add line item meta to the Order CSV Export in Default format

 * Example: add weight to the item meta data

 */



/**

 * Step 1. Add weight to line item data

 *

 * @param array $line_item the original line item data

 * @param array $item the item's order data

 * @param object $product the \WC_Product object for the line

 * @param object $order the \WC_Order object being exported

 * @return array the updated line item data

 */

function sv_wc_csv_export_add_weight_to_line_item( $line_item, $item, $product, $order ) {


    $new_item_data = array();


    foreach ( $line_item as $key => $data ) {


        $new_item_data[ $key ] = $data;


        if ( 'sku' === $key && $product ) {

            $new_item_data['weight'] = wc_format_decimal( $product->get_weight(), 2 );

        }

    }


    return $new_item_data;

}

add_filter( 'wc_customer_order_export_csv_order_line_item', 'sv_wc_csv_export_add_weight_to_line_item', 10, 4 );



/**

 * (optional) Step 2. Add a separate `item_weight` column to the default and custom formats

 *

 * @param array $column_headers the original column headers

 * @param \CSV_Export_Generator $csv_generator the generator instance

 * @return array - the updated column headers

 */

function sv_wc_csv_export_modify_column_headers_item_price( $column_headers, $csv_generator ) {


    $new_headers = array();


    if ( sv_wc_csv_export_is_one_row( $csv_generator ) ) {


        foreach( $column_headers as $key => $column ) {


            $new_headers[ $key ] = $column;


            // add the item_price after the SKU column

            if ( 'item_sku' === $key ) {

                $new_headers['item_weight'] = 'item_weight';

            }

        }


    } else {


        return $column_headers;

    }


    return $new_headers;

}

add_filter( 'wc_customer_order_export_csv_order_headers', 'sv_wc_csv_export_modify_column_headers_item_price', 10, 2 );



/**

 * (optional) Step 3. Add the item weight data (step 1) to the new item_weight column (step 2)

 * for the Default - One Row per Item format

 *

 * @param array $order_data the original order data

 * @param array $item       the item for this row

 * @return array - the updated order data

 */

function sv_wc_csv_export_order_row_one_row_per_item_weight( $order_data, $item ) {


    $order_data['item_weight'] = $item['weight'];

    return $order_data;

}

add_filter( 'wc_customer_order_export_csv_order_row_one_row_per_item', 'sv_wc_csv_export_order_row_one_row_per_item_weight', 10, 2 );



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;


查看完整回答
反对 回复 2023-11-03
  • 1 回答
  • 0 关注
  • 79 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信