使用可在 WooCommerce 订单列表 (HPOS) 中排序的订单项目元数据创建自定义列

问题描述 投票:0回答:1

我编写了一段代码,在 WooCommerce 的管理订单列表中添加项目元字段。

但我无法处理它来创建可排序的列。

代码:

function display_wc_order_list_custom_column_content( $column, $order ){
    switch ( $column ) {
        case 'my-column2' :
            // Get custom order metadata
            if ( ! empty($order) ) {
                foreach ( $order->get_items() as $item_id => $item ) {
                    if (! empty($item->get_meta('wcrp_rental_products_rent_from'))) {
                        // Using WC_Data method get_meta() since WooCommerce 3
                        //echo $item->get_meta('wcrp_rental_products_rent_from');
                        $fulfilment_date = date_i18n( 'd. M Y', strtotime( $item->get_meta('wcrp_rental_products_rent_from') ) );
                        echo $fulfilment_date;
                    }
                }
            }
            // For testing (to be removed) - Empty value case
            else {
                echo '<small>(<em>no value</em>)</small>';
            }
            break;
    }
}

我可以向我的列添加可排序功能:

add_filter( 'manage_woocommerce_page_wc-orders_sortable_columns', 'rudr_sortable_column' );
function rudr_sortable_column( $columns ) {
    $columns['my-column2'] = 'eventdate';
    return $columns;
}

但我不明白如何使其可排序。

如果我查看 WooCommerce 代码,我会在 woocommerce/includes/admin/list-tables/class-wc-admin-list-table-orders.php 第 587 行找到此片段的一些提示

// Sorting.
if ( isset( $query_vars['orderby'] ) ) {
    if ( 'order_total' === $query_vars['orderby'] ) {
        // @codingStandardsIgnoreStart
        $query_vars = array_merge( $query_vars, array(
            'meta_key'  => '_order_total',
            'orderby'   => 'meta_value_num',
        ) );
        // @codingStandardsIgnoreEnd
    }
}

我不明白,如何从项目元订单字段创建可排序列。我希望有人有想法。

php sorting woocommerce admin orders
1个回答
0
投票

谢谢你。我尝试编写代码来将项目元数据保存到订单元。但这不起作用。我的代码有什么问题吗?

add_action( 'woocommerce_checkout_update_order_meta', 'save_item_meta_to_order_meta' );

function save_item_meta_to_order_meta( $order_id ) {
if ( ! $order_id ) {
    return;
}

// Get the order object
$order = wc_get_order( $order_id );

// Check if order has items
if ( ! empty($order) ) {

    // Initialize an array to store item metadata
    $item_meta_values = array();

    foreach ( $order->get_items() as $item_id => $item ) {

        // Get the item metadata you're interested in
        //$item_meta = wc_get_order_item_meta( $item_id, 'wcrp_rental_products_rent_from', true );
                    $item_meta = $item->get_meta('wcrp_rental_products_rent_from');

        // Add the item metadata to the array if it's not empty
        if ( ! empty( $item_meta ) ) {
            $item_meta_values[] = $item_meta;
        }
    }

    // Check if there is any item metadata collected
    if ( ! empty( $item_meta_values ) ) {
        // Save the item metadata array to the order metadata
        //update_post_meta( $order_id, 'custom_event_date', $item_meta_values );
                    $order = wc_get_order( $order_id );
                    $order->add_meta_data( 'custom_event_date', $item_meta_values, false );
                    $order->save_meta_data();
    }
}}
© www.soinside.com 2019 - 2024. All rights reserved.