我编写了一段代码,在 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
}
}
我不明白,如何从项目元订单字段创建可排序列。我希望有人有想法。
谢谢你。我尝试编写代码来将项目元数据保存到订单元。但这不起作用。我的代码有什么问题吗?
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();
}
}}