如何仅为管理员在WooCommerce Bookings后台预订表单添加自定义价格覆盖字段?
解决方案
1. 后台添加自定义价格覆盖字段
使用woocommerce_booking_form_init动作钩子,在预订表单初始化时调用add_field方法添加字段,同时限制仅后台有权限的用户可见:
add_action( 'woocommerce_booking_form_init', 'add_admin_only_price_override_field' ); function add_admin_only_price_override_field( $booking_form ) { // 仅在后台且用户拥有编辑预订权限时显示字段 if ( is_admin() && current_user_can( 'edit_bookings' ) ) { $booking_form->add_field( array( 'type' => 'text', 'label' => '自定义价格覆盖', 'id' => 'custom_price_override', 'class' => array( 'form-row-wide' ), 'placeholder' => '输入自定义金额覆盖计算价格', 'description' => '填写后将替换系统自动计算的预订价格', ) ); } }
2. 保存自定义字段值
添加钩子将字段值存储到预订元数据中,确保提交后数据被保留:
add_action( 'woocommerce_booking_form_save_fields', 'save_custom_price_override_field', 10, 2 ); function save_custom_price_override_field( $booking_id, $booking_form ) { if ( isset( $_POST['custom_price_override'] ) && is_admin() && current_user_can( 'edit_bookings' ) ) { $override_price = sanitize_text_field( $_POST['custom_price_override'] ); // 验证输入为合法数字 if ( is_numeric( $override_price ) ) { update_post_meta( $booking_id, '_custom_price_override', wc_format_decimal( $override_price ) ); } } }
3. 结合现有价格计算钩子生效
在你已有的woocommerce_bookings_calculated_booking_cost筛选函数中,读取存储的自定义价格并覆盖系统计算值:
add_filter( 'woocommerce_bookings_calculated_booking_cost', 'apply_custom_price_override', 10, 3 ); function apply_custom_price_override( $cost, $booking, $args ) { // 仅在后台操作时应用自定义价格 if ( is_admin() && current_user_can( 'edit_bookings' ) ) { $override_price = get_post_meta( $booking->get_id(), '_custom_price_override', true ); if ( ! empty( $override_price ) && is_numeric( $override_price ) ) { $cost = wc_format_decimal( $override_price ); } } return $cost; }
关键说明
woocommerce_booking_form_init钩子会在WC_Booking_form实例初始化后触发,此时直接调用实例的add_field方法,比booking_form_fields筛选器更适合添加全新字段。- 通过权限判断确保字段仅对后台有权限的编辑人员可见,不会在前台预订表单中显示。
- 保存字段时增加数字验证,避免非法输入破坏价格计算逻辑。
内容的提问来源于stack exchange,提问作者Alastair Howard
相关产品推荐
相关产品推荐

