如何解决WooCommerce自定义字段值同步到产品属性的代码失效问题
WooCommerce自定义字段同步到产品属性 问题修复方案
原代码核心错误
- 未匹配目标属性名:直接遍历所有产品属性后给第一个属性赋值,没有判断是否是
lagerplacering属性,完全不符合需求逻辑 - 未处理属性不存在的场景:仅修改已有属性,没有实现“属性不存在则先创建”的规则
- 关键逻辑位置错误:更新属性元数据的代码放在了自定义字段非空判断之外,当自定义字段无值时会清空产品所有原有属性
- 未配置属性基础参数:新增属性时缺少可见性、是否可用于变体等必填配置,新增后后台无法正常展示
修复后可用代码
// 同步_Lagerplacering自定义字段到lagerplacering产品属性 function update_lager( $product_id ) { // 排除自动保存、修订版本场景,校验编辑权限 if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) return; if ( wp_is_post_revision( $product_id ) ) return; if ( ! current_user_can( 'edit_product', $product_id ) ) return; // 获取自定义字段值,注意字段名大小写要和实际存储的一致,如果你用的自定义字段是全小写lagerplacering可自行修改 $lagerplacering = get_post_meta( $product_id, '_Lagerplacering', true ); if ( empty( $lagerplacering ) ) return; $target_attr_name = 'lagerplacering'; $product_attributes = get_post_meta( $product_id, '_product_attributes', true ); if ( ! is_array( $product_attributes ) ) { $product_attributes = []; } $attr_found = false; // 遍历已有属性匹配目标属性 foreach ( $product_attributes as $attr_key => &$attr_data ) { if ( strtolower( $attr_data['name'] ) == strtolower( $target_attr_name ) ) { $attr_data['value'] = $lagerplacering; $attr_found = true; break; } } // 未找到目标属性则新增 if ( ! $attr_found ) { $new_attr = [ 'name' => $target_attr_name, 'value' => $lagerplacering, 'position' => count( $product_attributes ), // 排序放在最后 'is_visible' => 1, // 后台和产品详情页可见,不需要可见设为0 'is_variation' => 0, // 不用于变体,需要用于变体设为1 'is_taxonomy' => 0 // 0为本地自定义属性,1为全局属性(需要先在后台产品属性页创建好对应全局属性) ]; $product_attributes[ sanitize_title( $target_attr_name ) ] = $new_attr; } // 保存更新后的属性 update_post_meta( $product_id, '_product_attributes', $product_attributes ); } // 产品保存时触发同步 add_action( 'save_post_product', 'transfer_value_on_product_save', 10, 1 ); function transfer_value_on_product_save( $product_id ) { update_lager( $product_id ); }
注意事项
- 请确认你后台的自定义字段名是否为
_Lagerplacering,如果是不带下划线或者全小写,自行修改代码中get_post_meta的第二个参数 - 如果需要用全局属性,提前在WooCommerce后台-产品-属性中创建好
lagerplacering属性,再把代码中新增属性部分的is_taxonomy改为1,属性名改为pa_lagerplacering即可
内容的提问来源于stack exchange,提问作者tiny
相关产品推荐
相关产品推荐

