将 WooCommerce 预订日期和时间添加到管理订单预览
Add WooCommerce booking date and time to admin orders preview
嘿,我正在使用带有附加扩展名的 Woocommerce(Woocommerce 预订,我想知道是否有自定义代码可以在 woocommerce 订单预览中显示预订日期和时间(而不是订单日期和时间)
我发现了几个主要由 LoicTheAztec 编写的代码,可让您在特定列中插入产品和客户信息。
如果您点击客户,则会加载实际的预订信息,生成信息的代码可能是下面插入的代码。是否有人可以为 function.php 创建代码以便信息显示在 Woocommerce 订单预览表中?
至于现在我的预览是这样的:
但我希望显示预订信息(产品信息 - 可预订产品),点击订单号时也会加载该信息,并加载完整的客户信息(预约日期和时间):
<ul class="wc-booking-summary-list">
<li>
<?php echo esc_html( apply_filters( 'wc_bookings_summary_list_date', $booking_date, $booking->get_start(), $booking->get_end() ) ); ?>
<?php
if ( wc_should_convert_timezone( $booking ) ) :
/* translators: %s: timezone name */
echo esc_html( sprintf( __( 'in timezone: %s', 'woocommerce-bookings' ), $booking_timezone ) );
endif;
?>
</li>
<?php if ( $resource ) : ?>
<li>
<?php
/* translators: 1: label 2: resource name */
echo esc_html( sprintf( __( '%1$s: %2$s', 'woocommerce-bookings' ), $label, $resource->get_name() ) );
?>
</li>
<?php endif; ?>
<?php
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>
使用以下命令在 WooCommerce 订单预览中的每个订单项下方添加预订详细信息:
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>
<ul 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;
}
代码进入活动子主题(或活动主题)的 functions.php 文件。已测试并有效。
嘿,我正在使用带有附加扩展名的 Woocommerce(Woocommerce 预订,我想知道是否有自定义代码可以在 woocommerce 订单预览中显示预订日期和时间(而不是订单日期和时间)
我发现了几个主要由 LoicTheAztec 编写的代码,可让您在特定列中插入产品和客户信息。
如果您点击客户,则会加载实际的预订信息,生成信息的代码可能是下面插入的代码。是否有人可以为 function.php 创建代码以便信息显示在 Woocommerce 订单预览表中?
至于现在我的预览是这样的:
但我希望显示预订信息(产品信息 - 可预订产品),点击订单号时也会加载该信息,并加载完整的客户信息(预约日期和时间):
<ul class="wc-booking-summary-list">
<li>
<?php echo esc_html( apply_filters( 'wc_bookings_summary_list_date', $booking_date, $booking->get_start(), $booking->get_end() ) ); ?>
<?php
if ( wc_should_convert_timezone( $booking ) ) :
/* translators: %s: timezone name */
echo esc_html( sprintf( __( 'in timezone: %s', 'woocommerce-bookings' ), $booking_timezone ) );
endif;
?>
</li>
<?php if ( $resource ) : ?>
<li>
<?php
/* translators: 1: label 2: resource name */
echo esc_html( sprintf( __( '%1$s: %2$s', 'woocommerce-bookings' ), $label, $resource->get_name() ) );
?>
</li>
<?php endif; ?>
<?php
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>
使用以下命令在 WooCommerce 订单预览中的每个订单项下方添加预订详细信息:
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>
<ul 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;
}
代码进入活动子主题(或活动主题)的 functions.php 文件。已测试并有效。