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
相关产品推荐
相关产品推荐

