You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在WooCommerce后台订单列表显示预订起止日期的实现问题

WooCommerce后台订单页面添加预订日期列问题

问题背景

查过Stack Overflow上5篇相关帖子,尝试修改代码实现需求,部分方案看似可行但均未达到预期效果,决定从头开发。

需求

  • 在WooCommerce订单页面添加自定义列
  • 访问mywebsite.com/wp-admin/edit.php?post_type=shop_order时能看到该日期列
  • 列中显示预订开始日期和结束日期
  • 每个订单仅对应一个预订

当前进度

已完成添加列的代码,但无法正确填充预订日期:

// Add custom column to WooCommerce admin orders page
function custom_add_booking_dates_column($columns) {
    // Add the custom column after the "Order Actions" column
    $columns['booking_dates'] = __('Booking Dates', 'text-domain');
    return $columns;
}
add_filter('manage_edit-shop_order_columns', 'custom_add_booking_dates_column');

// Populate the custom column with "Testing" text
function custom_populate_booking_dates_column($column) {
    global $post;
    
    if ($column === 'booking_dates') {
        // Output the text you want to display in the custom column
        echo 'Testing';
    }
}
add_action('manage_shop_order_posts_custom_column', 'custom_populate_booking_dates_column');

已尝试操作

  • 修改wp-config文件增加内存
  • 开启调试模式解决wc_booking_order_has_bookings报错
  • 在子主题函数中加载WooCommerce和WooCommerce Bookings
  • 将插件部分文件复制到子主题并编辑/woocommerce-bookings/order/admin/booking-display.php和booking-summary-list.php文件
  • 让GPT分析Stack Overflow上的代码示例并生成函数,但均无效

尝试过的其他代码

// Add custom column to WooCommerce admin orders page
function custom_add_booking_dates_column($columns) {
    // Add the custom column after the 'order_actions' column
    $columns['booking_dates'] = __('Booking Dates', 'text-domain');
    return $columns;
}
add_filter('manage_edit-shop_order_columns', 'custom_add_booking_dates_column');

// Populate the custom column with data
function custom_booking_dates_column_content($column, $post_id) {
    if ($column == 'booking_dates') {
        // Retrieve booking dates for the order (replace this with your own logic)
        $booking_dates = get_post_meta($post_id, '_booking_dates', true);

        // Display the booking dates
        echo esc_html($booking_dates);
    }
}
add_action('manage_shop_order_posts_custom_column', 'custom_booking_dates_column_content', 10, 2);



add_action('after_setup_theme', 'child_theme_setup');

function child_theme_setup() {
    // Load WooCommerce
    add_theme_support('woocommerce');
    
    // Load WooCommerce Bookings
    add_theme_support('woocommerce-bookings');
}



// Add custom column to WooCommerce admin orders page
function add_custom_column_to_orders_page($columns) {
    // Add a new column called "Booking Dates" after the "Order Total" column
    $columns['booking_dates'] = __('Booking Dates', 'text-domain');
    return $columns;
}
add_filter('manage_edit-shop_order_columns', 'add_custom_column_to_orders_page', 20);

// Populate custom column with Booking Start and Booking End dates
function populate_custom_column_content($column) {
    global $post, $the_order;

    if ($column === 'booking_dates') {
        $order_id = $post->ID;

        // Check if the order has booking data
        if (wc_booking_order_has_bookings($order_id)) {
            $booking_data = wc_get_order($order_id)->get_items('booking');
            
            // Loop through each booking item (there may be multiple bookings in one order)
            foreach ($booking_data as $item_id => $booking_item) {
                $booking_start = date_i18n(wc_date_format(), strtotime($booking_item['Start']));
                $booking_end = date_i18n(wc_date_format(), strtotime($booking_item['End']));

                // Display Booking Start and End dates for each booking
                echo '<strong>' . __('Booking #', 'text-domain') . $booking_item['Booking ID'] . '</strong><br>';
                echo __('Start Date:', 'text-domain') . ' ' . esc_html($booking_start) . '<br>';
                echo __('End Date:', 'text-domain') . ' ' . esc_html($booking_end) . '<br>';
            }
        } else {
            echo __('No booking data', 'text-domain');
        }
    }
}
add_action('manage_shop_order_posts_custom_column', 'populate_custom_column_content');

解决方案

以下代码可正确实现需求,适配WooCommerce Bookings插件,确保精准获取并显示预订日期:

// 添加自定义列到WooCommerce后台订单页面(指定位置)
function custom_add_booking_dates_column($columns) {
    $new_columns = [];
    foreach ($columns as $key => $label) {
        $new_columns[$key] = $label;
        // 在"订单操作"列后插入自定义列
        if ($key === 'order_actions') {
            $new_columns['booking_dates'] = __('预订日期', 'text-domain');
        }
    }
    return $new_columns;
}
add_filter('manage_edit-shop_order_columns', 'custom_add_booking_dates_column');

// 填充自定义列的预订日期内容
function custom_populate_booking_dates_column($column, $post_id) {
    if ($column !== 'booking_dates') return;

    // 检查WooCommerce Bookings功能是否加载
    if (!function_exists('wc_booking_order_has_bookings')) {
        echo __('预订功能未启用', 'text-domain');
        return;
    }

    // 验证订单是否关联预订
    if (!wc_booking_order_has_bookings($post_id)) {
        echo __('无预订数据', 'text-domain');
        return;
    }

    $order = wc_get_order($post_id);
    $booking_items = $order->get_items('booking');
    
    // 取第一个预订(符合每个订单仅一个预订的需求)
    $booking_item = reset($booking_items);
    if (!$booking_item) {
        echo __('无预订数据', 'text-domain');
        return;
    }

    // 获取预订实例
    $booking_id = $booking_item->get_meta('_booking_id');
    $booking = new WC_Booking($booking_id);
    
    // 格式化并显示日期
    $start_date = date_i18n(wc_date_format() . ' ' . wc_time_format(), $booking->get_start());
    $end_date = date_i18n(wc_date_format() . ' ' . wc_time_format(), $booking->get_end());
    
    echo sprintf('%s: %s<br>%s: %s', __('开始', 'text-domain'), esc_html($start_date), __('结束', 'text-domain'), esc_html($end_date));
}
add_action('manage_shop_order_posts_custom_column', 'custom_populate_booking_dates_column', 10, 2);

关键优化点

  1. 列位置精准控制:通过遍历原列数组,确保自定义列插入到指定位置,避免布局混乱。
  2. 依赖检查:先验证预订功能函数是否存在,防止插件未加载导致的PHP错误。
  3. 正确获取预订数据:使用WC_Booking类直接获取预订对象,而非从订单项元数据中读取,确保数据准确性。
  4. 适配站点格式:使用WooCommerce内置的日期时间格式化函数,保证显示格式与站点设置一致。

内容的提问来源于stack exchange,提问作者Uncle Iroh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 03:02:31