在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);
关键优化点
- 列位置精准控制:通过遍历原列数组,确保自定义列插入到指定位置,避免布局混乱。
- 依赖检查:先验证预订功能函数是否存在,防止插件未加载导致的PHP错误。
- 正确获取预订数据:使用
WC_Booking类直接获取预订对象,而非从订单项元数据中读取,确保数据准确性。 - 适配站点格式:使用WooCommerce内置的日期时间格式化函数,保证显示格式与站点设置一致。
内容的提问来源于stack exchange,提问作者Uncle Iroh
相关产品推荐
相关产品推荐

