在 Woocommerce 管理订单列表中显示预订日期时间 [英] Display bookings date time in Woocommerce admin order list

查看:45
本文介绍了在 Woocommerce 管理订单列表中显示预订日期时间的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在 Woocommerce with Woocommerce Bookings 中,我在 WooCommerce 订单预览中添加了以下预订详细信息,在每个订单项下方:

function get_booking_id_from_order_item( $item_id ) {全球 $wpdb;return (int) $wpdb->get_var( $wpdb->prepare("SELECT post_id FROM {$wpdb->prefix}postmeta WHERE meta_key = '_booking_order_item_id' AND meta_value = %d", $item_id ) );}add_filter('woocommerce_admin_order_preview_line_item_columns', 'filter_admin_order_preview_line_item_columns', 10, 2 );函数 filter_admin_order_preview_line_item_columns( $columns, $order ) {$first_column = $columns['product'];未设置($columns['product']);return array_merge( array('product2' => $first_column ), $columns );}add_filter('woocommerce_admin_order_preview_line_item_column_product2', 'filter_admin_order_preview_line_item_column_product2', 10, 4 );函数 filter_admin_order_preview_line_item_column_product2( $html, $item, $item_id, $order ) {$product = is_callable( array( $item, 'get_product' ) ) ?$item->get_product() : null;$html .= wp_kses_post( $item->get_name() );如果($产品){$html .='

'.esc_html( $product->get_sku() ) .'</div>';}如果 ( $booking_id = get_booking_id_from_order_item( $item_id ) ) :$booking = get_wc_booking( $booking_id );$date_format = wc_date_format();$date_format .= ' ' .wc_time_format();//==>如果预订开始日期格式不需要时间,请注释此行ob_start();//开始缓冲?><div class="wc-booking-summary"><strong class="wc-booking-summary-number"><?php printf( __( 'Booking #%d', 'woocommerce-bookings' ), $booking_id );?><span class="status-<?php echo $booking->get_status();?>>><?php echo ucfirst( $booking->get_status() );?></span><div class="wc-booking-summary-list"><li><?php echo esc_html( apply_filters( 'wc_bookings_summary_list_date', date_i18n( $date_format, $booking->get_start() ), $booking->get_start(), $booking->get_end() );如果 ( wc_should_convert_timezone( $booking ) ) :/* 翻译器:%s:时区名称 */echo esc_html( sprintf( __( 'in timezone: %s', 'woocommerce-bookings' ), $booking->get_local_timezone() );万一;?><?php if ( $resource = $booking->get_resource() ) : ?><li><?php$label = method_exists( $resource, 'get_label' ) ?$resource->get_label() : __('Resource', 'woocommerce-bookings');/* 翻译器:1:标签 2:资源名称 */echo esc_html( sprintf( __( '%1$s: %2$s', 'woocommerce-bookings' ), $label, $resource->get_name() );?><?php endif;如果 ( $product && $product->has_persons() ) {如果 ( $product->has_person_types() ) {$person_types = $product->get_person_types();$person_counts = $booking->get_person_counts();如果(!空($person_types)&&is_array($person_types)){foreach ( $person_types as $person_type ) {如果(空($person_counts[$person_type->get_id()])){继续;}?><li><?php echo esc_html( sprintf( '%s: %d', $person_type->get_name(), $person_counts[ $person_type->get_id() ] );?></li><?php}}} 别的 {?><li><?php/* 翻译:1:人数 */echo esc_html( sprintf( __( '%d Persons', 'woocommerce-bookings' ), array_sum( $booking->get_person_counts() ) );?><?php}}?>

<?php$html .= ob_get_clean();//设置回缓冲的内容万一;$meta_data = $item->get_formatted_meta_data('');如果($meta_data){$html .='

';foreach ( $meta_data as $meta_id => $meta ) {if ( in_array( $meta->key, $hidden_​​order_itemmeta, true ) ) {继续;}$html .='
'.wp_kses_post( $meta->display_key ) .':</th><td>'.wp_kses_post( force_balance_tags( $meta->display_value ) ) .'</td></tr>';}$html .='
';}返回 $html;}

如何在 woocommerce 管理订单列表中的 billing_address 列下显示预订日期和时间(不是订单日期和时间)?

感谢任何帮助.

解决方案

您可以使用以下内容在 woocommerce 管理订单列表中的 billing_address 列下显示预订日期和时间:

add_action( 'manage_shop_order_posts_custom_column', 'display_bookings_datetime_orders_admin_list', 20, 2 );函数 display_bookings_datetime_orders_admin_list( $column, $post_id ) {if ('billing_address' === $column ) {全球 $post, $the_order;$order = is_a($the_order, 'WC_Order') ?$the_order : wc_get_order( $post->ID );//获取 WC_Order 对象$date_format = wc_date_format();$date_format .= ' ' .wc_time_format();//==>如果预订开始日期格式不需要时间,请注释此行$datetimes = array();//初始化//遍历订单项foreach ( $order->get_items() as $item_id => $item ) {$product = $item->get_product();如果 ( ! $product->is_type('booking') ) {继续;}$booking_ids = WC_Booking_Data_Store::get_booking_ids_from_order_item_id( $item_id );//循环遍历订单中的预订 IDforeach ( $booking_ids 作为 $booking_id ) {$booking = get_wc_booking( $booking_id );$datetimes[] = esc_html( apply_filters( 'wc_bookings_summary_list_date', date_i18n( $date_format, $booking->get_start()), $booking->get_start(), $booking->get_end());}}如果(!空($datetimes)){//输出htmlecho '
  • '.implode('</li><li>', $datetimes) .'</li></ul>';}}}

代码位于活动子主题(或活动主题)的functions.php 文件中.经测试有效.

In Woocommerce with Woocommerce Bookings, I have the following to add the booking details in WooCommerce order preview, below each order item:

function get_booking_id_from_order_item( $item_id ) {
    global $wpdb;
    return (int) $wpdb->get_var( $wpdb->prepare("SELECT post_id FROM {$wpdb->prefix}postmeta WHERE meta_key = '_booking_order_item_id' AND meta_value = %d", $item_id ) );
}

add_filter('woocommerce_admin_order_preview_line_item_columns', 'filter_admin_order_preview_line_item_columns', 10, 2 );
function filter_admin_order_preview_line_item_columns( $columns, $order ) {
    $first_column = $columns['product'];
    unset($columns['product']);

    return array_merge( array('product2' => $first_column ), $columns );
}

add_filter('woocommerce_admin_order_preview_line_item_column_product2', 'filter_admin_order_preview_line_item_column_product2', 10, 4 );
function filter_admin_order_preview_line_item_column_product2( $html, $item, $item_id, $order ) {
    $product = is_callable( array( $item, 'get_product' ) ) ? $item->get_product() : null;

    $html   .= wp_kses_post( $item->get_name() );

    if ( $product ) {
        $html .= '<div class="wc-order-item-sku">' . esc_html( $product->get_sku() ) . '</div>';
    }

    if ( $booking_id = get_booking_id_from_order_item( $item_id ) ) :
    $booking      = get_wc_booking( $booking_id );
    $date_format  = wc_date_format();
    $date_format .= ' ' . wc_time_format(); // ==> Comment this line if time is not needed in bookingstart date format

    ob_start(); // Start buffering
    ?>
    <div class="wc-booking-summary">
        <strong class="wc-booking-summary-number">
        <?php printf( __( 'Booking #%d', 'woocommerce-bookings' ), $booking_id ); ?>
            <span class="status-<?php echo $booking->get_status(); ?>"><?php echo ucfirst( $booking->get_status() ); ?></span>
        </strong>
        <div class="wc-booking-summary-list">
        <li>
        <?php echo esc_html( apply_filters( 'wc_bookings_summary_list_date', date_i18n( $date_format, $booking->get_start() ), $booking->get_start(), $booking->get_end() ) );
        if ( wc_should_convert_timezone( $booking ) ) :
            /* translators: %s: timezone name */
            echo esc_html( sprintf( __( 'in timezone: %s', 'woocommerce-bookings' ), $booking->get_local_timezone() ) );
        endif;
        ?>
        </li>
        <?php if ( $resource = $booking->get_resource() ) : ?>
            <li>
            <?php
            $label = method_exists( $resource, 'get_label' ) ? $resource->get_label() : __('Resource', 'woocommerce-bookings');
            /* translators: 1: label 2: resource name */
            echo esc_html( sprintf( __( '%1$s: %2$s', 'woocommerce-bookings' ), $label, $resource->get_name() ) );
            ?>
            </li>
        <?php endif;

        if ( $product && $product->has_persons() ) {
            if ( $product->has_person_types() ) {
                $person_types  = $product->get_person_types();
                $person_counts = $booking->get_person_counts();

                if ( ! empty( $person_types ) && is_array( $person_types ) ) {
                    foreach ( $person_types as $person_type ) {

                        if ( empty( $person_counts[ $person_type->get_id() ] ) ) {
                            continue;
                        }

                        ?>
                        <li><?php echo esc_html( sprintf( '%s: %d', $person_type->get_name(), $person_counts[ $person_type->get_id() ] ) ); ?></li>
                        <?php
                    }
                }
            } else {
                ?>
                <li>
                <?php
                /* translators: 1: person count */
                echo esc_html( sprintf( __( '%d Persons', 'woocommerce-bookings' ), array_sum( $booking->get_person_counts() ) ) );
                ?>
                </li>
                <?php
            }
        }
        ?>
    </ul>
    </div>
    <?php
    $html .= ob_get_clean(); // Set back buffered content
    endif;

    $meta_data = $item->get_formatted_meta_data( '' );

    if ( $meta_data ) {
        $html .= '<table cellspacing="0" class="wc-order-item-meta">';

        foreach ( $meta_data as $meta_id => $meta ) {
            if ( in_array( $meta->key, $hidden_order_itemmeta, true ) ) {
                continue;
            }
            $html .= '<tr><th>' . wp_kses_post( $meta->display_key ) . ':</th><td>' . wp_kses_post( force_balance_tags( $meta->display_value ) ) . '</td></tr>';
        }
        $html .= '</table>';
    }
    return $html;
}

How to display the booking date and time (not the order date and time) in in the woocommerce admin orders list under the billing_address column?

Any help is appreciated.

解决方案

You can use the following to display the bookings date and time in the woocommerce admin orders list under the billing_address column:

add_action( 'manage_shop_order_posts_custom_column', 'display_bookings_datetime_orders_admin_list', 20, 2 );
function display_bookings_datetime_orders_admin_list( $column, $post_id ) {
    if ( 'billing_address' === $column ) {
        global $post, $the_order;

        $order = is_a($the_order, 'WC_Order') ? $the_order : wc_get_order( $post->ID ); // Get WC_Order Object

        $date_format  = wc_date_format();
        $date_format .= ' ' . wc_time_format(); // ==> Comment this line if time is not needed in booking start date format

        $datetimes    = array(); // Initializing

        // Loop through order items
        foreach ( $order->get_items() as $item_id => $item ) {
            $product = $item->get_product();

            if ( ! $product->is_type('booking') ) {
                continue;
            }
            $booking_ids = WC_Booking_Data_Store::get_booking_ids_from_order_item_id( $item_id );

            // Loop through booking Ids in the order
            foreach ( $booking_ids as $booking_id ) {
                $booking = get_wc_booking( $booking_id );

                $datetimes[] = esc_html( apply_filters( 'wc_bookings_summary_list_date', date_i18n( $date_format, $booking->get_start() ), $booking->get_start(), $booking->get_end() ) );
            }
        }

        if ( ! empty($datetimes) ) {
            // Output html
            echo '<ul class="wc-booking-summary-list"><li>' . implode('</li><li>', $datetimes) . '</li></ul>';
        }
    }
}

Code goes in functions.php file of the active child theme (or active theme). Tested and works.

这篇关于在 Woocommerce 管理订单列表中显示预订日期时间的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆