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

WooCommerce订阅产品:能否在账户页修改下次订单的结账自定义字段?

需求可实现,以下是具体实现步骤

1. 确保结账自定义字段值保存到订阅对象

首先要把结账时用户填写的3个自定义字段值绑定到订阅(而非仅初始订单),为后续修改和同步做基础:

// 保存结账自定义字段到订阅
add_action('woocommerce_checkout_create_subscription', 'save_checkout_fields_to_subscription', 10, 2);
function save_checkout_fields_to_subscription($subscription, $data) {
    // 替换为你实际的自定义字段name
    $fields = ['custom_field_1', 'custom_field_2', 'custom_field_3'];
    foreach ($fields as $field) {
        if (!empty($_POST[$field])) {
            $subscription->update_meta_data('_'.$field, sanitize_text_field($_POST[$field]));
        }
    }
    $subscription->save();
}

2. 在账户订阅页添加修改表单

你可以通过钩子在订阅项下方插入修改表单,无需直接修改模板文件(若已修改模板,可直接将表单代码插入对应位置):

// 在账户订阅项下方添加自定义字段修改表单
add_action('woocommerce_my_account_my_subscriptions_after_actions', 'add_subscription_custom_fields_form', 10, 1);
function add_subscription_custom_fields_form($subscription) {
    // 仅针对目标订阅产品,替换为你的订阅产品ID
    $target_product_id = 123;
    $has_target_product = false;
    foreach ($subscription->get_items() as $item) {
        if ($item->get_product_id() == $target_product_id) {
            $has_target_product = true;
            break;
        }
    }
    if (!$has_target_product) return;

    // 获取当前订阅的字段值
    $field1 = $subscription->get_meta('_custom_field_1', true);
    $field2 = $subscription->get_meta('_custom_field_2', true);
    $field3 = $subscription->get_meta('_custom_field_3', true);

    // 输出表单
    echo '<div class="subscription-custom-fields-form" style="margin: 1em 0; padding: 1em; border: 1px solid #eee;">';
    echo '<h3>修改下月订单自定义信息</h3>';
    echo '<form method="post" action="">';
    echo '<input type="hidden" name="subscription_id" value="'.$subscription->get_id().'">';
    
    echo '<p><label>自定义字段1:</label><input type="text" name="custom_field_1" value="'.esc_attr($field1).'" style="width: 100%; max-width: 300px;"></p>';
    echo '<p><label>自定义字段2:</label><input type="text" name="custom_field_2" value="'.esc_attr($field2).'" style="width: 100%; max-width: 300px;"></p>';
    echo '<p><label>自定义字段3:</label><input type="text" name="custom_field_3" value="'.esc_attr($field3).'" style="width: 100%; max-width: 300px;"></p>';
    
    echo '<p><button type="submit" name="update_subscription_fields" class="button">保存修改</button></p>';
    echo '</form></div>';
}

3. 处理表单提交,更新订阅元数据

添加表单提交的验证与更新逻辑,确保只有订阅所有者能修改:

// 处理订阅自定义字段表单提交
add_action('init', 'handle_subscription_fields_update');
function handle_subscription_fields_update() {
    if (!is_user_logged_in()) return;
    if (!isset($_POST['update_subscription_fields']) || !isset($_POST['subscription_id'])) return;

    $subscription_id = intval($_POST['subscription_id']);
    $subscription = wc_get_subscription($subscription_id);
    
    // 验证当前用户是订阅所有者
    if (!$subscription || $subscription->get_user_id() != get_current_user_id()) return;

    // 更新字段值
    $fields = ['custom_field_1', 'custom_field_2', 'custom_field_3'];
    foreach ($fields as $field) {
        if (isset($_POST[$field])) {
            $subscription->update_meta_data('_'.$field, sanitize_text_field($_POST[$field]));
        }
    }
    $subscription->save();

    wc_add_notice('自定义信息已更新,下月订单将使用新数据', 'success');
}

4. 将更新后的字段同步到新生成的续订订单

当下次自动生成续订订单时,把订阅里的最新字段值同步到订单中:

// 将订阅自定义字段同步到续订订单
add_action('woocommerce_subscription_renewal_order_created', 'sync_subscription_fields_to_renewal_order', 10, 2);
function sync_subscription_fields_to_renewal_order($renewal_order, $subscription) {
    $fields = ['custom_field_1', 'custom_field_2', 'custom_field_3'];
    foreach ($fields as $field) {
        $value = $subscription->get_meta('_'.$field, true);
        if (!empty($value)) {
            $renewal_order->update_meta_data('_'.$field, $value);
            // 可选:在订单备注中显示字段值,方便后台查看
            $renewal_order->add_order_note("自定义字段{$field}:{$value}");
        }
    }
    $renewal_order->save();
}

注意事项

  • 替换代码中custom_field_1/2/3为你实际的字段name,target_product_id为你的订阅产品ID
  • 可添加nonce字段增强表单安全性,示例中未包含,可按需补充
  • 所有代码可添加到主题的functions.php文件或自定义插件中

内容的提问来源于stack exchange,提问作者Alessandro

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 05:07:39