如何不修改核心文件给WooCommerce Subscriptions加订阅自定义字段
WooCommerce Subscriptions无核心修改添加
baby_name自定义字段方案 直接修改插件核心文件的自定义逻辑会在插件版本更新时被覆盖,通过WordPress原生钩子即可把功能迁移到子主题functions.php中,实现和你之前修改核心完全一致的效果,全程不需要改动插件文件。
基础实现(满足当前自动存值需求)
WooCommerce Subscriptions在订阅创建完成后会触发wcs_create_subscription钩子,直接挂钩这个钩子执行元数据保存即可,不需要修改函数内部的$default_args定义。
将以下代码放入子主题的functions.php文件即可生效:
add_action( 'wcs_create_subscription', 'wcs_save_baby_name_meta', 10, 1 ); function wcs_save_baby_name_meta( $subscription ) { // 避免重复写入 if ( ! empty( $subscription->get_meta( '_baby_name', true ) ) ) { return; } // 测试阶段默认值和原有逻辑保持一致:取当前登录用户ID $baby_name = get_current_user_id(); // 正式使用时替换为实际的宝宝姓名取值逻辑,比如从之前表单存入的用户meta读取示例: // $baby_name = get_user_meta( $subscription->get_customer_id(), 'your_pre_collected_baby_name_key', true ); // 写入订阅元数据 $subscription->update_meta_data( '_baby_name', sanitize_text_field( $baby_name ) ); $subscription->save(); }
扩展支持:手动传参场景
如果后续有手动调用wcs_create_subscription创建订阅、需要自定义传入baby_name参数的需求,可以追加以下代码实现参数兼容,和之前修改核心后支持传baby_name参数的效果完全一致:
add_filter( 'woocommerce_new_subscription_data', 'wcs_pass_baby_name_arg_temp', 10, 2 ); function wcs_pass_baby_name_arg_temp( $subscription_data, $args ) { if ( isset( $args['baby_name'] ) && '' !== $args['baby_name'] ) { set_transient( 'wcs_temp_baby_name_' . md5( $subscription_data['post_title'] . $subscription_data['post_date_gmt'] ), sanitize_text_field( $args['baby_name'] ), 60 ); } return $subscription_data; } add_action( 'wcs_create_subscription', 'wcs_save_baby_name_meta', 10, 1 ); function wcs_save_baby_name_meta( $subscription ) { if ( ! empty( $subscription->get_meta( '_baby_name', true ) ) ) { return; } // 优先读取手动传入的参数值 $temp_key = 'wcs_temp_baby_name_' . md5( $subscription->get_title() . $subscription->get_date_created() ); $passed_baby_name = get_transient( $temp_key ); if ( false !== $passed_baby_name ) { $baby_name = $passed_baby_name; delete_transient( $temp_key ); } else { // 无传入参数走默认取值逻辑 $baby_name = get_current_user_id(); // 替换为实际业务取值逻辑即可 } $subscription->update_meta_data( '_baby_name', $baby_name ); $subscription->save(); }
验证方法
代码部署完成后创建测试订阅,查看站点wp_postmeta数据库表,对应新订阅记录会自动生成meta_key为_baby_name的条目,和之前修改核心文件的效果完全一致,后续WooCommerce Subscriptions插件更新不会丢失该自定义逻辑。
注意:修改核心文件新增默认参数的逻辑完全可以被钩子替代,WordPress/WooCommerce开发规范要求所有扩展功能均通过钩子实现,禁止直接修改插件、主题核心文件。

内容的提问来源于stack exchange,提问作者Nowak
相关产品推荐
相关产品推荐

