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

如何仅为管理员在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 06:48:26